summary refs log blame commit diff stats
path: root/nim/platform.pas
blob: c2fa711b9f1d538c96c604d618da82af62631f26 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14


                                
                                          









                                                                             
                                                 









                       
                                                                      












                                
          





              
             

                 








                                                            
                          

                   
                    
                      











                                                                  
   

                 
                      
                      









                                      
   

                    
                      
                      









                                      
   

                 
                      
                      









                                      
   

                  
                        
                      









                                         
   

                    
                        
                      









                                         
   

                  
                        
                      









                                         
   

                    
                        
                      









                                         
   

                 
                        
                      









                                         
   

                   
                        
                      









                                         
   

                    
                        
                      









                                         
   

                    
                        
                      









                                         
   

                 
                        
                      







                     

                                         
   

                   
                        
                      









                               
   

                 
                        
                      









                                         
   

                  
                          
                      









                               
   

                  
                      
                      









                               
   

                    
                      
                      









                                      
   

                  
                     
                      









                                      
   

                   
                           
                      

                    
                    





                                         



                       
                        
                      








                     



                     
                        
                      








                     



                











                                                                           
           

                  


                                      
                           













































































                                                                         






                       






                      
























































                                                                              
                                              
      
                                             

































































































                                                          
//
//
//           The Nimrod Compiler
//        (c) Copyright 2009 Andreas Rumpf
//
//    See the file "copying.txt", included in this
//    distribution, for details about the copyright.
//
unit platform;

// 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!

interface

{$include 'config.inc'}

uses
  nsystem, strutils;

type
  TSystemOS = (
    // 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 = (
    ospNeedsPIC,        // OS needs PIC for libraries
    ospCaseInsensitive, // OS filesystem is case insensitive
    ospPosix            // OS is posix-like
  );

  TInfoOSProps = set of TInfoOSProp;
  TInfoOS = record{@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;
  end;
const
  OS: array [succ(low(TSystemOS))..high(TSystemOS)] of TInfoOS = (
  (
    name: 'DOS';
    parDir: '..';
    dllFrmt: '$1.dll';
    altDirSep: '/'+'';
    objExt: '.obj';
    newLine: #13#10;
    pathSep: ';'+'';
    dirSep: '\'+'';
    scriptExt: '.bat';
    curDir: '.'+'';
    exeExt: '.exe';
    extSep: '.'+'';
    props: {@set}[ospCaseInsensitive];
  ),
  (
    name: 'Windows';
    parDir: '..';
    dllFrmt: '$1.dll';
    altDirSep: '/'+'';
    objExt: '.obj';
    newLine: #13#10;
    pathSep: ';'+'';
    dirSep: '\'+'';
    scriptExt: '.bat';
    curDir: '.'+'';
    exeExt: '.exe';
    extSep: '.'+'';
    props: {@set}[ospCaseInsensitive];
  ),
  (
    name: 'OS2';
    parDir: '..';
    dllFrmt: '$1.dll';
    altDirSep: '/'+'';
    objExt: '.obj';
    newLine: #13#10;
    pathSep: ';'+'';
    dirSep: '\'+'';
    scriptExt: '.bat';
    curDir: '.'+'';
    exeExt: '.exe';
    extSep: '.'+'';
    props: {@set}[ospCaseInsensitive];
  ),
  (
    name: 'Linux';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'MorphOS';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'SkyOS';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'Solaris';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'Irix';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'NetBSD';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'FreeBSD';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'OpenBSD';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'AIX';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'PalmOS';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC];
  ),
  (
    name: 'QNX';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'Amiga';
    parDir: '..';
    dllFrmt: '$1.library';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC];
  ),
  (
    name: 'Atari';
    parDir: '..';
    dllFrmt: '$1.dll';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '';
    curDir: '.'+'';
    exeExt: '.tpp';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC];
  ),
  (
    name: 'Netware';
    parDir: '..';
    dllFrmt: '$1.nlm';
    altDirSep: '/'+'';
    objExt: '';
    newLine: #13#10;
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '.nlm';
    extSep: '.'+'';
    props: {@set}[ospCaseInsensitive];
  ),
  (
    name: 'MacOS';
    parDir: '::';
    dllFrmt: '$1Lib';
    altDirSep: ':'+'';
    objExt: '.o';
    newLine: #13+'';
    pathSep: ','+'';
    dirSep: ':'+'';
    scriptExt: '';
    curDir: ':'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospCaseInsensitive];
  ),
  (
    name: 'MacOSX';
    parDir: '..';
    dllFrmt: 'lib$1.dylib';
    altDirSep: ':'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[ospNeedsPIC, ospPosix];
  ),
  (
    name: 'EcmaScript';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[];
  ),
  (
    name: 'NimrodVM';
    parDir: '..';
    dllFrmt: 'lib$1.so';
    altDirSep: '/'+'';
    objExt: '.o';
    newLine: #10+'';
    pathSep: ':'+'';
    dirSep: '/'+'';
    scriptExt: '.sh';
    curDir: '.'+'';
    exeExt: '';
    extSep: '.'+'';
    props: {@set}[];
  )
);
type
  TSystemCPU = (
    // 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 = (littleEndian, bigEndian);
  TInfoCPU = record{@tuple}
    name: string;
    intSize: int;
    endian: TEndian;
    floatSize: int;
    bit: int;
  end;
const
  EndianToStr: array [TEndian] of string = ('littleEndian', 'bigEndian');
  CPU: array [succ(low(TSystemCPU))..high(TSystemCPU)] of 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;

function NameToOS(const name: string): TSystemOS;
function NameToCPU(const name: string): TSystemCPU;

var
  IntSize: int;
  floatSize: int;
  PtrSize: int;
  tnl: string; // target newline

procedure setTarget(o: TSystemOS; c: TSystemCPU);

implementation

procedure setTarget(o: TSystemOS; c: TSystemCPU);
begin
  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;
end;

function NameToOS(const name: string): TSystemOS;
var
  i: TSystemOS;
begin
  for i := succ(osNone) to high(TSystemOS) do
    if cmpIgnoreStyle(name, OS[i].name) = 0 then begin
      result := i; exit
    end;
  result := osNone
end;

function NameToCPU(const name: string): TSystemCPU;
var
  i: TSystemCPU;
begin
  for i := succ(cpuNone) to high(TSystemCPU) do
    if cmpIgnoreStyle(name, CPU[i].name) = 0 then begin
      result := i; exit
    end;
  result := cpuNone
end;

// this is Ok for the Pascal version, but the Nimrod version needs a different
// mechanism
{@emit
procedure nimCPU(): cstring; importc; noconv;}
{@emit
procedure nimOS(): cstring; importc; noconv;}

{@ignore}
initialization
{$ifdef i386}
  hostCPU := cpuI386;
{$endif}
{$ifdef m68k}
  hostCPU := cpuM68k;
{$endif}
{$ifdef alpha}
  hostCPU := cpuAlpha;
{$endif}
{$ifdef powerpc}
  hostCPU := cpuPowerpc;
{$endif}
{$ifdef sparc}
  hostCPU := cpuSparc;
{$endif}
{$ifdef vm}
  hostCPU := cpuVm;
{$endif}
{$ifdef ia64}
  hostCPU := cpuIa64;
{$endif}
{$ifdef amd64}
  hostCPU := cpuAmd64;
{$endif}
{$ifdef mips}
  hostCPU := cpuMips;
{$endif}
{$ifdef arm}
  hostCPU := cpuArm;
{$endif}
{$ifdef DOS}
  hostOS := osDOS;
{$endif}
{$ifdef Windows}
  hostOS := osWindows;
{$endif}
{$ifdef OS2}
  hostOS := osOS2;
{$endif}
{$ifdef Linux}
  hostOS := osLinux;
{$endif}
{$ifdef MorphOS}
  hostOS := osMorphOS;
{$endif}
{$ifdef SkyOS}
  hostOS := osSkyOS;
{$endif}
{$ifdef Solaris}
  hostOS := osSolaris;
{$endif}
{$ifdef Irix}
  hostOS := osIrix;
{$endif}
{$ifdef NetBSD}
  hostOS := osNetBSD;
{$endif}
{$ifdef FreeBSD}
  hostOS := osFreeBSD;
{$endif}
{$ifdef OpenBSD}
  hostOS := osOpenBSD;
{$endif}
{$ifdef PalmOS}
  hostOS := osPalmOS;
{$endif}
{$ifdef QNX}
  hostOS := osQNX;
{$endif}
{$ifdef Amiga}
  hostOS := osAmiga;
{$endif}
{$ifdef Atari}
  hostOS := osAtari;
{$endif}
{$ifdef Netware}
  hostOS := osNetware;
{$endif}
{$ifdef MacOS}
  hostOS := osMacOS;
{$endif}
{$ifdef MacOSX}
  hostOS := osMacOSX;
{$endif}
{$ifdef darwin} // BUGFIX
  hostOS := osMacOSX;
{$endif}
{@emit
  hostCPU := nameToCPU(toString(nimCPU()));
}
{@emit
  hostOS := nameToOS(toString(nimOS()));
}
  setTarget(hostOS, hostCPU); // assume no cross-compiling
end.