Pārlūkot izejas kodu

Merged revisions 3894 via svnmerge from
svn+ssh://[email protected]/FPC/svn/fpc/trunk

........
r3894 | marco | 2006-06-19 16:17:45 +0200 (Mon, 19 Jun 2006) | 3 lines

* Link ordering working FreeBSD implementation


........

git-svn-id: branches/fixes_2_0@3919 -

marco 19 gadi atpakaļ
vecāks
revīzija
d75793a0f1
4 mainītis faili ar 29 papildinājumiem un 15 dzēšanām
  1. 9 8
      compiler/cclasses.pas
  2. 1 1
      compiler/globtype.pas
  3. 9 1
      compiler/link.pas
  4. 10 5
      compiler/options.pas

+ 9 - 8
compiler/cclasses.pas

@@ -352,7 +352,7 @@ type
        end;
 
 
-Const WeightDefault = 100;  
+Const WeightDefault = 1000;  
 
 Type
   TLinkRec = record 
@@ -2417,7 +2417,7 @@ end;
 
 function  TLinkStrMap.AddWeight(keyvalue:String):boolean;
 
-var i    : Longint;
+var i,j    : Longint;
     Code : Word;
     s    : AnsiString;
 
@@ -2427,10 +2427,10 @@ begin
   if i=0 then 
     exit;
   s:=Copy(KeyValue,i+1,length(KeyValue)-i);  
-  val(s,i,code);
-  if code<>0 Then
+  val(s,j,code);
+  if code=0 Then
     begin
-      Add(Copy(KeyValue,1,i-1),'',i);
+      Add(Copy(KeyValue,1,i-1),'',j);
       AddWeight:=True;
     end;  
 end;
@@ -2444,7 +2444,7 @@ begin
  while i<=k do
    begin
      j:=i;
-     while (i<=k) and (keys[i]<>';') do 
+     while (i<=k) and (keys[i]<>',') do 
        inc(i);
      add(copy(keys,j,i-j),'',weight);  
      inc(i);
@@ -2480,7 +2480,8 @@ begin
    lookup:=-1;
    i:=0;
    {$B-}
-   while (i<itemcnt) and (fmap[i].key<>key) do inc(i);
+   while (i<itemcnt) and (fmap[i].key<>key) do 
+     inc(i);
    {$B+}
    if i<>itemcnt then
       lookup:=i;
@@ -2525,7 +2526,6 @@ begin
         dest.add(LibN)
       else 
         dest.addseries(fmap[r].value);
-
     end;
 end;  
 
@@ -2543,3 +2543,4 @@ end;
 
 
 end.
+ 

+ 1 - 1
compiler/globtype.pas

@@ -128,7 +128,7 @@ than 255 characters. That's why using Ansi Strings}
          { linking }
          cs_link_extern,cs_link_static,cs_link_smart,cs_link_shared,cs_link_deffile,
          cs_link_strip,cs_link_staticflag,cs_link_on_target,cs_link_internal,
-         cs_link_map,cs_link_pthread
+         cs_link_map,cs_link_pthread,cs_link_no_default_lib_order
        );
        tglobalswitches = set of tglobalswitch;
 

+ 9 - 1
compiler/link.pas

@@ -59,6 +59,7 @@ Type
        Function  MakeStaticLibrary:boolean;virtual;
        procedure ExpandAndApplyOrder(var Src:TStringList);
        procedure LoadPredefinedLibraryOrder;virtual; 
+       function  ReOrderEntries : boolean;
      end;
 
     TExternalLinker = class(TLinker)
@@ -458,10 +459,11 @@ begin
   if (LinkLibraryAliases.count=0) and (LinkLibraryOrder.Count=0) Then 
     exit;
   p:=TLinkStrMap.Create;
-  
+    
   // expand libaliases, clears src
   LinkLibraryAliases.expand(src,p);
   
+  // writeln(src.count,' ',p.count,' ',linklibraryorder.count,' ',linklibraryaliases.count);
   // apply order
   p.UpdateWeights(LinkLibraryOrder);  
   p.SortOnWeight;
@@ -477,6 +479,12 @@ procedure TLinker.LoadPredefinedLibraryOrder;
 begin
 end;
 
+function  TLinker.ReOrderEntries : boolean;
+
+begin
+  result:=(LinkLibraryOrder.count>0) or (LinkLibraryAliases.count>0);
+end;
+
 {*****************************************************************************
                               TEXTERNALLINKER
 *****************************************************************************}

+ 10 - 5
compiler/options.pas

@@ -1188,8 +1188,9 @@ begin
                              DefaultReplacements(rlinkpath);
                              More:='';
                           end;
-                    'L' : begin  // -XLO is link order -XLA is link alias
-                            if (j=length(more)) or not ((more[j+1]='O') or (more[j+1]='A')) then
+                    'L' : begin  // -XLO is link order -XLA is link alias. -XLD avoids load defaults.
+                                 // these are not aggregable.
+                            if (j=length(more)) or not (more[j+1] in ['O','A','D']) then
                               IllegalPara(opt)
                             else
                               begin
@@ -1201,11 +1202,15 @@ begin
                                        end;
                                  'O' : begin
                                         s:=Copy(more,3,length(More)-2);
-                                        if not LinkLibraryAliases.AddWeight(s) Then
+                                        if not LinkLibraryOrder.AddWeight(s) Then
                                            IllegalPara(opt);
                                        end;
-                                   end;     
-                              end;
+                                 'D' : include(initglobalswitches,cs_link_no_default_lib_order)
+                                else
+                                  IllegalPara(opt);
+                                 end; {case}
+                                j:=length(more);    
+                              end; {else begin}
                           end;
                     'S' :
                       begin