From 7c9aeda65600adeabba403d0244bbc70163da25b Mon Sep 17 00:00:00 2001 From: svenbarth Date: Tue, 23 May 2017 19:58:39 +0000 Subject: [PATCH] * 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 - --- compiler/avr/navrutil.pas | 12 +++++------- compiler/jvm/njvmutil.pas | 8 ++++++-- compiler/ngenutil.pas | 20 +++++++++++++++----- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/compiler/avr/navrutil.pas b/compiler/avr/navrutil.pas index a7c549b768..4a27d5853b 100644 --- a/compiler/avr/navrutil.pas +++ b/compiler/avr/navrutil.pas @@ -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 diff --git a/compiler/jvm/njvmutil.pas b/compiler/jvm/njvmutil.pas index d03a7256a1..af73f759ec 100644 --- a/compiler/jvm/njvmutil.pas +++ b/compiler/jvm/njvmutil.pas @@ -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 diff --git a/compiler/ngenutil.pas b/compiler/ngenutil.pas index 30d004ba73..dbea0a3c1a 100644 --- a/compiler/ngenutil.pas +++ b/compiler/ngenutil.pas @@ -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(