From 393d86a2e51ad63275a78f113f75a2760e4f3c06 Mon Sep 17 00:00:00 2001 From: nickysn Date: Sat, 5 Sep 2015 13:45:23 +0000 Subject: [PATCH] + implemented writing proper win16 dll import libraries git-svn-id: trunk@31532 - --- compiler/ogomf.pas | 41 ++++++++++++++++++++++++++++++++++++ compiler/owomflib.pas | 10 +++++++-- compiler/systems/i_win16.pas | 4 ++-- compiler/systems/t_win16.pas | 32 ++++++++++++++++------------ 4 files changed, 70 insertions(+), 17 deletions(-) diff --git a/compiler/ogomf.pas b/compiler/ogomf.pas index 35ab830c49..14e0560738 100644 --- a/compiler/ogomf.pas +++ b/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 ****************************************************************************} diff --git a/compiler/owomflib.pas b/compiler/owomflib.pas index 885da7b3c5..bdae4c0f83 100644 --- a/compiler/owomflib.pas +++ b/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 diff --git a/compiler/systems/i_win16.pas b/compiler/systems/i_win16.pas index e9ad3b7e85..5a9261cfe3 100644 --- a/compiler/systems/i_win16.pas +++ b/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 : '\'; diff --git a/compiler/systems/t_win16.pas b/compiler/systems/t_win16.pas index ab5faccf8d..e04e189039 100644 --- a/compiler/systems/t_win16.pas +++ b/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;