فهرست منبع

* set tcgpara.vardef when creating parameter info

git-svn-id: trunk@21693 -
Jonas Maebe 13 سال پیش
والد
کامیت
c3ea451aea

+ 4 - 2
compiler/arm/cpupara.pas

@@ -358,7 +358,7 @@ unit cpupara;
 
             if push_addr_param(hp.varspez,paradef,p.proccalloption) then
               begin
-                paradef:=voidpointertype;
+                paradef:=getpointerdef(paradef);
                 loc:=LOC_REGISTER;
                 paracgsize := OS_ADDR;
                 paralen := tcgsize2size[OS_ADDR];
@@ -381,7 +381,8 @@ unit cpupara;
                     if (paracgsize=OS_NO) then
                       begin
                         paracgsize:=OS_ADDR;
-                        paralen := tcgsize2size[OS_ADDR];
+                        paralen:=tcgsize2size[OS_ADDR];
+                        paradef:=voidpointertype;
                       end;
                   end
               end;
@@ -389,6 +390,7 @@ unit cpupara;
              hp.paraloc[side].size:=paracgsize;
              hp.paraloc[side].Alignment:=std_param_align;
              hp.paraloc[side].intsize:=paralen;
+             hp.paraloc[side].def:=paradef;
              firstparaloc:=true;
 
 {$ifdef EXTDEBUG}

+ 4 - 2
compiler/avr/cpupara.pas

@@ -273,7 +273,7 @@ unit cpupara;
 
             if push_addr_param(hp.varspez,paradef,p.proccalloption) then
               begin
-                paradef:=voidpointertype;
+                paradef:=getpointerdef(paradef);
                 loc:=LOC_REGISTER;
                 paracgsize := OS_ADDR;
                 paralen := tcgsize2size[OS_ADDR];
@@ -296,7 +296,8 @@ unit cpupara;
                     if (paracgsize=OS_NO) then
                       begin
                         paracgsize:=OS_ADDR;
-                        paralen := tcgsize2size[OS_ADDR];
+                        paralen:=tcgsize2size[OS_ADDR];
+                        paradef:=voidpointertype;
                       end;
                   end
               end;
@@ -304,6 +305,7 @@ unit cpupara;
              hp.paraloc[side].size:=paracgsize;
              hp.paraloc[side].Alignment:=std_param_align;
              hp.paraloc[side].intsize:=paralen;
+             hp.paraloc[side].def:=paradef;
 
 {$ifdef EXTDEBUG}
              if paralen=0 then

+ 13 - 5
compiler/i386/cpupara.pas

@@ -394,6 +394,7 @@ unit cpupara;
       var
         i  : integer;
         hp : tparavarsym;
+        paradef : tdef;
         paraloc : pcgparalocation;
         l,
         paralen,
@@ -425,15 +426,17 @@ unit cpupara;
               (not(p.proccalloption in pushleftright_pocalls) and (i<=paras.count-1)) do
           begin
             hp:=tparavarsym(paras[i]);
-            pushaddr:=push_addr_param(hp.varspez,hp.vardef,p.proccalloption);
+            paradef:=hp.vardef;
+            pushaddr:=push_addr_param(hp.varspez,paradef,p.proccalloption);
             if pushaddr then
               begin
                 paralen:=sizeof(aint);
                 paracgsize:=OS_ADDR;
+                paradef:=getpointerdef(paradef);
               end
             else
               begin
-                paralen:=push_size(hp.varspez,hp.vardef,p.proccalloption);
+                paralen:=push_size(hp.varspez,paradef,p.proccalloption);
                 { darwin/x86 requires that parameters < sizeof(aint) are sign/ }
                 { zero extended to sizeof(aint)                                }
                 if (target_info.system in [system_i386_darwin,system_i386_iphonesim]) and
@@ -441,15 +444,17 @@ unit cpupara;
                    (paralen > 0) and
                    (paralen < sizeof(aint)) then
                   begin
-                    paralen := sizeof(aint);
+                    paralen:=sizeof(aint);
                     paracgsize:=OS_SINT;
+                    paradef:=sinttype;
                   end
                 else
-                  paracgsize:=def_cgsize(hp.vardef);
+                  paracgsize:=def_cgsize(paradef);
               end;
             hp.paraloc[side].reset;
             hp.paraloc[side].size:=paracgsize;
             hp.paraloc[side].intsize:=paralen;
+            hp.paraloc[side].def:=paradef;
             hp.paraloc[side].Alignment:=paraalign;
             { Copy to stack? }
             if (paracgsize=OS_NO) or
@@ -527,6 +532,7 @@ unit cpupara;
                                                             var parareg,parasize:longint);
       var
         hp : tparavarsym;
+        paradef : tdef;
         paraloc : pcgparalocation;
         paracgsize : tcgsize;
         i : integer;
@@ -559,14 +565,15 @@ unit cpupara;
             while true do
               begin
                 hp:=tparavarsym(paras[i]);
+                paradef:=hp.vardef;
                 if not(assigned(hp.paraloc[side].location)) then
                   begin
-
                     pushaddr:=push_addr_param(hp.varspez,hp.vardef,p.proccalloption);
                     if pushaddr then
                       begin
                         paralen:=sizeof(aint);
                         paracgsize:=OS_ADDR;
+                        paradef:=getpointerdef(paradef);
                       end
                     else
                       begin
@@ -576,6 +583,7 @@ unit cpupara;
                     hp.paraloc[side].size:=paracgsize;
                     hp.paraloc[side].intsize:=paralen;
                     hp.paraloc[side].Alignment:=paraalign;
+                    hp.paraloc[side].def:=paradef;
                     {
                       EAX
                       EDX

+ 2 - 1
compiler/m68k/cpupara.pas

@@ -309,7 +309,7 @@ unit cpupara;
 {$ifdef DEBUG_CHARLIE}
                 writeln('loc register');
 {$endif DEBUG_CHARLIE}
-                paradef:=voidpointertype;
+                paradef:=getpointerdef(paradef);
                 loc:=LOC_REGISTER;
                 paracgsize := OS_ADDR;
                 paralen := tcgsize2size[OS_ADDR];
@@ -334,6 +334,7 @@ unit cpupara;
             hp.paraloc[side].alignment:=std_param_align;
             hp.paraloc[side].size:=paracgsize;
             hp.paraloc[side].intsize:=paralen;
+            hp.paraloc[side].def:=paradef;
 
             if (paralen = 0) then
               if (paradef.typ = recorddef) then

+ 5 - 2
compiler/mips/cpupara.pas

@@ -306,10 +306,11 @@ implementation
                 break;
               end;
 
-            if (push_addr_param(hp.varspez,paradef,p.proccalloption)) then
+            if push_addr_param(hp.varspez,paradef,p.proccalloption) then
               begin
                 paracgsize := OS_ADDR;
-	    	paralen := tcgsize2size[paracgsize];
+                paralen := tcgsize2size[paracgsize];
+                paradef := getpointerdef(paradef);
               end
             else
               begin
@@ -318,6 +319,7 @@ implementation
                 if (paracgsize=OS_NO) then
                   begin
                     paracgsize:=OS_ADDR;
+                    paradef:=voidpointertype;
                   end;
 
                 if not is_special_array(paradef) then
@@ -335,6 +337,7 @@ implementation
             paralen:=tcgsize2size[paracgsize];
             hp.paraloc[side].intsize:=paralen;
             hp.paraloc[side].size:=paracgsize;
+            hp.paraloc[side].def:=paradef;
 	    { check the alignment, mips O32ABI require a nature alignment  }
             tmp := align(intparasize, alignment) - intparasize;
 	    while tmp > 0 do

+ 2 - 1
compiler/powerpc/cpupara.pas

@@ -375,7 +375,7 @@ unit cpupara;
 
               if push_addr_param(hp.varspez,paradef,p.proccalloption) then
                 begin
-                  paradef:=voidpointertype;
+                  paradef:=getpointerdef(paradef);
                   loc:=LOC_REGISTER;
                   paracgsize := OS_ADDR;
                   paralen := tcgsize2size[OS_ADDR];
@@ -433,6 +433,7 @@ unit cpupara;
               hp.paraloc[side].alignment:=std_param_align;
               hp.paraloc[side].size:=paracgsize;
               hp.paraloc[side].intsize:=paralen;
+              hp.paraloc[side].def:=paradef;
               if (target_info.abi = abi_powerpc_aix) and
                  (paradef.typ in [recorddef,arraydef]) then
                 hp.paraloc[side].composite:=true;

+ 1 - 0
compiler/powerpc64/cpupara.pas

@@ -357,6 +357,7 @@ begin
     hp.paraloc[side].alignment := std_param_align;
     hp.paraloc[side].size := paracgsize;
     hp.paraloc[side].intsize := paralen;
+    hp.paraloc[side].def := paradef;
     if (paralen = 0) then
       if (paradef.typ = recorddef) then begin
         paraloc := hp.paraloc[side].add_location;

+ 16 - 6
compiler/sparc/cpupara.pas

@@ -205,6 +205,7 @@ implementation
         paraloc      : pcgparalocation;
         i            : integer;
         hp           : tparavarsym;
+        paradef      : tdef;
         paracgsize   : tcgsize;
         hparasupregs : pparasupregs;
         paralen      : longint;
@@ -216,10 +217,11 @@ implementation
         for i:=0 to paras.count-1 do
           begin
             hp:=tparavarsym(paras[i]);
+            paradef:=hp.vardef;
             { currently only support C-style array of const,
               there should be no location assigned to the vararg array itself }
             if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
-               is_array_of_const(hp.vardef) then
+               is_array_of_const(paradef) then
               begin
                 paraloc:=hp.paraloc[side].add_location;
                 { hack: the paraloc must be valid, but is not actually used }
@@ -229,20 +231,28 @@ implementation
                 break;
               end;
 
-            if push_addr_param(hp.varspez,hp.vardef,p.proccalloption) then
-              paracgsize:=OS_ADDR
+            if push_addr_param(hp.varspez,paradef,p.proccalloption) then
+              begin
+                paracgsize:=OS_ADDR;
+                paradef:=getpointerdef(paradef);
+              end
             else
               begin
-                paracgsize:=def_cgSize(hp.vardef);
+                paracgsize:=def_cgsize(paradef);
+                { for formaldef }
                 if paracgsize=OS_NO then
-                  paracgsize:=OS_ADDR;
+                  begin
+                    paracgsize:=OS_ADDR;
+                    paradef:=voidpointertype;
+                  end;
               end;
             hp.paraloc[side].reset;
             hp.paraloc[side].size:=paracgsize;
+            hp.paraloc[side].def:=paradef;
             if (side = callerside) then
               hp.paraloc[side].Alignment:=std_param_align
             else
-              hp.paraloc[side].Alignment:=hp.vardef.alignment;
+              hp.paraloc[side].Alignment:=paradef.alignment;
             paralen:=tcgsize2size[paracgsize];
             hp.paraloc[side].intsize:=paralen;
             while paralen>0 do

+ 13 - 6
compiler/x86_64/cpupara.pas

@@ -933,6 +933,7 @@ unit cpupara;
                                                             var intparareg,mmparareg,parasize:longint;varargsparas: boolean);
       var
         hp         : tparavarsym;
+        paradef    : tdef;
         paraloc    : pcgparalocation;
         subreg     : tsubregister;
         pushaddr   : boolean;
@@ -951,19 +952,21 @@ unit cpupara;
         for i:=0 to paras.count-1 do
           begin
             hp:=tparavarsym(paras[i]);
-            pushaddr:=push_addr_param(hp.varspez,hp.vardef,p.proccalloption);
+            paradef:=hp.vardef;
+            pushaddr:=push_addr_param(hp.varspez,paradef,p.proccalloption);
             if pushaddr then
               begin
                 loc[1]:=X86_64_INTEGER_CLASS;
                 loc[2]:=X86_64_NO_CLASS;
                 paracgsize:=OS_ADDR;
                 paralen:=sizeof(pint);
+                paradef:=getpointerdef(paradef);
               end
             else
               begin
-                getvalueparaloc(hp.varspez,hp.vardef,loc[1],loc[2]);
-                paralen:=push_size(hp.varspez,hp.vardef,p.proccalloption);
-                paracgsize:=def_cgsize(hp.vardef);
+                getvalueparaloc(hp.varspez,paradef,loc[1],loc[2]);
+                paralen:=push_size(hp.varspez,paradef,p.proccalloption);
+                paracgsize:=def_cgsize(paradef);
                 { integer sizes < 32 bit have to be sign/zero extended to 32 bit
                   on the caller side }
                 if (side=callerside) and
@@ -971,24 +974,27 @@ unit cpupara;
                   begin
                     paracgsize:=OS_S32;
                     paralen:=4;
+                    paradef:=s32inttype;
                   end;
               end;
 
             { cheat for now, we should copy the value to an mm reg as well (FK) }
             if varargsparas and
                (target_info.system = system_x86_64_win64) and
-               (hp.vardef.typ = floatdef) then
+               (paradef.typ = floatdef) then
               begin
                 loc[2]:=X86_64_NO_CLASS;
                 if paracgsize=OS_F64 then
                   begin
                     loc[1]:=X86_64_INTEGER_CLASS;
-                    paracgsize:=OS_64
+                    paracgsize:=OS_64;
+                    paradef:=u64inttype;
                   end
                 else
                   begin
                     loc[1]:=X86_64_INTEGERSI_CLASS;
                     paracgsize:=OS_32;
+                    paradef:=u32inttype;
                   end;
               end;
 
@@ -996,6 +1002,7 @@ unit cpupara;
             hp.paraloc[side].size:=paracgsize;
             hp.paraloc[side].intsize:=paralen;
             hp.paraloc[side].Alignment:=paraalign;
+            hp.paraloc[side].def:=paradef;
             if paralen>0 then
               begin
                 { Enough registers free? }