diff options
-rwxr-xr-x | compiler/cgen.nim | 8 | ||||
-rwxr-xr-x | compiler/platform.nim | 14 | ||||
-rwxr-xr-x | koch.nim | 2 | ||||
-rwxr-xr-x | lib/system.nim | 54 | ||||
-rwxr-xr-x | lib/system/excpt.nim | 2 | ||||
-rwxr-xr-x | lib/system/mmdisp.nim | 72 | ||||
-rwxr-xr-x | lib/system/repr.nim | 2 |
7 files changed, 122 insertions, 32 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim index e9d7673bb..d85d3fe53 100755 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -778,6 +778,9 @@ proc genMainProc(m: BModule) = PosixCMain = "int main(int argc, char** args, char** env) {$n" & " cmdLine = args;$n" & " cmdCount = argc;$n" & " gEnv = env;$n" & " NimMain();$n" & " return nim_program_result;$n" & "}$n" + StandaloneCMain = "int main(void) {$n" & + " NimMain();$n" & + " return 0;$n" & "}$n" WinNimMain = "N_CDECL(void, NimMain)(void) {$n" & CommonMainBody & "}$n" WinCMain = "N_STDCALL(int, WinMain)(HINSTANCE hCurInstance, $n" & @@ -807,7 +810,10 @@ proc genMainProc(m: BModule) = elif optGenDynLib in gGlobalOptions: nimMain = posixNimDllMain otherMain = posixCDllMain - else: + elif platform.targetOS == osStandalone: + nimMain = PosixNimMain + otherMain = StandaloneCMain + else: nimMain = PosixNimMain otherMain = PosixCMain if gBreakpoints != nil: discard cgsym(m, "dbgRegisterBreakpoint") diff --git a/compiler/platform.nim b/compiler/platform.nim index 01190c9c9..f4cf3b882 100755 --- a/compiler/platform.nim +++ b/compiler/platform.nim @@ -21,7 +21,8 @@ type # conditionals to condsyms (end of module). osNone, osDos, osWindows, osOs2, osLinux, osMorphos, osSkyos, osSolaris, osIrix, osNetbsd, osFreebsd, osOpenbsd, osAix, osPalmos, osQnx, osAmiga, - osAtari, osNetware, osMacos, osMacosx, osEcmaScript, osNimrodVM + osAtari, osNetware, osMacos, osMacosx, osEcmaScript, osNimrodVM, + osStandalone type TInfoOSProp* = enum @@ -139,14 +140,18 @@ const exeExt: "", extSep: ".", props: {}), (name: "NimrodVM", parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/", objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/", - scriptExt: ".sh", curDir: ".", exeExt: "", extSep: ".", props: {})] + scriptExt: ".sh", curDir: ".", exeExt: "", extSep: ".", props: {}), + (name: "Standalone", parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/", + objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/", + scriptExt: ".sh", curDir: ".", exeExt: ".elf", extSep: ".", + props: {})] type TSystemCPU* = enum # Also add CPU for in initialization section and # alias conditionals to condsyms (end of module). cpuNone, cpuI386, cpuM68k, cpuAlpha, cpuPowerpc, cpuPowerpc64, cpuSparc, cpuVm, cpuIa64, cpuAmd64, cpuMips, cpuArm, - cpuEcmaScript, cpuNimrodVM + cpuEcmaScript, cpuNimrodVM, cpuAVR type TEndian* = enum @@ -169,7 +174,8 @@ const (name: "mips", intSize: 32, endian: bigEndian, floatSize: 64, bit: 32), (name: "arm", intSize: 32, endian: littleEndian, floatSize: 64, bit: 32), (name: "ecmascript", intSize: 32, endian: bigEndian,floatSize: 64,bit: 32), - (name: "nimrodvm", intSize: 32, endian: bigEndian, floatSize: 64, bit: 32)] + (name: "nimrodvm", intSize: 32, endian: bigEndian, floatSize: 64, bit: 32), + (name: "avr", intSize: 16, endian: littleEndian, floatSize: 32, bit: 16)] var targetCPU*, hostCPU*: TSystemCPU diff --git a/koch.nim b/koch.nim index add08625a..9eec6bd76 100755 --- a/koch.nim +++ b/koch.nim @@ -141,7 +141,7 @@ proc boot(args: string) = return copyExe(output, (i+1).thVersion) copyExe(output, finalDest) - echo "[Warning] executables are still not equal" + when not defined(windows): echo "[Warning] executables are still not equal" # -------------- clean -------------------------------------------------------- diff --git a/lib/system.nim b/lib/system.nim index 6583e4f15..07b5e8734 100755 --- a/lib/system.nim +++ b/lib/system.nim @@ -851,7 +851,7 @@ template sysAssert(cond: bool, msg: string) = include "system/inclrtl" -when not defined(ecmascript) and not defined(nimrodVm): +when not defined(ecmascript) and not defined(nimrodVm) and not defined(avr): include "system/cgprocs" proc add *[T](x: var seq[T], y: T) {.magic: "AppendSeqElem", noSideEffect.} @@ -1604,16 +1604,17 @@ when not defined(EcmaScript) and not defined(NimrodVM): {.push stack_trace: off.} proc initGC() - when not defined(boehmgc): + when not defined(boehmgc) and not defined(useMalloc): proc initAllocator() {.inline.} - proc initStackBottom() {.inline.} = - # WARNING: This is very fragile! An array size of 8 does not work on my - # Linux 64bit system. Very strange, but we are at the will of GCC's - # optimizer... - var locals {.volatile.}: pointer - locals = addr(locals) - setStackBottom(locals) + when not defined(nogc): + proc initStackBottom() {.inline.} = + # WARNING: This is very fragile! An array size of 8 does not work on my + # Linux 64bit system. Very strange, but we are at the will of GCC's + # optimizer... + var locals {.volatile.}: pointer + locals = addr(locals) + setStackBottom(locals) var strDesc: TNimType @@ -1868,7 +1869,7 @@ when not defined(EcmaScript) and not defined(NimrodVM): when hasThreadSupport: include "system/syslocks" include "system/threads" - else: + elif not defined(nogc): initStackBottom() initGC() @@ -1881,21 +1882,23 @@ when not defined(EcmaScript) and not defined(NimrodVM): ## for debug builds. {.push stack_trace: off.} - include "system/excpt" + when hostCPU == "avr": + include "system/embedded" + else: + include "system/excpt" + # we cannot compile this with stack tracing on # as it would recurse endlessly! include "system/arithm" {.pop.} # stack trace {.pop.} # stack trace - include "system/dyncalls" + when hostOS != "standalone": include "system/dyncalls" include "system/sets" const GenericSeqSize = (2 * sizeof(int)) - proc reprAny(p: pointer, typ: PNimType): string {.compilerRtl.} - proc getDiscriminant(aa: Pointer, n: ptr TNimNode): int = sysAssert(n.kind == nkCase, "getDiscriminant: node != nkCase") var d: int @@ -1918,7 +1921,7 @@ when not defined(EcmaScript) and not defined(NimrodVM): include "system/mmdisp" {.push stack_trace: off.} - include "system/sysstr" + when hostCPU != "avr": include "system/sysstr" {.pop.} include "system/sysio" @@ -1938,18 +1941,19 @@ when not defined(EcmaScript) and not defined(NimrodVM): var res = TaintedString(newStringOfCap(80)) while f.readLine(res): yield TaintedString(res) - include "system/assign" - include "system/repr" + when hostCPU != "avr": + include "system/assign" + include "system/repr" - proc getCurrentException*(): ref E_Base {.compilerRtl, inl.} = - ## retrieves the current exception; if there is none, nil is returned. - result = currException + proc getCurrentException*(): ref E_Base {.compilerRtl, inl.} = + ## retrieves the current exception; if there is none, nil is returned. + result = currException - proc getCurrentExceptionMsg*(): string {.inline.} = - ## retrieves the error message that was attached to the current - ## exception; if there is none, "" is returned. - var e = getCurrentException() - return if e == nil: "" else: e.msg + proc getCurrentExceptionMsg*(): string {.inline.} = + ## retrieves the error message that was attached to the current + ## exception; if there is none, "" is returned. + var e = getCurrentException() + return if e == nil: "" else: e.msg {.push stack_trace: off.} when defined(endb): diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim index 8ffca90fb..2df7fe4ad 100755 --- a/lib/system/excpt.nim +++ b/lib/system/excpt.nim @@ -27,7 +27,7 @@ else: proc writeToStdErr(msg: CString) = discard MessageBoxA(0, msg, nil, 0) -proc registerSignalHandler() {.compilerproc.} +proc registerSignalHandler() proc chckIndx(i, a, b: int): int {.inline, compilerproc.} proc chckRange(i, a, b: int): int {.inline, compilerproc.} diff --git a/lib/system/mmdisp.nim b/lib/system/mmdisp.nim index e8ad23970..1abf3fbbf 100755 --- a/lib/system/mmdisp.nim +++ b/lib/system/mmdisp.nim @@ -181,6 +181,78 @@ when defined(boehmgc): proc deallocOsPages() {.inline.} = nil include "system/cellsets" +elif defined(nogc) and defined(useMalloc): + + when not defined(useNimRtl): + proc alloc(size: int): pointer = + result = cmalloc(size) + if result == nil: raiseOutOfMem() + proc alloc0(size: int): pointer = + result = alloc(size) + zeroMem(result, size) + proc realloc(p: Pointer, newsize: int): pointer = + result = crealloc(p, newsize) + if result == nil: raiseOutOfMem() + proc dealloc(p: Pointer) = cfree(p) + + proc allocShared(size: int): pointer = + result = cmalloc(size) + if result == nil: raiseOutOfMem() + proc allocShared0(size: int): pointer = + result = alloc(size) + zeroMem(result, size) + proc reallocShared(p: Pointer, newsize: int): pointer = + result = crealloc(p, newsize) + if result == nil: raiseOutOfMem() + proc deallocShared(p: Pointer) = cfree(p) + + proc GC_disable() = nil + proc GC_enable() = nil + proc GC_fullCollect() = nil + proc GC_setStrategy(strategy: TGC_Strategy) = nil + proc GC_enableMarkAndSweep() = nil + proc GC_disableMarkAndSweep() = nil + proc GC_getStatistics(): string = return "" + + proc getOccupiedMem(): int = nil + proc getFreeMem(): int = nil + proc getTotalMem(): int = nil + + proc setStackBottom(theStackBottom: pointer) = nil + + proc initGC() = nil + + proc newObj(typ: PNimType, size: int): pointer {.compilerproc.} = + result = alloc(size) + proc newSeq(typ: PNimType, len: int): pointer {.compilerproc.} = + result = newObj(typ, addInt(mulInt(len, typ.base.size), GenericSeqSize)) + cast[PGenericSeq](result).len = len + cast[PGenericSeq](result).reserved = len + + proc growObj(old: pointer, newsize: int): pointer = + result = realloc(old, newsize) + + proc nimGCref(p: pointer) {.compilerproc, inline.} = nil + proc nimGCunref(p: pointer) {.compilerproc, inline.} = nil + + proc unsureAsgnRef(dest: ppointer, src: pointer) {.compilerproc, inline.} = + dest[] = src + proc asgnRef(dest: ppointer, src: pointer) {.compilerproc, inline.} = + dest[] = src + proc asgnRefNoCycle(dest: ppointer, src: pointer) {.compilerproc, inline.} = + dest[] = src + + type + TMemRegion = object {.final, pure.} + + proc Alloc(r: var TMemRegion, size: int): pointer = + result = alloc(size) + proc Alloc0(r: var TMemRegion, size: int): pointer = + result = alloc0(size) + proc Dealloc(r: var TMemRegion, p: Pointer) = Dealloc(p) + proc deallocOsPages(r: var TMemRegion) {.inline.} = nil + proc deallocOsPages() {.inline.} = nil + elif defined(nogc): # Even though we don't want the GC, we cannot simply use C's memory manager # because Nimrod's runtime wants ``realloc`` to zero out the additional diff --git a/lib/system/repr.nim b/lib/system/repr.nim index 2dec8136c..43ac0088f 100755 --- a/lib/system/repr.nim +++ b/lib/system/repr.nim @@ -9,6 +9,8 @@ # The generic ``repr`` procedure. It is an invaluable debugging tool. +proc reprAny(p: pointer, typ: PNimType): string {.compilerRtl.} + proc reprInt(x: int64): string {.compilerproc.} = return $x proc reprFloat(x: float): string {.compilerproc.} = return $x |