mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-23 18:59:26 +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
|
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
|
||||||
|
@ -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
|
||||||
|
@ -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(
|
||||||
|
Loading…
Reference in New Issue
Block a user