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)
This commit is contained in:
Jonas Maebe 2022-05-27 21:24:59 +02:00
parent a76085e463
commit a76038e1d1
4 changed files with 62 additions and 4 deletions

View File

@ -638,6 +638,11 @@ unit hlcgobj;
procedure gen_load_para_value(list:TAsmList);virtual;
{ helpers called by gen_load_para_value }
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
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);
@ -5206,7 +5211,7 @@ implementation
l:=tparavarsym(p).getsize;
localcopyloc.loc:=LOC_REFERENCE;
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 }
if is_shortstring(tparavarsym(p).vardef) then
begin
@ -5237,6 +5242,19 @@ implementation
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);
var
tmploc: tlocation;

View File

@ -52,6 +52,9 @@ uses
procedure allocallcpuregisters(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_set_reg_reg(list: TAsmList; doset: boolean; bitnumbersize, destsize: tdef; bitnumber, dest: tregister); override;
@ -384,6 +387,42 @@ implementation
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);
var
tmpbitnumberreg: tregister;

View File

@ -236,6 +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);
end;

View File

@ -980,10 +980,10 @@ implementation
if isaddr then
begin
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
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;
@ -1029,7 +1029,7 @@ implementation
else
begin
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;
hlcg.varsym_set_localloc(list,vs);
end;