瀏覽代碼

+ introduced the TOmfRecord_COMENT_IMPDEF class. Use it to encode the IMPDEF
records instead of encoding them directly.

git-svn-id: trunk@42236 -

nickysn 6 年之前
父節點
當前提交
eea3eb1a8e
共有 2 個文件被更改,包括 63 次插入9 次删除
  1. 16 9
      compiler/ogomf.pas
  2. 47 0
      compiler/omfbase.pas

+ 16 - 9
compiler/ogomf.pas

@@ -1334,7 +1334,8 @@ implementation
       var
         RawRecord: TOmfRawRecord;
         Header: TOmfRecord_THEADR;
-        DllImport_COMENT: TOmfRecord_COMENT;
+        DllImport_COMENT: TOmfRecord_COMENT=nil;
+        DllImport_COMENT_IMPDEF: TOmfRecord_COMENT_IMPDEF=nil;
         ModEnd: TOmfRecord_MODEND;
       begin
         { write header record }
@@ -1346,20 +1347,26 @@ implementation
         Header.Free;
 
         { write IMPDEF record }
-        DllImport_COMENT:=TOmfRecord_COMENT.Create;
-        DllImport_COMENT.CommentClass:=CC_OmfExtension;
+        DllImport_COMENT_IMPDEF:=TOmfRecord_COMENT_IMPDEF.Create;
+        DllImport_COMENT_IMPDEF.InternalName:=mangledname;
+        DllImport_COMENT_IMPDEF.ModuleName:=dllname;
         if ordnr <= 0 then
           begin
-            if afuncname=mangledname then
-              DllImport_COMENT.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#0+Chr(Length(mangledname))+mangledname+Chr(Length(dllname))+dllname+#0
-            else
-              DllImport_COMENT.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#0+Chr(Length(mangledname))+mangledname+Chr(Length(dllname))+dllname+Chr(Length(afuncname))+afuncname;
+            DllImport_COMENT_IMPDEF.ImportByOrdinal:=False;
+            DllImport_COMENT_IMPDEF.Name:=afuncname;
           end
         else
-          DllImport_COMENT.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#1+Chr(Length(mangledname))+mangledname+Chr(Length(dllname))+dllname+Chr(ordnr and $ff)+Chr((ordnr shr 8) and $ff);
+          begin
+            DllImport_COMENT_IMPDEF.ImportByOrdinal:=True;
+            DllImport_COMENT_IMPDEF.Ordinal:=ordnr;
+          end;
+
+        DllImport_COMENT:=TOmfRecord_COMENT.Create;
+        DllImport_COMENT_IMPDEF.EncodeTo(DllImport_COMENT);
+        FreeAndNil(DllImport_COMENT_IMPDEF);
         DllImport_COMENT.EncodeTo(RawRecord);
+        FreeAndNil(DllImport_COMENT);
         RawRecord.WriteTo(FWriter);
-        DllImport_COMENT.Free;
 
         { write MODEND record }
         ModEnd:=TOmfRecord_MODEND.Create;

+ 47 - 0
compiler/omfbase.pas

@@ -337,6 +337,26 @@ interface
       procedure EncodeTo(ComentRecord: TOmfRecord_COMENT);virtual;abstract;
     end;
 
+    { TOmfRecord_COMENT_IMPDEF }
+
+    TOmfRecord_COMENT_IMPDEF = class(TOmfRecord_COMENT_Subtype)
+    private
+      FImportByOrdinal: Boolean;
+      FInternalName: string;
+      FModuleName: string;
+      FOrdinal: Word;
+      FName: string;
+    public
+      procedure DecodeFrom(ComentRecord: TOmfRecord_COMENT);override;
+      procedure EncodeTo(ComentRecord: TOmfRecord_COMENT);override;
+
+      property ImportByOrdinal: Boolean read FImportByOrdinal write FImportByOrdinal;
+      property InternalName: string read FInternalName write FInternalName;
+      property ModuleName: string read FModuleName write FModuleName;
+      property Ordinal: Word read FOrdinal write FOrdinal;
+      property Name: string read FName write FName;
+    end;
+
     { TOmfRecord_LNAMES }
 
     TOmfRecord_LNAMES = class(TOmfParsedRecord)
@@ -1555,6 +1575,33 @@ implementation
       RawRecord.CalculateChecksumByte;
     end;
 
+  { TOmfRecord_COMENT_IMPDEF }
+
+  procedure TOmfRecord_COMENT_IMPDEF.DecodeFrom(ComentRecord: TOmfRecord_COMENT);
+    begin
+      {todo: implement}
+      internalerror(2019061502);
+    end;
+
+  procedure TOmfRecord_COMENT_IMPDEF.EncodeTo(ComentRecord: TOmfRecord_COMENT);
+    begin
+      ComentRecord.CommentClass:=CC_OmfExtension;
+      if ImportByOrdinal then
+        ComentRecord.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#1+
+                                    Chr(Length(InternalName))+InternalName+
+                                    Chr(Length(ModuleName))+ModuleName+
+                                    Chr(Ordinal and $ff)+Chr((Ordinal shr 8) and $ff)
+      else if InternalName=Name then
+        ComentRecord.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#0+
+                                    Chr(Length(InternalName))+InternalName+
+                                    Chr(Length(ModuleName))+ModuleName+#0
+      else
+        ComentRecord.CommentString:=Chr(CC_OmfExtension_IMPDEF)+#0+
+                                    Chr(Length(InternalName))+InternalName+
+                                    Chr(Length(ModuleName))+ModuleName+
+                                    Chr(Length(Name))+Name;
+    end;
+
   { TOmfRecord_LNAMES }
 
   constructor TOmfRecord_LNAMES.Create;