mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-25 00:29:25 +02:00
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:
parent
a76085e463
commit
a76038e1d1
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user