Browse Source

* use pocalls_cdecl and cstylearrayofconst more consistently instead of
ad hoc set constants containing varying number cdecl-like calling
conventions
o added pocall_sysv_abi_cdecl and pocall_ms_abi_cdecl to cstylearrayofconst
o also allow C-style blocks with mwpascal instead of cdecl (mwpascal = cdecl
with "const" = "constref" for record parameters)
o did not touch cases related to name mangling and import/export names,
because those are a real mess and easily break things left and right :/

git-svn-id: trunk@35479 -

Jonas Maebe 8 years ago
parent
commit
4c68ea1000

+ 1 - 1
compiler/arm/cpupara.pas

@@ -132,7 +132,7 @@ unit cpupara;
               if ((target_info.abi=abi_eabihf) or (calloption=pocall_hardfloat)) and
               if ((target_info.abi=abi_eabihf) or (calloption=pocall_hardfloat)) and
                  (not isvariadic) then
                  (not isvariadic) then
                 getparaloc:=LOC_MMREGISTER
                 getparaloc:=LOC_MMREGISTER
-              else if (calloption in [pocall_cdecl,pocall_cppdecl,pocall_softfloat]) or
+              else if (calloption in cdecl_pocalls) or
                  (cs_fp_emulation in current_settings.moduleswitches) or
                  (cs_fp_emulation in current_settings.moduleswitches) or
                  (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv4,fpu_vfpv3_d16,fpu_fpv4_s16]) then
                  (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv4,fpu_vfpv3_d16,fpu_fpv4_s16]) then
                 { the ARM eabi also allows passing VFP values via VFP registers,
                 { the ARM eabi also allows passing VFP values via VFP registers,

+ 1 - 1
compiler/globtype.pas

@@ -575,7 +575,7 @@ interface
        pocall_default = pocall_stdcall;
        pocall_default = pocall_stdcall;
 {$endif}
 {$endif}
 
 
-       cstylearrayofconst = [pocall_cdecl,pocall_cppdecl,pocall_mwpascal];
+       cstylearrayofconst = [pocall_cdecl,pocall_cppdecl,pocall_mwpascal,pocall_sysv_abi_cdecl,pocall_ms_abi_cdecl];
 
 
        modeswitchstr : array[tmodeswitch] of string[18] = ('',
        modeswitchstr : array[tmodeswitch] of string[18] = ('',
          '','','','','','','',
          '','','','','','','',

+ 2 - 2
compiler/i386/cpupara.pas

@@ -104,7 +104,7 @@ unit cpupara;
                       only records of a size of 1,2 or 4 bytes in FUNCTION_RETURN_REG }
                       only records of a size of 1,2 or 4 bytes in FUNCTION_RETURN_REG }
                     if ((pd.proccalloption in [pocall_stdcall,pocall_register]) and
                     if ((pd.proccalloption in [pocall_stdcall,pocall_register]) and
                         (def.size in [1,2,4])) or
                         (def.size in [1,2,4])) or
-                       ((pd.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
+                       ((pd.proccalloption in cdecl_pocalls) and
                         (def.size>0) and
                         (def.size>0) and
                         (def.size<=8)) then
                         (def.size<=8)) then
                      begin
                      begin
@@ -121,7 +121,7 @@ unit cpupara;
                 recorddef :
                 recorddef :
                   begin
                   begin
                     { EMX port of GCC returns small records in the FUNCTION_RETURN_REG up to 4 bytes in registers. }
                     { EMX port of GCC returns small records in the FUNCTION_RETURN_REG up to 4 bytes in registers. }
-                    if ((pd.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
+                    if ((pd.proccalloption in cdecl_pocalls) and
                         (def.size>0) and
                         (def.size>0) and
                         (def.size<=4)) then
                         (def.size<=4)) then
                      begin
                      begin

+ 2 - 1
compiler/mips/ncpucall.pas

@@ -38,6 +38,7 @@ implementation
 
 
 uses
 uses
   globtype,cpubase,procinfo,
   globtype,cpubase,procinfo,
+  symconst,
   aasmtai,aasmcpu,aasmdata,
   aasmtai,aasmcpu,aasmdata,
   paramgr,
   paramgr,
   ncal;
   ncal;
@@ -47,7 +48,7 @@ begin
   pass_1 := inherited pass_1;
   pass_1 := inherited pass_1;
   if assigned(current_procinfo) and
   if assigned(current_procinfo) and
      assigned(procdefinition) and
      assigned(procdefinition) and
-     (procdefinition.proccalloption=pocall_cdecl) then
+     (procdefinition.proccalloption in cdecl_pocalls) then
     include(current_procinfo.flags,pi_needs_got);
     include(current_procinfo.flags,pi_needs_got);
 end;
 end;
 
 

+ 1 - 1
compiler/pdecl.pas

@@ -839,7 +839,7 @@ implementation
                            else
                            else
                              begin
                              begin
                                if (po_hascallingconvention in tprocvardef(hdef).procoptions) and
                                if (po_hascallingconvention in tprocvardef(hdef).procoptions) and
-                                  (tprocvardef(hdef).proccalloption=pocall_cdecl) then
+                                  (tprocvardef(hdef).proccalloption in [pocall_cdecl,pocall_mwpascal]) then
                                  begin
                                  begin
                                    include(tprocvardef(hdef).procoptions,po_is_block);
                                    include(tprocvardef(hdef).procoptions,po_is_block);
                                    { can't check yet whether the parameter types
                                    { can't check yet whether the parameter types

+ 2 - 2
compiler/pdecsub.pas

@@ -3234,7 +3234,7 @@ const
                          { for objcclasses this is checked later, because the entire
                          { for objcclasses this is checked later, because the entire
                            class may be external.  }
                            class may be external.  }
                          is_objc_class_or_protocol(tprocdef(pd).struct)) and
                          is_objc_class_or_protocol(tprocdef(pd).struct)) and
-                     not(pd.proccalloption in (cdecl_pocalls + [pocall_mwpascal,pocall_stdcall])) then
+                     not(pd.proccalloption in (cdecl_pocalls + [pocall_stdcall])) then
                     Message(parser_e_varargs_need_cdecl_and_external);
                     Message(parser_e_varargs_need_cdecl_and_external);
                 end
                 end
                else
                else
@@ -3242,7 +3242,7 @@ const
                   { both must be defined now }
                   { both must be defined now }
                   if not((po_external in pd.procoptions) or
                   if not((po_external in pd.procoptions) or
                          (pd.typ=procvardef)) or
                          (pd.typ=procvardef)) or
-                     not(pd.proccalloption in (cdecl_pocalls + [pocall_mwpascal,pocall_stdcall])) then
+                     not(pd.proccalloption in (cdecl_pocalls + [pocall_stdcall])) then
                     Message(parser_e_varargs_need_cdecl_and_external);
                     Message(parser_e_varargs_need_cdecl_and_external);
                 end;
                 end;
              end;
              end;

+ 1 - 1
compiler/powerpc/cpupara.pas

@@ -220,7 +220,7 @@ unit cpupara;
               not(target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) or
               not(target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin]) or
               ((varspez = vs_const) and
               ((varspez = vs_const) and
                ((calloption = pocall_mwpascal) or
                ((calloption = pocall_mwpascal) or
-                (not (calloption in [pocall_cdecl,pocall_cppdecl]) and
+                (not (calloption in cdecl_pocalls) and
                  (def.size > 8)
                  (def.size > 8)
                 )
                 )
                )
                )

+ 3 - 3
compiler/powerpc64/cpupara.pas

@@ -185,7 +185,7 @@ begin
         (varspez = vs_const) and
         (varspez = vs_const) and
         (
         (
          (
          (
-          (not (calloption in [pocall_cdecl, pocall_cppdecl]) and
+          (not (calloption in cdecl_pocalls) and
           (def.size > 8))
           (def.size > 8))
          ) or
          ) or
          (calloption = pocall_mwpascal)
          (calloption = pocall_mwpascal)
@@ -371,7 +371,7 @@ begin
     end;
     end;
 
 
     { currently only support C-style array of const }
     { currently only support C-style array of const }
-    if (p.proccalloption in [pocall_cdecl, pocall_cppdecl]) and
+    if (p.proccalloption in cstylearrayofconst) and
       is_array_of_const(hp.vardef) then begin
       is_array_of_const(hp.vardef) then begin
       paraloc := hp.paraloc[side].add_location;
       paraloc := hp.paraloc[side].add_location;
       { hack: the paraloc must be valid, but is not actually used }
       { hack: the paraloc must be valid, but is not actually used }
@@ -744,7 +744,7 @@ begin
 
 
   result := create_paraloc_info_intern(p, callerside, p.paras, curintreg,
   result := create_paraloc_info_intern(p, callerside, p.paras, curintreg,
     curfloatreg, curmmreg, cur_stack_offset, false);
     curfloatreg, curmmreg, cur_stack_offset, false);
-  if (p.proccalloption in [pocall_cdecl, pocall_cppdecl, pocall_mwpascal]) then begin
+  if (p.proccalloption in cstylearrayofconst) then begin
     { just continue loading the parameters in the registers }
     { just continue loading the parameters in the registers }
     result := create_paraloc_info_intern(p, callerside, varargspara, curintreg,
     result := create_paraloc_info_intern(p, callerside, varargspara, curintreg,
       curfloatreg, curmmreg, cur_stack_offset, true);
       curfloatreg, curmmreg, cur_stack_offset, true);