summary refs log tree commit diff stats
diff options
context:
space:
mode:
authoralaviss <alaviss@users.noreply.github.com>2020-01-20 09:51:21 +0000
committerAndreas Rumpf <rumpf_a@web.de>2020-01-20 10:51:21 +0100
commit470faa97c60aa5d8153f00083913aca4f0dc1fdf (patch)
tree6512d3029c96fa0fb28b86f3f3393ab15ecbdd37
parentda1bddb084443f7f386a04c853eb5c1c03b28ce4 (diff)
downloadNim-470faa97c60aa5d8153f00083913aca4f0dc1fdf.tar.gz
compiler/ccgtypes: hide exportc proc unless it has dynlib (#13199)
This hides most of stdlib's internal functions from resulting
binaries/libraries, where they aren't needed on *nix. Static libraries
are not affected by this change (visibility doesn't apply to them).
-rw-r--r--compiler/ccgtypes.nim2
-rw-r--r--testament/categories.nim4
-rw-r--r--tests/dll/visibility.nim19
3 files changed, 24 insertions, 1 deletions
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim
index 905f8999e..59f47b02d 100644
--- a/compiler/ccgtypes.nim
+++ b/compiler/ccgtypes.nim
@@ -954,7 +954,7 @@ proc genProcHeader(m: BModule, prc: PSym, asPtr: bool = false): Rope =
       result.add "N_LIB_EXPORT "
   elif prc.typ.callConv == ccInline or asPtr or isNonReloadable(m, prc):
     result.add "static "
-  elif {sfImportc, sfExportc} * prc.flags == {}:
+  elif sfImportc notin prc.flags:
     result.add "N_LIB_PRIVATE "
   var check = initIntSet()
   fillLoc(prc.loc, locProc, prc.ast[namePos], mangleName(m, prc), OnUnknown)
diff --git a/testament/categories.nim b/testament/categories.nim
index 98ddd7e10..f8cc625c4 100644
--- a/testament/categories.nim
+++ b/testament/categories.nim
@@ -128,6 +128,9 @@ proc runBasicDLLTest(c, r: var TResults, cat: Category, options: string) =
   var test3 = makeTest("lib/nimhcr.nim", options & " --outdir:tests/dll" & rpath, cat)
   test3.spec.action = actionCompile
   testSpec c, test3
+  var test4 = makeTest("tests/dll/visibility.nim", options & " --app:lib" & rpath, cat)
+  test4.spec.action = actionCompile
+  testSpec c, test4
 
   # windows looks in the dir of the exe (yay!):
   when not defined(Windows):
@@ -141,6 +144,7 @@ proc runBasicDLLTest(c, r: var TResults, cat: Category, options: string) =
 
   testSpec r, makeTest("tests/dll/client.nim", options & " --threads:on" & rpath, cat)
   testSpec r, makeTest("tests/dll/nimhcr_unit.nim", options & rpath, cat)
+  testSpec r, makeTest("tests/dll/visibility.nim", options & rpath, cat)
 
   if "boehm" notin options:
     # force build required - see the comments in the .nim file for more details
diff --git a/tests/dll/visibility.nim b/tests/dll/visibility.nim
new file mode 100644
index 000000000..7341e3311
--- /dev/null
+++ b/tests/dll/visibility.nim
@@ -0,0 +1,19 @@
+discard """
+  output: "could not import: foo"
+  exitcode: 1
+"""
+
+const LibName {.used.} =
+  when defined(windows):
+    "visibility.dll"
+  elif defined(macosx):
+    "libvisibility.dylib"
+  else:
+    "libvisibility.so"
+
+when compileOption("app", "lib"):
+  proc foo() {.exportc.} =
+    echo "failed"
+elif isMainModule:
+  proc foo() {.importc, dynlib: LibName.}
+  foo()