Browse Source

* Overload hlcg.a_call_ref and a_call_reg methods for cdecl'ared functions to use register

git-svn-id: trunk@21856 -
pierre 13 years ago
parent
commit
489b93f2f5
1 changed files with 47 additions and 17 deletions
  1. 47 17
      compiler/mips/hlcgcpu.pas

+ 47 - 17
compiler/mips/hlcgcpu.pas

@@ -31,46 +31,76 @@ interface
 uses
   globtype,
   aasmbase, aasmdata,
+  cgbase, cgutils,
   symdef,
   hlcgobj, hlcg2ll;
-  
+
   type
     thlcg2mips = class(thlcg2ll)
       procedure a_call_name(list: TAsmList; pd: tprocdef; const s: TSymStr; weak: boolean);override;
-	end;
+      procedure a_call_reg(list : TAsmList;pd : tabstractprocdef;reg : tregister);override;
+      procedure a_call_ref(list : TAsmList;pd : tabstractprocdef;const ref : treference);override;
+  end;
 
   procedure create_hlcodegen;
 
 implementation
 
   uses
-	cgbase,
-	cgutils,
-	cgobj,
-	cpubase,
-	cgcpu;
+    aasmtai,
+    cutils,
+    cgobj,
+    cpubase,
+    cgcpu;
 
   procedure thlcg2mips.a_call_name(list: TAsmList; pd: tprocdef; const s: TSymStr; weak: boolean);
     var
       ref : treference;
     begin
-      if pd.proccalloption =pocall_cdecl then
+      if pd.proccalloption=pocall_cdecl then
         begin
           { Use $gp/$t9 registers as the code might be in a shared library }
-		  reference_reset(ref,sizeof(aint));
-		  ref.symbol:=current_asmdata.RefAsmSymbol('_gp');
-		  cg.a_loadaddr_ref_reg(list,ref,NR_GP);
-		  reference_reset(ref,sizeof(aint));
-		  ref.symbol:=current_asmdata.RefAsmSymbol(s);
-		  ref.base:=NR_GP;
-		  ref.refaddr:=addr_pic;
-		  cg.a_loadaddr_ref_reg(list,ref,NR_PIC_FUNC);
-		  cg.a_call_reg(list,NR_PIC_FUNC);
+          reference_reset(ref,sizeof(aint));
+          ref.symbol:=current_asmdata.RefAsmSymbol('_gp');
+          list.concat(tai_comment.create(strpnew('Using PIC code for a_call_name')));
+          cg.a_loadaddr_ref_reg(list,ref,NR_GP);
+          reference_reset(ref,sizeof(aint));
+          ref.symbol:=current_asmdata.RefAsmSymbol(s);
+          ref.base:=NR_GP;
+      	  ref.refaddr:=addr_pic;
+          cg.a_loadaddr_ref_reg(list,ref,NR_PIC_FUNC);
+          cg.a_call_reg(list,NR_PIC_FUNC);
         end
       else
         cg.a_call_name(list,s,weak);
     end;
 
+  procedure thlcg2mips.a_call_reg(list: TAsmList; pd: tabstractprocdef; reg: tregister);
+    begin
+      if (pd.proccalloption=pocall_cdecl) and (reg<>NR_PIC_FUNC) then
+        begin
+          list.concat(tai_comment.create(strpnew('Using PIC code for a_call_reg')));
+          { Use $t9 register as the code might be in a shared library }
+          cg.a_load_reg_reg(list,OS_32,OS_32,reg,NR_PIC_FUNC);
+          cg.a_call_reg(list,NR_PIC_FUNC);
+        end
+      else
+        cg.a_call_reg(list,reg);
+    end;
+
+  procedure thlcg2mips.a_call_ref(list: TAsmList; pd: tabstractprocdef; const ref: treference);
+    begin
+      if pd.proccalloption =pocall_cdecl then
+        begin
+          { Use $t9 register as the code might be in a shared library }
+          list.concat(tai_comment.create(strpnew('Using PIC code for a_call_ref')));
+          cg.a_loadaddr_ref_reg(list,ref,NR_PIC_FUNC);
+          cg.a_call_reg(list,NR_PIC_FUNC);
+        end
+      else
+        cg.a_call_ref(list,ref);
+    end;
+
   procedure create_hlcodegen;
     begin
       hlcg:=thlcg2mips.create;