Browse Source

+ support reading OMF files with THREAD FIXUPP subrecords; note that fixups,
determined by thread are still not yet implemented

git-svn-id: trunk@39150 -

nickysn 7 years ago
parent
commit
2fb73de404
1 changed files with 21 additions and 7 deletions
  1. 21 7
      compiler/ogomf.pas

+ 21 - 7
compiler/ogomf.pas

@@ -1495,6 +1495,7 @@ implementation
         objsec: TOmfObjSection;
         objsec: TOmfObjSection;
         FixupRawRec: TOmfRawRecord;
         FixupRawRec: TOmfRawRecord;
         Fixup: TOmfSubRecord_FIXUP;
         Fixup: TOmfSubRecord_FIXUP;
+        Thread: TOmfSubRecord_THREAD;
       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
@@ -1561,22 +1562,35 @@ implementation
                 exit;
                 exit;
               end;
               end;
             NextOfs:=0;
             NextOfs:=0;
+            Thread:=TOmfSubRecord_THREAD.Create;
             Fixup:=TOmfSubRecord_FIXUP.Create;
             Fixup:=TOmfSubRecord_FIXUP.Create;
             Fixup.Is32Bit:=FixupRawRec.RecordType=RT_FIXUPP32;
             Fixup.Is32Bit:=FixupRawRec.RecordType=RT_FIXUPP32;
             Fixup.DataRecordStartOffset:=EnumeratedDataOffset;
             Fixup.DataRecordStartOffset:=EnumeratedDataOffset;
             while NextOfs<(FixupRawRec.RecordLength-1) do
             while NextOfs<(FixupRawRec.RecordLength-1) do
               begin
               begin
-                NextOfs:=Fixup.ReadAt(FixupRawRec,NextOfs);
-                if Fixup.FrameDeterminedByThread or Fixup.TargetDeterminedByThread then
+                if (FixupRawRec.RawData[NextOfs] and $80)<>0 then
                   begin
                   begin
-                    InputError('Fixups determined by thread not supported');
-                    Fixup.Free;
-                    FixupRawRec.Free;
-                    exit;
+                    { FIXUP subrecord }
+                    NextOfs:=Fixup.ReadAt(FixupRawRec,NextOfs);
+                    if Fixup.FrameDeterminedByThread or Fixup.TargetDeterminedByThread then
+                      begin
+                        InputError('Fixups determined by thread not supported');
+                        Fixup.Free;
+                        Thread.Free;
+                        FixupRawRec.Free;
+                        exit;
+                      end;
+                    ImportOmfFixup(objdata,objsec,Fixup);
+                  end
+                else
+                  begin
+                    { THREAD subrecord }
+                    NextOfs:=Thread.ReadAt(FixupRawRec,NextOfs);
+                    Thread.ApplyTo(FFixupThreads);
                   end;
                   end;
-                ImportOmfFixup(objdata,objsec,Fixup);
               end;
               end;
             Fixup.Free;
             Fixup.Free;
+            Thread.Free;
             FixupRawRec.Free;
             FixupRawRec.Free;
           end;
           end;
         Result:=True;
         Result:=True;