Bläddra i källkod

+ thlcg.g_ptrtypecast_reg/ref() to typecast a pointer in a register, or the
pointer type describing a reference, to another pointer type

git-svn-id: branches/hlcgllvm@28781 -

Jonas Maebe 10 år sedan
förälder
incheckning
cc596225fa
2 ändrade filer med 38 tillägg och 0 borttagningar
  1. 18 0
      compiler/hlcgobj.pas
  2. 20 0
      compiler/llvm/hlcgllvm.pas

+ 18 - 0
compiler/hlcgobj.pas

@@ -531,6 +531,14 @@ unit hlcgobj;
             for targets without pointers. }
           procedure g_reference_loc(list: TAsmList; def: tdef; const fromloc: tlocation; out toloc: tlocation); virtual;
 
+          { typecasts the pointer in reg to a new pointer. By default it does
+            nothing, only required for type-aware platforms like LLVM }
+          procedure g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister); virtual;
+          { same but for a treference (considers the reference itself, not the
+            value stored at that place in memory). Replaces ref with a new
+            reference if necessary }
+          procedure g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference); virtual;
+
 
           { routines migrated from ncgutil }
 
@@ -3790,6 +3798,16 @@ implementation
       end;
     end;
 
+  procedure thlcgobj.g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister);
+    begin
+      { nothing to do }
+    end;
+
+  procedure thlcgobj.g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference);
+    begin
+      { nothing to do }
+    end;
+
   procedure thlcgobj.location_force_reg(list: TAsmList; var l: tlocation; src_size, dst_size: tdef; maybeconst: boolean);
     var
       hregister,

+ 20 - 0
compiler/llvm/hlcgllvm.pas

@@ -91,6 +91,9 @@ uses
       procedure g_overflowcheck(list: TAsmList; const Loc: tlocation; def: tdef); override;
       procedure g_overflowCheck_loc(List:TAsmList;const Loc:TLocation;def:TDef;var ovloc : tlocation); override;
 
+      procedure g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister); override;
+      procedure g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference); override;
+
       procedure a_loadmm_ref_reg(list: TAsmList; fromsize, tosize: tdef; const ref: treference; reg: tregister; shuffle: pmmshuffle); override;
       procedure a_loadmm_reg_ref(list: TAsmList; fromsize, tosize: tdef; reg: tregister; const ref: treference; shuffle: pmmshuffle); override;
       procedure a_loadmm_reg_reg(list: TAsmList; fromsize, tosize: tdef; reg1, reg2: tregister; shuffle: pmmshuffle); override;
@@ -1100,6 +1103,23 @@ implementation
     end;
 
 
+  procedure thlcgllvm.g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister);
+    begin
+      { will insert a bitcast if necessary }
+      a_load_reg_reg(list,fromdef,todef,reg,reg);
+    end;
+
+
+  procedure thlcgllvm.g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference);
+    var
+      hreg: tregister;
+    begin
+      hreg:=getaddresregister(list,todef);
+      a_loadaddr_ref_reg(list,fromdef.pointeddef,todef,ref,hreg);
+      reference_reset_base(ref,todef,hreg,0,ref.alignment);
+    end;
+
+
   procedure thlcgllvm.a_loadmm_ref_reg(list: TAsmList; fromsize, tosize: tdef; const ref: treference; reg: tregister; shuffle: pmmshuffle);
     var
       href: treference;