Browse Source

hlcgobj: new getlocal and recordnewsymloc methods

Call hlcg.getlocal instead of tg.getlocal when used for actual parameters/local
variables. Has an extra tsym parameter, which will enable the LLVM backend to
insert debug information.

Call hlcg.recordnewsymloc when the location of a (local/para) symbol changes,
so debug info tracking can be updated (only done for LLVM currently)
Jonas Maebe 3 years ago
parent
commit
a76038e1d1
4 changed files with 62 additions and 4 deletions
  1. 19 1
      compiler/hlcgobj.pas
  2. 39 0
      compiler/llvm/hlcgllvm.pas
  3. 1 0
      compiler/ncgld.pas
  4. 3 3
      compiler/ncgutil.pas

+ 19 - 1
compiler/hlcgobj.pas

@@ -638,6 +638,11 @@ unit hlcgobj;
           procedure gen_load_para_value(list:TAsmList);virtual;
           procedure gen_load_para_value(list:TAsmList);virtual;
           { helpers called by gen_load_para_value }
           { helpers called by gen_load_para_value }
           procedure g_copyvalueparas(p:TObject;arg:pointer);virtual;
           procedure g_copyvalueparas(p:TObject;arg:pointer);virtual;
+
+          { allocate a local temp to serve as storage for a para/localsym }
+          procedure getlocal(list: TAsmList; sym: tsym; size: asizeint; alignment: shortint; def: tdef; out ref : treference);
+          { the symbol is stored at this location from now on }
+          procedure recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference); virtual;
          protected
          protected
           procedure gen_loadfpu_loc_cgpara(list: TAsmList; size: tdef; const l: tlocation;const cgpara: tcgpara;locintsize: longint);virtual;
           procedure gen_loadfpu_loc_cgpara(list: TAsmList; size: tdef; const l: tlocation;const cgpara: tcgpara;locintsize: longint);virtual;
           procedure init_paras(p:TObject;arg:pointer);
           procedure init_paras(p:TObject;arg:pointer);
@@ -5206,7 +5211,7 @@ implementation
               l:=tparavarsym(p).getsize;
               l:=tparavarsym(p).getsize;
               localcopyloc.loc:=LOC_REFERENCE;
               localcopyloc.loc:=LOC_REFERENCE;
               localcopyloc.size:=int_cgsize(l);
               localcopyloc.size:=int_cgsize(l);
-              tg.GetLocal(list,l,tparavarsym(p).vardef,localcopyloc.reference);
+              getlocal(list,tparavarsym(p),l,tparavarsym(p).vardef.alignment,tparavarsym(p).vardef,localcopyloc.reference);
               { Copy data }
               { Copy data }
               if is_shortstring(tparavarsym(p).vardef) then
               if is_shortstring(tparavarsym(p).vardef) then
                 begin
                 begin
@@ -5237,6 +5242,19 @@ implementation
         end;
         end;
     end;
     end;
 
 
+
+  procedure thlcgobj.getlocal(list: TAsmList; sym: tsym; size: asizeint; alignment: shortint; def: tdef; out ref: treference);
+    begin
+      tg.getlocal(list,size,alignment,def,ref);
+      recordnewsymloc(list,sym,def,ref);
+    end;
+
+  procedure thlcgobj.recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference);
+    begin
+      // do nothing
+    end;
+
+
   procedure thlcgobj.gen_loadfpu_loc_cgpara(list: TAsmList; size: tdef; const l: tlocation; const cgpara: tcgpara; locintsize: longint);
   procedure thlcgobj.gen_loadfpu_loc_cgpara(list: TAsmList; size: tdef; const l: tlocation; const cgpara: tcgpara; locintsize: longint);
     var
     var
       tmploc: tlocation;
       tmploc: tlocation;

+ 39 - 0
compiler/llvm/hlcgllvm.pas

@@ -52,6 +52,9 @@ uses
       procedure allocallcpuregisters(list: TAsmList); override;
       procedure allocallcpuregisters(list: TAsmList); override;
       procedure deallocallcpuregisters(list: TAsmList); override;
       procedure deallocallcpuregisters(list: TAsmList); override;
 
 
+      procedure recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference); override;
+
+     public
       procedure a_bit_test_reg_reg_reg(list: TAsmList; bitnumbersize, valuesize, destsize: tdef; bitnumber, value, destreg: tregister); override;
       procedure a_bit_test_reg_reg_reg(list: TAsmList; bitnumbersize, valuesize, destsize: tdef; bitnumber, value, destreg: tregister); override;
       procedure a_bit_set_reg_reg(list: TAsmList; doset: boolean; bitnumbersize, destsize: tdef; bitnumber, dest: tregister); override;
       procedure a_bit_set_reg_reg(list: TAsmList; doset: boolean; bitnumbersize, destsize: tdef; bitnumber, dest: tregister); override;
 
 
@@ -384,6 +387,42 @@ implementation
     end;
     end;
 
 
 
 
+  procedure thlcgllvm.recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference);
+    var
+      varmetapara,
+      symmetadatapara,
+      exprmetapara: tcgpara;
+      pd: tprocdef;
+    begin
+      if assigned(sym) and
+         (sym.visibility<>vis_hidden) and
+         (cs_debuginfo in current_settings.moduleswitches) then
+        begin
+          pd:=search_system_proc('llvm_dbg_addr');
+          varmetapara.init;
+          symmetadatapara.init;
+          exprmetapara.init;
+          paramanager.getcgtempparaloc(current_asmdata.CurrAsmList,pd,1,varmetapara);
+          paramanager.getcgtempparaloc(current_asmdata.CurrAsmList,pd,1,symmetadatapara);
+          paramanager.getcgtempparaloc(current_asmdata.CurrAsmList,pd,1,exprmetapara);
+          { the local location of the var/para }
+          varmetapara.Location^.def:=cpointerdef.getreusable(def);
+          varmetapara.Location^.register:=ref.base;
+          { the variable/para metadata }
+          symmetadatapara.Location^.llvmloc.loc:=LOC_CREFERENCE;
+          symmetadatapara.Location^.llvmloc.localsym:=sym;
+          { dummy for the expression metadata }
+          exprmetapara.Location^.llvmloc.loc:=LOC_CONSTANT;
+          exprmetapara.Location^.llvmloc.value:=0;
+          g_call_system_proc(list,pd,[@varmetapara,@symmetadatapara,@exprmetapara],nil).resetiftemp;
+
+          varmetapara.done;
+          symmetadatapara.done;
+          exprmetapara.done;
+        end;
+    end;
+
+
   procedure thlcgllvm.a_bit_test_reg_reg_reg(list: TAsmList; bitnumbersize, valuesize, destsize: tdef; bitnumber, value, destreg: tregister);
   procedure thlcgllvm.a_bit_test_reg_reg_reg(list: TAsmList; bitnumbersize, valuesize, destsize: tdef; bitnumber, value, destreg: tregister);
     var
     var
       tmpbitnumberreg: tregister;
       tmpbitnumberreg: tregister;

+ 1 - 0
compiler/ncgld.pas

@@ -236,6 +236,7 @@ implementation
         location.reference:=ref;
         location.reference:=ref;
         tg.ChangeTempType(current_asmdata.CurrAsmList,location.reference,oldtemptype);
         tg.ChangeTempType(current_asmdata.CurrAsmList,location.reference,oldtemptype);
         tabstractnormalvarsym(symtableentry).localloc:=location;
         tabstractnormalvarsym(symtableentry).localloc:=location;
+        hlcg.recordnewsymloc(current_asmdata.CurrAsmList,symtableentry,tabstractnormalvarsym(symtableentry).vardef,location.reference);
       end;
       end;
 
 
 
 

+ 3 - 3
compiler/ncgutil.pas

@@ -980,10 +980,10 @@ implementation
                               if isaddr then
                               if isaddr then
                                 begin
                                 begin
                                   ptrdef:=cpointerdef.getreusable(vs.vardef);
                                   ptrdef:=cpointerdef.getreusable(vs.vardef);
-                                  tg.GetLocal(list,ptrdef.size,ptrdef,vs.initialloc.reference)
+                                  hlcg.GetLocal(list,vs,ptrdef.size,ptrdef.alignment,ptrdef,vs.initialloc.reference)
                                 end
                                 end
                               else
                               else
-                                tg.GetLocal(list,vs.getsize,tparavarsym(vs).paraloc[calleeside].alignment,vs.vardef,vs.initialloc.reference);
+                                hlcg.GetLocal(list,vs,vs.getsize,tparavarsym(vs).paraloc[calleeside].alignment,vs.vardef,vs.initialloc.reference);
                             end;
                             end;
                         end;
                         end;
                     end;
                     end;
@@ -1029,7 +1029,7 @@ implementation
                   else
                   else
                     begin
                     begin
                       vs.initialloc.loc:=LOC_REFERENCE;
                       vs.initialloc.loc:=LOC_REFERENCE;
-                      tg.GetLocal(list,vs.getsize,vs.vardef,vs.initialloc.reference);
+                      hlcg.GetLocal(list,vs,vs.getsize,vs.vardef.alignment,vs.vardef,vs.initialloc.reference);
                     end;
                     end;
                   hlcg.varsym_set_localloc(list,vs);
                   hlcg.varsym_set_localloc(list,vs);
                 end;
                 end;