Unexport even more symbols (#13214)

* system/gc: don't export markStackAndRegisters

* compiler/cgen: unexport internal symbols

As these functions are Nim-specific walkaround against C's optimization
schemes, they don't serve any purpose being exported.

* compiler/cgen: don't export global var unless marked

* compiler/ccgthreadvars: don't export threadvar unless marked

* tests/dll/visibility: also check for exports

This ensure that these changes don't break manual exports.

* compiler/cgen: hide all variables created for constants

* compiler/ccgtypes: don't export RTTI variables

* compiler/ccgexprs: make all complex const static

* nimbase.h: fix export for windows

* compiler/cgen, ccgthreadvars: export variables correctly

For C/C++ variables, `extern` means that the variable is defined in an
another unit. Added a new N_LIB_EXPORT_VAR to correctly export
variables.
This commit is contained in:
alaviss 2020-01-23 12:45:31 +00:00 • committed by Andreas Rumpf
commit f500895efe
7 changed files with 52 additions and 22 deletions

View file

@ -1,6 +1,5 @@
discard """
output: "could not import: foo"
exitcode: 1
output: ""
"""
const LibName {.used.} =
@ -12,8 +11,33 @@ const LibName {.used.} =
"libvisibility.so"
when compileOption("app", "lib"):
proc foo() {.exportc.} =
echo "failed"
var
bar {.exportc.}: int
thr {.exportc, threadvar.}: int
proc foo() {.exportc.} = discard
var
exported {.exportc, dynlib.}: int
exported_thr {.exportc, threadvar, dynlib.}: int
proc exported_func() {.exportc, dynlib.} = discard
elif isMainModule:
proc foo() {.importc, dynlib: LibName.}
foo()
import dynlib
let handle = loadLib(LibName)
template check(sym: untyped) =
const s = astToStr(sym)
if handle.symAddr(s) != nil:
echo s, " is exported"
template checkE(sym: untyped) =
const s = astToStr(sym)
if handle.symAddr(s) == nil:
echo s, " is not exported"
check foo
check bar
check thr
checkE exported
checkE exported_thr
checkE exported_func