Quellcode durchsuchen

+ assign an MZExeUnifiedLogicalSegment object to the OMF dwarf sections, so that
OMF relocations work on them too

git-svn-id: trunk@39223 -

nickysn vor 7 Jahren
Ursprung
Commit
239fb25179
1 geänderte Dateien mit 48 neuen und 8 gelöschten Zeilen
  1. 48 8
      compiler/ogomf.pas

+ 48 - 8
compiler/ogomf.pas

@@ -280,8 +280,10 @@ interface
         FMZFlatContentSection: TMZExeSection;
         FExeUnifiedLogicalSegments: TFPHashObjectList;
         FExeUnifiedLogicalGroups: TFPHashObjectList;
+        FDwarfUnifiedLogicalSegments: TFPHashObjectList;
         FHeader: TMZExeHeader;
         function GetMZFlatContentSection: TMZExeSection;
+        procedure CalcDwarfUnifiedLogicalSegmentsForSection(const SecName: TSymStr);
         procedure CalcExeUnifiedLogicalSegments;
         procedure CalcExeGroups;
         procedure CalcSegments_MemBasePos;
@@ -299,6 +301,7 @@ interface
         function writeDebugElf:boolean;
         property ExeUnifiedLogicalSegments: TFPHashObjectList read FExeUnifiedLogicalSegments;
         property ExeUnifiedLogicalGroups: TFPHashObjectList read FExeUnifiedLogicalGroups;
+        property DwarfUnifiedLogicalSegments: TFPHashObjectList read FExeUnifiedLogicalSegments;
         property Header: TMZExeHeader read FHeader;
       protected
         procedure Load_Symbol(const aname:string);override;
@@ -2277,6 +2280,32 @@ implementation
         result:=FMZFlatContentSection;
       end;
 
+    procedure TMZExeOutput.CalcDwarfUnifiedLogicalSegmentsForSection(const SecName: TSymStr);
+      var
+        ExeSec: TMZExeSection;
+        ObjSec: TOmfObjSection;
+        UniSeg: TMZExeUnifiedLogicalSegment;
+        i: Integer;
+      begin
+        ExeSec:=TMZExeSection(FindExeSection(SecName));
+        for i:=0 to ExeSec.ObjSectionList.Count-1 do
+          begin
+            ObjSec:=TOmfObjSection(ExeSec.ObjSectionList[i]);
+            UniSeg:=TMZExeUnifiedLogicalSegment(DwarfUnifiedLogicalSegments.Find(ObjSec.Name));
+            if not assigned(UniSeg) then
+              begin
+                UniSeg:=TMZExeUnifiedLogicalSegment.Create(DwarfUnifiedLogicalSegments,ObjSec.Name);
+                UniSeg.MemPos:=0;
+              end;
+            UniSeg.AddObjSection(ObjSec);
+          end;
+        for i:=0 to DwarfUnifiedLogicalSegments.Count-1 do
+          begin
+            UniSeg:=TMZExeUnifiedLogicalSegment(DwarfUnifiedLogicalSegments[i]);
+            UniSeg.CalcMemPos;
+          end;
+      end;
+
     procedure TMZExeOutput.CalcExeUnifiedLogicalSegments;
       var
         ExeSec: TMZExeSection;
@@ -2968,14 +2997,23 @@ cleanup:
         if assigned(CurrExeSec) then
           SecName:=CurrExeSec.Name;
         inherited MemPos_EndExeSection;
-        if SecName='.MZ_flat_content' then
-          begin
-            CalcExeUnifiedLogicalSegments;
-            CalcExeGroups;
-            CalcSegments_MemBasePos;
-            if assigned(exemap) then
-              WriteMap_SegmentsAndGroups;
-          end;
+        case SecName of
+          '.MZ_flat_content':
+            begin
+              CalcExeUnifiedLogicalSegments;
+              CalcExeGroups;
+              CalcSegments_MemBasePos;
+              if assigned(exemap) then
+                WriteMap_SegmentsAndGroups;
+            end;
+          '.debug_info',
+          '.debug_abbrev',
+          '.debug_line',
+          '.debug_aranges':
+            CalcDwarfUnifiedLogicalSegmentsForSection(SecName);
+          else
+            internalerror(2018061401);
+        end;
       end;
 
     function TMZExeOutput.writeData: boolean;
@@ -3008,12 +3046,14 @@ cleanup:
         MaxMemPos:=$9FFFF;
         FExeUnifiedLogicalSegments:=TFPHashObjectList.Create;
         FExeUnifiedLogicalGroups:=TFPHashObjectList.Create;
+        FDwarfUnifiedLogicalSegments:=TFPHashObjectList.Create;
         FHeader:=TMZExeHeader.Create;
       end;
 
     destructor TMZExeOutput.destroy;
       begin
         FHeader.Free;
+        FDwarfUnifiedLogicalSegments.Free;
         FExeUnifiedLogicalGroups.Free;
         FExeUnifiedLogicalSegments.Free;
         inherited destroy;