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
This commit is contained in:
Jonas Maebe 2023-12-06 22:53:26 +01:00
parent dd768554b4
commit 49cb7b2564
5 changed files with 16 additions and 8 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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';