浏览代码

+ write a MODEND (end of module) record at the end of the omf file

git-svn-id: trunk@30454 -
nickysn 10 年之前
父节点
当前提交
b67fea70bd
共有 2 个文件被更改,包括 56 次插入0 次删除
  1. 7 0
      compiler/ogomf.pas
  2. 49 0
      compiler/omfbase.pas

+ 7 - 0
compiler/ogomf.pas

@@ -285,6 +285,7 @@ implementation
         Translator_COMENT: TOmfRecord_COMENT;
         LinkPassSeparator_COMENT: TOmfRecord_COMENT;
         LNamesRec: TOmfRecord_LNAMES;
+        ModEnd: TOmfRecord_MODEND;
         I: Integer;
         SegDef: TOmfRecord_SEGDEF;
         GrpDef: TOmfRecord_GRPDEF;
@@ -363,6 +364,12 @@ implementation
         { write section content, interleaved with fixups }
         WriteSections(Data);
 
+        { write MODEND record }
+        ModEnd:=TOmfRecord_MODEND.Create;
+        ModEnd.EncodeTo(RawRecord);
+        RawRecord.WriteTo(FWriter);
+        ModEnd.Free;
+
         RawRecord.Free;
         result:=true;
       end;

+ 49 - 0
compiler/omfbase.pas

@@ -317,6 +317,26 @@ interface
       property SegmentList: TSegmentList read FSegmentList write FSegmentList;
     end;
 
+    { TOmfRecord_MODEND }
+
+    TOmfRecord_MODEND = class(TOmfParsedRecord)
+    private
+      FIs32Bit: Boolean;
+      FIsMainModule: Boolean;
+      FHasStartAddress: Boolean;
+      FSegmentBit: Boolean;
+      FLogicalStartAddress: Boolean;
+    public
+      procedure DecodeFrom(RawRecord: TOmfRawRecord);override;
+      procedure EncodeTo(RawRecord: TOmfRawRecord);override;
+
+      property Is32Bit: Boolean read FIs32Bit write FIs32Bit;
+      property IsMainModule: Boolean read FIsMainModule write FIsMainModule;
+      property HasStartAddress: Boolean read FHasStartAddress write FHasStartAddress;
+      property SegmentBit: Boolean read FSegmentBit write FSegmentBit;
+      property LogicalStartAddress: Boolean read FLogicalStartAddress write FLogicalStartAddress;
+    end;
+
     { TOmfSubRecord_FIXUP }
 
     TOmfSubRecord_FIXUP = class
@@ -776,6 +796,35 @@ implementation
       RawRecord.CalculateChecksumByte;
     end;
 
+  { TOmfRecord_MODEND }
+
+  procedure TOmfRecord_MODEND.DecodeFrom(RawRecord: TOmfRawRecord);
+    begin
+      {TODO: implement}
+      internalerror(2015040101);
+    end;
+
+  procedure TOmfRecord_MODEND.EncodeTo(RawRecord: TOmfRawRecord);
+    var
+      ModTyp: Byte;
+      NextOfs: Integer;
+    begin
+      if Is32Bit then
+        RawRecord.RecordType:=RT_MODEND32
+      else
+        RawRecord.RecordType:=RT_MODEND;
+      ModTyp:=(Ord(IsMainModule) shl 7)+(Ord(HasStartAddress) shl 6)+(Ord(SegmentBit) shl 5)+Ord(LogicalStartAddress);
+      RawRecord.RawData[0]:=ModTyp;
+      NextOfs:=1;
+      if HasStartAddress then
+        begin
+          {TODO: implement writing a start address}
+          internalerror(2015040101);
+        end;
+      RawRecord.RecordLength:=NextOfs+1;
+      RawRecord.CalculateChecksumByte;
+    end;
+
   { TOmfSubRecord_FIXUP }
 
   function TOmfSubRecord_FIXUP.GetDataRecordOffset: Integer;