* rework InsertInitFinalTable a bit more so that the list of init/fini entries does not need to be generated twice for AVR

git-svn-id: trunk@36310 -
This commit is contained in:
svenbarth 2017-05-23 19:58:39 +00:00
parent fab6f70de8
commit 7c9aeda656
3 changed files with 26 additions and 14 deletions

View File

@ -26,6 +26,7 @@ unit navrutil;
interface interface
uses uses
cclasses,
node,nbas, node,nbas,
ngenutil, ngenutil,
symtype,symconst,symsym,symdef; symtype,symconst,symsym,symdef;
@ -33,14 +34,14 @@ interface
type type
tavrnodeutils = class(tnodeutils) tavrnodeutils = class(tnodeutils)
class procedure InsertInitFinalTable; override; protected
class procedure insert_init_final_table(entries:tfplist); override;
end; end;
implementation implementation
uses uses
verbose,cutils,globtype,globals,constexp,fmodule, verbose,cutils,globtype,globals,constexp,fmodule,
cclasses,
aasmdata,aasmtai,aasmcpu,aasmcnst,aasmbase, aasmdata,aasmtai,aasmcpu,aasmcnst,aasmbase,
cpubase, cpubase,
symbase,symcpu,symtable,defutil, symbase,symcpu,symtable,defutil,
@ -51,11 +52,10 @@ implementation
pass_1; pass_1;
class procedure tavrnodeutils.InsertInitFinalTable; class procedure tavrnodeutils.insert_init_final_table(entries:tfplist);
var var
op : TAsmOp; op : TAsmOp;
initList, finalList, header: TAsmList; initList, finalList, header: TAsmList;
entries : tfplist;
entry : pinitfinalentry; entry : pinitfinalentry;
i : longint; i : longint;
begin begin
@ -67,7 +67,6 @@ implementation
else else
op:=A_RCALL; op:=A_RCALL;
entries:=get_init_final_list;
for i:=0 to entries.count-1 do for i:=0 to entries.count-1 do
begin begin
entry:=pinitfinalentry(entries[i]); entry:=pinitfinalentry(entries[i]);
@ -76,7 +75,6 @@ implementation
if entry^.initfunc<>'' then if entry^.initfunc<>'' then
initList.Concat(taicpu.op_sym(op,current_asmdata.RefAsmSymbol(entry^.initfunc,AT_FUNCTION))); initList.Concat(taicpu.op_sym(op,current_asmdata.RefAsmSymbol(entry^.initfunc,AT_FUNCTION)));
end; end;
release_init_final_list(entries);
initList.Concat(taicpu.op_none(A_RET)); initList.Concat(taicpu.op_none(A_RET));
finalList.Concat(taicpu.op_none(A_RET)); finalList.Concat(taicpu.op_none(A_RET));
@ -106,7 +104,7 @@ implementation
initList.Free; initList.Free;
finalList.Free; finalList.Free;
inherited InsertInitFinalTable; inherited insert_init_final_table(entries);
end; end;
begin begin

View File

@ -26,6 +26,7 @@ unit njvmutil;
interface interface
uses uses
cclasses,
node,nbas, node,nbas,
ngenutil, ngenutil,
symtype,symconst,symsym,symdef; symtype,symconst,symsym,symdef;
@ -43,7 +44,6 @@ interface
class function trashable_sym(p: tsym): boolean; override; class function trashable_sym(p: tsym): boolean; override;
class procedure maybe_trash_variable(var stat: tstatementnode; p: tabstractnormalvarsym; trashn: tnode); override; class procedure maybe_trash_variable(var stat: tstatementnode; p: tabstractnormalvarsym; trashn: tnode); override;
class procedure InsertInitFinalTable; override;
class procedure InsertThreadvarTablesTable; override; class procedure InsertThreadvarTablesTable; override;
class procedure InsertThreadvars; override; class procedure InsertThreadvars; override;
class procedure InsertWideInitsTablesTable; override; class procedure InsertWideInitsTablesTable; override;
@ -53,6 +53,8 @@ interface
class procedure InsertResStrTablesTable; override; class procedure InsertResStrTablesTable; override;
class procedure InsertResStrInits; override; class procedure InsertResStrInits; override;
class procedure InsertMemorySizes; override; class procedure InsertMemorySizes; override;
protected
class procedure insert_init_final_table(entries:tfplist); override;
strict protected strict protected
class procedure add_main_procdef_paras(pd: tdef); override; class procedure add_main_procdef_paras(pd: tdef); override;
end; end;
@ -378,7 +380,7 @@ implementation
inherited; inherited;
end; end;
class procedure tjvmnodeutils.InsertInitFinalTable; class procedure tjvmnodeutils.insert_init_final_table(entries:tfplist);
var var
hp : tused_unit; hp : tused_unit;
unitinits : TAsmList; unitinits : TAsmList;
@ -386,6 +388,8 @@ implementation
mainpsym: tsym; mainpsym: tsym;
mainpd: tprocdef; mainpd: tprocdef;
begin begin
{ JVM does not use the entries list }
unitinits:=TAsmList.Create; unitinits:=TAsmList.Create;
hp:=tused_unit(usedunits.first); hp:=tused_unit(usedunits.first);
while assigned(hp) do while assigned(hp) do

View File

@ -109,11 +109,13 @@ interface
class procedure insertbssdata(sym : tstaticvarsym); virtual; class procedure insertbssdata(sym : tstaticvarsym); virtual;
class function create_main_procdef(const name: string; potype:tproctypeoption; ps: tprocsym):tdef; virtual; class function create_main_procdef(const name: string; potype:tproctypeoption; ps: tprocsym):tdef; virtual;
class procedure InsertInitFinalTable; virtual; class procedure InsertInitFinalTable;;
protected protected
class procedure InsertRuntimeInits(const prefix:string;list:TLinkedList;unitflag:cardinal); virtual; class procedure InsertRuntimeInits(const prefix:string;list:TLinkedList;unitflag:cardinal); virtual;
class procedure InsertRuntimeInitsTablesTable(const prefix,tablename:string;unitflag:cardinal); virtual; class procedure InsertRuntimeInitsTablesTable(const prefix,tablename:string;unitflag:cardinal); virtual;
class procedure insert_init_final_table(entries:tfplist); virtual;
class function get_init_final_list: tfplist; class function get_init_final_list: tfplist;
class procedure release_init_final_list(list:tfplist); class procedure release_init_final_list(list:tfplist);
public public
@ -1017,12 +1019,23 @@ implementation
class procedure tnodeutils.InsertInitFinalTable; class procedure tnodeutils.InsertInitFinalTable;
var
entries : tfplist;
begin
entries := get_init_final_list;
insert_init_final_table(entries);
release_init_final_list(entries);
end;
class procedure tnodeutils.insert_init_final_table(entries:tfplist);
var var
i : longint; i : longint;
unitinits : ttai_typedconstbuilder; unitinits : ttai_typedconstbuilder;
nameinit,namefini : TSymStr; nameinit,namefini : TSymStr;
tabledef: tdef; tabledef: tdef;
entries : tfplist;
entry : pinitfinalentry; entry : pinitfinalentry;
procedure add_initfinal_import(symtable:tsymtable); procedure add_initfinal_import(symtable:tsymtable);
@ -1070,7 +1083,6 @@ implementation
targetinfos[target_info.system]^.alignment.recordalignmin, targetinfos[target_info.system]^.alignment.recordalignmin,
targetinfos[target_info.system]^.alignment.maxCrecordalign); targetinfos[target_info.system]^.alignment.maxCrecordalign);
entries:=get_init_final_list;
{ tablecount } { tablecount }
unitinits.emit_ord_const(entries.count,aluuinttype); unitinits.emit_ord_const(entries.count,aluuinttype);
{ initcount (initialised at run time } { initcount (initialised at run time }
@ -1125,8 +1137,6 @@ implementation
end; end;
end; end;
release_init_final_list(entries);
{ Add to data segment } { Add to data segment }
tabledef:=unitinits.end_anonymous_record; tabledef:=unitinits.end_anonymous_record;
current_asmdata.asmlists[al_globals].concatlist( current_asmdata.asmlists[al_globals].concatlist(