summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorolivier <olivier@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-05-28 22:27:11 +0000
committerolivier <olivier@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-05-28 22:27:11 +0000
commit6c1ebfcb2d4f3318931eb87a57661853785808a4 (patch)
treead00faf64973766ae9d6c75e6c6cf58c74d4522d
parent0ffad229c60dc01b541fc2945e9d0d67cf4bf75c (diff)
downloadfpc-6c1ebfcb2d4f3318931eb87a57661853785808a4.tar.gz
* enable some features for the x86_64 UEFI target, based on the win64 target.
git-svn-id: https://svn.freepascal.org/svn/fpc/branches/olivier@36368 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--uefi/compiler/aasmtai.pas2
-rw-r--r--uefi/compiler/assemble.pas2
-rw-r--r--uefi/compiler/entfile.pas4
-rw-r--r--uefi/compiler/ogcoff.pas18
-rw-r--r--uefi/compiler/systems/i_uefi.pas16
-rw-r--r--uefi/compiler/systems/t_win.pas18
-rw-r--r--uefi/compiler/x86/aasmcpu.pas2
-rw-r--r--uefi/compiler/x86/cgx86.pas2
-rw-r--r--uefi/compiler/x86/nx86ld.pas2
-rw-r--r--uefi/compiler/x86_64/cgcpu.pas6
-rw-r--r--uefi/compiler/x86_64/cpupi.pas6
-rw-r--r--uefi/compiler/x86_64/nx64flw.pas14
-rw-r--r--uefi/compiler/x86_64/rax64att.pas2
13 files changed, 48 insertions, 46 deletions
diff --git a/uefi/compiler/aasmtai.pas b/uefi/compiler/aasmtai.pas
index 14e50954d1..13a45a23d9 100644
--- a/uefi/compiler/aasmtai.pas
+++ b/uefi/compiler/aasmtai.pas
@@ -1906,7 +1906,7 @@ implementation
result:=8;
aitconst_secrel32_symbol,
aitconst_rva_symbol :
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
result:=sizeof(longint)
else
result:=sizeof(pint);
diff --git a/uefi/compiler/assemble.pas b/uefi/compiler/assemble.pas
index 83f031fd32..c0a7dbfe42 100644
--- a/uefi/compiler/assemble.pas
+++ b/uefi/compiler/assemble.pas
@@ -1899,7 +1899,7 @@ Implementation
aitconst_rva_symbol :
begin
{ PE32+? }
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
ObjData.writereloc(Tai_const(hp).symofs,sizeof(longint),Objdata.SymbolRef(tai_const(hp).sym),RELOC_RVA)
else
ObjData.writereloc(Tai_const(hp).symofs,sizeof(pint),Objdata.SymbolRef(tai_const(hp).sym),RELOC_RVA);
diff --git a/uefi/compiler/entfile.pas b/uefi/compiler/entfile.pas
index fbc2dd570e..e248d9bfc6 100644
--- a/uefi/compiler/entfile.pas
+++ b/uefi/compiler/entfile.pas
@@ -872,7 +872,7 @@ var
d : entryreal;
hd : double;
begin
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
begin
hd:=getrealsize(sizeof(hd));
getreal:=hd;
@@ -1178,7 +1178,7 @@ procedure tentryfile.putreal(d:entryreal);
var
hd : double;
begin
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
begin
hd:=d;
putdata(hd,sizeof(hd));
diff --git a/uefi/compiler/ogcoff.pas b/uefi/compiler/ogcoff.pas
index 0349d9e062..7ceabb75ef 100644
--- a/uefi/compiler/ogcoff.pas
+++ b/uefi/compiler/ogcoff.pas
@@ -2184,7 +2184,7 @@ const pemagic : array[0..3] of byte = (
begin
inherited create;
win32:=awin32;
- if target_info.system in [system_x86_64_win64] then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
MaxMemPos:=$FFFFFFFF
else
if target_info.system in systems_wince then
@@ -2522,7 +2522,7 @@ const pemagic : array[0..3] of byte = (
if win32 then
begin
header.flag:=PE_FILE_EXECUTABLE_IMAGE or PE_FILE_LINE_NUMS_STRIPPED;
- if target_info.system in [system_x86_64_win64] then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
header.flag:=header.flag or PE_FILE_LARGE_ADDRESS_AWARE
else
header.flag:=header.flag or PE_FILE_32BIT_MACHINE;
@@ -2717,7 +2717,7 @@ const pemagic : array[0..3] of byte = (
objreloc:TObjRelocation;
i,j:longint;
begin
- if target_info.system<>system_x86_64_win64 then
+ if not (target_info.system in [system_x86_64_win64,system_x86_64_uefi]) then
exit;
exesec:=FindExeSection('.pdata');
if exesec=nil then
@@ -2778,11 +2778,11 @@ const pemagic : array[0..3] of byte = (
begin
{ idata4 }
idata4objsection.writezeros(sizeof(longint));
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
idata4objsection.writezeros(sizeof(longint));
{ idata5 }
idata5objsection.writezeros(sizeof(longint));
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
idata5objsection.writezeros(sizeof(longint));
end;
@@ -2809,14 +2809,14 @@ const pemagic : array[0..3] of byte = (
if AOrdNr <= 0 then
begin
objsec.writereloc_internal(idata6objsection,idata6objsection.size,sizeof(longint),RELOC_RVA);
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
objsec.writezeros(sizeof(longint));
end
else
begin
{ import by ordinal }
ordint:=AOrdNr;
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
begin
objsec.write(ordint,sizeof(ordint));
ordint:=$80000000;
@@ -3117,14 +3117,14 @@ const pemagic : array[0..3] of byte = (
result:=false;
fillchar(sechdr,sizeof(sechdr),0);
{$ifdef win32}
- if (target_info.system=system_x86_64_win64) and
+ if (target_info.system in [system_x86_64_win64,system_x86_64_uefi]) and
assigned(Wow64DisableWow64FsRedirection) then
Wow64DisableWow64FsRedirection(p);
{$endif win32}
DLLReader:=TObjectReader.Create;
DLLReader.OpenFile(dllname);
{$ifdef win32}
- if (target_info.system=system_x86_64_win64) and
+ if (target_info.system in [system_x86_64_win64,system_x86_64_uefi]) and
assigned(Wow64RevertWow64FsRedirection) then
Wow64RevertWow64FsRedirection(p);
{$endif win32}
diff --git a/uefi/compiler/systems/i_uefi.pas b/uefi/compiler/systems/i_uefi.pas
index eb2834912d..dcc68c5abb 100644
--- a/uefi/compiler/systems/i_uefi.pas
+++ b/uefi/compiler/systems/i_uefi.pas
@@ -38,8 +38,8 @@ unit i_uefi;
shortname : 'uefi';
flags : [tf_files_case_aware,tf_use_function_relative_addresses,tf_smartlink_library
,tf_smartlink_sections{,tf_section_threadvars}{,tf_needs_dwarf_cfi},
- tf_no_generic_stackcheck{,tf_has_winlike_resources},tf_under_development,
- tf_dwarf_only_local_labels{,tf_pic_uses_got}];
+ tf_no_generic_stackcheck{,tf_has_winlike_resources},tf_under_development//,
+ {tf_dwarf_only_local_labels}{,tf_pic_uses_got}];
cpu : cpu_i386;
unit_env : 'UEFIUNITS';
extradefines : 'UEFI,FPC_OS_UNICODE';
@@ -104,14 +104,14 @@ unit i_uefi;
system : system_x86_64_uefi;
name : 'UEFI for x86_64';
shortname : 'uefi';
- flags : [tf_files_case_aware,tf_use_function_relative_addresses
- ,tf_smartlink_sections{,tf_section_threadvars}{,tf_needs_dwarf_cfi},
- tf_no_generic_stackcheck{,tf_has_winlike_resources},tf_under_development,
- tf_dwarf_only_local_labels{,tf_pic_uses_got},tf_pic_default,tf_library_needs_pic];
+ flags : [tf_files_case_aware,tf_use_function_relative_addresses,tf_smartlink_library
+ ,tf_smartlink_sections{,tf_section_threadvars}{,tf_needs_dwarf_cfi},{tf_dwarf_relative_addresses,}
+ tf_no_generic_stackcheck{,tf_has_winlike_resources},tf_under_development,{tf_no_pic_supported,}
+ tf_dwarf_only_local_labels{,tf_pic_uses_got}{,tf_pic_default,tf_library_needs_pic}];
cpu : cpu_x86_64;
unit_env : 'UEFIUNITS';
extradefines : 'UEFI,FPC_OS_UNICODE';
- exeext : '.exe';
+ exeext : '.efi';
defext : '.def';
scriptext : '.bat';
smartext : '.sl';
@@ -140,7 +140,7 @@ unit i_uefi;
linkextern : ld_none;
ar : ar_gnu_ar;
res : res_gnu_windres;
- dbg : dbg_dwarf2;
+ dbg : dbg_stabs;
script : script_dos;
endian : endian_little;
alignment :
diff --git a/uefi/compiler/systems/t_win.pas b/uefi/compiler/systems/t_win.pas
index 13b89004a7..103421a6c8 100644
--- a/uefi/compiler/systems/t_win.pas
+++ b/uefi/compiler/systems/t_win.pas
@@ -251,12 +251,12 @@ implementation
{ idata4 }
objdata.SetSection(idata4objsection);
objdata.writebytes(emptyint,sizeof(emptyint));
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
objdata.writebytes(emptyint,sizeof(emptyint));
{ idata5 }
objdata.SetSection(idata5objsection);
objdata.writebytes(emptyint,sizeof(emptyint));
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
objdata.writebytes(emptyint,sizeof(emptyint));
{ idata7 }
objdata.SetSection(idata7objsection);
@@ -311,14 +311,14 @@ implementation
begin
{ import by name }
objdata.writereloc(0,sizeof(longint),idata6label,RELOC_RVA);
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
objdata.writebytes(emptyint,sizeof(emptyint));
end
else
begin
{ import by ordinal }
ordint:=ordnr;
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
begin
objdata.writebytes(ordint,sizeof(ordint));
ordint:=$80000000;
@@ -487,12 +487,12 @@ implementation
if ImportSymbol.Name<>'' then
begin
current_asmdata.asmlists[al_imports].concat(Tai_const.Create_rva_sym(TAsmLabel(ImportLabels[j])));
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
current_asmdata.asmlists[al_imports].concat(Tai_const.Create_32bit(0));
end
else
begin
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
current_asmdata.asmlists[al_imports].concat(Tai_const.Create_64bit(int64($8000000000000000) or ImportSymbol.ordnr))
else
current_asmdata.asmlists[al_imports].concat(Tai_const.Create_32bit(longint($80000000) or ImportSymbol.ordnr));
@@ -500,7 +500,7 @@ implementation
end;
{ finalize the names ... }
current_asmdata.asmlists[al_imports].concat(Tai_const.Create_32bit(0));
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
current_asmdata.asmlists[al_imports].concat(Tai_const.Create_32bit(0));
{ then the addresses and create also the indirect jump }
@@ -573,12 +573,12 @@ implementation
else
current_asmdata.asmlists[al_imports].concat(Tai_symbol.Createname_global(ImportSymbol.MangledName,AT_DATA,0,voidpointertype));
current_asmdata.asmlists[al_imports].concat(Tai_const.Create_rva_sym(TAsmLabel(Importlabels[j])));
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
current_asmdata.asmlists[al_imports].concat(Tai_const.Create_32bit(0));
end;
{ finalize the addresses }
current_asmdata.asmlists[al_imports].concat(Tai_const.Create_32bit(0));
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
current_asmdata.asmlists[al_imports].concat(Tai_const.Create_32bit(0));
{ finally the import information }
diff --git a/uefi/compiler/x86/aasmcpu.pas b/uefi/compiler/x86/aasmcpu.pas
index 1cc6d93113..a19bea68af 100644
--- a/uefi/compiler/x86/aasmcpu.pas
+++ b/uefi/compiler/x86/aasmcpu.pas
@@ -3428,7 +3428,9 @@ implementation
currabsreloc:=RELOC_ABSOLUTE
else
{$endif i8086}
+ begin
currabsreloc:=RELOC_ABSOLUTE32;
+ end;
if (currabsreloc in [RELOC_ABSOLUTE32{$ifdef i8086},RELOC_ABSOLUTE{$endif}]) and
(Assigned(oper[opidx]^.ref^.relsymbol)) then
diff --git a/uefi/compiler/x86/cgx86.pas b/uefi/compiler/x86/cgx86.pas
index 13bca63081..ff16c54d8b 100644
--- a/uefi/compiler/x86/cgx86.pas
+++ b/uefi/compiler/x86/cgx86.pas
@@ -529,7 +529,7 @@ unit cgx86;
end
else
{ Always use RIP relative symbol addressing for Windows and Darwin targets. }
- if (target_info.system in (systems_all_windows+[system_x86_64_darwin,system_x86_64_iphonesim])) and (ref.base<>NR_RIP) then
+ if (target_info.system in (systems_all_windows+[system_x86_64_darwin,system_x86_64_iphonesim,system_x86_64_uefi])) and (ref.base<>NR_RIP) then
begin
if (ref.refaddr=addr_no) and (ref.base=NR_NO) and (ref.index=NR_NO) then
begin
diff --git a/uefi/compiler/x86/nx86ld.pas b/uefi/compiler/x86/nx86ld.pas
index 91bb3b3282..33b18c3a12 100644
--- a/uefi/compiler/x86/nx86ld.pas
+++ b/uefi/compiler/x86/nx86ld.pas
@@ -59,7 +59,7 @@ implementation
handled:=false;
if (tf_section_threadvars in target_info.flags) then
begin
- if target_info.system in [system_i386_win32,system_x86_64_win64] then
+ if target_info.system in [system_i386_win32,system_x86_64_win64,system_x86_64_uefi] then
begin
paraloc1.init;
pd:=search_system_proc('fpc_tls_add');
diff --git a/uefi/compiler/x86_64/cgcpu.pas b/uefi/compiler/x86_64/cgcpu.pas
index 76bdc8565f..523146ec53 100644
--- a/uefi/compiler/x86_64/cgcpu.pas
+++ b/uefi/compiler/x86_64/cgcpu.pas
@@ -158,7 +158,7 @@ unit cgcpu;
i: longint;
begin
result:=0;
- if (target_info.system<>system_x86_64_win64) or
+ if (not(target_info.system in [system_x86_64_win64,system_x86_64_uefi])) or
(not uses_registers(R_MMREGISTER)) then
exit;
for i:=low(saved_mm_registers) to high(saved_mm_registers) do
@@ -397,7 +397,7 @@ unit cgcpu;
if (current_procinfo.procdef.proctypeoption=potype_exceptfilter) then
list.concat(Taicpu.op_reg(A_POP,tcgsize2opsize[OS_ADDR],NR_FRAME_POINTER_REG));
end
- else if (target_info.system=system_x86_64_win64) then
+ else if (target_info.system in [system_x86_64_win64,system_x86_64_uefi]) then
begin
{ Comply with Win64 unwinding mechanism, which only recognizes
'add $constant,%rsp' and 'lea offset(FPREG),%rsp' as belonging to
@@ -516,7 +516,7 @@ unit cgcpu;
if assigned(current_procinfo) then
use_ms_abi:=x86_64_use_ms_abi(current_procinfo.procdef.proccalloption)
else
- use_ms_abi:=target_info.system=system_x86_64_win64;
+ use_ms_abi:=target_info.system in [system_x86_64_win64,system_x86_64_uefi];
end;
diff --git a/uefi/compiler/x86_64/cpupi.pas b/uefi/compiler/x86_64/cpupi.pas
index e8a3bbabdf..e22030b796 100644
--- a/uefi/compiler/x86_64/cpupi.pas
+++ b/uefi/compiler/x86_64/cpupi.pas
@@ -68,7 +68,7 @@ implementation
procedure tcpuprocinfo.set_first_temp_offset;
begin
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
begin
{ Fixes the case when there are calls done by low-level means
(cg.a_call_name) but no child callnode }
@@ -89,7 +89,7 @@ implementation
procedure tcpuprocinfo.generate_parameter_info;
begin
inherited generate_parameter_info;
- if target_info.system=system_x86_64_win64 then
+ if target_info.system in [system_x86_64_win64,system_x86_64_uefi] then
para_stack_size:=0;
end;
@@ -171,7 +171,7 @@ implementation
function x86_64_use_ms_abi(proccall: tproccalloption): boolean;
begin
result:=
- ((target_info.system=system_x86_64_win64) and
+ ((target_info.system in [system_x86_64_win64,system_x86_64_uefi]) and
not(proccall in [pocall_sysv_abi_default,pocall_sysv_abi_cdecl])) or
(proccall in [pocall_ms_abi_default,pocall_ms_abi_cdecl]);
end;
diff --git a/uefi/compiler/x86_64/nx64flw.pas b/uefi/compiler/x86_64/nx64flw.pas
index c3c67ae25b..c4738c068b 100644
--- a/uefi/compiler/x86_64/nx64flw.pas
+++ b/uefi/compiler/x86_64/nx64flw.pas
@@ -72,7 +72,7 @@ function tx64raisenode.pass_1 : tnode;
raisenode : tcallnode;
begin
{ difference from generic code is that address stack is not popped on reraise }
- if (target_info.system<>system_x86_64_win64) or assigned(left) then
+ if (not(target_info.system in [system_x86_64_win64,system_x86_64_uefi])) or assigned(left) then
result:=inherited pass_1
else
begin
@@ -89,7 +89,7 @@ procedure tx64onnode.pass_generate_code;
var
exceptvarsym : tlocalvarsym;
begin
- if (target_info.system<>system_x86_64_win64) then
+ if (not(target_info.system in [system_x86_64_win64,system_x86_64_uefi])) then
begin
inherited pass_generate_code;
exit;
@@ -153,7 +153,7 @@ function copy_parasize(var n: tnode; arg: pointer): foreachnoderesult;
constructor tx64tryfinallynode.create(l, r: TNode);
begin
inherited create(l,r);
- if (target_info.system=system_x86_64_win64) and
+ if (target_info.system in [system_x86_64_win64,system_x86_64_uefi]) and
{ Don't create child procedures for generic methods, their nested-like
behavior causes compilation errors because real nested procedures
aren't allowed for generics. Not creating them doesn't harm because
@@ -179,7 +179,7 @@ constructor tx64tryfinallynode.create(l, r: TNode);
constructor tx64tryfinallynode.create_implicit(l, r, _t1: TNode);
begin
inherited create_implicit(l, r, _t1);
- if (target_info.system=system_x86_64_win64) then
+ if (target_info.system in [system_x86_64_win64,system_x86_64_uefi]) then
begin
if df_generic in current_procinfo.procdef.defoptions then
InternalError(2013012501);
@@ -202,7 +202,7 @@ constructor tx64tryfinallynode.create_implicit(l, r, _t1: TNode);
function tx64tryfinallynode.simplify(forinline: boolean): tnode;
begin
result:=inherited simplify(forinline);
- if (target_info.system<>system_x86_64_win64) then
+ if (not(target_info.system in [system_x86_64_win64,system_x86_64_uefi])) then
exit;
if (result=nil) then
begin
@@ -243,7 +243,7 @@ procedure tx64tryfinallynode.pass_generate_code;
oldflowcontrol: tflowcontrol;
catch_frame: boolean;
begin
- if (target_info.system<>system_x86_64_win64) then
+ if (not(target_info.system in [system_x86_64_win64,system_x86_64_uefi])) then
begin
inherited pass_generate_code;
exit;
@@ -372,7 +372,7 @@ procedure tx64tryexceptnode.pass_generate_code;
label
errorexit;
begin
- if (target_info.system<>system_x86_64_win64) then
+ if (not(target_info.system in [system_x86_64_win64,system_x86_64_uefi])) then
begin
inherited pass_generate_code;
exit;
diff --git a/uefi/compiler/x86_64/rax64att.pas b/uefi/compiler/x86_64/rax64att.pas
index e7d4cc8245..780a5ff300 100644
--- a/uefi/compiler/x86_64/rax64att.pas
+++ b/uefi/compiler/x86_64/rax64att.pas
@@ -74,7 +74,7 @@ Unit rax64att;
i: TAsmSehDirective;
begin
result:=false;
- if target_info.system<>system_x86_64_win64 then
+ if not(target_info.system in [system_x86_64_win64,system_x86_64_uefi]) then
exit;
for i:=low(TAsmSehDirective) to high(TAsmSehDirective) do