From 470faa97c60aa5d8153f00083913aca4f0dc1fdf Mon Sep 17 00:00:00 2001 From: alaviss Date: Mon, 20 Jan 2020 09:51:21 +0000 Subject: [PATCH] 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). --- compiler/ccgtypes.nim | 2 +- testament/categories.nim | 4 ++++ tests/dll/visibility.nim | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 tests/dll/visibility.nim diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 905f8999e6..59f47b02d0 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 98ddd7e10b..f8cc625c42 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 0000000000..7341e33112 --- /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()