+ implement initial compiler support for Win64 on Aarch64

git-svn-id: trunk@44914 -
This commit is contained in:
svenbarth 2020-04-21 06:04:22 +00:00
parent 5b941e3cea
commit 3af74d2fd2
9 changed files with 152 additions and 32 deletions

View File

@ -44,6 +44,9 @@ implementation
{$ifndef NOTARGETANDROID} {$ifndef NOTARGETANDROID}
,t_android ,t_android
{$endif} {$endif}
{$ifndef NOTARGETWIN64}
,t_win
{$endif}
{************************************** {**************************************
Assemblers Assemblers

View File

@ -126,6 +126,7 @@ begin
end; end;
system_i386_win32, system_i386_win32,
system_x86_64_win64, system_x86_64_win64,
system_aarch64_win64,
obsolete_system_ia64_win64, obsolete_system_ia64_win64,
system_arm_wince, system_arm_wince,
system_i386_wince, system_i386_wince,

View File

@ -287,6 +287,11 @@ interface
COFF_OPT_MAGIC = $20b; COFF_OPT_MAGIC = $20b;
TLSDIR_SIZE = $28; TLSDIR_SIZE = $28;
{$endif x86_64} {$endif x86_64}
{$ifdef aarch64}
COFF_MAGIC = $AA64;
COFF_OPT_MAGIC = $20b;
TLSDIR_SIZE = $28;
{$endif aarch64}
COFF_BIG_OBJ_MAGIC: array[0..15] of byte = ($C7, $A1, $BA, $D1, $EE, $BA, $A9, $4B, $AF, $20, $FA, $F6, $6A, $A4, $DC, $B8); COFF_BIG_OBJ_MAGIC: array[0..15] of byte = ($C7, $A1, $BA, $D1, $EE, $BA, $A9, $4B, $AF, $20, $FA, $F6, $6A, $A4, $DC, $B8);
COFF_BIG_OBJ_VERSION = 2; COFF_BIG_OBJ_VERSION = 2;
@ -1739,12 +1744,12 @@ const pemagic : array[0..3] of byte = (
header.syms:=symidx; header.syms:=symidx;
if win32 then if win32 then
begin begin
{$ifndef x86_64} {$ifndef cpu64bitaddr}
header.flag:=PE_FILE_32BIT_MACHINE or header.flag:=PE_FILE_32BIT_MACHINE or
PE_FILE_LINE_NUMS_STRIPPED or PE_FILE_LOCAL_SYMS_STRIPPED; PE_FILE_LINE_NUMS_STRIPPED or PE_FILE_LOCAL_SYMS_STRIPPED;
{$else x86_64} {$else cpu64bitaddr}
header.flag:=PE_FILE_LINE_NUMS_STRIPPED or PE_FILE_LOCAL_SYMS_STRIPPED; header.flag:=PE_FILE_LINE_NUMS_STRIPPED or PE_FILE_LOCAL_SYMS_STRIPPED;
{$endif x86_64} {$endif cpu64bitaddr}
end end
else else
header.flag:=COFF_FLAG_AR32WR or COFF_FLAG_NOLINES or COFF_FLAG_NOLSYMS; header.flag:=COFF_FLAG_AR32WR or COFF_FLAG_NOLINES or COFF_FLAG_NOLSYMS;
@ -2405,7 +2410,7 @@ const pemagic : array[0..3] of byte = (
begin begin
inherited create; inherited create;
win32:=awin32; win32:=awin32;
if target_info.system in [system_x86_64_win64] then if target_info.system in [system_x86_64_win64,system_aarch64_win64] then
MaxMemPos:=$FFFFFFFF MaxMemPos:=$FFFFFFFF
else else
if target_info.system in systems_wince then if target_info.system in systems_wince then
@ -2743,7 +2748,7 @@ const pemagic : array[0..3] of byte = (
if win32 then if win32 then
begin begin
header.flag:=PE_FILE_EXECUTABLE_IMAGE or PE_FILE_LINE_NUMS_STRIPPED; 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_aarch64_win64] then
header.flag:=header.flag or PE_FILE_LARGE_ADDRESS_AWARE header.flag:=header.flag or PE_FILE_LARGE_ADDRESS_AWARE
else else
header.flag:=header.flag or PE_FILE_32BIT_MACHINE; header.flag:=header.flag or PE_FILE_32BIT_MACHINE;
@ -3022,16 +3027,22 @@ const pemagic : array[0..3] of byte = (
function AddImport(const afuncname,amangledname:string; AOrdNr:longint;isvar:boolean):TObjSymbol; function AddImport(const afuncname,amangledname:string; AOrdNr:longint;isvar:boolean):TObjSymbol;
const const
{$ifdef arm} {$if defined(arm)}
jmpopcode : array[0..7] of byte = ( jmpopcode : array[0..7] of byte = (
$00,$c0,$9f,$e5, // ldr ip, [pc, #0] $00,$c0,$9f,$e5, // ldr ip, [pc, #0]
$00,$f0,$9c,$e5 // ldr pc, [ip] $00,$f0,$9c,$e5 // ldr pc, [ip]
); );
{$else arm} {$elseif defined(aarch64)}
jmpopcode : array[0..11] of byte = (
$70,$00,$00,$58, // ldr ip0, .+12
$10,$02,$40,$F9, // ldr ip0, [ip0]
$00,$02,$1F,$D6 // br ip0
);
{$else}
jmpopcode : array[0..1] of byte = ( jmpopcode : array[0..1] of byte = (
$ff,$25 $ff,$25
); );
{$endif arm} {$endif}
nopopcodes : array[0..1] of byte = ( nopopcodes : array[0..1] of byte = (
$90,$90 $90,$90
); );
@ -3086,11 +3097,13 @@ const pemagic : array[0..3] of byte = (
textobjsection.writezeros(align_aword(textobjsection.size,16)-textobjsection.size); textobjsection.writezeros(align_aword(textobjsection.size,16)-textobjsection.size);
result:=internalobjdata.SymbolDefine('_'+amangledname,AB_GLOBAL,AT_FUNCTION); result:=internalobjdata.SymbolDefine('_'+amangledname,AB_GLOBAL,AT_FUNCTION);
textobjsection.write(jmpopcode,sizeof(jmpopcode)); textobjsection.write(jmpopcode,sizeof(jmpopcode));
{$ifdef x86_64} {$if defined(x86_64)}
textobjsection.writereloc_internal(idata5objsection,idata5objsection.size,4,RELOC_RELATIVE); textobjsection.writereloc_internal(idata5objsection,idata5objsection.size,4,RELOC_RELATIVE);
{$elseif defined(aarch64)}
textobjsection.writereloc_internal(idata5objsection,idata5objsection.size,8,RELOC_ABSOLUTE);
{$else} {$else}
textobjsection.writereloc_internal(idata5objsection,idata5objsection.size,4,RELOC_ABSOLUTE32); textobjsection.writereloc_internal(idata5objsection,idata5objsection.size,4,RELOC_ABSOLUTE32);
{$endif x86_64} {$endif x86_64 or aarch64}
textobjsection.write(nopopcodes,align(textobjsection.size,qword(sizeof(nopopcodes)))-textobjsection.size); textobjsection.write(nopopcodes,align(textobjsection.size,qword(sizeof(nopopcodes)))-textobjsection.size);
end; end;

View File

@ -4608,7 +4608,7 @@ begin
{ Section smartlinking conflicts with import sections on Windows } { Section smartlinking conflicts with import sections on Windows }
if GenerateImportSection and if GenerateImportSection and
(target_info.system in [system_i386_win32,system_x86_64_win64]) then (target_info.system in [system_i386_win32,system_x86_64_win64,system_aarch64_win64]) then
exclude(target_info.flags,tf_smartlink_sections); exclude(target_info.flags,tf_smartlink_sections);
if not option.LinkTypeSetExplicitly then if not option.LinkTypeSetExplicitly then

View File

@ -194,7 +194,8 @@
system_xtensa_embedded, { 103 } system_xtensa_embedded, { 103 }
system_xtensa_freertos, { 104 } system_xtensa_freertos, { 104 }
system_xtensa_linux, { 105 } system_xtensa_linux, { 105 }
system_arm_freertos { 106 } system_arm_freertos, { 106 }
system_aarch64_win64 { 107 }
); );
type type

View File

@ -276,11 +276,11 @@ interface
systems_aix = [system_powerpc_aix,system_powerpc64_aix]; systems_aix = [system_powerpc_aix,system_powerpc64_aix];
{ all real windows systems, no cripple ones like win16, wince, wdosx et. al. } { all real windows systems, no cripple ones like win16, wince, wdosx et. al. }
systems_windows = [system_i386_win32,system_x86_64_win64]; systems_windows = [system_i386_win32,system_x86_64_win64,system_aarch64_win64];
{ all windows systems } { all windows systems }
systems_all_windows = [system_i386_win32,system_x86_64_win64, systems_all_windows = systems_windows+
system_arm_wince,system_i386_wince, [system_arm_wince,system_i386_wince,
system_i8086_win16]; system_i8086_win16];
{ all darwin systems } { all darwin systems }
@ -356,13 +356,16 @@ interface
system_i386_netwlibc, system_i386_netwlibc,
system_arm_wince, system_arm_wince,
system_x86_64_win64, system_x86_64_win64,
system_i8086_win16]+systems_linux+systems_android; system_i8086_win16,
system_aarch64_win64]+systems_linux+systems_android;
{ all systems that reference symbols in other binaries using indirect imports } { all systems that reference symbols in other binaries using indirect imports }
systems_indirect_var_imports = systems_all_windows+[system_i386_nativent]; systems_indirect_var_imports = systems_all_windows+[system_i386_nativent];
{ all systems that support indirect entry information } { all systems that support indirect entry information }
systems_indirect_entry_information = systems_darwin+[system_i386_win32,system_x86_64_win64,system_x86_64_linux]; systems_indirect_entry_information = systems_darwin+
[system_i386_win32,system_x86_64_win64,system_x86_64_linux,
system_aarch64_win64];
{ all systems for which weak linking has been tested/is supported } { all systems for which weak linking has been tested/is supported }
systems_weak_linking = systems_darwin + systems_solaris + systems_linux + systems_android + systems_openbsd + systems_freebsd; systems_weak_linking = systems_darwin + systems_solaris + systems_linux + systems_android + systems_openbsd + systems_freebsd;
@ -373,13 +376,14 @@ interface
system_m68k_atari,system_m68k_palmos, system_m68k_atari,system_m68k_palmos,
system_i386_haiku,system_x86_64_haiku, system_i386_haiku,system_x86_64_haiku,
system_i386_openbsd,system_x86_64_openbsd, system_i386_openbsd,system_x86_64_openbsd,
system_riscv32_linux,system_riscv64_linux system_riscv32_linux,system_riscv64_linux,
system_aarch64_win64
]+systems_darwin+systems_amigalike; ]+systems_darwin+systems_amigalike;
{ all systems that use the PE+ header in the PE/COFF file { all systems that use the PE+ header in the PE/COFF file
Note: this is here and not in ogcoff, because it's required in other Note: this is here and not in ogcoff, because it's required in other
units as well } units as well }
systems_peoptplus = [system_x86_64_win64]; systems_peoptplus = [system_x86_64_win64,system_aarch64_win64];
{ all systems that use garbage collection for reference-counted types } { all systems that use garbage collection for reference-counted types }
systems_garbage_collected_managed_types = [ systems_garbage_collected_managed_types = [
@ -1113,6 +1117,10 @@ begin
{$define default_target_set} {$define default_target_set}
default_target(system_aarch64_android); default_target(system_aarch64_android);
{$endif android} {$endif android}
{$ifdef windows}
{$define default_target_set}
default_target(system_aarch64_win64);
{$endif}
{$ifndef default_target_set} {$ifndef default_target_set}
default_target(system_aarch64_linux); default_target(system_aarch64_linux);
{$define default_target_set} {$define default_target_set}

View File

@ -309,6 +309,77 @@ unit i_win;
llvmdatalayout : 'todo'; llvmdatalayout : 'todo';
); );
system_aarch64_win64_info : tsysteminfo =
(
system : system_aarch64_win64;
name : 'Win64 for Aarch64';
shortname : 'Win64';
flags : [tf_files_case_aware,tf_has_dllscanner,
tf_smartlink_sections,
tf_winlikewidestring,tf_no_pic_supported,
tf_dwarf_only_local_labels,
tf_no_generic_stackcheck,tf_has_winlike_resources,
tf_safecall_exceptions,tf_no_backquote_support,tf_supports_hidden_symbols];
cpu : cpu_aarch64;
unit_env : 'WIN64UNITS';
extradefines : 'MSWINDOWS;WINDOWS';
exeext : '.exe';
defext : '.def';
scriptext : '.bat';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.obj';
sharedlibext : '.dll';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : '';
sharedClibext : '.dll';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : '';
importlibprefix : 'libimp';
importlibext : '.a';
Cprefix : '';
newline : #13#10;
dirsep : '\';
assem : as_clang_gas;
assemextern : as_clang_gas;
link : ld_int_windows;
linkextern : ld_windows;
ar : ar_gnu_ar;
res : res_gnu_windres;
dbg : dbg_dwarf2;
script : script_dos;
endian : endian_little;
alignment :
(
procalign : 8;
loopalign : 4;
jumpalign : 0;
jumpalignskipmax : 0;
coalescealign : 0;
coalescealignskipmax: 0;
constalignmin : 0;
constalignmax : 16;
varalignmin : 0;
varalignmax : 16;
localalignmin : 4;
localalignmax : 16;
recordalignmin : 0;
recordalignmax : 16;
maxCrecordalign : 16
);
first_parm_offset : 16;
stacksize : 16*1024*1024;
stackalign : 16;
abi : abi_default;
llvmdatalayout : 'e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32:64-S128'
);
implementation implementation
@ -337,4 +408,10 @@ initialization
set_source_info(system_arm_wince_info); set_source_info(system_arm_wince_info);
{$endif WINCE} {$endif WINCE}
{$endif CPUARM} {$endif CPUARM}
{$ifdef CPUAARCH64}
{$ifdef WIN64}
set_source_info(system_aarch64_win64_info);
{$endif WIN64}
{$endif CPUAARCH64}
end. end.

View File

@ -151,7 +151,7 @@ implementation
else else
linker.sysinitunit:='sysinitpas'; linker.sysinitunit:='sysinitpas';
end end
else if target_info.system=system_x86_64_win64 then else if target_info.system in [system_x86_64_win64,system_aarch64_win64] then
linker.sysinitunit:='sysinit'; linker.sysinitunit:='sysinit';
end; end;
@ -270,22 +270,26 @@ implementation
procedure AddImport(const afuncname,mangledname:string;ordnr:longint;isvar:boolean); procedure AddImport(const afuncname,mangledname:string;ordnr:longint;isvar:boolean);
const const
{$ifdef x86_64} {$if defined(x86_64)}
jmpopcode : array[0..1] of byte = ( jmpopcode : array[0..1] of byte = (
$ff,$25 // jmp qword [rip + offset32] $ff,$25 // jmp qword [rip + offset32]
); );
{$else x86_64} {$elseif defined(arm)}
{$ifdef arm}
jmpopcode : array[0..7] of byte = ( jmpopcode : array[0..7] of byte = (
$00,$c0,$9f,$e5, // ldr ip, [pc, #0] $00,$c0,$9f,$e5, // ldr ip, [pc, #0]
$00,$f0,$9c,$e5 // ldr pc, [ip] $00,$f0,$9c,$e5 // ldr pc, [ip]
); );
{$else arm} {$elseif defined(aarch64)}
jmpopcode : array[0..11] of byte = (
$70,$00,$00,$58, // ldr ip0, .+12
$10,$02,$40,$F9, // ldr ip0, [ip0]
$00,$02,$1F,$D6 // br ip0
);
{$elseif defined(i386)}
jmpopcode : array[0..1] of byte = ( jmpopcode : array[0..1] of byte = (
$ff,$25 $ff,$25
); );
{$endif arm} {$endif}
{$endif x86_64}
nopopcodes : array[0..1] of byte = ( nopopcodes : array[0..1] of byte = (
$90,$90 $90,$90
); );
@ -378,11 +382,13 @@ implementation
else else
implabel:=objdata.SymbolDefine(basedllname+'_index_'+tostr(ordnr),AB_GLOBAL,AT_FUNCTION); implabel:=objdata.SymbolDefine(basedllname+'_index_'+tostr(ordnr),AB_GLOBAL,AT_FUNCTION);
objdata.writebytes(jmpopcode,sizeof(jmpopcode)); objdata.writebytes(jmpopcode,sizeof(jmpopcode));
{$ifdef x86_64} {$if defined(x86_64)}
objdata.writereloc(0,sizeof(longint),idata5label,RELOC_RELATIVE); objdata.writereloc(0,sizeof(longint),idata5label,RELOC_RELATIVE);
{$elseif defined(aarch64)}
objdata.writereloc(0,sizeof(aint),idata5label,RELOC_ABSOLUTE);
{$else} {$else}
objdata.writereloc(0,sizeof(longint),idata5label,RELOC_ABSOLUTE32); objdata.writereloc(0,sizeof(longint),idata5label,RELOC_ABSOLUTE32);
{$endif x86_64} {$endif x86_64 or aarch64}
objdata.writebytes(nopopcodes,align(objdata.CurrObjSec.size,qword(sizeof(nopopcodes)))-objdata.CurrObjSec.size); objdata.writebytes(nopopcodes,align(objdata.CurrObjSec.size,qword(sizeof(nopopcodes)))-objdata.CurrObjSec.size);
end; end;
ObjOutput.exportsymbol(implabel); ObjOutput.exportsymbol(implabel);
@ -524,7 +530,7 @@ implementation
else else
current_asmdata.asmlists[al_imports].concat(Tai_symbol.Createname_global(ExtractFileName(ImportLibrary.Name)+'_index_'+tostr(ImportSymbol.ordnr),AT_FUNCTION,0,voidcodepointertype)); current_asmdata.asmlists[al_imports].concat(Tai_symbol.Createname_global(ExtractFileName(ImportLibrary.Name)+'_index_'+tostr(ImportSymbol.ordnr),AT_FUNCTION,0,voidcodepointertype));
current_asmdata.asmlists[al_imports].concat(tai_function_name.create('')); current_asmdata.asmlists[al_imports].concat(tai_function_name.create(''));
{$ifdef ARM} {$if defined(ARM)}
reference_reset_symbol(href,l5,0,sizeof(pint),[]); reference_reset_symbol(href,l5,0,sizeof(pint),[]);
current_asmdata.asmlists[al_imports].concat(Taicpu.op_reg_ref(A_LDR,NR_R12,href)); current_asmdata.asmlists[al_imports].concat(Taicpu.op_reg_ref(A_LDR,NR_R12,href));
reference_reset_base(href,NR_R12,0,ctempposinvalid,sizeof(pint),[]); reference_reset_base(href,NR_R12,0,ctempposinvalid,sizeof(pint),[]);
@ -532,7 +538,10 @@ implementation
current_asmdata.asmlists[al_imports].concat(Tai_label.Create(l5)); current_asmdata.asmlists[al_imports].concat(Tai_label.Create(l5));
reference_reset_symbol(href,l4,0,sizeof(pint),[]); reference_reset_symbol(href,l4,0,sizeof(pint),[]);
current_asmdata.asmlists[al_imports].concat(tai_const.create_sym_offset(href.symbol,href.offset)); current_asmdata.asmlists[al_imports].concat(tai_const.create_sym_offset(href.symbol,href.offset));
{$else ARM} {$elseif defined(AARCH64)}
{ ToDo }
internalerror(2020033001);
{$else X86}
reference_reset_symbol(href,l4,0,sizeof(pint),[]); reference_reset_symbol(href,l4,0,sizeof(pint),[]);
{$ifdef X86_64} {$ifdef X86_64}
href.base:=NR_RIP; href.base:=NR_RIP;
@ -540,7 +549,7 @@ implementation
current_asmdata.asmlists[al_imports].concat(Taicpu.Op_ref(A_JMP,S_NO,href)); current_asmdata.asmlists[al_imports].concat(Taicpu.Op_ref(A_JMP,S_NO,href));
current_asmdata.asmlists[al_imports].concat(Tai_align.Create_op(4,$90)); current_asmdata.asmlists[al_imports].concat(Tai_align.Create_op(4,$90));
{$endif ARM} {$endif X86}
{ add jump field to al_imports } { add jump field to al_imports }
new_section(current_asmdata.asmlists[al_imports],sec_idata5,'',0); new_section(current_asmdata.asmlists[al_imports],sec_idata5,'',0);
if (cs_debuginfo in current_settings.moduleswitches) then if (cs_debuginfo in current_settings.moduleswitches) then
@ -1859,4 +1868,11 @@ initialization
RegisterRes(res_gnu_windres_info,TWinLikeResourceFile); RegisterRes(res_gnu_windres_info,TWinLikeResourceFile);
RegisterTarget(system_arm_wince_info); RegisterTarget(system_arm_wince_info);
{$endif arm} {$endif arm}
{$ifdef aarch64}
RegisterImport(system_aarch64_win64,TImportLibWin);
RegisterExport(system_aarch64_win64,TExportLibWin);
// ToDo?
RegisterRes(res_gnu_windres_info,TWinLikeResourceFile);
RegisterTarget(system_aarch64_win64_info);
{$endif aarch64}
end. end.

View File

@ -224,7 +224,8 @@ const
{ 103 } 'Embedded-Xtensa', { 103 } 'Embedded-Xtensa',
{ 104 } 'FreeRTos-Xtensa', { 104 } 'FreeRTos-Xtensa',
{ 105 } 'Linux-Xtensa', { 105 } 'Linux-Xtensa',
{ 106 } 'FreeRTos-arm' { 106 } 'FreeRTos-arm',
{ 107 } 'Win64-AArch64'
); );
const const