Forráskód Böngészése

* 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 -
svenbarth 8 éve
szülő
commit
7c9aeda656
3 módosított fájl, 26 hozzáadás és 14 törlés
  1. 5 7
      compiler/avr/navrutil.pas
  2. 6 2
      compiler/jvm/njvmutil.pas
  3. 15 5
      compiler/ngenutil.pas

+ 5 - 7
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

+ 6 - 2
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

+ 15 - 5
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(