mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-28 16:40:28 +02:00
* OS/2 compilation fixes (not completely finished yet)
git-svn-id: trunk@6937 -
This commit is contained in:
parent
0b3ddb0b82
commit
30b78920cd
@ -82,6 +82,11 @@ interface
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
TAoutGNUAssembler=class(TGNUAssembler)
|
||||||
|
function sectionname(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder):string;override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -1141,6 +1146,51 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{****************************************************************************}
|
||||||
|
{ a.out/GNU Assembler writer }
|
||||||
|
{****************************************************************************}
|
||||||
|
|
||||||
|
function TAoutGNUAssembler.sectionname(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder):string;
|
||||||
|
const
|
||||||
|
(* Translation table - replace unsupported section types with basic ones. *)
|
||||||
|
SecXTable: array[TAsmSectionType] of TAsmSectionType = (
|
||||||
|
sec_none,
|
||||||
|
sec_code,
|
||||||
|
sec_data,
|
||||||
|
sec_data (* sec_rodata *),
|
||||||
|
sec_bss,
|
||||||
|
sec_data (* sec_threadvar *),
|
||||||
|
{ used for wince exception handling }
|
||||||
|
sec_code (* sec_pdata *),
|
||||||
|
{ used for darwin import stubs }
|
||||||
|
sec_code (* sec_stub *),
|
||||||
|
{ stabs }
|
||||||
|
sec_stab,sec_stabstr,
|
||||||
|
{ win32 }
|
||||||
|
sec_data (* sec_idata2 *),
|
||||||
|
sec_data (* sec_idata4 *),
|
||||||
|
sec_data (* sec_idata5 *),
|
||||||
|
sec_data (* sec_idata6 *),
|
||||||
|
sec_data (* sec_idata7 *),
|
||||||
|
sec_data (* sec_edata *),
|
||||||
|
{ C++ exception handling unwinding (uses dwarf) }
|
||||||
|
sec_eh_frame,
|
||||||
|
{ dwarf }
|
||||||
|
sec_debug_frame,
|
||||||
|
sec_debug_info,
|
||||||
|
sec_debug_line,
|
||||||
|
sec_debug_abbrev,
|
||||||
|
{ ELF resources (+ references to stabs debug information sections) }
|
||||||
|
sec_code (* sec_fpc *),
|
||||||
|
{ Table of contents section }
|
||||||
|
sec_code (* sec_toc *),
|
||||||
|
sec_code (* sec_init *)
|
||||||
|
);
|
||||||
|
begin
|
||||||
|
Result := inherited SectionName (SecXTable [AType], AName, AOrder);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{****************************************************************************}
|
{****************************************************************************}
|
||||||
{ Abstract Instruction Writer }
|
{ Abstract Instruction Writer }
|
||||||
{****************************************************************************}
|
{****************************************************************************}
|
||||||
|
@ -2113,13 +2113,25 @@ const
|
|||||||
if assigned(pd.import_dll) then
|
if assigned(pd.import_dll) then
|
||||||
begin
|
begin
|
||||||
{ If we are not using direct dll linking under win32 then imports
|
{ If we are not using direct dll linking under win32 then imports
|
||||||
need to use the normal name since to functions can refer to the
|
need to use the normal name since two functions can refer to the
|
||||||
same DLL function. This is also needed for compatability
|
same DLL function. This is also needed for compatability
|
||||||
with Delphi and TP7 }
|
with Delphi and TP7 }
|
||||||
|
(*
|
||||||
|
case target_info.system of
|
||||||
|
system_i386_emx,
|
||||||
|
system_i386_os2 :
|
||||||
|
begin
|
||||||
|
{ keep normal mangledname }
|
||||||
|
if not (Assigned (PD.Import_Name)) then
|
||||||
|
Result := PD.MangledName;
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
*)
|
||||||
if assigned(pd.import_name) then
|
if assigned(pd.import_name) then
|
||||||
begin
|
begin
|
||||||
if target_info.system in system_all_windows then
|
if target_info.system in (system_all_windows +
|
||||||
{ cprefix is not used in DLL imports under Windows }
|
[system_i386_emx, system_i386_os2]) then
|
||||||
|
{ cprefix is not used in DLL imports under Windows or OS/2 }
|
||||||
result:=pd.import_name^
|
result:=pd.import_name^
|
||||||
else
|
else
|
||||||
result:=maybe_cprefix(pd.import_name^);
|
result:=maybe_cprefix(pd.import_name^);
|
||||||
|
@ -1541,7 +1541,7 @@ implementation
|
|||||||
(pd.hasforward) and
|
(pd.hasforward) and
|
||||||
not(
|
not(
|
||||||
assigned(pd.import_dll) and
|
assigned(pd.import_dll) and
|
||||||
(target_info.system in [system_i386_wdosx,system_i386_emx,system_i386_os2,
|
(target_info.system in [system_i386_wdosx,
|
||||||
system_arm_wince,system_i386_wince])
|
system_arm_wince,system_i386_wince])
|
||||||
) then
|
) then
|
||||||
begin
|
begin
|
||||||
|
@ -284,21 +284,29 @@ procedure AddImport(const module:string;index:longint;const name:string);
|
|||||||
module = Name of DLL to import from.
|
module = Name of DLL to import from.
|
||||||
index = Index of function in DLL. Use 0 to import by name.
|
index = Index of function in DLL. Use 0 to import by name.
|
||||||
name = Name of function in DLL. Ignored when index=0;}
|
name = Name of function in DLL. Ignored when index=0;}
|
||||||
|
(*
|
||||||
var tmp1,tmp2,tmp3:string;
|
var tmp1,tmp2,tmp3:string;
|
||||||
|
*)
|
||||||
|
var tmp1,tmp3:string;
|
||||||
sym_mcount,sym_import:longint;
|
sym_mcount,sym_import:longint;
|
||||||
fixup_mcount,fixup_import:longint;
|
fixup_mcount,fixup_import:longint;
|
||||||
func : string;
|
|
||||||
begin
|
begin
|
||||||
aout_init;
|
aout_init;
|
||||||
|
(*
|
||||||
tmp2:=func;
|
tmp2:=func;
|
||||||
if profile_flag and not (copy(func,1,4)='_16_') then
|
if profile_flag and not (copy(func,1,4)='_16_') then
|
||||||
|
*)
|
||||||
|
if profile_flag and not (copy(Name,1,4)='_16_') then
|
||||||
begin
|
begin
|
||||||
{sym_entry:=aout_sym(func,n_text+n_ext,0,0,aout_text_size);}
|
{sym_entry:=aout_sym(func,n_text+n_ext,0,0,aout_text_size);}
|
||||||
sym_mcount:=aout_sym('__mcount',n_ext,0,0,0);
|
sym_mcount:=aout_sym('__mcount',n_ext,0,0,0);
|
||||||
{Use, say, "_$U_DosRead" for "DosRead" to import the
|
{Use, say, "_$U_DosRead" for "DosRead" to import the
|
||||||
non-profiled function.}
|
non-profiled function.}
|
||||||
|
(*
|
||||||
tmp2:='__$U_'+func;
|
tmp2:='__$U_'+func;
|
||||||
sym_import:=aout_sym(tmp2,n_ext,0,0,0);
|
sym_import:=aout_sym(tmp2,n_ext,0,0,0);
|
||||||
|
*)
|
||||||
|
sym_import:=aout_sym(name,n_ext,0,0,0);
|
||||||
aout_text_byte($55); {push ebp}
|
aout_text_byte($55); {push ebp}
|
||||||
aout_text_byte($89); {mov ebp, esp}
|
aout_text_byte($89); {mov ebp, esp}
|
||||||
aout_text_byte($e5);
|
aout_text_byte($e5);
|
||||||
@ -315,14 +323,24 @@ begin
|
|||||||
end;
|
end;
|
||||||
str(seq_no,tmp1);
|
str(seq_no,tmp1);
|
||||||
tmp1:='IMPORT#'+tmp1;
|
tmp1:='IMPORT#'+tmp1;
|
||||||
|
(*
|
||||||
if name='' then
|
if name='' then
|
||||||
|
*)
|
||||||
|
if index<>0 then
|
||||||
begin
|
begin
|
||||||
str(index,tmp3);
|
str(index,tmp3);
|
||||||
|
(*
|
||||||
tmp3:=func+'='+module+'.'+tmp3;
|
tmp3:=func+'='+module+'.'+tmp3;
|
||||||
|
*)
|
||||||
|
tmp3:=Name+'='+module+'.'+tmp3;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
tmp3:=Name+'='+module+'.'+name;
|
||||||
|
(*
|
||||||
tmp3:=func+'='+module+'.'+name;
|
tmp3:=func+'='+module+'.'+name;
|
||||||
aout_sym(tmp2,n_imp1+n_ext,0,0,0);
|
aout_sym(tmp2,n_imp1+n_ext,0,0,0);
|
||||||
|
*)
|
||||||
|
aout_sym(Name,n_imp1+n_ext,0,0,0);
|
||||||
aout_sym(tmp3,n_imp2+n_ext,0,0,0);
|
aout_sym(tmp3,n_imp2+n_ext,0,0,0);
|
||||||
aout_finish;
|
aout_finish;
|
||||||
write_ar(tmp1,aout_size);
|
write_ar(tmp1,aout_size);
|
||||||
@ -340,22 +358,24 @@ end;
|
|||||||
ImportLibrary : TImportLibrary;
|
ImportLibrary : TImportLibrary;
|
||||||
ImportSymbol : TImportSymbol;
|
ImportSymbol : TImportSymbol;
|
||||||
begin
|
begin
|
||||||
|
LibName:=FixFileName(Current_Module.RealModuleName^ + Target_Info.StaticCLibExt);
|
||||||
|
seq_no:=1;
|
||||||
|
current_module.linkotherstaticlibs.add(libname,link_always);
|
||||||
|
assign(out_file,current_module.outputpath^+libname);
|
||||||
|
rewrite(out_file,1);
|
||||||
|
blockwrite(out_file,ar_magic,sizeof(ar_magic));
|
||||||
|
|
||||||
for i:=0 to current_module.ImportLibraryList.Count-1 do
|
for i:=0 to current_module.ImportLibraryList.Count-1 do
|
||||||
begin
|
begin
|
||||||
ImportLibrary:=TImportLibrary(current_module.ImportLibraryList[i]);
|
ImportLibrary:=TImportLibrary(current_module.ImportLibraryList[i]);
|
||||||
LibName:=FixFileName(ImportLibrary.Name + Target_Info.StaticCLibExt);
|
{ LibName:=FixFileName(ImportLibrary.Name + Target_Info.StaticCLibExt);}
|
||||||
seq_no:=1;
|
|
||||||
current_module.linkotherstaticlibs.add(libname,link_always);
|
|
||||||
assign(out_file,current_module.outputpath^+libname);
|
|
||||||
rewrite(out_file,1);
|
|
||||||
blockwrite(out_file,ar_magic,sizeof(ar_magic));
|
|
||||||
for j:=0 to ImportLibrary.ImportSymbolList.Count-1 do
|
for j:=0 to ImportLibrary.ImportSymbolList.Count-1 do
|
||||||
begin
|
begin
|
||||||
ImportSymbol:=TImportSymbol(ImportLibrary.ImportSymbolList[j]);
|
ImportSymbol:=TImportSymbol(ImportLibrary.ImportSymbolList[j]);
|
||||||
AddImport(ImportLibrary.Name,ImportSymbol.OrdNr,ImportSymbol.Name);
|
AddImport(ChangeFileExt(ExtractFileName(ImportLibrary.Name),''),ImportSymbol.OrdNr,ImportSymbol.Name);
|
||||||
end;
|
end;
|
||||||
close(out_file);
|
|
||||||
end;
|
end;
|
||||||
|
close(out_file);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,6 +41,10 @@ interface
|
|||||||
constructor create(smart: boolean); override;
|
constructor create(smart: boolean); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Tx86AoutGNUAssembler=class(TAoutGNUassembler)
|
||||||
|
constructor create(smart: boolean); override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
Tx86InstrWriter=class(TCPUInstrWriter)
|
Tx86InstrWriter=class(TCPUInstrWriter)
|
||||||
private
|
private
|
||||||
@ -83,6 +87,16 @@ interface
|
|||||||
InstrWriter := Tx86InstrWriter.create(self);
|
InstrWriter := Tx86InstrWriter.create(self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{****************************************************************************
|
||||||
|
Tx86AoutGNUAssembler
|
||||||
|
****************************************************************************}
|
||||||
|
|
||||||
|
constructor Tx86AoutGNUAssembler.create(smart: boolean);
|
||||||
|
begin
|
||||||
|
inherited create(smart);
|
||||||
|
InstrWriter := Tx86InstrWriter.create(self);
|
||||||
|
end;
|
||||||
|
|
||||||
{****************************************************************************
|
{****************************************************************************
|
||||||
Tx86InstrWriter
|
Tx86InstrWriter
|
||||||
****************************************************************************}
|
****************************************************************************}
|
||||||
@ -339,6 +353,6 @@ initialization
|
|||||||
RegisterAssembler(as_i386_as_info,Tx86ATTAssembler);
|
RegisterAssembler(as_i386_as_info,Tx86ATTAssembler);
|
||||||
RegisterAssembler(as_i386_gas_info,Tx86ATTAssembler);
|
RegisterAssembler(as_i386_gas_info,Tx86ATTAssembler);
|
||||||
RegisterAssembler(as_i386_gas_darwin_info,Tx86AppleGNUAssembler);
|
RegisterAssembler(as_i386_gas_darwin_info,Tx86AppleGNUAssembler);
|
||||||
RegisterAssembler(as_i386_as_aout_info,Tx86ATTAssembler);
|
RegisterAssembler(as_i386_as_aout_info,Tx86AoutGNUAssembler);
|
||||||
{$endif x86_64}
|
{$endif x86_64}
|
||||||
end.
|
end.
|
||||||
|
Loading…
Reference in New Issue
Block a user