mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-20 09:49:08 +02:00
* LLVM=: also merge varargs paralocs
git-svn-id: branches/debug_eh@41520 -
This commit is contained in:
parent
e720a1f306
commit
8f6820a9f1
@ -49,12 +49,14 @@ unit llvmpara;
|
|||||||
function param_use_paraloc(const cgpara: tcgpara): boolean; override;
|
function param_use_paraloc(const cgpara: tcgpara): boolean; override;
|
||||||
procedure createtempparaloc(list: TAsmList; calloption: tproccalloption; parasym: tparavarsym; can_use_final_stack_loc: boolean; var cgpara: TCGPara); override;
|
procedure createtempparaloc(list: TAsmList; calloption: tproccalloption; parasym: tparavarsym; can_use_final_stack_loc: boolean; var cgpara: TCGPara); override;
|
||||||
function create_paraloc_info(p: tabstractprocdef; side: tcallercallee): longint; override;
|
function create_paraloc_info(p: tabstractprocdef; side: tcallercallee): longint; override;
|
||||||
|
function create_varargs_paraloc_info(p: tabstractprocdef; side: tcallercallee; varargspara: tvarargsparalist): longint; override;
|
||||||
function get_funcretloc(p: tabstractprocdef; side: tcallercallee; forcetempdef: tdef): tcgpara; override;
|
function get_funcretloc(p: tabstractprocdef; side: tcallercallee; forcetempdef: tdef): tcgpara; override;
|
||||||
private
|
private
|
||||||
|
procedure create_paraloc_info_internllvm(p: tabstractprocdef; side: tcallercallee);
|
||||||
procedure set_llvm_paraloc_name(p: tabstractprocdef; hp: tparavarsym; var para: tcgpara);
|
procedure set_llvm_paraloc_name(p: tabstractprocdef; hp: tparavarsym; var para: tcgpara);
|
||||||
procedure add_llvm_callee_paraloc_names(p: tabstractprocdef);
|
procedure add_llvm_callee_paraloc_names(p: tabstractprocdef);
|
||||||
procedure reducetosingleregparaloc(paraloc: PCGParaLocation; def: tdef; reg: tregister);
|
procedure reducetosingleregparaloc(paraloc: PCGParaLocation; def: tdef; reg: tregister);
|
||||||
procedure reduceparalocs(p: tabstractprocdef; side: tcallercallee);
|
procedure reduceparalocs(p: tabstractprocdef; side: tcallercallee; paras: tparalist);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -108,15 +110,15 @@ unit llvmpara;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tllvmparamanager.reduceparalocs(p: tabstractprocdef; side: tcallercallee);
|
procedure tllvmparamanager.reduceparalocs(p: tabstractprocdef; side: tcallercallee; paras: tparalist);
|
||||||
var
|
var
|
||||||
paranr: longint;
|
paranr: longint;
|
||||||
hp: tparavarsym;
|
hp: tparavarsym;
|
||||||
paraloc: PCGParaLocation;
|
paraloc: PCGParaLocation;
|
||||||
begin
|
begin
|
||||||
for paranr:=0 to p.paras.count-1 do
|
for paranr:=0 to paras.count-1 do
|
||||||
begin
|
begin
|
||||||
hp:=tparavarsym(p.paras[paranr]);
|
hp:=tparavarsym(paras[paranr]);
|
||||||
paraloc:=hp.paraloc[side].location;
|
paraloc:=hp.paraloc[side].location;
|
||||||
if assigned(paraloc) and
|
if assigned(paraloc) and
|
||||||
assigned(paraloc^.next) and
|
assigned(paraloc^.next) and
|
||||||
@ -211,21 +213,17 @@ unit llvmpara;
|
|||||||
|
|
||||||
function tllvmparamanager.create_paraloc_info(p: tabstractprocdef; side: tcallercallee): longint;
|
function tllvmparamanager.create_paraloc_info(p: tabstractprocdef; side: tcallercallee): longint;
|
||||||
begin
|
begin
|
||||||
result:=inherited create_paraloc_info(p, side);
|
result:=inherited;
|
||||||
{ on the calleeside, llvm declares the parameters similar to Pascal or C
|
create_paraloc_info_internllvm(p,side);
|
||||||
(a list of parameters and their types), but they correspond more
|
end;
|
||||||
closely to parameter locations than to parameters -> add names to the
|
|
||||||
locations }
|
|
||||||
if (side=calleeside) and
|
function tllvmparamanager.create_varargs_paraloc_info(p: tabstractprocdef; side: tcallercallee; varargspara: tvarargsparalist): longint;
|
||||||
not(po_assembler in p.procoptions) then
|
begin
|
||||||
begin
|
result:=inherited;
|
||||||
add_llvm_callee_paraloc_names(p);
|
create_paraloc_info_internllvm(p,side);
|
||||||
reduceparalocs(p,side);
|
if assigned(varargspara) then
|
||||||
end
|
reduceparalocs(p,side,varargspara);
|
||||||
else if side=callerside then
|
|
||||||
begin
|
|
||||||
reduceparalocs(p,side);
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -252,6 +250,25 @@ unit llvmpara;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure tllvmparamanager.create_paraloc_info_internllvm(p: tabstractprocdef; side: tcallercallee);
|
||||||
|
begin
|
||||||
|
{ on the calleeside, llvm declares the parameters similar to Pascal or C
|
||||||
|
(a list of parameters and their types), but they correspond more
|
||||||
|
closely to parameter locations than to parameters -> add names to the
|
||||||
|
locations }
|
||||||
|
if (side=calleeside) and
|
||||||
|
not(po_assembler in p.procoptions) then
|
||||||
|
begin
|
||||||
|
add_llvm_callee_paraloc_names(p);
|
||||||
|
reduceparalocs(p,side,p.paras);
|
||||||
|
end
|
||||||
|
else if side=callerside then
|
||||||
|
begin
|
||||||
|
reduceparalocs(p,side,p.paras);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ hp non-nil: parasym to check
|
{ hp non-nil: parasym to check
|
||||||
hp nil: function result
|
hp nil: function result
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user