Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unexport even more symbols #13214

Merged
merged 10 commits into from
Jan 23, 2020
6 changes: 3 additions & 3 deletions compiler/ccgexprs.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1325,7 +1325,7 @@ proc rawConstExpr(p: BProc, n: PNode; d: var TLoc) =
if id == p.module.labels:
# expression not found in the cache:
inc(p.module.labels)
p.module.s[cfsData].addf("NIM_CONST $1 $2 = $3;$n",
p.module.s[cfsData].addf("static NIM_CONST $1 $2 = $3;$n",
[getTypeDesc(p.module, t), d.r, genBracedInit(p, n, isConst = true)])

proc handleConstExpr(p: BProc, n: PNode, d: var TLoc): bool =
Expand Down Expand Up @@ -2508,7 +2508,7 @@ proc exprComplexConst(p: BProc, n: PNode, d: var TLoc) =
if id == p.module.labels:
# expression not found in the cache:
inc(p.module.labels)
p.module.s[cfsData].addf("NIM_CONST $1 $2 = $3;$n",
p.module.s[cfsData].addf("static NIM_CONST $1 $2 = $3;$n",
[getTypeDesc(p.module, t), tmp, genBracedInit(p, n, isConst = true)])

if d.k == locNone:
Expand Down Expand Up @@ -2896,7 +2896,7 @@ proc genConstSeq(p: BProc, n: PNode, t: PType; isConst: bool): Rope =
let base = t.skipTypes(abstractInst)[0]

appcg(p.module, cfsData,
"$5 struct {$n" &
"static $5 struct {$n" &
" #TGenericSeq Sup;$n" &
" $1 data[$2];$n" &
"} $3 = $4;$n", [
Expand Down
2 changes: 2 additions & 0 deletions compiler/ccgthreadvars.nim
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ proc declareThreadVar(m: BModule, s: PSym, isExtern: bool) =
m.g.nimtv.addf("$1 $2;$n", [getTypeDesc(m, s.loc.t), s.loc.r])
else:
if isExtern: m.s[cfsVars].add("extern ")
elif lfExportLib in s.loc.flags: m.s[cfsVars].add("N_LIB_EXPORT_VAR ")
else: m.s[cfsVars].add("N_LIB_PRIVATE ")
if optThreads in m.config.globalOptions: m.s[cfsVars].add("NIM_THREADVAR ")
m.s[cfsVars].add(getTypeDesc(m, s.loc.t))
m.s[cfsVars].addf(" $1;$n", [s.loc.r])
Expand Down
4 changes: 2 additions & 2 deletions compiler/ccgtypes.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1026,7 +1026,7 @@ proc genTypeInfoAuxBase(m: BModule; typ, origType: PType;
m.hcrCreateTypeInfosProc.addf("\thcrRegisterGlobal($2, \"$1\", sizeof(TNimType), NULL, (void**)&$1);$n",
[name, getModuleDllPath(m, m.module)])
else:
m.s[cfsData].addf("TNimType $1;$n", [name])
m.s[cfsData].addf("N_LIB_PRIVATE TNimType $1;$n", [name])

proc genTypeInfoAux(m: BModule, typ, origType: PType, name: Rope;
info: TLineInfo) =
Expand Down Expand Up @@ -1301,7 +1301,7 @@ proc genTypeInfoV2(m: BModule, t, origType: PType, name: Rope; info: TLineInfo)
else:
typeName = rope("NIM_NIL")

m.s[cfsData].addf("TNimType $1;$n", [name])
m.s[cfsData].addf("N_LIB_PRIVATE TNimType $1;$n", [name])
let destroyImpl = genHook(m, t, info, attachedDestructor)
let traceImpl = genHook(m, t, info, attachedTrace)
let disposeImpl = genHook(m, t, info, attachedDispose)
Expand Down
18 changes: 10 additions & 8 deletions compiler/cgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,8 @@ proc assignGlobalVar(p: BProc, n: PNode; value: Rope) =
decl.addf "NIM_ALIGN($1) ", [rope(s.alignment)]
if p.hcrOn: decl.add("static ")
elif sfImportc in s.flags: decl.add("extern ")
elif lfExportLib in s.loc.flags: decl.add("N_LIB_EXPORT_VAR ")
else: decl.add("N_LIB_PRIVATE ")
if s.kind == skLet and value != nil: decl.add("NIM_CONST ")
decl.add(td)
if p.hcrOn: decl.add("*")
Expand Down Expand Up @@ -1175,7 +1177,7 @@ proc requestConstImpl(p: BProc, sym: PSym) =
var q = findPendingModule(m, sym)
if q != nil and not containsOrIncl(q.declaredThings, sym.id):
assert q.initProc.module == q
q.s[cfsData].addf("NIM_CONST $1 $2 = $3;$n",
q.s[cfsData].addf("N_LIB_PRIVATE NIM_CONST $1 $2 = $3;$n",
[getTypeDesc(q, sym.typ), sym.loc.r, genBracedInit(q.initProc, sym.ast, isConst = true)])
# declare header:
if q != m and not containsOrIncl(m.declaredThings, sym.id):
Expand Down Expand Up @@ -1316,19 +1318,19 @@ proc genMainProc(m: BModule) =
const
# not a big deal if we always compile these 3 global vars... makes the HCR code easier
PosixCmdLine =
"int cmdCount;$N" &
"char** cmdLine;$N" &
"char** gEnv;$N"
"N_LIB_PRIVATE int cmdCount;$N" &
"N_LIB_PRIVATE char** cmdLine;$N" &
"N_LIB_PRIVATE char** gEnv;$N"

# The use of a volatile function pointer to call Pre/NimMainInner
# prevents inlining of the NimMainInner function and dependent
# functions, which might otherwise merge their stack frames.
PreMainBody = "$N" &
"void PreMainInner(void) {$N" &
"N_LIB_PRIVATE void PreMainInner(void) {$N" &
"$2" &
"}$N$N" &
PosixCmdLine &
"void PreMain(void) {$N" &
"N_LIB_PRIVATE void PreMain(void) {$N" &
"\tvoid (*volatile inner)(void);$N" &
"\tinner = PreMainInner;$N" &
"$1" &
Expand All @@ -1341,7 +1343,7 @@ proc genMainProc(m: BModule) =
MainProcsWithResult =
MainProcs & ("\treturn $1nim_program_result;$N")

NimMainInner = "N_CDECL(void, NimMainInner)(void) {$N" &
NimMainInner = "N_LIB_PRIVATE N_CDECL(void, NimMainInner)(void) {$N" &
"$1" &
"}$N$N"

Expand Down Expand Up @@ -1388,7 +1390,7 @@ proc genMainProc(m: BModule) =
PosixNimDllMain = WinNimDllMain

PosixCDllMain =
"void NIM_POSIX_INIT NimMainInit(void) {$N" &
"N_LIB_PRIVATE void NIM_POSIX_INIT NimMainInit(void) {$N" &
MainProcs &
"}$N$N"

Expand Down
6 changes: 4 additions & 2 deletions lib/nimbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,10 +182,11 @@ __AVR__
# define N_SAFECALL_PTR(rettype, name) rettype (__stdcall *name)

# ifdef __cplusplus
# define N_LIB_EXPORT extern "C" __declspec(dllexport)
# define N_LIB_EXPORT NIM_EXTERNC __declspec(dllexport)
# else
# define N_LIB_EXPORT extern __declspec(dllexport)
# define N_LIB_EXPORT NIM_EXTERNC __declspec(dllexport)
# endif
# define N_LIB_EXPORT_VAR __declspec(dllexport)
# define N_LIB_IMPORT extern __declspec(dllimport)
#else
# define N_LIB_PRIVATE __attribute__((visibility("hidden")))
Expand Down Expand Up @@ -215,6 +216,7 @@ __AVR__
# define N_SAFECALL_PTR(rettype, name) rettype (*name)
# endif
# define N_LIB_EXPORT NIM_EXTERNC __attribute__((visibility("default")))
# define N_LIB_EXPORT_VAR __attribute__((visibility("default")))
# define N_LIB_IMPORT extern
#endif

Expand Down
2 changes: 1 addition & 1 deletion lib/system/gc.nim
Original file line number Diff line number Diff line change
Expand Up @@ -682,7 +682,7 @@ proc gcMark(gch: var GcHeap, p: pointer) {.inline.} =
`CLANG_NO_SANITIZE_ADDRESS` in `lib/nimbase.h`.
]#
proc markStackAndRegisters(gch: var GcHeap) {.noinline, cdecl,
codegenDecl: "CLANG_NO_SANITIZE_ADDRESS $# $#$#".} =
codegenDecl: "CLANG_NO_SANITIZE_ADDRESS N_LIB_PRIVATE $# $#$#".} =
forEachStackSlot(gch, gcMark)

proc collectZCT(gch: var GcHeap): bool =
Expand Down
36 changes: 30 additions & 6 deletions tests/dll/visibility.nim
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
discard """
output: "could not import: foo"
exitcode: 1
output: ""
"""

const LibName {.used.} =
Expand All @@ -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