浏览代码

* fixed setting calling convention for calls (the callpd passed to the
taillvm constructors is not necessarily a proc(var)def)

git-svn-id: branches/debug_eh@41979 -

Jonas Maebe 6 年之前
父节点
当前提交
024b38e1ff
共有 2 个文件被更改,包括 16 次插入16 次删除
  1. 12 12
      compiler/llvm/aasmllvm.pas
  2. 4 4
      compiler/llvm/hlcgllvm.pas

+ 12 - 12
compiler/llvm/aasmllvm.pas

@@ -113,13 +113,13 @@ interface
         constructor cleanupclause;
         constructor cleanupclause;
 
 
         { e.g. dst = call retsize name (paras) }
         { e.g. dst = call retsize name (paras) }
-        constructor call_size_name_paras(callpd: tdef; dst: tregister;retsize: tdef;name:tasmsymbol;paras: tfplist);
+        constructor call_size_name_paras(callpd: tdef;cc: tproccalloption;dst: tregister;retsize: tdef;name:tasmsymbol;paras: tfplist);
         { e.g. dst = call retsize reg (paras) }
         { e.g. dst = call retsize reg (paras) }
-        constructor call_size_reg_paras(callpd: tdef; dst: tregister;retsize: tdef;reg:tregister;paras: tfplist);
+        constructor call_size_reg_paras(callpd: tdef; cc: tproccalloption; dst: tregister;retsize: tdef;reg:tregister;paras: tfplist);
         { e.g. dst = invoke retsize name (paras) to label <normal label> unwind label <exception label> }
         { e.g. dst = invoke retsize name (paras) to label <normal label> unwind label <exception label> }
-        constructor invoke_size_name_paras_retlab_exceptlab(callpd: tdef; dst: tregister; retsize: tdef;name: tasmsymbol; paras: tfplist; retlab, exceptlab:TAsmLabel);
+        constructor invoke_size_name_paras_retlab_exceptlab(callpd: tdef; cc: tproccalloption; dst: tregister; retsize: tdef;name: tasmsymbol; paras: tfplist; retlab, exceptlab:TAsmLabel);
         { e.g. dst = invoke retsize reg (paras) to label <normal label> unwind label <exception label> }
         { e.g. dst = invoke retsize reg (paras) to label <normal label> unwind label <exception label> }
-        constructor invoke_size_reg_paras_retlab_exceptlab(callpd: tdef; dst: tregister; retsize: tdef; reg: tregister; paras: tfplist; retlab, exceptlab:TAsmLabel);
+        constructor invoke_size_reg_paras_retlab_exceptlab(callpd: tdef; cc: tproccalloption; dst: tregister; retsize: tdef; reg: tregister; paras: tfplist; retlab, exceptlab:TAsmLabel);
 
 
         { e.g. dst := extractvalue srcsize src, 0 (note: no type for the index) }
         { e.g. dst := extractvalue srcsize src, 0 (note: no type for the index) }
         constructor extract(op: tllvmop; dst: tregister; srcsize: tdef; src: tregister; idx: longint);
         constructor extract(op: tllvmop; dst: tregister; srcsize: tdef; src: tregister; idx: longint);
@@ -1128,7 +1128,7 @@ uses
       end;
       end;
 
 
 
 
-    constructor taillvm.call_size_name_paras(callpd: tdef; dst: tregister; retsize: tdef; name:tasmsymbol; paras: tfplist);
+    constructor taillvm.call_size_name_paras(callpd: tdef; cc: tproccalloption; dst: tregister; retsize: tdef; name:tasmsymbol; paras: tfplist);
       begin
       begin
         create_llvm(la_call);
         create_llvm(la_call);
         ops:=6;
         ops:=6;
@@ -1139,33 +1139,33 @@ uses
           is generated, because the alias declaration may occur anywhere }
           is generated, because the alias declaration may occur anywhere }
         loaddef(0,retsize);
         loaddef(0,retsize);
         loadreg(1,dst);
         loadreg(1,dst);
-        loadcallingconvention(2,tabstractprocdef(callpd).proccalloption);
+        loadcallingconvention(2,cc);
         loaddef(3,callpd);
         loaddef(3,callpd);
         loadsymbol(4,name,0);
         loadsymbol(4,name,0);
         loadparas(5,paras);
         loadparas(5,paras);
       end;
       end;
 
 
 
 
-    constructor taillvm.call_size_reg_paras(callpd: tdef; dst: tregister; retsize: tdef; reg: tregister; paras: tfplist);
+    constructor taillvm.call_size_reg_paras(callpd: tdef; cc: tproccalloption; dst: tregister; retsize: tdef; reg: tregister; paras: tfplist);
       begin
       begin
         create_llvm(la_call);
         create_llvm(la_call);
         ops:=6;
         ops:=6;
         loaddef(0,retsize);
         loaddef(0,retsize);
         loadreg(1,dst);
         loadreg(1,dst);
-        loadcallingconvention(2,tabstractprocdef(callpd).proccalloption);
+        loadcallingconvention(2,cc);
         loaddef(3,callpd);
         loaddef(3,callpd);
         loadreg(4,reg);
         loadreg(4,reg);
         loadparas(5,paras);
         loadparas(5,paras);
       end;
       end;
 
 
 
 
-    constructor taillvm.invoke_size_name_paras_retlab_exceptlab(callpd: tdef; dst: tregister; retsize: tdef; name: tasmsymbol; paras: tfplist; retlab, exceptlab: TAsmLabel);
+    constructor taillvm.invoke_size_name_paras_retlab_exceptlab(callpd: tdef; cc: tproccalloption; dst: tregister; retsize: tdef; name: tasmsymbol; paras: tfplist; retlab, exceptlab: TAsmLabel);
       begin
       begin
         create_llvm(la_invoke);
         create_llvm(la_invoke);
         ops:=8;
         ops:=8;
         loaddef(0,retsize);
         loaddef(0,retsize);
         loadreg(1,dst);
         loadreg(1,dst);
-        loadcallingconvention(2,tabstractprocdef(callpd).proccalloption);
+        loadcallingconvention(2,cc);
         loaddef(3,callpd);
         loaddef(3,callpd);
         loadsymbol(4,name,0);
         loadsymbol(4,name,0);
         loadparas(5,paras);
         loadparas(5,paras);
@@ -1174,13 +1174,13 @@ uses
       end;
       end;
 
 
 
 
-    constructor taillvm.invoke_size_reg_paras_retlab_exceptlab(callpd: tdef; dst: tregister; retsize: tdef; reg: tregister; paras: tfplist; retlab, exceptlab: TAsmLabel);
+    constructor taillvm.invoke_size_reg_paras_retlab_exceptlab(callpd: tdef; cc: tproccalloption; dst: tregister; retsize: tdef; reg: tregister; paras: tfplist; retlab, exceptlab: TAsmLabel);
       begin
       begin
         create_llvm(la_invoke);
         create_llvm(la_invoke);
         ops:=8;
         ops:=8;
         loaddef(0,retsize);
         loaddef(0,retsize);
         loadreg(1,dst);
         loadreg(1,dst);
-        loadcallingconvention(2,tabstractprocdef(callpd).proccalloption);
+        loadcallingconvention(2,cc);
         loaddef(3,callpd);
         loaddef(3,callpd);
         loadreg(4,reg);
         loadreg(4,reg);
         loadparas(5,paras);
         loadparas(5,paras);

+ 4 - 4
compiler/llvm/hlcgllvm.pas

@@ -560,12 +560,12 @@ implementation
       if not(fc_catching_exceptions in flowcontrol) or
       if not(fc_catching_exceptions in flowcontrol) or
          { no invoke for intrinsics }
          { no invoke for intrinsics }
          (copy(s,1,5)='llvm.') then
          (copy(s,1,5)='llvm.') then
-        list.concat(taillvm.call_size_name_paras(get_call_pd(pd),res,llvmretdef,current_asmdata.RefAsmSymbol(s,AT_FUNCTION),callparas))
+        list.concat(taillvm.call_size_name_paras(get_call_pd(pd),pd.proccalloption,res,llvmretdef,current_asmdata.RefAsmSymbol(s,AT_FUNCTION),callparas))
       else
       else
         begin
         begin
           current_asmdata.getjumplabel(nextinslab);
           current_asmdata.getjumplabel(nextinslab);
           exceptlab:=tllvmprocinfo(current_procinfo).CurrExceptLabel;
           exceptlab:=tllvmprocinfo(current_procinfo).CurrExceptLabel;
-          list.concat(taillvm.invoke_size_name_paras_retlab_exceptlab(get_call_pd(pd),res,llvmretdef,current_asmdata.RefAsmSymbol(s,AT_FUNCTION),callparas,nextinslab,exceptlab));
+          list.concat(taillvm.invoke_size_name_paras_retlab_exceptlab(get_call_pd(pd),pd.proccalloption,res,llvmretdef,current_asmdata.RefAsmSymbol(s,AT_FUNCTION),callparas,nextinslab,exceptlab));
           a_label(list,nextinslab);
           a_label(list,nextinslab);
         end;
         end;
       result:=get_call_result_cgpara(pd,forceresdef);
       result:=get_call_result_cgpara(pd,forceresdef);
@@ -584,12 +584,12 @@ implementation
     begin
     begin
       a_call_common(list,pd,paras,nil,res,hlretdef,llvmretdef,callparas);
       a_call_common(list,pd,paras,nil,res,hlretdef,llvmretdef,callparas);
       if not(fc_catching_exceptions in flowcontrol) then
       if not(fc_catching_exceptions in flowcontrol) then
-        list.concat(taillvm.call_size_reg_paras(get_call_pd(pd),res,llvmretdef,reg,callparas))
+        list.concat(taillvm.call_size_reg_paras(get_call_pd(pd),pd.proccalloption,res,llvmretdef,reg,callparas))
       else
       else
         begin
         begin
           current_asmdata.getjumplabel(nextinslab);
           current_asmdata.getjumplabel(nextinslab);
           exceptlab:=tllvmprocinfo(current_procinfo).CurrExceptLabel;
           exceptlab:=tllvmprocinfo(current_procinfo).CurrExceptLabel;
-          list.concat(taillvm.invoke_size_reg_paras_retlab_exceptlab(get_call_pd(pd),res,llvmretdef,reg,callparas,nextinslab,exceptlab));
+          list.concat(taillvm.invoke_size_reg_paras_retlab_exceptlab(get_call_pd(pd),pd.proccalloption,res,llvmretdef,reg,callparas,nextinslab,exceptlab));
           a_label(list,nextinslab);
           a_label(list,nextinslab);
         end;
         end;
       result:=get_call_result_cgpara(pd,nil);
       result:=get_call_result_cgpara(pd,nil);