Просмотр исходного кода

Keep track of how many units are used from each required/requested package and only link those from which any units are used.

fpkg.pas, tpackageentry:
  + new field usedunits to count how many units of the package are used
pkgutil.pas:
  + new procedure add_package_unit_ref() to increase the amount of used units for the given package
pmodules.pas:
  * proc_package & proc_program: check which units of all loaded ones are provided by other packages

git-svn-id: branches/svenbarth/packages@31937 -
svenbarth 9 лет назад
Родитель
Сommit
79eb9d6743
3 измененных файлов с 31 добавлено и 8 удалено
  1. 1 0
      compiler/fpkg.pas
  2. 26 8
      compiler/pkgutil.pas
  3. 4 0
      compiler/pmodules.pas

+ 1 - 0
compiler/fpkg.pas

@@ -53,6 +53,7 @@ interface
     tpackageentry=record
       package : tpackage;
       realpkgname : string;
+      usedunits : longint;
     end;
     ppackageentry=^tpackageentry;
 

+ 26 - 8
compiler/pkgutil.pas

@@ -34,6 +34,7 @@ interface
   procedure export_unit(u:tmodule);
   procedure load_packages;
   procedure add_package(const name:string;ignoreduplicates:boolean);
+  procedure add_package_unit_ref(package:tpackage);
   procedure add_package_libs(l:tlinker);
 
 implementation
@@ -441,10 +442,22 @@ implementation
       new(entry);
       entry^.package:=nil;
       entry^.realpkgname:=name;
+      entry^.usedunits:=0;
       packagelist.add(upper(name),entry);
     end;
 
 
+  procedure add_package_unit_ref(package: tpackage);
+    var
+      pkgentry : ppackageentry;
+    begin
+      pkgentry:=ppackageentry(packagelist.find(package.packagename^));
+      if not assigned(pkgentry) then
+        internalerror(2015100301);
+      inc(pkgentry^.usedunits);
+    end;
+
+
   procedure add_package_libs(l:tlinker);
     var
       pkgentry : ppackageentry;
@@ -454,14 +467,19 @@ implementation
       for i:=0 to packagelist.count-1 do
         begin
           pkgentry:=ppackageentry(packagelist[i]);
-          //writeln('package used: ',pkgentry^.realpkgname);
-          pkgname:=pkgentry^.package.pplfilename;
-          if copy(pkgname,1,length(target_info.sharedlibprefix))=target_info.sharedlibprefix then
-            delete(pkgname,1,length(target_info.sharedlibprefix));
-          if copy(pkgname,length(pkgname)-length(target_info.sharedlibext)+1,length(target_info.sharedlibext))=target_info.sharedlibext then
-            delete(pkgname,length(pkgname)-length(target_info.sharedlibext)+1,length(target_info.sharedlibext));
-          //writeln('adding library: ', pkgname);
-          l.sharedlibfiles.concat(pkgname);
+          if pkgentry^.usedunits>0 then
+            begin
+              //writeln('package used: ',pkgentry^.realpkgname);
+              pkgname:=pkgentry^.package.pplfilename;
+              if copy(pkgname,1,length(target_info.sharedlibprefix))=target_info.sharedlibprefix then
+                delete(pkgname,1,length(target_info.sharedlibprefix));
+              if copy(pkgname,length(pkgname)-length(target_info.sharedlibext)+1,length(target_info.sharedlibext))=target_info.sharedlibext then
+                delete(pkgname,length(pkgname)-length(target_info.sharedlibext)+1,length(target_info.sharedlibext));
+              //writeln('adding library: ', pkgname);
+              l.sharedlibfiles.concat(pkgname);
+            end
+          else
+            {writeln('ignoring package: ',pkgentry^.realpkgname)};
         end;
     end;
 

+ 4 - 0
compiler/pmodules.pas

@@ -1547,6 +1547,8 @@ type
           begin
             hp2:=hp;
             hp:=tmodule(hp.next);
+            if assigned(hp2.package) then
+              add_package_unit_ref(hp2.package);
             if hp2.is_unit and
                not assigned(hp2.globalsymtable) then
               loaded_units.remove(hp2);
@@ -2157,6 +2159,8 @@ type
                     if hp.flags and uf_in_library=0 then
                       linker.AddModuleFiles(hp);
                     hp2:=tmodule(hp.next);
+                    if assigned(hp.package) then
+                      add_package_unit_ref(hp.package);
                     if (hp<>current_module) and
                        (not needsymbolinfo) then
                       begin