Browse Source

LLVM: use llvm.dbg.declare instead of llvm.dbg.addr for variable declarations

Even though it's supposedly deprecated, clang also still uses it and without
the declaration ranges of local variables are sometimes cut off
Jonas Maebe 1 year ago
parent
commit
49cb7b2564
5 changed files with 16 additions and 8 deletions
  1. 3 3
      compiler/hlcgobj.pas
  2. 5 1
      compiler/llvm/dbgllvm.pas
  3. 6 3
      compiler/llvm/hlcgllvm.pas
  4. 1 1
      compiler/ncgld.pas
  5. 1 0
      rtl/inc/llvmintr.inc

+ 3 - 3
compiler/hlcgobj.pas

@@ -653,7 +653,7 @@ unit hlcgobj;
           { 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;
+          procedure recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference; initial: boolean); virtual;
          protected
           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);
@@ -5289,10 +5289,10 @@ implementation
   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);
+      recordnewsymloc(list,sym,def,ref,true);
     end;
 
-  procedure thlcgobj.recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference);
+  procedure thlcgobj.recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference; initial: boolean);
     begin
       // do nothing
     end;

+ 5 - 1
compiler/llvm/dbgllvm.pas

@@ -83,6 +83,7 @@ interface
         { reusable deref node }
         fderefexpression  : tai_llvmspecialisedmetadatanode;
 
+        fllvm_dbg_declare_pd: tprocdef;
         fllvm_dbg_addr_pd: tprocdef;
 
         function absolute_llvm_path(const s:tcmdstr):tcmdstr;
@@ -490,6 +491,8 @@ implementation
 
     procedure TDebugInfoLLVM.ensuremetainit;
       begin
+        if not assigned(fllvm_dbg_declare_pd) then
+          fllvm_dbg_declare_pd:=search_system_proc('llvm_dbg_declare');
         if not assigned(fllvm_dbg_addr_pd) then
           fllvm_dbg_addr_pd:=search_system_proc('llvm_dbg_addr');
         if not assigned(fenums) then
@@ -574,7 +577,8 @@ implementation
         { not really clean since hardcoding the structure of the call
           instruction's procdef encoding, but quick }
         if (hp.oper[taillvm.callpdopernr]^.def.typ<>pointerdef) or
-           (tpointerdef(hp.oper[taillvm.callpdopernr]^.def).pointeddef<>fllvm_dbg_addr_pd) then
+           ((tpointerdef(hp.oper[taillvm.callpdopernr]^.def).pointeddef<>fllvm_dbg_declare_pd) and
+            (tpointerdef(hp.oper[taillvm.callpdopernr]^.def).pointeddef<>fllvm_dbg_addr_pd)) then
           exit;
         deref:=false;
 

+ 6 - 3
compiler/llvm/hlcgllvm.pas

@@ -52,7 +52,7 @@ uses
       procedure allocallcpuregisters(list: TAsmList); override;
       procedure deallocallcpuregisters(list: TAsmList); override;
 
-      procedure recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference); override;
+      procedure recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference; initial: boolean); override;
 
       class function def2regtyp(def: tdef): tregistertype; override;
      public
@@ -403,7 +403,7 @@ implementation
     end;
 
 
-  procedure thlcgllvm.recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference);
+  procedure thlcgllvm.recordnewsymloc(list: TAsmList; sym: tsym; def: tdef; const ref: treference; initial: boolean);
     var
       varmetapara,
       symmetadatapara,
@@ -414,7 +414,10 @@ implementation
          (sym.visibility<>vis_hidden) and
          (cs_debuginfo in current_settings.moduleswitches) then
         begin
-          pd:=search_system_proc('llvm_dbg_addr');
+          if initial then
+            pd:=search_system_proc('llvm_dbg_declare')
+          else
+            pd:=search_system_proc('llvm_dbg_addr');
           varmetapara.init;
           symmetadatapara.init;
           exprmetapara.init;

+ 1 - 1
compiler/ncgld.pas

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

+ 1 - 0
rtl/inc/llvmintr.inc

@@ -117,4 +117,5 @@ function llvm_experimental_constrained_uitofp_f64_i64(val: qword; rounding, exce
 function llvm_experimental_constrained_uitofp_f80_i64(val: qword; rounding, exceptions: LLVMMetadata): extended; compilerproc; external name 'llvm.experimental.constrained.uitofp.x86_fp80.i64';
 {$endif}
 
+procedure llvm_dbg_declare(address, description, expression: LLVMMetadata); compilerproc; external name 'llvm.dbg.declare';
 procedure llvm_dbg_addr(address, description, expression: LLVMMetadata); compilerproc; external name 'llvm.dbg.addr';