summary refs log tree commit diff stats
path: root/tests/dll
diff options
context:
space:
mode:
authoralaviss <alaviss@users.noreply.github.com>2020-01-23 12:45:31 +0000
committerAndreas Rumpf <rumpf_a@web.de>2020-01-23 13:45:31 +0100
commitf500895efe84525c131beadd2e83b30caa6674a3 (patch)
tree2562499459cbbe87f50c9a1401c27f8a0177bbe9 /tests/dll
parent3a5056dc70102e4d6dafaa0e0914ae48326c5f4a (diff)
downloadNim-f500895efe84525c131beadd2e83b30caa6674a3.tar.gz
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.
Diffstat (limited to 'tests/dll')
-rw-r--r--tests/dll/visibility.nim36
1 files changed, 30 insertions, 6 deletions
diff --git a/tests/dll/visibility.nim b/tests/dll/visibility.nim
index 7341e3311..ec15dad29 100644
--- a/tests/dll/visibility.nim
+++ b/tests/dll/visibility.nim
@@ -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