summary refs log tree commit diff stats
path: root/rod/platform.nim
diff options
context:
space:
mode:
Diffstat (limited to 'rod/platform.nim')
-rwxr-xr-xrod/platform.nim212
1 files changed, 212 insertions, 0 deletions
diff --git a/rod/platform.nim b/rod/platform.nim
new file mode 100755
index 000000000..6e747014d
--- /dev/null
+++ b/rod/platform.nim
@@ -0,0 +1,212 @@
+#
+#
+#           The Nimrod Compiler
+#        (c) Copyright 2009 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+# This module contains data about the different processors
+# and operating systems.
+# Note: Unfortunately if an OS or CPU is listed here this does not mean that
+# Nimrod has been tested on this platform or that the RTL has been ported.
+# Feel free to test for your excentric platform!
+
+import 
+  strutils
+
+type 
+  TSystemOS* = enum # Also add OS in initialization section and alias
+                    # 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
+
+type 
+  TInfoOSProp* = enum 
+    ospNeedsPIC,              # OS needs PIC for libraries
+    ospCaseInsensitive,       # OS filesystem is case insensitive
+    ospPosix                  # OS is posix-like
+  TInfoOSProps* = set[TInfoOSProp]
+  TInfoOS* = tuple[name: string, parDir: string, dllFrmt: string, 
+                   altDirSep: string, objExt: string, newLine: string, 
+                   pathSep: string, dirSep: string, scriptExt: string, 
+                   curDir: string, exeExt: string, extSep: string, 
+                   props: TInfoOSProps]
+
+const 
+  OS*: array[succ(low(TSystemOS))..high(TSystemOS), TInfoOS] = [
+     (name: "DOS", 
+      parDir: "..", dllFrmt: "$1.dll", altDirSep: "/", objExt: ".obj", 
+      newLine: "\x0D\x0A", pathSep: ";", dirSep: "\\", scriptExt: ".bat", 
+      curDir: ".", exeExt: ".exe", extSep: ".", props: {ospCaseInsensitive}), 
+     (name: "Windows", parDir: "..", dllFrmt: "$1.dll", altDirSep: "/", 
+      objExt: ".obj", newLine: "\x0D\x0A", pathSep: ";", dirSep: "\\", 
+      scriptExt: ".bat", curDir: ".", exeExt: ".exe", extSep: ".", 
+      props: {ospCaseInsensitive}), 
+     (name: "OS2", parDir: "..", 
+      dllFrmt: "$1.dll", altDirSep: "/", 
+      objExt: ".obj", newLine: "\x0D\x0A", 
+      pathSep: ";", dirSep: "\\", 
+      scriptExt: ".bat", curDir: ".", 
+      exeExt: ".exe", extSep: ".", 
+      props: {ospCaseInsensitive}), 
+     (name: "Linux", parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC, ospPosix}), 
+     (name: "MorphOS", parDir: "..", 
+      dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", 
+      pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", 
+      exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC, ospPosix}), 
+     (name: "SkyOS", parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC, ospPosix}), 
+     (name: "Solaris", parDir: "..", 
+      dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", 
+      pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", 
+      exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC, ospPosix}), 
+     (name: "Irix", parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC, ospPosix}), 
+     (name: "NetBSD", parDir: "..", 
+      dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", 
+      pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", 
+      exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC, ospPosix}), 
+     (name: "FreeBSD", parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC, ospPosix}), 
+     (name: "OpenBSD", parDir: "..", 
+      dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", 
+      pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", 
+      exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC, ospPosix}), 
+     (name: "AIX", parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC, ospPosix}), 
+     (name: "PalmOS", parDir: "..", 
+      dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", 
+      pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", 
+      exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC}), 
+     (name: "QNX", 
+      parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/", objExt: ".o", 
+      newLine: "\x0A", pathSep: ":", dirSep: "/", scriptExt: ".sh", curDir: ".", 
+      exeExt: "", extSep: ".", props: {ospNeedsPIC, ospPosix}), 
+     (name: "Amiga", 
+      parDir: "..", dllFrmt: "$1.library", altDirSep: "/", objExt: ".o", 
+      newLine: "\x0A", pathSep: ":", dirSep: "/", scriptExt: ".sh", curDir: ".", 
+      exeExt: "", extSep: ".", props: {ospNeedsPIC}), 
+     (name: "Atari", 
+      parDir: "..", dllFrmt: "$1.dll", altDirSep: "/", objExt: ".o", 
+      newLine: "\x0A", pathSep: ":", dirSep: "/", scriptExt: "", curDir: ".", 
+      exeExt: ".tpp", extSep: ".", props: {ospNeedsPIC}), 
+     (name: "Netware", 
+      parDir: "..", dllFrmt: "$1.nlm", altDirSep: "/", objExt: "", 
+      newLine: "\x0D\x0A", pathSep: ":", dirSep: "/", scriptExt: ".sh", 
+      curDir: ".", exeExt: ".nlm", extSep: ".", props: {ospCaseInsensitive}), 
+     (name: "MacOS", parDir: "::", dllFrmt: "$1Lib", altDirSep: ":", 
+      objExt: ".o", newLine: "\x0D", pathSep: ",", dirSep: ":", scriptExt: "", 
+      curDir: ":", exeExt: "", extSep: ".", props: {ospCaseInsensitive}), 
+     (name: "MacOSX", parDir: "..", dllFrmt: "lib$1.dylib", altDirSep: ":", 
+      objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", exeExt: "", extSep: ".", 
+      props: {ospNeedsPIC, ospPosix}), 
+     (name: "EcmaScript", parDir: "..", 
+      dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", 
+      pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", 
+      exeExt: "", extSep: ".", props: {}), 
+     (name: "NimrodVM", parDir: "..", dllFrmt: "lib$1.so", altDirSep: "/", 
+      objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/", 
+      scriptExt: ".sh", curDir: ".", exeExt: "", 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, cpuSparc, cpuVm, cpuIa64, 
+    cpuAmd64, cpuMips, cpuArm, cpuEcmaScript, cpuNimrodVM
+
+type 
+  TEndian* = enum 
+    littleEndian, bigEndian
+  TInfoCPU* = tuple[name: string, intSize: int, endian: TEndian, floatSize: int, 
+                    bit: int]
+
+const 
+  EndianToStr*: array[TEndian, string] = ["littleEndian", "bigEndian"]
+  CPU*: array[succ(low(TSystemCPU))..high(TSystemCPU), TInfoCPU] = [
+    (name: "i386", intSize: 32, endian: littleEndian, floatSize: 64, bit: 32), 
+    (name: "m68k", intSize: 32, endian: bigEndian, floatSize: 64, bit: 32), 
+    (name: "alpha", intSize: 64, endian: littleEndian, floatSize: 64, bit: 64), 
+    (name: "powerpc", intSize: 32, endian: bigEndian, floatSize: 64, bit: 32), 
+    (name: "sparc", intSize: 32, endian: bigEndian, floatSize: 64, bit: 32), 
+    (name: "vm", intSize: 32, endian: littleEndian, floatSize: 64, bit: 32), 
+    (name: "ia64", intSize: 64, endian: littleEndian, floatSize: 64, bit: 64), 
+    (name: "amd64", intSize: 64, endian: littleEndian, floatSize: 64, bit: 64), 
+    (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)]
+
+var 
+  targetCPU*, hostCPU*: TSystemCPU
+  targetOS*, hostOS*: TSystemOS
+
+proc NameToOS*(name: string): TSystemOS
+proc NameToCPU*(name: string): TSystemCPU
+
+var 
+  IntSize*: int
+  floatSize*: int
+  PtrSize*: int
+  tnl*: string                # target newline
+
+proc setTarget*(o: TSystemOS, c: TSystemCPU) = 
+  assert(c != cpuNone)
+  assert(o != osNone)
+  targetCPU = c
+  targetOS = o
+  intSize = cpu[c].intSize div 8
+  floatSize = cpu[c].floatSize div 8
+  ptrSize = cpu[c].bit div 8
+  tnl = os[o].newLine
+
+proc NameToOS(name: string): TSystemOS = 
+  for i in countup(succ(osNone), high(TSystemOS)): 
+    if cmpIgnoreStyle(name, OS[i].name) == 0: 
+      return i
+  result = osNone
+
+proc NameToCPU(name: string): TSystemCPU = 
+  for i in countup(succ(cpuNone), high(TSystemCPU)): 
+    if cmpIgnoreStyle(name, CPU[i].name) == 0: 
+      return i
+  result = cpuNone
+
+proc nimCPU(): cstring{.importc, noconv.}
+proc nimOS(): cstring{.importc, noconv.}
+
+hostCPU = nameToCPU($(nimCPU()))
+hostOS = nameToOS($(nimOS()))
+setTarget(hostOS, hostCPU) # assume no cross-compiling
+