Browse Source

+ support for a_call_reg() on the llvm target (can call simple procvars now)

git-svn-id: branches/hlcgllvm@28480 -
Jonas Maebe 11 years ago
parent
commit
9d118567cd
2 changed files with 23 additions and 3 deletions
  1. 14 1
      compiler/llvm/aasmllvm.pas
  2. 9 2
      compiler/llvm/hlcgllvm.pas

+ 14 - 1
compiler/llvm/aasmllvm.pas

@@ -101,8 +101,10 @@ interface
         constructor getelementptr_reg_size_ref_size_const(dst:tregister;ptrsize:tdef;const ref:treference;indextype:tdef;index1:ptrint;indirect:boolean);
         constructor getelementptr_reg_size_ref_size_const(dst:tregister;ptrsize:tdef;const ref:treference;indextype:tdef;index1:ptrint;indirect:boolean);
         constructor getelementptr_reg_tai_size_const(dst:tregister;const ai:tai;indextype:tdef;index1:ptrint;indirect:boolean);
         constructor getelementptr_reg_tai_size_const(dst:tregister;const ai:tai;indextype:tdef;index1:ptrint;indirect:boolean);
 
 
-        { e.g. dst = call retsize (paras) }
+        { e.g. dst = call retsize name (paras) }
         constructor call_size_name_paras(dst: tregister;retsize: tdef;name:tasmsymbol;paras: tfplist);
         constructor call_size_name_paras(dst: tregister;retsize: tdef;name:tasmsymbol;paras: tfplist);
+        { e.g. dst = call retsize reg (paras) }
+        constructor call_size_reg_paras(dst: tregister;retsize: tdef;reg:tregister;paras: tfplist);
 
 
         procedure loadtai(opidx: longint; _ai: tai);
         procedure loadtai(opidx: longint; _ai: tai);
         procedure loaddef(opidx: longint; _def: tdef);
         procedure loaddef(opidx: longint; _def: tdef);
@@ -853,4 +855,15 @@ uses
         loadparas(3,paras);
         loadparas(3,paras);
       end;
       end;
 
 
+
+    constructor taillvm.call_size_reg_paras(dst: tregister; retsize: tdef; reg: tregister; paras: tfplist);
+      begin
+        create_llvm(la_call);
+        ops:=4;
+        loadreg(0,dst);
+        loaddef(1,retsize);
+        loadreg(2,reg);
+        loadparas(3,paras);
+      end;
+
 end.
 end.

+ 9 - 2
compiler/llvm/hlcgllvm.pas

@@ -429,10 +429,17 @@ implementation
 
 
 
 
   function thlcgllvm.a_call_reg(list: TAsmList; pd: tabstractprocdef; reg: tregister; const paras: array of pcgpara): tcgpara;
   function thlcgllvm.a_call_reg(list: TAsmList; pd: tabstractprocdef; reg: tregister; const paras: array of pcgpara): tcgpara;
+    var
+      callparas: tfplist;
+      llvmretdef,
+      hlretdef,
+      calldef: tdef;
+      res: tregister;
     begin
     begin
-      internalerror(2012042824);
+      a_call_common(list,pd,paras,nil,res,calldef,hlretdef,llvmretdef,callparas);
+      list.concat(taillvm.call_size_reg_paras(res,calldef,reg,callparas));
       result:=get_call_result_cgpara(pd,nil);
       result:=get_call_result_cgpara(pd,nil);
-//      set_call_function_result(list,pd,pd.returndef,res,result);
+      set_call_function_result(list,pd,llvmretdef,hlretdef,res,result);
     end;
     end;