mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-24 22:10:42 +02:00
* allow g_ptrtypecast_reg() to allocate a new register, because spilling
a bitcast that reads from and writes to the same register doesn't work well * changed pointerdef parameters of g_ptrtypecast_reg()/ref() to regular tdef so that these routines can also be used with procvardefs (which are pointers, but not pointerdefs), except for the fromdef of g_ptrtypecast_ref() as this one has to call a_loadaddr_ref_reg() (which needs the pointeddef, and getting that is not possible for non-pointerdefs) git-svn-id: trunk@32417 -
This commit is contained in:
parent
abd79d275f
commit
00a5dd87c9
@ -532,12 +532,17 @@ unit hlcgobj;
|
|||||||
procedure g_reference_loc(list: TAsmList; def: tdef; const fromloc: tlocation; out toloc: tlocation); virtual;
|
procedure g_reference_loc(list: TAsmList; def: tdef; const fromloc: tlocation; out toloc: tlocation); virtual;
|
||||||
|
|
||||||
{ typecasts the pointer in reg to a new pointer. By default it does
|
{ typecasts the pointer in reg to a new pointer. By default it does
|
||||||
nothing, only required for type-aware platforms like LLVM }
|
nothing, only required for type-aware platforms like LLVM.
|
||||||
procedure g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister); virtual;
|
fromdef/todef are not typed as pointerdef, because they may also be
|
||||||
|
a procvardef or classrefdef. Replaces reg with a new register if
|
||||||
|
necessary }
|
||||||
|
procedure g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tdef; var reg: tregister); virtual;
|
||||||
{ same but for a treference (considers the reference itself, not the
|
{ same but for a treference (considers the reference itself, not the
|
||||||
value stored at that place in memory). Replaces ref with a new
|
value stored at that place in memory). Replaces ref with a new
|
||||||
reference if necessary }
|
reference if necessary. fromdef needs to be a pointerdef because
|
||||||
procedure g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference); virtual;
|
it may have to be passed as fromdef to a_loadaddr_ref_reg, which
|
||||||
|
needs the "pointeddef" of fromdef }
|
||||||
|
procedure g_ptrtypecast_ref(list: TAsmList; fromdef: tpointerdef; todef: tdef; var ref: treference); virtual;
|
||||||
|
|
||||||
{ update a reference pointing to the start address of a record/object/
|
{ update a reference pointing to the start address of a record/object/
|
||||||
class (contents) so it refers to the indicated field }
|
class (contents) so it refers to the indicated field }
|
||||||
@ -3834,12 +3839,12 @@ implementation
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure thlcgobj.g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister);
|
procedure thlcgobj.g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tdef; var reg: tregister);
|
||||||
begin
|
begin
|
||||||
{ nothing to do }
|
{ nothing to do }
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure thlcgobj.g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference);
|
procedure thlcgobj.g_ptrtypecast_ref(list: TAsmList; fromdef: tpointerdef; todef: tdef; var ref: treference);
|
||||||
begin
|
begin
|
||||||
{ nothing to do }
|
{ nothing to do }
|
||||||
end;
|
end;
|
||||||
|
@ -94,8 +94,8 @@ uses
|
|||||||
procedure g_overflowcheck(list: TAsmList; const Loc: tlocation; def: tdef); override;
|
procedure g_overflowcheck(list: TAsmList; const Loc: tlocation; def: tdef); override;
|
||||||
procedure g_overflowCheck_loc(List:TAsmList;const Loc:TLocation;def:TDef;var ovloc : tlocation); override;
|
procedure g_overflowCheck_loc(List:TAsmList;const Loc:TLocation;def:TDef;var ovloc : tlocation); override;
|
||||||
|
|
||||||
procedure g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister); override;
|
procedure g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tdef; var reg: tregister); override;
|
||||||
procedure g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference); override;
|
procedure g_ptrtypecast_ref(list: TAsmList; fromdef: tpointerdef; todef: tdef; var ref: treference); override;
|
||||||
|
|
||||||
procedure g_set_addr_nonbitpacked_field_ref(list: TAsmList; recdef: tabstractrecorddef; field: tfieldvarsym; var recref: treference); override;
|
procedure g_set_addr_nonbitpacked_field_ref(list: TAsmList; recdef: tabstractrecorddef; field: tfieldvarsym; var recref: treference); override;
|
||||||
|
|
||||||
@ -1195,15 +1195,23 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure thlcgllvm.g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister);
|
procedure thlcgllvm.g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tdef; var reg: tregister);
|
||||||
|
var
|
||||||
|
hreg: tregister;
|
||||||
begin
|
begin
|
||||||
{ will insert a bitcast if necessary }
|
{ will insert a bitcast if necessary }
|
||||||
a_load_reg_reg(list,fromdef,todef,reg,reg);
|
if fromdef<>todef then
|
||||||
|
begin
|
||||||
|
hreg:=getregisterfordef(list,todef);
|
||||||
|
a_load_reg_reg(list,fromdef,todef,reg,hreg);
|
||||||
|
reg:=hreg;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure thlcgllvm.g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference);
|
procedure thlcgllvm.g_ptrtypecast_ref(list: TAsmList; fromdef: tpointerdef; todef: tdef; var ref: treference);
|
||||||
var
|
var
|
||||||
|
sref: treference;
|
||||||
hreg: tregister;
|
hreg: tregister;
|
||||||
begin
|
begin
|
||||||
hreg:=getaddressregister(list,todef);
|
hreg:=getaddressregister(list,todef);
|
||||||
|
Loading…
Reference in New Issue
Block a user