diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ccgexprs.nim | 2 | ||||
-rw-r--r-- | compiler/ccgstmts.nim | 34 | ||||
-rw-r--r-- | compiler/ccgthreadvars.nim | 4 | ||||
-rw-r--r-- | compiler/ccgtrav.nim | 2 | ||||
-rw-r--r-- | compiler/ccgtypes.nim | 4 | ||||
-rw-r--r-- | compiler/ccgutils.nim | 46 | ||||
-rw-r--r-- | compiler/cgen.nim | 27 | ||||
-rw-r--r-- | compiler/pragmas.nim | 1 |
8 files changed, 69 insertions, 51 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index eabcdd66a..a3144bb3c 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2001,7 +2001,7 @@ proc expr(p: BProc, n: PNode, d: var TLoc) = if sfThread in sym.flags: accessThreadLocalVar(p, sym) if emulatedThreadVars(): - putIntoDest(p, d, sym.loc.t, "NimTV->" & sym.loc.r) + putIntoDest(p, d, sym.loc.t, "NimTV_->" & sym.loc.r) else: putLocIntoDest(p, d, sym.loc) else: diff --git a/compiler/ccgstmts.nim b/compiler/ccgstmts.nim index b3d21c35e..09b455ec0 100644 --- a/compiler/ccgstmts.nim +++ b/compiler/ccgstmts.nim @@ -102,7 +102,7 @@ proc assignLabel(b: var TBlock): Rope {.inline.} = proc blockBody(b: var TBlock): Rope = result = b.sections[cpsLocals] if b.frameLen > 0: - result.addf("FR.len+=$1;$n", [b.frameLen.rope]) + result.addf("FR_.len+=$1;$n", [b.frameLen.rope]) result.add(b.sections[cpsInit]) result.add(b.sections[cpsStmts]) @@ -123,7 +123,7 @@ proc endBlock(p: BProc) = ~"}$n" let frameLen = p.blocks[topBlock].frameLen if frameLen > 0: - blockEnd.addf("FR.len-=$1;$n", [frameLen.rope]) + blockEnd.addf("FR_.len-=$1;$n", [frameLen.rope]) endBlock(p, blockEnd) proc genSimpleBlock(p: BProc, stmts: PNode) {.inline.} = @@ -156,7 +156,7 @@ proc genGotoState(p: BProc, n: PNode) = initLocExpr(p, n.sons[0], a) lineF(p, cpsStmts, "switch ($1) {$n", [rdLoc(a)]) p.beforeRetNeeded = true - lineF(p, cpsStmts, "case -1: goto BeforeRet;$n", []) + lineF(p, cpsStmts, "case -1: goto BeforeRet_;$n", []) for i in 0 .. lastOrd(n.sons[0].typ): lineF(p, cpsStmts, "case $1: goto STATE$1;$n", [rope(i)]) lineF(p, cpsStmts, "}$n", []) @@ -373,7 +373,7 @@ proc genReturnStmt(p: BProc, t: PNode) = # consume it before we return. var safePoint = p.finallySafePoints[p.finallySafePoints.len-1] linefmt(p, cpsStmts, "if ($1.status != 0) #popCurrentException();$n", safePoint) - lineF(p, cpsStmts, "goto BeforeRet;$n", []) + lineF(p, cpsStmts, "goto BeforeRet_;$n", []) proc genGotoForCase(p: BProc; caseStmt: PNode) = for i in 1 .. <caseStmt.len: @@ -411,11 +411,11 @@ proc genComputedGoto(p: BProc; n: PNode) = localError(n.info, "no case statement found for computed goto"); return var id = p.labels+1 inc p.labels, arraySize+1 - let tmp = "TMP$1" % [id.rope] + let tmp = "TMP$1_" % [id.rope] var gotoArray = "static void* $#[$#] = {" % [tmp, arraySize.rope] for i in 1..arraySize-1: - gotoArray.addf("&&TMP$#, ", [(id+i).rope]) - gotoArray.addf("&&TMP$#};$n", [(id+arraySize).rope]) + gotoArray.addf("&&TMP$#_, ", [(id+i).rope]) + gotoArray.addf("&&TMP$#_};$n", [(id+arraySize).rope]) line(p, cpsLocals, gotoArray) let topBlock = p.blocks.len-1 @@ -445,7 +445,7 @@ proc genComputedGoto(p: BProc; n: PNode) = localError(it.info, "range notation not available for computed goto") return let val = getOrdValue(it.sons[j]) - lineF(p, cpsStmts, "TMP$#:$n", [intLiteral(val+id+1)]) + lineF(p, cpsStmts, "TMP$#_:$n", [intLiteral(val+id+1)]) genStmts(p, it.lastSon) #for j in casePos+1 .. <n.len: genStmts(p, n.sons[j]) # tailB #for j in 0 .. casePos-1: genStmts(p, n.sons[j]) # tailA @@ -600,7 +600,7 @@ proc genCaseSecondPass(p: BProc, t: PNode, d: var TLoc, for i in 1..until: # bug #4230: avoid false sharing between branches: if d.k == locTemp and isEmptyType(t.typ): d.k = locNone - lineF(p, cpsStmts, "LA$1: ;$n", [rope(labId + i)]) + lineF(p, cpsStmts, "LA$1_: ;$n", [rope(labId + i)]) if t.sons[i].kind == nkOfBranch: var length = sonsLen(t.sons[i]) exprBlock(p, t.sons[i].sons[length - 1], d) @@ -618,15 +618,15 @@ proc genIfForCaseUntil(p: BProc, t: PNode, d: var TLoc, inc(p.labels) if t.sons[i].kind == nkOfBranch: # else statement genCaseGenericBranch(p, t.sons[i], a, rangeFormat, eqFormat, - "LA" & rope(p.labels)) + "LA" & rope(p.labels) & "_") else: - lineF(p, cpsStmts, "goto LA$1;$n", [rope(p.labels)]) + lineF(p, cpsStmts, "goto LA$1_;$n", [rope(p.labels)]) if until < t.len-1: inc(p.labels) var gotoTarget = p.labels - lineF(p, cpsStmts, "goto LA$1;$n", [rope(gotoTarget)]) + lineF(p, cpsStmts, "goto LA$1_;$n", [rope(gotoTarget)]) result = genCaseSecondPass(p, t, d, labId, until) - lineF(p, cpsStmts, "LA$1: ;$n", [rope(gotoTarget)]) + lineF(p, cpsStmts, "LA$1_: ;$n", [rope(gotoTarget)]) else: result = genCaseSecondPass(p, t, d, labId, until) @@ -664,7 +664,7 @@ proc genStringCase(p: BProc, t: PNode, d: var TLoc) = for i in countup(1, sonsLen(t) - 1): inc(p.labels) if t.sons[i].kind == nkOfBranch: - genCaseStringBranch(p, t.sons[i], a, "LA" & rope(p.labels), + genCaseStringBranch(p, t.sons[i], a, "LA" & rope(p.labels) & "_", branches) else: # else statement: nothing to do yet @@ -678,7 +678,7 @@ proc genStringCase(p: BProc, t: PNode, d: var TLoc) = [intLiteral(j), branches[j]]) lineF(p, cpsStmts, "}$n", []) # else statement: if t.sons[sonsLen(t)-1].kind != nkOfBranch: - lineF(p, cpsStmts, "goto LA$1;$n", [rope(p.labels)]) + lineF(p, cpsStmts, "goto LA$1_;$n", [rope(p.labels)]) # third pass: generate statements var lend = genCaseSecondPass(p, t, d, labId, sonsLen(t)-1) fixLabel(p, lend) @@ -802,7 +802,7 @@ proc genTryCpp(p: BProc, t: PNode, d: var TLoc) = let length = sonsLen(t) endBlock(p, ropecg(p.module, "} catch (NimException& $1) {$n", [exc])) if optStackTrace in p.options: - linefmt(p, cpsStmts, "#setFrame((TFrame*)&FR);$n") + linefmt(p, cpsStmts, "#setFrame((TFrame*)&FR_);$n") inc p.inExceptBlock var i = 1 var catchAllPresent = false @@ -910,7 +910,7 @@ proc genTry(p: BProc, t: PNode, d: var TLoc) = startBlock(p, "else {$n") linefmt(p, cpsStmts, "#popSafePoint();$n") if optStackTrace in p.options: - linefmt(p, cpsStmts, "#setFrame((TFrame*)&FR);$n") + linefmt(p, cpsStmts, "#setFrame((TFrame*)&FR_);$n") inc p.inExceptBlock var i = 1 while (i < length) and (t.sons[i].kind == nkExceptBranch): diff --git a/compiler/ccgthreadvars.nim b/compiler/ccgthreadvars.nim index 81af89249..3efddbf30 100644 --- a/compiler/ccgthreadvars.nim +++ b/compiler/ccgthreadvars.nim @@ -19,9 +19,9 @@ proc accessThreadLocalVar(p: BProc, s: PSym) = if emulatedThreadVars() and not p.threadVarAccessed: p.threadVarAccessed = true incl p.module.flags, usesThreadVars - addf(p.procSec(cpsLocals), "\tNimThreadVars* NimTV;$n", []) + addf(p.procSec(cpsLocals), "\tNimThreadVars* NimTV_;$n", []) add(p.procSec(cpsInit), - ropecg(p.module, "\tNimTV = (NimThreadVars*) #GetThreadLocalVars();$n")) + ropecg(p.module, "\tNimTV_ = (NimThreadVars*) #GetThreadLocalVars();$n")) var nimtv: Rope # Nim thread vars; the struct body diff --git a/compiler/ccgtrav.nim b/compiler/ccgtrav.nim index 6dab003fd..547504afb 100644 --- a/compiler/ccgtrav.nim +++ b/compiler/ccgtrav.nim @@ -145,7 +145,7 @@ proc genTraverseProcForGlobal(m: BModule, s: PSym): Rope = if sfThread in s.flags and emulatedThreadVars(): accessThreadLocalVar(p, s) - sLoc = "NimTV->" & sLoc + sLoc = "NimTV_->" & sLoc c.visitorFrmt = "#nimGCvisit((void*)$1, 0);$n" c.p = p diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 8f4db126e..ba505facb 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -1139,13 +1139,11 @@ proc genTypeInfo(m: BModule, t: PType): Rope = discard cgsym(m, "TNimType") discard cgsym(m, "TNimNode") addf(m.s[cfsVars], "extern TNimType $1;$n", [result]) - #return "(&".rope & result & ")".rope - #result = "NTI$1" % [rope($sig)] # also store in local type section: m.typeInfoMarker[sig] = result return "(&".rope & result & ")".rope - result = "NTI$1" % [rope($sig)] + result = "NTI$1_" % [rope($sig)] m.typeInfoMarker[sig] = result let owner = t.skipTypes(typedescPtrs).owner.getModule diff --git a/compiler/ccgutils.nim b/compiler/ccgutils.nim index 4d6ba858c..0985759b9 100644 --- a/compiler/ccgutils.nim +++ b/compiler/ccgutils.nim @@ -168,24 +168,42 @@ proc mangle*(name: string): string = ## so they are represented as `HEX____`. If the name starts with a number, ## `N` is prepended result = newStringOfCap(name.len) - case name[0] - of Letters: - result.add(name[0]) - of Digits: - result.add("N" & name[0]) - else: - result = "HEX" & toHex(ord(name[0]), 2) - for i in 1..(name.len-1): + var start = 0 + if name[0] in Digits: + result.add("X" & name[0]) + start = 1 + var requiresUnderscore = false + template special(x) = + result.add x + requiresUnderscore = true + for i in start..(name.len-1): let c = name[i] case c - of 'A'..'Z': - add(result, c.toLowerAscii) - of '_': - discard - of 'a'..'z', '0'..'9': + of 'a'..'z', '0'..'9', 'A'..'Z', '_': add(result, c) + of '$': special "dollar" + of '%': special "percent" + of '&': special "amp" + of '^': special "roof" + of '!': special "emark" + of '?': special "qmark" + of '*': special "star" + of '+': special "plus" + of '-': special "minus" + of '/': special "slash" + of '=': special "eq" + of '<': special "lt" + of '>': special "gt" + of '~': special "tilde" + of ':': special "colon" + of '.': special "dot" + of '@': special "at" + of '|': special "bar" else: - add(result, "HEX" & toHex(ord(c), 2)) + add(result, "X" & toHex(ord(c), 2)) + requiresUnderscore = true + if requiresUnderscore: + result.add "_" proc makeLLVMString*(s: string): Rope = const MaxLineLength = 64 diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 538111663..ae735d30b 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -216,7 +216,7 @@ proc genLineDir(p: BProc, t: PNode) = {optLineTrace, optStackTrace}) and (p.prc == nil or sfPure notin p.prc.flags) and tt.info.fileIndex >= 0: if freshLineInfo(p, tt.info): - linefmt(p, cpsStmts, "nimln($1, $2);$n", + linefmt(p, cpsStmts, "nimln_($1, $2);$n", line.rope, tt.info.quotedFilename) proc postStmtActions(p: BProc) {.inline.} = @@ -338,7 +338,7 @@ proc initLocalVar(p: BProc, v: PSym, immediateAsgn: bool) = proc getTemp(p: BProc, t: PType, result: var TLoc; needsInit=false) = inc(p.labels) - result.r = "LOC" & rope(p.labels) + result.r = "T" & rope(p.labels) & "_" linefmt(p, cpsLocals, "$1 $2;$n", getTypeDesc(p.module, t), result.r) result.k = locTemp result.t = t @@ -347,12 +347,12 @@ proc getTemp(p: BProc, t: PType, result: var TLoc; needsInit=false) = constructLoc(p, result, not needsInit) proc initGCFrame(p: BProc): Rope = - if p.gcFrameId > 0: result = "struct {$1} GCFRAME;$n" % [p.gcFrameType] + if p.gcFrameId > 0: result = "struct {$1} GCFRAME_;$n" % [p.gcFrameType] proc deinitGCFrame(p: BProc): Rope = if p.gcFrameId > 0: result = ropecg(p.module, - "if (((NU)&GCFRAME) < 4096) #nimGCFrame(&GCFRAME);$n") + "if (((NU)&GCFRAME_) < 4096) #nimGCFrame(&GCFRAME_);$n") proc localDebugInfo(p: BProc, s: PSym) = if {optStackTrace, optEndb} * p.options != {optStackTrace, optEndb}: return @@ -361,7 +361,7 @@ proc localDebugInfo(p: BProc, s: PSym) = var a = "&" & s.loc.r if s.kind == skParam and ccgIntroducedPtr(s): a = s.loc.r lineF(p, cpsInit, - "FR.s[$1].address = (void*)$3; FR.s[$1].typ = $4; FR.s[$1].name = $2;$n", + "FR_.s[$1].address = (void*)$3; FR_.s[$1].typ = $4; FR_.s[$1].name = $2;$n", [p.maxFrameLen.rope, makeCString(normalize(s.name.s)), a, genTypeInfo(p.module, s.loc.t)]) inc(p.maxFrameLen) @@ -443,7 +443,7 @@ proc fillProcLoc(m: BModule; sym: PSym) = proc getLabel(p: BProc): TLabel = inc(p.labels) - result = "LA" & rope(p.labels) + result = "LA" & rope(p.labels) & "_" proc fixLabel(p: BProc, labl: TLabel) = lineF(p, cpsStmts, "$1: ;$n", [labl]) @@ -521,7 +521,7 @@ proc mangleDynLibProc(sym: PSym): Rope = # NOTE: sym.loc.r is the external name! result = rope(sym.name.s) else: - result = "Dl_$1" % [rope(sym.id)] + result = "Dl_$1_" % [rope(sym.id)] proc symInDynamicLib(m: BModule, sym: PSym) = var lib = sym.annex @@ -609,11 +609,11 @@ proc initFrame(p: BProc, procname, filename: Rope): Rope = discard cgsym(p.module, "nimFrame") if p.maxFrameLen > 0: discard cgsym(p.module, "VarSlot") - result = rfmt(nil, "\tnimfrs($1, $2, $3, $4)$N", + result = rfmt(nil, "\tnimfrs_($1, $2, $3, $4)$N", procname, filename, p.maxFrameLen.rope, p.blocks[0].frameLen.rope) else: - result = rfmt(nil, "\tnimfr($1, $2)$N", procname, filename) + result = rfmt(nil, "\tnimfr_($1, $2)$N", procname, filename) proc deinitFrame(p: BProc): Rope = result = rfmt(p.module, "\t#popFrame();$n") @@ -708,7 +708,7 @@ proc genProcAux(m: BModule, prc: PSym) = if p.beforeRetNeeded: add(generatedProc, "{") add(generatedProc, p.s(cpsInit)) add(generatedProc, p.s(cpsStmts)) - if p.beforeRetNeeded: add(generatedProc, ~"\t}BeforeRet: ;$n") + if p.beforeRetNeeded: add(generatedProc, ~"\t}BeforeRet_: ;$n") add(generatedProc, deinitGCFrame(p)) if optStackTrace in prc.options: add(generatedProc, deinitFrame(p)) add(generatedProc, returnStmt) @@ -847,7 +847,8 @@ proc genVarPrototype(m: BModule, sym: PSym) = genVarPrototypeAux(m, sym) proc addIntTypes(result: var Rope) {.inline.} = - addf(result, "#define NIM_INTBITS $1" & tnl, [ + addf(result, "#define NIM_NEW_MANGLING_RULES" & tnl & + "#define NIM_INTBITS $1" & tnl, [ platform.CPU[targetCPU].intSize.rope]) proc getCopyright(cfile: Cfile): Rope = @@ -1059,7 +1060,7 @@ proc genInitCode(m: BModule) = var procname = makeCString(m.module.name.s) add(prc, initFrame(m.initProc, procname, m.module.info.quotedFilename)) else: - add(prc, ~"\tTFrame FR; FR.len = 0;$N") + add(prc, ~"\tTFrame FR_; FR_.len = 0;$N") add(prc, genSectionStart(cpsInit)) add(prc, m.preInitProc.s(cpsInit)) @@ -1124,7 +1125,7 @@ proc initProcOptions(m: BModule): TOptions = proc rawNewModule(g: BModuleList; module: PSym, filename: string): BModule = new(result) - result.tmpBase = rope("T" & $hashOwner(module) & "_") + result.tmpBase = rope("TM" & $hashOwner(module) & "_") initLinkedList(result.headerFiles) result.declaredThings = initIntSet() result.declaredProtos = initIntSet() diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index c88451de6..04dbd3612 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -763,6 +763,7 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: int, processDynLib(c, it, sym) of wCompilerproc: noVal(it) # compilerproc may not get a string! + cppDefine(c.graph.config, sym.name.s) if sfFromGeneric notin sym.flags: markCompilerProc(sym) of wProcVar: noVal(it) |