Browse Source

Partial merge of r28846 (without the global assembler symbols)

To correctly generate the import library for a package we need to resolve the dangling external symbols of all units. For this each unit now stores which symbols it exported from another unit and it also stores all global and external assembler symbols it has (maybe this can be streamlined later on, but for now this works).

entfile.pas:
  + new entry for the imported unit symbols
fmodule.pas, tmodule:
  + new field unitimportsyms which holds all symbols imported by a unit from another unit
  + new method to add an imported symbol
  * create, destroy & reset: correctly instantiate/free the two new lists
fppu.pas, tppumodule:
  + new field unitimportsymsderefs to hold the derefs during loading from/storing to PPU
  + new method buildderefunitimportsyms to generate the derefs for each imported symbol
  + new method derefunitimportsyms to resolve each imported symbol deref
  + new method readunitimportsyms to read the imported symbols from the PPU
  + new method writeunitimportsyms to write all imported symbols to the PPU
  * load_implementation: read the imported symbols if their entry is encountered
  * writeppu: generate the derefs for the imported symbols and write them to the PPU
  * load_usedunits: resolve the imported symbols once all derefs are known
symtable.pas:
  * addsymref: if the symbol is not from the current unit than mark it as imported
ppu.pas:
  * increase PPU version
-- Diese und die folgenden Zeilen werden ignoriert --

M    entfile.pas
M    fmodule.pas
M    fppu.pas
M    ppu.pas
M    symtable.pas

git-svn-id: trunk@33492 -
svenbarth 9 years ago
parent
commit
9fd8c8718a
5 changed files with 82 additions and 2 deletions
  1. 1 0
      compiler/entfile.pas
  2. 10 0
      compiler/fmodule.pas
  3. 66 0
      compiler/fppu.pas
  4. 1 1
      compiler/ppu.pas
  5. 4 1
      compiler/symtable.pas

+ 1 - 0
compiler/entfile.pas

@@ -117,6 +117,7 @@ const
   ibcreatedobjtypes = 83;
   ibcreatedobjtypes = 83;
   ibwpofile         = 84;
   ibwpofile         = 84;
   ibmoduleoptions   = 85;
   ibmoduleoptions   = 85;
+  ibunitimportsyms  = 86;
 
 
   ibmainname       = 90;
   ibmainname       = 90;
   ibsymtableoptions = 91;
   ibsymtableoptions = 91;

+ 10 - 0
compiler/fmodule.pas

@@ -158,6 +158,7 @@ interface
         procinfo      : TObject;  { current procedure being compiled }
         procinfo      : TObject;  { current procedure being compiled }
         asmdata       : TObject;  { Assembler data }
         asmdata       : TObject;  { Assembler data }
         asmprefix     : pshortstring;  { prefix for the smartlink asmfiles }
         asmprefix     : pshortstring;  { prefix for the smartlink asmfiles }
+        unitimportsyms : tfpobjectlist; { list of symbols that are imported from other units }
         debuginfo     : TObject;
         debuginfo     : TObject;
         loaded_from   : tmodule;
         loaded_from   : tmodule;
         _exports      : tlinkedlist;
         _exports      : tlinkedlist;
@@ -223,6 +224,7 @@ interface
         procedure reset;virtual;
         procedure reset;virtual;
         procedure adddependency(callermodule:tmodule);
         procedure adddependency(callermodule:tmodule);
         procedure flagdependent(callermodule:tmodule);
         procedure flagdependent(callermodule:tmodule);
+        procedure addimportedsym(sym:TSymEntry);
         function  addusedunit(hp:tmodule;inuses:boolean;usym:tunitsym):tused_unit;
         function  addusedunit(hp:tmodule;inuses:boolean;usym:tunitsym):tused_unit;
         procedure updatemaps;
         procedure updatemaps;
         function  derefidx_unit(id:longint):longint;
         function  derefidx_unit(id:longint):longint;
@@ -610,6 +612,7 @@ implementation
         _exports:=TLinkedList.Create;
         _exports:=TLinkedList.Create;
         dllscannerinputlist:=TFPHashList.Create;
         dllscannerinputlist:=TFPHashList.Create;
         asmdata:=casmdata.create(modulename);
         asmdata:=casmdata.create(modulename);
+        unitimportsyms:=TFPObjectList.Create(false);
         InitDebugInfo(self,false);
         InitDebugInfo(self,false);
       end;
       end;
 
 
@@ -669,6 +672,7 @@ implementation
         linkothersharedlibs.Free;
         linkothersharedlibs.Free;
         linkotherframeworks.Free;
         linkotherframeworks.Free;
         stringdispose(mainname);
         stringdispose(mainname);
+        unitimportsyms.Free;
         FImportLibraryList.Free;
         FImportLibraryList.Free;
         extendeddefs.Free;
         extendeddefs.Free;
         genericdummysyms.free;
         genericdummysyms.free;
@@ -886,6 +890,12 @@ implementation
       end;
       end;
 
 
 
 
+    procedure tmodule.addimportedsym(sym:TSymEntry);
+      begin
+        if unitimportsyms.IndexOf(sym)<0 then
+          unitimportsyms.Add(sym);
+      end;
+
     function tmodule.addusedunit(hp:tmodule;inuses:boolean;usym:tunitsym):tused_unit;
     function tmodule.addusedunit(hp:tmodule;inuses:boolean;usym:tunitsym):tused_unit;
       var
       var
         pu : tused_unit;
         pu : tused_unit;

+ 66 - 0
compiler/fppu.pas

@@ -69,6 +69,7 @@ interface
           procedure reload_flagged_units;
           procedure reload_flagged_units;
           procedure end_of_parsing;override;
           procedure end_of_parsing;override;
        private
        private
+          unitimportsymsderefs : tfplist;
          { Each time a unit's defs are (re)created, its defsgeneration is
          { Each time a unit's defs are (re)created, its defsgeneration is
            set to the value of a global counter, and the global counter is
            set to the value of a global counter, and the global counter is
            increased. We only reresolve its dependent units' defs in case
            increased. We only reresolve its dependent units' defs in case
@@ -85,6 +86,8 @@ interface
           procedure load_usedunits;
           procedure load_usedunits;
           procedure printcomments;
           procedure printcomments;
           procedure queuecomment(const s:TMsgStr;v,w:longint);
           procedure queuecomment(const s:TMsgStr;v,w:longint);
+          procedure buildderefunitimportsyms;
+          procedure derefunitimportsyms;
           procedure writesourcefiles;
           procedure writesourcefiles;
           procedure writeusedunit(intf:boolean);
           procedure writeusedunit(intf:boolean);
           procedure writelinkcontainer(var p:tlinkcontainer;id:byte;strippath:boolean);
           procedure writelinkcontainer(var p:tlinkcontainer;id:byte;strippath:boolean);
@@ -92,6 +95,7 @@ interface
           procedure writederefdata;
           procedure writederefdata;
           procedure writeImportSymbols;
           procedure writeImportSymbols;
           procedure writeResources;
           procedure writeResources;
+          procedure writeunitimportsyms;
           procedure readsourcefiles;
           procedure readsourcefiles;
           procedure readloadunit;
           procedure readloadunit;
           procedure readlinkcontainer(var p:tlinkcontainer);
           procedure readlinkcontainer(var p:tlinkcontainer);
@@ -100,6 +104,7 @@ interface
           procedure readImportSymbols;
           procedure readImportSymbols;
           procedure readResources;
           procedure readResources;
           procedure readwpofile;
           procedure readwpofile;
+          procedure readunitimportsyms;
 {$IFDEF MACRO_DIFF_HINT}
 {$IFDEF MACRO_DIFF_HINT}
           procedure writeusedmacro(p:TNamedIndexItem;arg:pointer);
           procedure writeusedmacro(p:TNamedIndexItem;arg:pointer);
           procedure writeusedmacros;
           procedure writeusedmacros;
@@ -137,6 +142,7 @@ var
         inherited create(LoadedFrom,amodulename,afilename,_is_unit);
         inherited create(LoadedFrom,amodulename,afilename,_is_unit);
         ppufile:=nil;
         ppufile:=nil;
         sourcefn:=afilename;
         sourcefn:=afilename;
+        unitimportsymsderefs:=tfplist.create;
       end;
       end;
 
 
 
 
@@ -147,6 +153,8 @@ var
         ppufile:=nil;
         ppufile:=nil;
         comments.free;
         comments.free;
         comments:=nil;
         comments:=nil;
+        unitimportsymsderefs.free;
+        unitimportsymsderefs:=nil;
         inherited Destroy;
         inherited Destroy;
       end;
       end;
 
 
@@ -589,6 +597,32 @@ var
       end;
       end;
 
 
 
 
+    procedure tppumodule.buildderefunitimportsyms;
+      var
+        i : longint;
+        deref : pderef;
+      begin
+        for i:=0 to unitimportsyms.count-1 do
+          begin
+            new(deref);
+            deref^.build(unitimportsyms[i]);
+            unitimportsymsderefs.add(deref);
+          end;
+      end;
+
+
+    procedure tppumodule.derefunitimportsyms;
+      var
+        i : longint;
+        sym : tsym;
+      begin
+        for i:=0 to unitimportsymsderefs.count-1 do
+          begin
+            sym:=tsym(pderef(unitimportsymsderefs[i])^.resolve);
+            unitimportsyms.add(sym);
+          end;
+      end;
+
 {**********************************
 {**********************************
     PPU Reading/Writing Helpers
     PPU Reading/Writing Helpers
 ***********************************}
 ***********************************}
@@ -804,6 +838,16 @@ var
       end;
       end;
 
 
 
 
+    procedure tppumodule.writeunitimportsyms;
+      var
+        i : longint;
+      begin
+        ppufile.putlongint(unitimportsymsderefs.count);
+        for i:=0 to unitimportsymsderefs.count-1 do
+          ppufile.putderef(pderef(unitimportsymsderefs[i])^);
+        ppufile.writeentry(ibunitimportsyms);
+      end;
+
 {$IFDEF MACRO_DIFF_HINT}
 {$IFDEF MACRO_DIFF_HINT}
 
 
 {
 {
@@ -1100,6 +1144,20 @@ var
       end;
       end;
 
 
 
 
+    procedure tppumodule.readunitimportsyms;
+      var
+        c,i : longint;
+        deref : pderef;
+      begin
+        c:=ppufile.getlongint;
+        for i:=0 to c-1 do
+          begin
+            new(deref);
+            ppufile.getderef(deref^);
+            unitimportsymsderefs.add(deref);
+          end;
+      end;
+
     procedure tppumodule.load_interface;
     procedure tppumodule.load_interface;
       var
       var
         b : byte;
         b : byte;
@@ -1197,6 +1255,8 @@ var
              ibasmsymbols :
              ibasmsymbols :
 { TODO: Remove ibasmsymbols}
 { TODO: Remove ibasmsymbols}
                ;
                ;
+             ibunitimportsyms:
+               readunitimportsyms;
              ibendimplementation :
              ibendimplementation :
                break;
                break;
            else
            else
@@ -1312,6 +1372,7 @@ var
          tunitwpoinfo(wpoinfo).buildderefimpl;
          tunitwpoinfo(wpoinfo).buildderefimpl;
          if (flags and uf_local_symtable)<>0 then
          if (flags and uf_local_symtable)<>0 then
            tstoredsymtable(localsymtable).buildderef_registered;
            tstoredsymtable(localsymtable).buildderef_registered;
+         buildderefunitimportsyms;
          writederefmap;
          writederefmap;
          writederefdata;
          writederefdata;
 
 
@@ -1338,6 +1399,9 @@ var
          { write implementation uses }
          { write implementation uses }
          writeusedunit(false);
          writeusedunit(false);
 
 
+         { write all symbols imported from another unit }
+         writeunitimportsyms;
+
          { end of implementation }
          { end of implementation }
          ppufile.writeentry(ibendimplementation);
          ppufile.writeentry(ibendimplementation);
 
 
@@ -1592,6 +1656,8 @@ var
         if assigned(localsymtable) then
         if assigned(localsymtable) then
           tstoredsymtable(localsymtable).derefimpl(false);
           tstoredsymtable(localsymtable).derefimpl(false);
 
 
+        derefunitimportsyms;
+
          { read whole program optimisation-related information }
          { read whole program optimisation-related information }
          wpoinfo:=tunitwpoinfo.ppuload(ppufile);
          wpoinfo:=tunitwpoinfo.ppuload(ppufile);
          tunitwpoinfo(wpoinfo).deref;
          tunitwpoinfo(wpoinfo).deref;

+ 1 - 1
compiler/ppu.pas

@@ -43,7 +43,7 @@ type
 {$endif Test_Double_checksum}
 {$endif Test_Double_checksum}
 
 
 const
 const
-  CurrentPPUVersion = 181;
+  CurrentPPUVersion = 182;
 
 
   ppubufsize   = 16384;
   ppubufsize   = 16384;
 
 

+ 4 - 1
compiler/symtable.pas

@@ -2737,7 +2737,6 @@ implementation
        begin
        begin
          { symbol uses count }
          { symbol uses count }
          sym.IncRefCount;
          sym.IncRefCount;
-         { unit uses count }
          owner:=sym.owner;
          owner:=sym.owner;
          while owner.symtabletype in [objectsymtable,recordsymtable,enumsymtable] do
          while owner.symtabletype in [objectsymtable,recordsymtable,enumsymtable] do
            owner:=tdef(owner.defowner).owner;
            owner:=tdef(owner.defowner).owner;
@@ -2746,7 +2745,11 @@ implementation
              begin
              begin
                if tglobalsymtable(owner).moduleid>=current_module.unitmapsize then
                if tglobalsymtable(owner).moduleid>=current_module.unitmapsize then
                  internalerror(200501152);
                  internalerror(200501152);
+               { unit uses count }
                inc(current_module.unitmap[tglobalsymtable(owner).moduleid].refs);
                inc(current_module.unitmap[tglobalsymtable(owner).moduleid].refs);
+               { symbol is imported from another unit }
+               if current_module.globalsymtable<>owner then
+                 current_module.addimportedsym(sym);
              end;
              end;
        end;
        end;