瀏覽代碼

* simplify references before generating getelementptr instructions with them

git-svn-id: trunk@30722 -
Jonas Maebe 10 年之前
父節點
當前提交
98c5f7d20f
共有 2 個文件被更改,包括 8 次插入2 次删除
  1. 4 1
      compiler/llvm/hlcgllvm.pas
  2. 4 1
      compiler/llvm/nllvmmem.pas

+ 4 - 1
compiler/llvm/hlcgllvm.pas

@@ -127,10 +127,13 @@ uses
 
       procedure varsym_set_localloc(list: TAsmList; vs: tabstractnormalvarsym); override;
       procedure paravarsym_set_initialloc_to_paraloc(vs: tparavarsym); override;
-    protected
+
+      procedure g_external_wrapper(list: TAsmList; procdef: tprocdef; const externalname: string); override;
+
       { def is the type of the data stored in memory pointed to by ref, not
         a pointer to this type }
       function make_simple_ref(list: TAsmList; const ref: treference; def: tdef): treference;
+    protected
       procedure paraloctoloc(const paraloc: pcgparalocation; out hloc: tlocation);
       procedure set_call_function_result(const list: TAsmList; const pd: tabstractprocdef; const llvmretdef, hlretdef: tdef; const resval: tregister; var retpara: tcgpara);
     end;

+ 4 - 1
compiler/llvm/nllvmmem.pas

@@ -59,7 +59,7 @@ implementation
       aasmdata,aasmllvm,
       symtable,symconst,symdef,defutil,
       nmem,
-      cpubase,llvmbase,hlcgobj;
+      cpubase,llvmbase,hlcgobj,hlcgllvm;
 
   { tllvmsubscriptnode }
 
@@ -86,6 +86,7 @@ implementation
             llvmfielddef:=tabstractrecordsymtable(tabstractrecorddef(left.resultdef).symtable).llvmst[vs.llvmfieldnr].def;
             { load the address of that shadow field }
             newbase:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(llvmfielddef));
+            location.reference:=thlcgllvm(hlcg).make_simple_ref(current_asmdata.CurrAsmList,location.reference,left.resultdef);
             current_asmdata.CurrAsmList.concat(taillvm.getelementptr_reg_size_ref_size_const(newbase,getpointerdef(left.resultdef),location.reference,s32inttype,vs.llvmfieldnr,true));
             reference_reset_base(location.reference,newbase,vs.offsetfromllvmfield,newalignment(location.reference.alignment,vs.fieldoffset));
             { in case of an 80 bits extended type, typecast from an array of 10
@@ -148,6 +149,7 @@ implementation
              -> convert it into a pointer to an element inside this array }
           getarrelementptrdef;
           hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,arrptrelementdef);
+          locref^:=thlcgllvm(hlcg).make_simple_ref(current_asmdata.CurrAsmList,location.reference,left.resultdef);
           current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_const(hreg,getpointerdef(left.resultdef),
             locref^,ptruinttype,constarrayoffset,true));
           reference_reset_base(locref^,hreg,0,locref^.alignment);
@@ -179,6 +181,7 @@ implementation
           maybe_const_reg:=hreg;
         end;
       hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(resultdef));
+      location.reference:=thlcgllvm(hlcg).make_simple_ref(current_asmdata.CurrAsmList,location.reference,left.resultdef);
       { get address of indexed array element and convert pointer to array into
         pointer to the elementdef in the process }
       current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(hreg,getpointerdef(left.resultdef),