mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 11:08:02 +02:00
* 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:
parent
fab6f70de8
commit
7c9aeda656
@ -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
|
||||
|
@ -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
|
||||
|
@ -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(
|
||||
|
Loading…
Reference in New Issue
Block a user