* converted gen_stack_check_call() to the high level code generator

git-svn-id: trunk@33990 -
This commit is contained in:
Jonas Maebe 2016-06-15 18:31:52 +00:00
parent 4121facc7a
commit 98ac6c4797
3 changed files with 33 additions and 36 deletions

View File

@ -631,6 +631,8 @@ unit hlcgobj;
procedure gen_load_return_value(list:TAsmList);virtual;
{ extras refactored from other units }
procedure gen_stack_check_size_para(list:TAsmList); virtual;
procedure gen_stack_check_call(list:TAsmList); virtual;
{ queue the code/data generated for a procedure for writing out to
the assembler/object file }
@ -5191,6 +5193,35 @@ implementation
gen_load_uninitialized_function_result(list,current_procinfo.procdef,retdef,current_procinfo.procdef.funcretloc[calleeside])
end;
procedure thlcgobj.gen_stack_check_size_para(list: TAsmList);
var
paraloc1 : tcgpara;
pd : tprocdef;
begin
pd:=search_system_proc('fpc_stackcheck');
paraloc1.init;
paramanager.getintparaloc(current_asmdata.CurrAsmList,pd,1,paraloc1);
hlcg.a_load_const_cgpara(list,paraloc1.def,current_procinfo.calc_stackframe_size,paraloc1);
paramanager.freecgpara(list,paraloc1);
paraloc1.done;
end;
procedure thlcgobj.gen_stack_check_call(list: TAsmList);
var
paraloc1 : tcgpara;
pd : tprocdef;
begin
pd:=search_system_proc('fpc_stackcheck');
paraloc1.init;
{ The parameter to fpc_stackcheck is loaded seperately via
gen_stack_check_size_para() }
paramanager.getintparaloc(list,pd,1,paraloc1);
paramanager.freecgpara(list,paraloc1);
{ Call the helper }
hlcg.g_call_system_proc(list,pd,[@paraloc1],nil);
paraloc1.done;
end;
procedure thlcgobj.record_generated_code_for_procdef(pd: tprocdef; code, data: TAsmList);
var
alt: TAsmListType;

View File

@ -79,8 +79,6 @@ interface
procedure release_proc_symbol(pd:tprocdef);
procedure gen_proc_entry_code(list:TAsmList);
procedure gen_proc_exit_code(list:TAsmList);
procedure gen_stack_check_size_para(list:TAsmList);
procedure gen_stack_check_call(list:TAsmList);
procedure gen_save_used_regs(list:TAsmList);
procedure gen_restore_used_regs(list:TAsmList);
procedure gen_load_para_value(list:TAsmList);
@ -1467,38 +1465,6 @@ implementation
end;
procedure gen_stack_check_size_para(list:TAsmList);
var
paraloc1 : tcgpara;
pd : tprocdef;
begin
pd:=search_system_proc('fpc_stackcheck');
paraloc1.init;
paramanager.getintparaloc(current_asmdata.CurrAsmList,pd,1,paraloc1);
cg.a_load_const_cgpara(list,OS_INT,current_procinfo.calc_stackframe_size,paraloc1);
paramanager.freecgpara(list,paraloc1);
paraloc1.done;
end;
procedure gen_stack_check_call(list:TAsmList);
var
paraloc1 : tcgpara;
pd : tprocdef;
begin
pd:=search_system_proc('fpc_stackcheck');
paraloc1.init;
{ Also alloc the register needed for the parameter }
paramanager.getintparaloc(current_asmdata.CurrAsmList,pd,1,paraloc1);
paramanager.freecgpara(list,paraloc1);
{ Call the helper }
cg.allocallcpuregisters(list);
cg.a_call_name(list,'FPC_STACKCHECK',false);
cg.deallocallcpuregisters(list);
paraloc1.done;
end;
procedure gen_save_used_regs(list:TAsmList);
begin
{ Pure assembler routines need to save the registers themselves }

View File

@ -1556,7 +1556,7 @@ implementation
(procdef.proctypeoption<>potype_proginit) then
begin
current_filepos:=entrypos;
gen_stack_check_call(templist);
hlcg.gen_stack_check_call(templist);
aktproccode.insertlistafter(stackcheck_asmnode.currenttai,templist)
end;
@ -1627,7 +1627,7 @@ implementation
(procdef.proctypeoption<>potype_proginit) then
begin
current_filepos:=entrypos;
gen_stack_check_size_para(templist);
hlcg.gen_stack_check_size_para(templist);
aktproccode.insertlistafter(stackcheck_asmnode.currenttai,templist)
end;
{ Add entry code (stack allocation) after header }