Pārlūkot izejas kodu

* more SysV call support stuff for MorphOS

Károly Balogh 20 gadi atpakaļ
vecāks
revīzija
5908985365

+ 42 - 3
compiler/pdecsub.pas

@@ -1206,7 +1206,7 @@ begin
     internalerror(2003042614);
   tprocdef(pd).forwarddef:=false;
 {$ifdef powerpc}
-   if target_info.system in [system_powerpc_morphos,system_m68k_amiga] then
+   if target_info.system in [system_powerpc_morphos] then
     begin
       if idtoken=_LEGACY then
         begin
@@ -1218,11 +1218,32 @@ begin
           consume(_SYSV);
           include(pd.procoptions,po_syscall_sysv);
         end
+      else if idtoken=_BASESYSV then
+        begin
+          consume(_BASESYSV);
+          include(pd.procoptions,po_syscall_basesysv);
+        end 
+      else if idtoken=_SYSVBASE then
+        begin
+          consume(_SYSVBASE);
+          include(pd.procoptions,po_syscall_sysvbase);
+        end
+      else if idtoken=_R12BASE then
+        begin
+          consume(_R12BASE);
+          include(pd.procoptions,po_syscall_r12base);
+        end
       else 
         if syscall_convention='LEGACY' then 
           include(pd.procoptions,po_syscall_legacy)
         else if syscall_convention='SYSV' then
           include(pd.procoptions,po_syscall_sysv)
+        else if syscall_convention='BASESYSV' then
+          include(pd.procoptions,po_syscall_basesysv)
+        else if syscall_convention='SYSVBASE' then
+          include(pd.procoptions,po_syscall_sysvbase)
+        else if syscall_convention='R12BASE' then
+          include(pd.procoptions,po_syscall_r12base)
         else
           internalerror(2005010404);
       
@@ -1243,7 +1264,22 @@ begin
                 end
               else if po_syscall_sysv in tprocdef(pd).procoptions then
                 begin
-                  vs:=tparavarsym.create('$syscalllib',paranr_syscall_sysv,vs_value,tabstractvarsym(sym).vartype,[vo_is_syscall_lib,vo_is_hidden_para]);
+                  { Nothing to be done for sysv here for now, but this might change }
+                end
+              else if po_syscall_basesysv in tprocdef(pd).procoptions then
+                begin
+                  vs:=tparavarsym.create('$syscalllib',paranr_syscall_basesysv,vs_value,tabstractvarsym(sym).vartype,[vo_is_syscall_lib,vo_is_hidden_para]);
+                  pd.parast.insert(vs);
+                end
+              else if po_syscall_sysvbase in tprocdef(pd).procoptions then
+                begin
+                  vs:=tparavarsym.create('$syscalllib',paranr_syscall_sysvbase,vs_value,tabstractvarsym(sym).vartype,[vo_is_syscall_lib,vo_is_hidden_para]);
+                  pd.parast.insert(vs);
+                end
+              else if po_syscall_r12base in tprocdef(pd).procoptions then
+                begin
+                  vs:=tparavarsym.create('$syscalllib',paranr_syscall_r12base,vs_value,tabstractvarsym(sym).vartype,[vo_is_syscall_lib,vo_is_hidden_para,vo_has_explicit_paraloc]);
+                  paramanager.parseparaloc(vs,'R12');
                   pd.parast.insert(vs);
                 end
               else
@@ -2372,7 +2408,10 @@ const
 end.
 {
   $Log$
-  Revision 1.224  2005-01-05 02:31:06  karoly
+  Revision 1.225  2005-01-06 02:13:03  karoly
+    * more SysV call support stuff for MorphOS
+
+  Revision 1.224  2005/01/05 02:31:06  karoly
     * fixed SysV syscall support (MorphOS)
 
   Revision 1.223  2005/01/04 17:40:33  karoly

+ 12 - 1
compiler/powerpc/cpupara.pas

@@ -611,6 +611,14 @@ unit cpupara;
                 paraloc^.reference.offset:=56
               { 'A7' is the stack pointer on 68k, can't be overwritten
                 by API calls, so it has no offset }
+              { 'R12' is special, used internally to support r12base sysv 
+                calling convention }
+              else if s='R12' then
+                begin
+                  paraloc^.loc:=LOC_REGISTER;
+                  paraloc^.size:=OS_ADDR;
+                  paraloc^.register:=NR_R12;
+                end
               else
                 exit;
 
@@ -629,7 +637,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.78  2005-01-05 19:01:53  karoly
+  Revision 1.79  2005-01-06 02:13:03  karoly
+    * more SysV call support stuff for MorphOS
+
+  Revision 1.78  2005/01/05 19:01:53  karoly
     * sysv abi also uses F0-F13 as volatile registers
 
   Revision 1.77  2004/12/24 15:00:11  jonas

+ 34 - 5
compiler/powerpc/nppccal.pas

@@ -75,14 +75,40 @@ implementation
         case target_info.system of
           system_powerpc_morphos:
             begin
-              if po_syscall_sysv in tprocdef(procdefinition).procoptions then
+              if (po_syscall_sysv in tprocdef(procdefinition).procoptions) or 
+                (po_syscall_sysvbase in tprocdef(procdefinition).procoptions) then
                 begin
                   cg.getcpuregister(exprasmlist,NR_R0);
                   cg.getcpuregister(exprasmlist,NR_R31);
-                    
-                  exprasmlist.concat(taicpu.op_reg_reg_const(A_ADDI,NR_R31,NR_R3,-tprocdef(procdefinition).extnumber));
+                  
                   reference_reset(tmpref);
-                  tmpref.base := NR_R31;
+                  tmpref.symbol:=objectlibrary.newasmsymbol(tglobalvarsym(tprocdef(procdefinition).libsym).mangledname,AB_EXTERNAL,AT_DATA);
+                  tmpref.refaddr:=addr_hi;
+                  exprasmlist.concat(taicpu.op_reg_ref(A_LIS,NR_R31,tmpref));
+                  tmpref.base:=NR_R31;
+                  tmpref.refaddr:=addr_lo;
+                  exprasmlist.concat(taicpu.op_reg_ref(A_LWZ,NR_R31,tmpref));
+
+                  exprasmlist.concat(taicpu.op_reg_reg_const(A_ADDI,NR_R31,NR_R31,-tprocdef(procdefinition).extnumber));
+                  reference_reset_base(tmpref,NR_R31,0);
+                  exprasmlist.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
+                  exprasmlist.concat(taicpu.op_reg(A_MTCTR,NR_R0));
+                  exprasmlist.concat(taicpu.op_none(A_BCTRL));
+
+                  cg.ungetcpuregister(exprasmlist,NR_R31);
+                  cg.ungetcpuregister(exprasmlist,NR_R0);
+                end
+              else if (po_syscall_basesysv in tprocdef(procdefinition).procoptions) or 
+                (po_syscall_r12base in tprocdef(procdefinition).procoptions) then
+                begin
+                  cg.getcpuregister(exprasmlist,NR_R0);
+                  cg.getcpuregister(exprasmlist,NR_R31);
+                  
+                  if (po_syscall_basesysv in tprocdef(procdefinition).procoptions) then
+                    exprasmlist.concat(taicpu.op_reg_reg_const(A_ADDI,NR_R31,NR_R3,-tprocdef(procdefinition).extnumber))
+                  else 
+                    exprasmlist.concat(taicpu.op_reg_reg_const(A_ADDI,NR_R31,NR_R12,-tprocdef(procdefinition).extnumber));
+                  reference_reset_base(tmpref,NR_R31,0);
                   exprasmlist.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
                   exprasmlist.concat(taicpu.op_reg(A_MTCTR,NR_R0));
                   exprasmlist.concat(taicpu.op_none(A_BCTRL));
@@ -121,7 +147,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.33  2005-01-05 02:31:06  karoly
+  Revision 1.34  2005-01-06 02:13:03  karoly
+    * more SysV call support stuff for MorphOS
+
+  Revision 1.33  2005/01/05 02:31:06  karoly
     * fixed SysV syscall support (MorphOS)
 
   Revision 1.32  2005/01/04 17:40:33  karoly

+ 6 - 2
compiler/scandir.pas

@@ -886,7 +886,8 @@ implementation
         current_scanner.skipspace;
         
         sctype:=current_scanner.readid;
-        if (sctype='LEGACY') or (sctype='SYSV') then
+        if (sctype='LEGACY') or (sctype='SYSV') or (sctype='SYSVBASE') or
+          (sctype='BASESYSV') or (sctype='R12BASE') then
           syscall_convention:=sctype
         else
           comment (V_Warning,'Invalid Syscall directive ignored.');
@@ -1169,7 +1170,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.49  2005-01-04 17:40:33  karoly
+  Revision 1.50  2005-01-06 02:13:03  karoly
+    * more SysV call support stuff for MorphOS
+
+  Revision 1.49  2005/01/04 17:40:33  karoly
     + sysv style syscalls added for MorphOS
 
   Revision 1.48  2005/01/04 16:18:57  florian

+ 13 - 4
compiler/symconst.pas

@@ -106,7 +106,10 @@ const
   paranr_result = 2;
   paranr_self = 3;
   paranr_vmt = 4;
-  paranr_syscall_sysv     = 9;
+  { Required to support variations of syscalls on MorphOS }
+  paranr_syscall_basesysv = 9;
+  paranr_syscall_sysvbase = high(word)-4;
+  paranr_syscall_r12base  = high(word)-3;
   paranr_syscall_legacy   = high(word)-2;
   paranr_result_leftright = high(word)-1;
 
@@ -251,9 +254,12 @@ type
     po_forward,
     po_global,
     po_has_inlininginfo,
-    { The two different kind of syscalls on MorphOS }
+    { The different kind of syscalls on MorphOS }
     po_syscall_legacy,
-    po_syscall_sysv  
+    po_syscall_sysv,
+    po_syscall_basesysv,
+    po_syscall_sysvbase,
+    po_syscall_r12base
   );
   tprocoptions=set of tprocoption;
 
@@ -433,7 +439,10 @@ initialization
 end.
 {
   $Log$
-  Revision 1.98  2005-01-05 02:31:06  karoly
+  Revision 1.99  2005-01-06 02:13:03  karoly
+    * more SysV call support stuff for MorphOS
+
+  Revision 1.98  2005/01/05 02:31:06  karoly
     * fixed SysV syscall support (MorphOS)
 
   Revision 1.97  2005/01/04 17:40:33  karoly

+ 12 - 3
compiler/tokens.pas

@@ -182,12 +182,14 @@ type
     _MESSAGE,
     _PRIVATE,
     _PROGRAM,
+    _R12BASE,
     _STDCALL,
     _SYSCALL,
     _VARARGS,
     _VIRTUAL,
     _ABSOLUTE,
     _ABSTRACT,
+    _BASESYSV,
     _CONTINUE,
     _CPPCLASS,
     _EXTERNAL,
@@ -201,6 +203,7 @@ type
     _REGISTER,
     _RESIDENT,
     _SAFECALL,
+    _SYSVBASE,
     _ASSEMBLER,
     _INHERITED,
     _INTERFACE,
@@ -362,7 +365,7 @@ const
       (str:'NEAR'          ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'READ'          ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'SELF'          ;special:false;keyword:m_none;op:NOTOKEN), {set inside methods only PM }
-      (str:'SYSV'          ;special:false;keyword:m_none;op:NOTOKEN),
+      (str:'SYSV'          ;special:false;keyword:m_none;op:NOTOKEN),   { Syscall variation on MorphOS }
       (str:'THEN'          ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'TRUE'          ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'TYPE'          ;special:false;keyword:m_all;op:NOTOKEN),
@@ -390,7 +393,7 @@ const
       (str:'EXCEPT'        ;special:false;keyword:m_class;op:NOTOKEN),
       (str:'EXPORT'        ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'INLINE'        ;special:false;keyword:m_none;op:NOTOKEN),
-      (str:'LEGACY'        ;special:false;keyword:m_none;op:NOTOKEN),
+      (str:'LEGACY'        ;special:false;keyword:m_none;op:NOTOKEN),   { Syscall variation on MorphOS }
       (str:'OBJECT'        ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'PACKED'        ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'PASCAL'        ;special:false;keyword:m_none;op:NOTOKEN),
@@ -414,12 +417,14 @@ const
       (str:'MESSAGE'       ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'PRIVATE'       ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'PROGRAM'       ;special:false;keyword:m_all;op:NOTOKEN),
+      (str:'R12BASE'       ;special:false;keyword:m_none;op:NOTOKEN),   { Syscall variation on MorphOS }
       (str:'STDCALL'       ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'SYSCALL'       ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'VARARGS'       ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'VIRTUAL'       ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'ABSOLUTE'      ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'ABSTRACT'      ;special:false;keyword:m_none;op:NOTOKEN),
+      (str:'BASESYSV'      ;special:false;keyword:m_none;op:NOTOKEN),   { Syscall variation on MorphOS }
       (str:'CONTINUE'      ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'CPPCLASS'      ;special:false;keyword:m_fpc;op:NOTOKEN),
       (str:'EXTERNAL'      ;special:false;keyword:m_none;op:NOTOKEN),
@@ -433,6 +438,7 @@ const
       (str:'REGISTER'      ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'RESIDENT'      ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'SAFECALL'      ;special:false;keyword:m_none;op:NOTOKEN),
+      (str:'SYSVBASE'      ;special:false;keyword:m_none;op:NOTOKEN),   { Syscall variation on MorphOS }
       (str:'ASSEMBLER'     ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'INHERITED'     ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'INTERFACE'     ;special:false;keyword:m_all;op:NOTOKEN),
@@ -523,7 +529,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.34  2005-01-04 19:22:33  olle
+  Revision 1.35  2005-01-06 02:13:03  karoly
+    * more SysV call support stuff for MorphOS
+
+  Revision 1.34  2005/01/04 19:22:33  olle
     * sorted in correctly new tokens added by Karoly
 
   Revision 1.33  2005/01/04 17:40:33  karoly