Skip to content

Commit

Permalink
added a switch -d:nimEmulateOverflowChecks for broken or old GCC vers…
Browse files Browse the repository at this point in the history
…ions (#13692)
  • Loading branch information
Araq authored Mar 19, 2020
1 parent b5c9881 commit ba6e7c6
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 5 deletions.
6 changes: 6 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@

## Changes affecting backwards compatibility

- The Nim compiler now implements a faster way to detect overflows based
on GCC's `__builtin_sadd_overflow` family of functions. (Clang also
supports these). Some versions of GCC lack this feature and unfortunately
we cannot detect this case reliably. So if you get compilation errors like
"undefined reference to '__builtin_saddll_overflow'" compile your programs
with `-d:nimEmulateOverflowChecks`.


### Breaking changes in the standard library
Expand Down
8 changes: 5 additions & 3 deletions compiler/cgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1234,13 +1234,15 @@ proc genVarPrototype(m: BModule, n: PNode) =
"\t$1 = ($2*)hcrGetGlobal($3, \"$1\");$n", [sym.loc.r,
getTypeDesc(m, sym.loc.t), getModuleDllPath(m, sym)])

proc addIntTypes(result: var Rope; conf: ConfigRef) {.inline.} =
proc addNimDefines(result: var Rope; conf: ConfigRef) {.inline.} =
result.addf("#define NIM_INTBITS $1\L", [
platform.CPU[conf.target.targetCPU].intSize.rope])
if conf.cppCustomNamespace.len > 0:
result.add("#define USE_NIM_NAMESPACE ")
result.add(conf.cppCustomNamespace)
result.add("\L")
if conf.isDefined("nimEmulateOverflowChecks"):
result.add("#define NIM_EmulateOverflowChecks\L")

proc getCopyright(conf: ConfigRef; cfile: Cfile): Rope =
if optCompileOnly in conf.globalOptions:
Expand All @@ -1263,7 +1265,7 @@ proc getCopyright(conf: ConfigRef; cfile: Cfile): Rope =
proc getFileHeader(conf: ConfigRef; cfile: Cfile): Rope =
result = getCopyright(conf, cfile)
if conf.hcrOn: result.add("#define NIM_HOT_CODE_RELOADING\L")
addIntTypes(result, conf)
addNimDefines(result, conf)

proc getSomeNameForModule(m: PSym): Rope =
assert m.kind == skModule
Expand Down Expand Up @@ -1825,7 +1827,7 @@ proc writeHeader(m: BModule) =

var guard = "__$1__" % [m.filename.splitFile.name.rope]
result.addf("#ifndef $1$n#define $1$n", [guard])
addIntTypes(result, m.config)
addNimDefines(result, m.config)
generateHeaders(m)

generateThreadLocalStorage(m)
Expand Down
2 changes: 1 addition & 1 deletion lib/nimbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,7 @@ typedef int Nim_and_C_compiler_disagree_on_target_architecture[sizeof(NI) == siz
#define nimModInt(a, b, res) (((*res) = (a) % (b)), 0)
#define nimModInt64(a, b, res) (((*res) = (a) % (b)), 0)

#if !defined(_MSC_VER)
#if !defined(_MSC_VER) && !defined(NIM_EmulateOverflowChecks)
/* these exist because we cannot have .compilerProcs that are importc'ed
by a different name */

Expand Down
2 changes: 1 addition & 1 deletion lib/system/integerops.nim
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ proc raiseDivByZero {.compilerproc, noinline.} =

{.pragma: nimbaseH, importc, nodecl, noSideEffect, compilerproc.}

when defined(gcc) or defined(clang):
when (defined(gcc) or defined(clang)) and not defined(nimEmulateOverflowChecks):
# take the #define from nimbase.h

proc nimAddInt(a, b: int, res: ptr int): bool {.nimbaseH.}
Expand Down

0 comments on commit ba6e7c6

Please sign in to comment.