mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-05 20:27:56 +02:00
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:
parent
dd768554b4
commit
49cb7b2564
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
||||
|
@ -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';
|
||||
|
Loading…
Reference in New Issue
Block a user