Răsfoiți Sursa

+ implemented writing proper win16 dll import libraries

git-svn-id: trunk@31532 -
nickysn 10 ani în urmă
părinte
comite
393d86a2e5
4 a modificat fișierele cu 70 adăugiri și 17 ștergeri
  1. 41 0
      compiler/ogomf.pas
  2. 8 2
      compiler/owomflib.pas
  3. 2 2
      compiler/systems/i_win16.pas
  4. 19 13
      compiler/systems/t_win16.pas

+ 41 - 0
compiler/ogomf.pas

@@ -136,6 +136,7 @@ interface
       public
         constructor create(AWriter:TObjectWriter);override;
         destructor Destroy;override;
+        procedure WriteDllImport(const dllname,afuncname,mangledname:string;ordnr:longint;isvar:boolean);
       end;
 
       { TOmfObjInput }
@@ -999,6 +1000,46 @@ implementation
         inherited Destroy;
       end;
 
+    procedure TOmfObjOutput.WriteDllImport(const dllname,afuncname,mangledname: string; ordnr: longint; isvar: boolean);
+      var
+        RawRecord: TOmfRawRecord;
+        Header: TOmfRecord_THEADR;
+        DllImport_COMENT: TOmfRecord_COMENT;
+        ModEnd: TOmfRecord_MODEND;
+      begin
+        { write header record }
+        RawRecord:=TOmfRawRecord.Create;
+        Header:=TOmfRecord_THEADR.Create;
+        Header.ModuleName:=mangledname;
+        Header.EncodeTo(RawRecord);
+        RawRecord.WriteTo(FWriter);
+        Header.Free;
+
+        { write IMPDEF record }
+        DllImport_COMENT:=TOmfRecord_COMENT.Create;
+        DllImport_COMENT.CommentClass:=CC_OmfExtension;
+        if ordnr <= 0 then
+          begin
+            if afuncname=mangledname then
+              DllImport_COMENT.CommentString:=#1#0+Chr(Length(mangledname))+mangledname+Chr(Length(dllname))+dllname+#0
+            else
+              DllImport_COMENT.CommentString:=#1#0+Chr(Length(mangledname))+mangledname+Chr(Length(dllname))+dllname+Chr(Length(afuncname))+afuncname;
+          end
+        else
+          DllImport_COMENT.CommentString:=#1#1+Chr(Length(mangledname))+mangledname+Chr(Length(dllname))+dllname+Chr(ordnr and $ff)+Chr((ordnr shr 8) and $ff);
+        DllImport_COMENT.EncodeTo(RawRecord);
+        RawRecord.WriteTo(FWriter);
+        DllImport_COMENT.Free;
+
+        { write MODEND record }
+        ModEnd:=TOmfRecord_MODEND.Create;
+        ModEnd.EncodeTo(RawRecord);
+        RawRecord.WriteTo(FWriter);
+        ModEnd.Free;
+
+        RawRecord.Free;
+      end;
+
 {****************************************************************************
                                TOmfObjInput
 ****************************************************************************}

+ 8 - 2
compiler/owomflib.pas

@@ -64,6 +64,7 @@ type
     function TryWriteDictionaryWithSize(nblocks: Byte): Boolean;
   public
     constructor createAr(const Aarfn:string);override;
+    constructor createAr(const Aarfn:string;PageSize:Integer);
     destructor  destroy;override;
     function  createfile(const fn:string):boolean;override;
     procedure closefile;override;
@@ -135,7 +136,12 @@ implementation
 
     constructor TOmfLibObjectWriter.createAr(const Aarfn: string);
       begin
-        FPageSize:=512;
+        createAr(Aarfn,512);
+      end;
+
+    constructor TOmfLibObjectWriter.createAr(const Aarfn: string;PageSize: Integer);
+      begin
+        FPageSize:=PageSize;
         FLibName:=Aarfn;
         FLibData:=TDynamicArray.Create(libbufsize);
         FDictionary:=TFPHashObjectList.Create;
@@ -261,7 +267,7 @@ implementation
         libf.Free;
       end;
 
-    function TOmfLibObjectWriter.WriteDictionary: Byte;
+        function TOmfLibObjectWriter.WriteDictionary: byte;
       var
         nb: Byte;
       begin

+ 2 - 2
compiler/systems/i_win16.pas

@@ -64,8 +64,8 @@ unit i_win16;
             staticClibext : '.a';
             staticClibprefix : 'lib';
             sharedClibprefix : '';
-            importlibprefix : '';
-            importlibext : '.al';
+            importlibprefix : 'libimp';
+            importlibext : '.a';
             Cprefix      : '_';
             newline      : #13#10;
             dirsep       : '\';

+ 19 - 13
compiler/systems/t_win16.pas

@@ -56,9 +56,6 @@ implementation
          function  MakeExecutable:boolean;override;
       end;
 
-    var
-      importlist: array of string;
-
 {****************************************************************************
                                TImportLibWin16
 ****************************************************************************}
@@ -66,21 +63,36 @@ implementation
 
 procedure TImportLibWin16.generatelib;
 var
-  i: Integer;
-  j: Integer;
+  ObjWriter: TOmfLibObjectWriter;
+  ObjOutput: TOmfObjOutput;
+  i,j: Integer;
   ImportLibrary: TImportLibrary;
   ImportSymbol: TImportSymbol;
+  AsmPrefix: String;
+
+  procedure AddImport(const dllname,afuncname,mangledname:string;ordnr:longint;isvar:boolean);
+    begin
+      ObjOutput.startObjectfile(mangledname);
+      ObjOutput.WriteDllImport(dllname,afuncname,mangledname,ordnr,isvar);
+      ObjOutput.Writer.closefile;
+    end;
+
 begin
+  AsmPrefix:='imp'+Lower(current_module.modulename^);
+  current_module.linkotherstaticlibs.add(current_module.importlibfilename,link_always);
+  ObjWriter:=TOmfLibObjectWriter.CreateAr(current_module.importlibfilename,32);
+  ObjOutput:=TOmfObjOutput.Create(ObjWriter);
   for i:=0 to current_module.ImportLibraryList.Count-1 do
     begin
       ImportLibrary:=TImportLibrary(current_module.ImportLibraryList[i]);
       for j:=0 to ImportLibrary.ImportSymbolList.Count-1 do
         begin
           ImportSymbol:=TImportSymbol(ImportLibrary.ImportSymbolList[j]);
-          SetLength(importlist, Length(importlist)+1);
-          WriteStr(importlist[high(importlist)],'import ',ImportSymbol.Name,' ',ImportLibrary.Name);
+          AddImport(ImportLibrary.Name,ImportSymbol.Name,ImportSymbol.MangledName,ImportSymbol.OrdNr,ImportSymbol.IsVar);
         end;
     end;
+  ObjOutput.Free;
+  ObjWriter.Free;
 end;
 
 
@@ -133,12 +145,6 @@ begin
     LinkRes.Add('option map='+maybequoted(ChangeFileExt(current_module.exefilename,'.map')));
   LinkRes.Add('name ' + maybequoted(current_module.exefilename));
 
-{  LinkRes.Add('import InitTask KERNEL');
-  LinkRes.Add('import WaitEvent KERNEL');
-  LinkRes.Add('import InitApp USER');}
-  for i:=low(importlist) to high(importlist) do
-    LinkRes.Add(importlist[i]);
-
   { Write and Close response }
   linkres.writetodisk;
   LinkRes.Free;