diff --git a/compiler/omfbase.pas b/compiler/omfbase.pas index f2bee41dfe..dee9422c14 100644 --- a/compiler/omfbase.pas +++ b/compiler/omfbase.pas @@ -228,6 +228,9 @@ interface ftmGroupIndexNoDisp = 5, { GI() } ftmExternalIndexNoDisp = 6, { EI() } ftmFrameNumberNoDisp = 7); { } + TOmfThreadType = ( + ttTarget, + ttFrame); { TOmfOrderedNameCollection } @@ -554,6 +557,26 @@ interface property LineNumberList: TOmfSubRecord_LINNUM_MsLink_LineNumberList read FLineNumberList write FLineNumberList; end; + { TOmfSubRecord_THREAD } + + TOmfSubRecord_THREAD = class + private + FThreadNumber: TOmfFixupThread; + FThreadType: TOmfThreadType; + FTargetMethod: TOmfFixupTargetMethod; + FFrameMethod: TOmfFixupFrameMethod; + FDatum: Integer; + public + function ReadAt(RawRecord: TOmfRawRecord; Offset: Integer): Integer; + function WriteAt(RawRecord: TOmfRawRecord; Offset: Integer): Integer; + + property ThreadNumber: TOmfFixupThread read FThreadNumber write FThreadNumber; + property ThreadType: TOmfThreadType read FThreadType write FThreadType; + property TargetMethod: TOmfFixupTargetMethod read FTargetMethod write FTargetMethod; + property FrameMethod: TOmfFixupFrameMethod read FFrameMethod write FFrameMethod; + property Datum: Integer read FDatum write FDatum; + end; + { TOmfSubRecord_FIXUP } TOmfSubRecord_FIXUP = class @@ -2206,6 +2229,64 @@ implementation NextIndex:=LastIncludedIndex+1; end; + { TOmfSubRecord_THREAD } + + function TOmfSubRecord_THREAD.ReadAt(RawRecord: TOmfRawRecord; Offset: Integer): Integer; + var + B, Method: Byte; + begin + if Offset>=RawRecord.RecordLength then + internalerror(2018052901); + B:=RawRecord.RawData[Offset]; + Inc(Offset); + if (B and $A0)<>0 then + internalerror(2018052902); + ThreadNumber:=TOmfFixupThread(B and 3); + Method:=(B shr 2) and 7; + if (B and $40)<>0 then + begin + ThreadType:=ttFrame; + FrameMethod:=TOmfFixupFrameMethod(Method); + end + else + begin + ThreadType:=ttTarget; + if Method>3 then + internalerror(2018052903); + TargetMethod:=TOmfFixupTargetMethod(Method); + end; + if Method<=3 then + Offset:=RawRecord.ReadIndexedRef(Offset,FDatum) + else + Datum:=0; + Result:=Offset; + end; + + function TOmfSubRecord_THREAD.WriteAt(RawRecord: TOmfRawRecord; Offset: Integer): Integer; + var + B, Method: Byte; + begin + if ThreadType=ttFrame then + begin + B:=$40; + Method:=Byte(FrameMethod) and 7; + end + else + begin + B:=0; + Method:=Byte(TargetMethod) and 7; + if Method>3 then + internalerror(2018052904); + end; + Inc(B,Byte(ThreadNumber) and 3); + Inc(B,Method shl 2); + RawRecord.RawData[Offset]:=B; + Inc(Offset); + if Method<=3 then + Offset:=RawRecord.WriteIndexedRef(Offset,Datum); + Result:=Offset; + end; + { TOmfSubRecord_FIXUP } function TOmfSubRecord_FIXUP.GetDataRecordOffset: Integer;