Răsfoiți Sursa

+ Stabs debug info needs swapping when linking for different endianness.
* A few minor tweaks for Stabs generation.

git-svn-id: trunk@23316 -

sergei 12 ani în urmă
părinte
comite
2bba4e2d44
1 a modificat fișierele cu 19 adăugiri și 12 ștergeri
  1. 19 12
      compiler/ogbase.pas

+ 19 - 12
compiler/ogbase.pas

@@ -627,6 +627,17 @@ implementation
           result:=((v+a-1) div a) * a;
       end;
 
+
+    procedure MaybeSwapStab(var v:TObjStabEntry);
+      begin
+        if source_info.endian<>target_info.endian then
+          begin
+            v.strpos:=SwapEndian(v.strpos);
+            v.nvalue:=SwapEndian(v.nvalue);
+            v.ndesc:=SwapEndian(v.ndesc);
+          end;
+      end;
+
 {*****************************************************************************
                                  TObjSymbol
 *****************************************************************************}
@@ -1275,19 +1286,14 @@ implementation
 
 
     procedure TObjData.beforewrite;
-      var
-        s : string[1];
-        hstab : TObjStabEntry;
       begin
         { create stabs sections if debugging }
         if assigned(StabsSec) then
          begin
            { Create dummy HdrSym stab, it will be overwritten in AfterWrite }
-           fillchar(hstab,sizeof(hstab),0);
-           StabsSec.Write(hstab,sizeof(hstab));
+           StabsSec.WriteZeros(sizeof(TObjStabEntry));
            { start of stabstr }
-           s:=#0;
-           StabStrSec.write(s[1],length(s));
+           StabStrSec.writeZeros(1);
          end;
       end;
 
@@ -1300,7 +1306,6 @@ implementation
 
     procedure TObjData.afterwrite;
       var
-        s : string[1];
         hstab : TObjStabEntry;
       begin
         FObjSectionList.ForEachCall(@section_afterwrite,nil);
@@ -1309,14 +1314,14 @@ implementation
         if assigned(StabsSec) then
           begin
             { end of stabstr }
-            s:=#0;
-            StabStrSec.write(s[1],length(s));
+            StabStrSec.writeZeros(1);
             { header stab }
             hstab.strpos:=1;
             hstab.ntype:=0;
             hstab.nother:=0;
             hstab.ndesc:=(StabsSec.Size div sizeof(TObjStabEntry))-1;
             hstab.nvalue:=StabStrSec.Size;
+            MaybeSwapStab(hstab);
             StabsSec.Data.seek(0);
             StabsSec.Data.write(hstab,sizeof(hstab));
           end;
@@ -2764,8 +2769,7 @@ implementation
         mergedstabstrsec:=internalObjData.CreateSection(sec_stabstr,'');
 
         { write stab for hdrsym }
-        fillchar(hstab,sizeof(TObjStabEntry),0);
-        mergedstabsec.write(hstab,sizeof(TObjStabEntry));
+        mergedstabsec.writeZeros(sizeof(TObjStabEntry));
         mergestabcnt:=1;
 
         { .stabstr starts with a #0 }
@@ -2788,6 +2792,7 @@ implementation
                     hstabreloc:=nil;
                     skipstab:=false;
                     currstabsec.Data.read(hstab,sizeof(TObjStabEntry));
+                    MaybeSwapStab(hstab);
                     { Only include first hdrsym stab }
                     if hstab.ntype=0 then
                       skipstab:=true;
@@ -2868,6 +2873,7 @@ implementation
                             mergedstabsec.ObjRelocations.Add(hstabreloc);
                           end;
                         { Write updated stab }
+                        MaybeSwapStab(hstab);
                         mergedstabsec.write(hstab,sizeof(hstab));
                         inc(mergestabcnt);
                       end;
@@ -2892,6 +2898,7 @@ implementation
             hstab.nother:=0;
             hstab.ndesc:=word(mergestabcnt-1);
             hstab.nvalue:=mergedstabstrsec.Size;
+            MaybeSwapStab(hstab);
             mergedstabsec.Data.seek(0);
             mergedstabsec.Data.write(hstab,sizeof(hstab));
           end;