+ added class for decoding/encoding THREAD OMF subrecords

git-svn-id: trunk@39142 -
This commit is contained in:
nickysn 2018-05-29 15:05:07 +00:00
parent b1537a7f40
commit 54a8d8de58

View File

@ -228,6 +228,9 @@ interface
ftmGroupIndexNoDisp = 5, { GI(<group name>) }
ftmExternalIndexNoDisp = 6, { EI(<symbol name>) }
ftmFrameNumberNoDisp = 7); { <FRAME NUMBER> }
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;