Răsfoiți Sursa

* blockaddress creates a constant operand for another opcode, it's not an
independent operation
o additionally, it does not take a "label" qualifier for its label argument

git-svn-id: trunk@34944 -

Jonas Maebe 8 ani în urmă
părinte
comite
3b7d9447ae
2 a modificat fișierele cu 17 adăugiri și 11 ștergeri
  1. 5 6
      compiler/llvm/aasmllvm.pas
  2. 12 5
      compiler/llvm/agllvm.pas

+ 5 - 6
compiler/llvm/aasmllvm.pas

@@ -104,7 +104,7 @@ interface
         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 blockaddress(dstreg: tregister; fun, lab: tasmsymbol);
+        constructor blockaddress(fun, lab: tasmsymbol);
 
         { e.g. dst = call retsize name (paras) }
         constructor call_size_name_paras(callpd: tdef; dst: tregister;retsize: tdef;name:tasmsymbol;paras: tfplist);
@@ -1024,13 +1024,12 @@ uses
         loadconst(index+1,index1);
       end;
 
-    constructor taillvm.blockaddress(dstreg: tregister; fun, lab: tasmsymbol);
+    constructor taillvm.blockaddress(fun, lab: tasmsymbol);
       begin
         create_llvm(la_blockaddress);
-        ops:=3;
-        loadreg(0,dstreg);
-        loadsymbol(1,fun,0);
-        loadsymbol(2,lab,0);
+        ops:=2;
+        loadsymbol(0,fun,0);
+        loadsymbol(1,lab,0);
       end;
 
 

+ 12 - 5
compiler/llvm/agllvm.pas

@@ -594,12 +594,19 @@ implementation
           end;
         la_blockaddress:
           begin
+            owner.writer.AsmWrite('i8* blockaddress(');
             owner.writer.AsmWrite(getopstr(taillvm(hp).oper[0]^,false));
-            owner.writer.AsmWrite(' = blockaddress(');
-            owner.writer.AsmWrite(getopstr(taillvm(hp).oper[1]^,false));
-            owner.writer.AsmWrite(',');
-            owner.writer.AsmWrite(getopstr(taillvm(hp).oper[2]^,false));
-            owner.writer.AsmWrite(')');
+            { getopstr would add a "label" qualifier, which blockaddress does
+              not want }
+            owner.writer.AsmWrite(',%');
+            with taillvm(hp).oper[1]^ do
+              begin
+                if (typ<>top_ref) or
+                   (ref^.refaddr<>addr_full) then
+                  internalerror(2016112001);
+                owner.writer.AsmWrite(ref^.symbol.name);
+              end;
+            nested:=true;
             done:=true;
           end;
         la_alloca: