mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-04 07:50:17 +02:00
* split en_exit_code into a part that may allocate a register and a part
that doesn't, so the former can be done before the register colouring has been performed
This commit is contained in:
parent
af784cfb1e
commit
177d57f22c
@ -69,7 +69,7 @@ interface
|
|||||||
|
|
||||||
procedure gen_entry_code(list:TAAsmoutput;inlined:boolean);
|
procedure gen_entry_code(list:TAAsmoutput;inlined:boolean);
|
||||||
procedure gen_stackalloc_code(list:Taasmoutput);
|
procedure gen_stackalloc_code(list:Taasmoutput);
|
||||||
procedure gen_exit_code(list:Taasmoutput;inlined:boolean);
|
procedure gen_exit_code(list : TAAsmoutput;inlined,usesacc,usesacchi,usesfpu:boolean);
|
||||||
|
|
||||||
(*
|
(*
|
||||||
procedure geninlineentrycode(list : TAAsmoutput;stackframe:longint);
|
procedure geninlineentrycode(list : TAAsmoutput;stackframe:longint);
|
||||||
@ -274,16 +274,28 @@ implementation
|
|||||||
cg.a_paramaddr_ref(list,jmpbuf,paramanager.getintparaloc(list,2));
|
cg.a_paramaddr_ref(list,jmpbuf,paramanager.getintparaloc(list,2));
|
||||||
{ push type of exceptionframe }
|
{ push type of exceptionframe }
|
||||||
cg.a_param_const(list,OS_S32,1,paramanager.getintparaloc(list,1));
|
cg.a_param_const(list,OS_S32,1,paramanager.getintparaloc(list,1));
|
||||||
cg.a_call_name(list,'FPC_PUSHEXCEPTADDR');
|
|
||||||
paramanager.freeintparaloc(list,3);
|
paramanager.freeintparaloc(list,3);
|
||||||
paramanager.freeintparaloc(list,2);
|
paramanager.freeintparaloc(list,2);
|
||||||
paramanager.freeintparaloc(list,1);
|
paramanager.freeintparaloc(list,1);
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
|
cg.a_call_name(list,'FPC_PUSHEXCEPTADDR');
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
|
|
||||||
r.enum:=R_INTREGISTER;
|
r.enum:=R_INTREGISTER;
|
||||||
r.number:=NR_FUNCTION_RESULT_REG;
|
r.number:=NR_FUNCTION_RESULT_REG;
|
||||||
cg.a_param_reg(list,OS_ADDR,r,paramanager.getintparaloc(list,1));
|
cg.a_param_reg(list,OS_ADDR,r,paramanager.getintparaloc(list,1));
|
||||||
cg.a_call_name(list,'FPC_SETJMP');
|
|
||||||
paramanager.freeintparaloc(list,1);
|
paramanager.freeintparaloc(list,1);
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
|
cg.a_call_name(list,'FPC_SETJMP');
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
|
|
||||||
cg.g_exception_reason_save(list, href);
|
cg.g_exception_reason_save(list, href);
|
||||||
cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,r,exceptlabel);
|
cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,r,exceptlabel);
|
||||||
@ -296,7 +308,13 @@ implementation
|
|||||||
var r:Tregister;
|
var r:Tregister;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
cg.a_call_name(list,'FPC_POPADDRSTACK');
|
cg.a_call_name(list,'FPC_POPADDRSTACK');
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
|
|
||||||
if not onlyfree then
|
if not onlyfree then
|
||||||
begin
|
begin
|
||||||
@ -1231,23 +1249,41 @@ implementation
|
|||||||
begin
|
begin
|
||||||
reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
|
reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
|
||||||
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
|
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
|
||||||
cg.a_call_name(list,'FPC_ANSISTR_DECR_REF');
|
|
||||||
paramanager.freeintparaloc(list,1);
|
paramanager.freeintparaloc(list,1);
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
|
cg.a_call_name(list,'FPC_ANSISTR_DECR_REF');
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
end;
|
end;
|
||||||
tt_widestring,
|
tt_widestring,
|
||||||
tt_freewidestring :
|
tt_freewidestring :
|
||||||
begin
|
begin
|
||||||
reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
|
reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
|
||||||
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
|
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
|
||||||
cg.a_call_name(list,'FPC_WIDESTR_DECR_REF');
|
|
||||||
paramanager.freeintparaloc(list,1);
|
paramanager.freeintparaloc(list,1);
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
|
cg.a_call_name(list,'FPC_WIDESTR_DECR_REF');
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
end;
|
end;
|
||||||
tt_interfacecom :
|
tt_interfacecom :
|
||||||
begin
|
begin
|
||||||
reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
|
reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
|
||||||
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
|
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
|
||||||
cg.a_call_name(list,'FPC_INTF_DECR_REF');
|
|
||||||
paramanager.freeintparaloc(list,1);
|
paramanager.freeintparaloc(list,1);
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
|
cg.a_call_name(list,'FPC_INTF_DECR_REF');
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
hp:=hp^.next;
|
hp:=hp^.next;
|
||||||
@ -1492,13 +1528,25 @@ implementation
|
|||||||
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,2));
|
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,2));
|
||||||
reference_reset_symbol(href,objectlibrary.newasmsymboldata('__image_base__'),0);
|
reference_reset_symbol(href,objectlibrary.newasmsymboldata('__image_base__'),0);
|
||||||
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
|
cg.a_paramaddr_ref(list,href,paramanager.getintparaloc(list,1));
|
||||||
cg.a_call_name(list,'_monstartup');
|
|
||||||
paramanager.freeintparaloc(list,2);
|
paramanager.freeintparaloc(list,2);
|
||||||
paramanager.freeintparaloc(list,1);
|
paramanager.freeintparaloc(list,1);
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
|
cg.a_call_name(list,'_monstartup');
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ initialize units }
|
{ initialize units }
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.allocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
cg.a_call_name(list,'FPC_INITIALIZEUNITS');
|
cg.a_call_name(list,'FPC_INITIALIZEUNITS');
|
||||||
|
{$ifdef newra}
|
||||||
|
rg.deallocexplicitregistersint(list,VOLATILE_INTREGISTERS);
|
||||||
|
{$endif newra}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$ifdef GDB}
|
{$ifdef GDB}
|
||||||
@ -1689,7 +1737,7 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure gen_exit_code(list : TAAsmoutput;inlined:boolean);
|
procedure gen_exit_code(list : TAAsmoutput;inlined,usesacc,usesacchi,usesfpu:boolean);
|
||||||
|
|
||||||
var
|
var
|
||||||
{$ifdef GDB}
|
{$ifdef GDB}
|
||||||
@ -1697,18 +1745,9 @@ implementation
|
|||||||
mangled_length : longint;
|
mangled_length : longint;
|
||||||
p : pchar;
|
p : pchar;
|
||||||
{$endif GDB}
|
{$endif GDB}
|
||||||
usesacc,
|
|
||||||
usesacchi,
|
|
||||||
usesfpu : boolean;
|
|
||||||
rsp : Tregister;
|
rsp : Tregister;
|
||||||
retsize : longint;
|
retsize : longint;
|
||||||
begin
|
begin
|
||||||
{ handle return value, this is not done for assembler routines when
|
|
||||||
they didn't reference the result variable }
|
|
||||||
usesacc:=false;
|
|
||||||
usesfpu:=false;
|
|
||||||
usesacchi:=false;
|
|
||||||
gen_load_return_value(list,usesacc,usesacchi,usesfpu);
|
|
||||||
|
|
||||||
{$ifdef GDB}
|
{$ifdef GDB}
|
||||||
if ((cs_debuginfo in aktmoduleswitches) and not inlined) then
|
if ((cs_debuginfo in aktmoduleswitches) and not inlined) then
|
||||||
@ -1987,7 +2026,12 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.130 2003-07-06 17:58:22 peter
|
Revision 1.131 2003-07-23 11:04:15 jonas
|
||||||
|
* split en_exit_code into a part that may allocate a register and a part
|
||||||
|
that doesn't, so the former can be done before the register colouring
|
||||||
|
has been performed
|
||||||
|
|
||||||
|
Revision 1.130 2003/07/06 17:58:22 peter
|
||||||
* framepointer fixes for sparc
|
* framepointer fixes for sparc
|
||||||
* parent framepointer code more generic
|
* parent framepointer code more generic
|
||||||
|
|
||||||
|
@ -749,6 +749,9 @@ implementation
|
|||||||
procedure gen_implicit_initfinal(list:taasmoutput;flag:word;st:tsymtable);
|
procedure gen_implicit_initfinal(list:taasmoutput;flag:word;st:tsymtable);
|
||||||
var
|
var
|
||||||
pd : tprocdef;
|
pd : tprocdef;
|
||||||
|
usesacc,
|
||||||
|
usesfpu,
|
||||||
|
usesacchi : boolean;
|
||||||
begin
|
begin
|
||||||
{ update module flags }
|
{ update module flags }
|
||||||
current_module.flags:=current_module.flags or flag;
|
current_module.flags:=current_module.flags or flag;
|
||||||
@ -772,7 +775,11 @@ implementation
|
|||||||
gen_entry_code(list,false);
|
gen_entry_code(list,false);
|
||||||
gen_initialize_code(list,false);
|
gen_initialize_code(list,false);
|
||||||
gen_finalize_code(list,false);
|
gen_finalize_code(list,false);
|
||||||
gen_exit_code(list,false);
|
usesacc:=false;
|
||||||
|
usesfpu:=false;
|
||||||
|
usesacchi:=false;
|
||||||
|
gen_load_return_value(list,usesacc,usesacchi,usesfpu);
|
||||||
|
gen_exit_code(list,false,usesacc,usesacchi,usesfpu);
|
||||||
list.convert_registers;
|
list.convert_registers;
|
||||||
release_main_proc(pd);
|
release_main_proc(pd);
|
||||||
end;
|
end;
|
||||||
@ -1446,7 +1453,12 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.115 2003-07-06 17:58:22 peter
|
Revision 1.116 2003-07-23 11:04:15 jonas
|
||||||
|
* split en_exit_code into a part that may allocate a register and a part
|
||||||
|
that doesn't, so the former can be done before the register colouring
|
||||||
|
has been performed
|
||||||
|
|
||||||
|
Revision 1.115 2003/07/06 17:58:22 peter
|
||||||
* framepointer fixes for sparc
|
* framepointer fixes for sparc
|
||||||
* parent framepointer code more generic
|
* parent framepointer code more generic
|
||||||
|
|
||||||
|
@ -571,6 +571,9 @@ implementation
|
|||||||
oldfilepos : tfileposinfo;
|
oldfilepos : tfileposinfo;
|
||||||
templist,
|
templist,
|
||||||
stackalloccode : Taasmoutput;
|
stackalloccode : Taasmoutput;
|
||||||
|
usesacc,
|
||||||
|
usesfpu,
|
||||||
|
usesacchi : boolean;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
{ the initialization procedure can be empty, then we
|
{ the initialization procedure can be empty, then we
|
||||||
@ -625,11 +628,18 @@ implementation
|
|||||||
aktproccode.insertlistafter(tasmnode(finalasmnode).currenttai,templist)
|
aktproccode.insertlistafter(tasmnode(finalasmnode).currenttai,templist)
|
||||||
else
|
else
|
||||||
aktproccode.concatlist(templist);
|
aktproccode.concatlist(templist);
|
||||||
gen_exit_code(templist,false);
|
|
||||||
aktproccode.concatlist(templist);
|
{ handle return value, this is not done for assembler routines when
|
||||||
|
they didn't reference the result variable }
|
||||||
|
usesacc:=false;
|
||||||
|
usesfpu:=false;
|
||||||
|
usesacchi:=false;
|
||||||
|
gen_load_return_value(aktproccode,usesacc,usesacchi,usesfpu);
|
||||||
|
|
||||||
{$ifdef newra}
|
{$ifdef newra}
|
||||||
{ rg.writegraph;}
|
{$ifdef ra_debug2}
|
||||||
|
rg.writegraph;
|
||||||
|
{$endif}
|
||||||
{$endif}
|
{$endif}
|
||||||
if not(cs_no_regalloc in aktglobalswitches) then
|
if not(cs_no_regalloc in aktglobalswitches) then
|
||||||
begin
|
begin
|
||||||
@ -657,7 +667,11 @@ implementation
|
|||||||
gen_stackalloc_code(stackalloccode);
|
gen_stackalloc_code(stackalloccode);
|
||||||
stackalloccode.convert_registers;
|
stackalloccode.convert_registers;
|
||||||
aktproccode.insertlist(stackalloccode);
|
aktproccode.insertlist(stackalloccode);
|
||||||
stackalloccode.destroy;
|
stackalloccode.free;
|
||||||
|
|
||||||
|
gen_exit_code(templist,false,usesacc,usesacchi,usesfpu);
|
||||||
|
templist.convert_registers;
|
||||||
|
aktproccode.concatlist(templist);
|
||||||
|
|
||||||
{ now all the registers used are known }
|
{ now all the registers used are known }
|
||||||
{ Remove all imaginary registers from the used list.}
|
{ Remove all imaginary registers from the used list.}
|
||||||
@ -1252,7 +1266,12 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.132 2003-07-06 17:58:22 peter
|
Revision 1.133 2003-07-23 11:04:15 jonas
|
||||||
|
* split en_exit_code into a part that may allocate a register and a part
|
||||||
|
that doesn't, so the former can be done before the register colouring
|
||||||
|
has been performed
|
||||||
|
|
||||||
|
Revision 1.132 2003/07/06 17:58:22 peter
|
||||||
* framepointer fixes for sparc
|
* framepointer fixes for sparc
|
||||||
* parent framepointer code more generic
|
* parent framepointer code more generic
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user