Start adding an aarch64-pc-windows-msvc target
This commit adds the necessary definitions for target specs and such as well as
the necessary support in libstd to compile basic `aarch64-pc-windows-msvc`
binaries. The target is not currently built on CI, but it can be built locally
with:
./configure --target=aarch64-pc-windows-msvc --set rust.lld
./x.py build src/libstd --target aarch64-pc-windows-msvc
Currently this fails to build `libtest` due to a linker bug (seemingly in LLD?)
which hasn't been investigate yet. Otherwise though with libstd you can build a
hello world program (linked with LLD). I've not tried to execute it yet, but it
at least links!
Full support for this target is still a long road ahead, but this is hopefully a
good stepping stone to get started.
Points of note about this target are:
* Currently defaults to `panic=abort` as support is still landing in LLVM for
SEH on AArch64.
* Currently defaults to LLD as a linker as I was able to get farther with it
than I was with `link.exe`
This commit is contained in:
parent
d767ee1161
commit
fccc04d3e7
8 changed files with 201 additions and 33 deletions
|
|
@ -229,6 +229,7 @@ impl StackFrame for c::STACKFRAME_EX {
|
|||
self.AddrFrame.Mode = c::ADDRESS_MODE::AddrModeFlat;
|
||||
c::IMAGE_FILE_MACHINE_I386
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
fn init(&mut self, ctx: &c::CONTEXT) -> c::DWORD {
|
||||
self.AddrPC.Offset = ctx.Rip as u64;
|
||||
|
|
@ -240,6 +241,17 @@ impl StackFrame for c::STACKFRAME_EX {
|
|||
c::IMAGE_FILE_MACHINE_AMD64
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
fn init(&mut self, ctx: &c::CONTEXT) -> c::DWORD {
|
||||
self.AddrPC.Offset = ctx.Pc as u64;
|
||||
self.AddrPC.Mode = c::ADDRESS_MODE::AddrModeFlat;
|
||||
self.AddrStack.Offset = ctx.Sp as u64;
|
||||
self.AddrStack.Mode = c::ADDRESS_MODE::AddrModeFlat;
|
||||
self.AddrFrame.Offset = ctx.Fp as u64;
|
||||
self.AddrFrame.Mode = c::ADDRESS_MODE::AddrModeFlat;
|
||||
c::IMAGE_FILE_MACHINE_ARM64
|
||||
}
|
||||
|
||||
fn get_addr(&self) -> *const u8 {
|
||||
(self.AddrPC.Offset - 1) as *const u8
|
||||
}
|
||||
|
|
@ -260,6 +272,7 @@ impl StackFrame for c::STACKFRAME64 {
|
|||
self.AddrFrame.Mode = c::ADDRESS_MODE::AddrModeFlat;
|
||||
c::IMAGE_FILE_MACHINE_I386
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
fn init(&mut self, ctx: &c::CONTEXT) -> c::DWORD {
|
||||
self.AddrPC.Offset = ctx.Rip as u64;
|
||||
|
|
@ -271,6 +284,17 @@ impl StackFrame for c::STACKFRAME64 {
|
|||
c::IMAGE_FILE_MACHINE_AMD64
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
fn init(&mut self, ctx: &c::CONTEXT) -> c::DWORD {
|
||||
self.AddrPC.Offset = ctx.Pc as u64;
|
||||
self.AddrPC.Mode = c::ADDRESS_MODE::AddrModeFlat;
|
||||
self.AddrStack.Offset = ctx.Sp as u64;
|
||||
self.AddrStack.Mode = c::ADDRESS_MODE::AddrModeFlat;
|
||||
self.AddrFrame.Offset = ctx.Fp as u64;
|
||||
self.AddrFrame.Mode = c::ADDRESS_MODE::AddrModeFlat;
|
||||
c::IMAGE_FILE_MACHINE_ARM64
|
||||
}
|
||||
|
||||
fn get_addr(&self) -> *const u8 {
|
||||
(self.AddrPC.Offset - 1) as *const u8
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue