Jelajahi Sumber

+ support OMF fixups, determined by thread

git-svn-id: trunk@39151 -
nickysn 7 tahun lalu
induk
melakukan
98634899f2
2 mengubah file dengan 25 tambahan dan 8 penghapusan
  1. 1 8
      compiler/ogomf.pas
  2. 24 0
      compiler/omfbase.pas

+ 1 - 8
compiler/ogomf.pas

@@ -1572,14 +1572,7 @@ implementation
                   begin
                     { 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;
+                    Fixup.ResolveByThread(FFixupThreads);
                     ImportOmfFixup(objdata,objsec,Fixup);
                   end
                 else

+ 24 - 0
compiler/omfbase.pas

@@ -651,6 +651,8 @@ interface
       function ReadAt(RawRecord: TOmfRawRecord; Offset: Integer): Integer;
       function WriteAt(RawRecord: TOmfRawRecord; Offset: Integer): Integer;
 
+      procedure ResolveByThread(AThreads: TOmfThreads);
+
       property Is32Bit: Boolean read FIs32Bit write FIs32Bit;
       property Mode: TOmfFixupMode read FMode write FMode;
       property LocationType: TOmfFixupLocationType read FLocationType write FLocationType;
@@ -2551,6 +2553,28 @@ implementation
       Result:=Offset;
     end;
 
+  procedure TOmfSubRecord_FIXUP.ResolveByThread(AThreads: TOmfThreads);
+    begin
+      if TargetDeterminedByThread then
+        begin
+          if not AThreads.TargetThread[TargetThread].Initialized then
+            internalerror(2018053002);
+          TargetDatum:=AThreads.TargetThread[TargetThread].Datum;
+          TargetMethod:=AThreads.TargetThread[TargetThread].TargetMethod;
+          if not TargetThreadDisplacementPresent then
+            Inc(FTargetMethod,4);
+          TargetThreadDisplacementPresent:=False;
+          TargetDeterminedByThread:=False;
+        end;
+      if FrameDeterminedByThread then
+        begin
+          if not AThreads.FrameThread[FrameThread].Initialized then
+            internalerror(2018053003);
+          FrameDatum:=AThreads.FrameThread[FrameThread].Datum;
+          FrameMethod:=AThreads.FrameThread[FrameThread].FrameMethod;
+          FrameDeterminedByThread:=False;
+        end;
+    end;
 
   { TOmfRecord_LIBHEAD }