Browse Source

+ parse FIXUPP records in the omf object reader (although converting them TOmfRelocation is not yet implemented)

git-svn-id: trunk@31320 -
nickysn 10 years ago
parent
commit
e59c164844
1 changed files with 55 additions and 2 deletions
  1. 55 2
      compiler/ogomf.pas

+ 55 - 2
compiler/ogomf.pas

@@ -126,6 +126,8 @@ interface
         FPubDefs: TFPHashObjectList;
         FPubDefs: TFPHashObjectList;
         FRawRecord: TOmfRawRecord;
         FRawRecord: TOmfRawRecord;
 
 
+        function PeekNextRecordType: Byte;
+
         function ReadLNames(RawRec: TOmfRawRecord): Boolean;
         function ReadLNames(RawRec: TOmfRawRecord): Boolean;
         function ReadSegDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
         function ReadSegDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
         function ReadGrpDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
         function ReadGrpDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
@@ -950,6 +952,20 @@ implementation
                                TOmfObjInput
                                TOmfObjInput
 ****************************************************************************}
 ****************************************************************************}
 
 
+    function TOmfObjInput.PeekNextRecordType: Byte;
+      var
+        OldPos: LongInt;
+      begin
+        OldPos:=FReader.Pos;
+        if not FReader.read(Result, 1) then
+          begin
+            InputError('Unexpected end of file');
+            Result:=0;
+            exit;
+          end;
+        FReader.seek(OldPos);
+      end;
+
     function TOmfObjInput.ReadLNames(RawRec: TOmfRawRecord): Boolean;
     function TOmfObjInput.ReadLNames(RawRec: TOmfRawRecord): Boolean;
       var
       var
         LNamesRec: TOmfRecord_LNAMES;
         LNamesRec: TOmfRecord_LNAMES;
@@ -1163,6 +1179,8 @@ implementation
         EnumeratedDataOffset: DWord;
         EnumeratedDataOffset: DWord;
         BlockLength: Integer;
         BlockLength: Integer;
         objsec: TOmfObjSection;
         objsec: TOmfObjSection;
+        FixupRawRec: TOmfRawRecord;
+        Fixup: TOmfSubRecord_FIXUP;
       begin
       begin
         Result:=False;
         Result:=False;
         if not (RawRec.RecordType in [RT_LEDATA,RT_LEDATA32]) then
         if not (RawRec.RecordType in [RT_LEDATA,RT_LEDATA32]) then
@@ -1215,7 +1233,36 @@ implementation
             exit;
             exit;
           end;
           end;
         objsec.Data.write(RawRec.RawData[NextOfs],BlockLength);
         objsec.Data.write(RawRec.RawData[NextOfs],BlockLength);
-        {todo: read also the FIXUPP record that may follow}
+
+        { also read all the FIXUPP records that may follow }
+        while PeekNextRecordType in [RT_FIXUPP,RT_FIXUPP32] do
+          begin
+            FixupRawRec:=TOmfRawRecord.Create;
+            FixupRawRec.ReadFrom(FReader);
+            if not FRawRecord.VerifyChecksumByte then
+              begin
+                InputError('Invalid checksum in OMF record');
+                FixupRawRec.Free;
+                exit;
+              end;
+            NextOfs:=0;
+            Fixup:=TOmfSubRecord_FIXUP.Create;
+            Fixup.Is32Bit:=FixupRawRec.RecordType=RT_FIXUPP32;
+            while NextOfs<(FixupRawRec.RecordLength-1) do
+              begin
+                NextOfs:=Fixup.ReadAt(FixupRawRec,NextOfs);
+                if Fixup.FrameDeterminedByThread or Fixup.TargetDeterminedByThread then
+                  begin
+                    InputError('Fixups determined by thread not supported');
+                    Fixup.Free;
+                    FixupRawRec.Free;
+                    exit;
+                  end;
+                {todo: convert the fixup to a TOmfRelocation }
+              end;
+            Fixup.Free;
+            FixupRawRec.Free;
+          end;
         Result:=True;
         Result:=True;
       end;
       end;
 
 
@@ -1301,9 +1348,15 @@ implementation
             RT_LEDATA,RT_LEDATA32:
             RT_LEDATA,RT_LEDATA32:
               if not ReadLEDataAndFixups(FRawRecord,objdata) then
               if not ReadLEDataAndFixups(FRawRecord,objdata) then
                 exit;
                 exit;
+            RT_LIDATA,RT_LIDATA32:
+              begin
+                InputError('LIDATA records are not supported');
+                exit;
+              end;
             RT_FIXUPP,RT_FIXUPP32:
             RT_FIXUPP,RT_FIXUPP32:
               begin
               begin
-                {todo}
+                InputError('FIXUPP record is invalid, because it does not follow a LEDATA or LIDATA record');
+                exit;
               end;
               end;
             RT_MODEND,RT_MODEND32:
             RT_MODEND,RT_MODEND32:
               begin
               begin