Browse Source

Ensure that unneeded initialization/finalization procedures don't leave assembler symbols.

ncgutil.pas:
  + new function release_proc_symbol which removes all assembler symbols of a procdef
pmodules.pas, proc_unit:
  * if the initialization or finalization procedure is empty also remove their assembler symbols so they are exported

git-svn-id: branches/svenbarth/packages@28903 -
svenbarth 10 years ago
parent
commit
8df3f8dcd2
2 changed files with 23 additions and 2 deletions
  1. 17 0
      compiler/ncgutil.pas
  2. 6 2
      compiler/pmodules.pas

+ 17 - 0
compiler/ncgutil.pas

@@ -76,6 +76,7 @@ interface
 
 
     function  has_alias_name(pd:tprocdef;const s:string):boolean;
     function  has_alias_name(pd:tprocdef;const s:string):boolean;
     procedure alloc_proc_symbol(pd: tprocdef);
     procedure alloc_proc_symbol(pd: tprocdef);
+    procedure release_proc_symbol(pd:tprocdef);
     procedure gen_proc_entry_code(list:TAsmList);
     procedure gen_proc_entry_code(list:TAsmList);
     procedure gen_proc_exit_code(list:TAsmList);
     procedure gen_proc_exit_code(list:TAsmList);
     procedure gen_stack_check_size_para(list:TAsmList);
     procedure gen_stack_check_size_para(list:TAsmList);
@@ -1354,6 +1355,22 @@ implementation
        end;
        end;
 
 
 
 
+    procedure release_proc_symbol(pd:tprocdef);
+      var
+        idx : longint;
+        item : TCmdStrListItem;
+      begin
+        item:=TCmdStrListItem(pd.aliasnames.first);
+        while assigned(item) do
+          begin
+            idx:=current_asmdata.AsmSymbolDict.findindexof(item.str);
+            if idx>=0 then
+              current_asmdata.AsmSymbolDict.Delete(idx);
+            item:=TCmdStrListItem(item.next);
+          end;
+      end;
+
+
     procedure gen_proc_entry_code(list:TAsmList);
     procedure gen_proc_entry_code(list:TAsmList);
       var
       var
         hitemp,
         hitemp,

+ 6 - 2
compiler/pmodules.pas

@@ -1105,7 +1105,9 @@ type
                  init_procinfo.code:=cnodeutils.wrap_proc_body(init_procinfo.procdef,init_procinfo.code);
                  init_procinfo.code:=cnodeutils.wrap_proc_body(init_procinfo.procdef,init_procinfo.code);
                  init_procinfo.generate_code;
                  init_procinfo.generate_code;
                  current_module.flags:=current_module.flags or uf_init;
                  current_module.flags:=current_module.flags or uf_init;
-               end;
+               end
+             else
+               release_proc_symbol(init_procinfo.procdef);
              init_procinfo.resetprocdef;
              init_procinfo.resetprocdef;
              release_main_proc(init_procinfo);
              release_main_proc(init_procinfo);
            end;
            end;
@@ -1118,7 +1120,9 @@ type
                  finalize_procinfo.code:=cnodeutils.wrap_proc_body(finalize_procinfo.procdef,finalize_procinfo.code);
                  finalize_procinfo.code:=cnodeutils.wrap_proc_body(finalize_procinfo.procdef,finalize_procinfo.code);
                  finalize_procinfo.generate_code;
                  finalize_procinfo.generate_code;
                  current_module.flags:=current_module.flags or uf_finalize;
                  current_module.flags:=current_module.flags or uf_finalize;
-               end;
+               end
+             else
+               release_proc_symbol(finalize_procinfo.procdef);
              finalize_procinfo.resetprocdef;
              finalize_procinfo.resetprocdef;
              release_main_proc(finalize_procinfo);
              release_main_proc(finalize_procinfo);
            end;
            end;