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

View File

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

View File

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