Merge pull request #1183 from bjorn3/full_aarch64_support

AArch64 support on Linux
This commit is contained in:
bjorn3 2021-07-02 15:03:16 +02:00 committed by GitHub
commit 4c440af7c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 54 additions and 25 deletions

View File

@ -19,6 +19,9 @@ jobs:
- os: ubuntu-latest - os: ubuntu-latest
env: env:
TARGET_TRIPLE: x86_64-pc-windows-gnu TARGET_TRIPLE: x86_64-pc-windows-gnu
- os: ubuntu-latest
env:
TARGET_TRIPLE: aarch64-unknown-linux-gnu
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
@ -49,12 +52,20 @@ jobs:
sudo apt-get install -y gcc-mingw-w64-x86-64 wine-stable sudo apt-get install -y gcc-mingw-w64-x86-64 wine-stable
rustup target add x86_64-pc-windows-gnu rustup target add x86_64-pc-windows-gnu
- name: Install AArch64 toolchain and qemu
if: matrix.os == 'ubuntu-latest' && matrix.env.TARGET_TRIPLE == 'aarch64-unknown-linux-gnu'
run: |
sudo apt-get install -y gcc-aarch64-linux-gnu qemu-user
- name: Prepare dependencies - name: Prepare dependencies
run: | run: |
git config --global user.email "user@example.com" git config --global user.email "user@example.com"
git config --global user.name "User" git config --global user.name "User"
./y.rs prepare ./y.rs prepare
- name: Build
run: ./y.rs build --sysroot none
- name: Test - name: Test
env: env:
TARGET_TRIPLE: ${{ matrix.env.TARGET_TRIPLE }} TARGET_TRIPLE: ${{ matrix.env.TARGET_TRIPLE }}

View File

@ -3,7 +3,7 @@
"rust-analyzer.diagnostics.disabled": ["unresolved-extern-crate", "unresolved-macro-call"], "rust-analyzer.diagnostics.disabled": ["unresolved-extern-crate", "unresolved-macro-call"],
"rust-analyzer.assist.importGranularity": "module", "rust-analyzer.assist.importGranularity": "module",
"rust-analyzer.assist.importEnforceGranularity": true, "rust-analyzer.assist.importEnforceGranularity": true,
"rust-analyzer.assist.importPrefix": "by_crate", "rust-analyzer.assist.importPrefix": "crate",
"rust-analyzer.cargo.runBuildScripts": true, "rust-analyzer.cargo.runBuildScripts": true,
"rust-analyzer.linkedProjects": [ "rust-analyzer.linkedProjects": [
"./Cargo.toml", "./Cargo.toml",

29
Cargo.lock generated
View File

@ -34,7 +34,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]] [[package]]
name = "cranelift-bforest" name = "cranelift-bforest"
version = "0.75.0" version = "0.75.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#3d56728b8698d538a00d9f1c295149bbf5e8b78b" source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#f2d2f3a841f4da8188df0a5f1033b5bdeaf02bcd"
dependencies = [ dependencies = [
"cranelift-entity", "cranelift-entity",
] ]
@ -42,7 +42,7 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-codegen" name = "cranelift-codegen"
version = "0.75.0" version = "0.75.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#3d56728b8698d538a00d9f1c295149bbf5e8b78b" source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#f2d2f3a841f4da8188df0a5f1033b5bdeaf02bcd"
dependencies = [ dependencies = [
"cranelift-bforest", "cranelift-bforest",
"cranelift-codegen-meta", "cranelift-codegen-meta",
@ -58,7 +58,7 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-codegen-meta" name = "cranelift-codegen-meta"
version = "0.75.0" version = "0.75.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#3d56728b8698d538a00d9f1c295149bbf5e8b78b" source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#f2d2f3a841f4da8188df0a5f1033b5bdeaf02bcd"
dependencies = [ dependencies = [
"cranelift-codegen-shared", "cranelift-codegen-shared",
"cranelift-entity", "cranelift-entity",
@ -67,17 +67,17 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-codegen-shared" name = "cranelift-codegen-shared"
version = "0.75.0" version = "0.75.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#3d56728b8698d538a00d9f1c295149bbf5e8b78b" source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#f2d2f3a841f4da8188df0a5f1033b5bdeaf02bcd"
[[package]] [[package]]
name = "cranelift-entity" name = "cranelift-entity"
version = "0.75.0" version = "0.75.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#3d56728b8698d538a00d9f1c295149bbf5e8b78b" source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#f2d2f3a841f4da8188df0a5f1033b5bdeaf02bcd"
[[package]] [[package]]
name = "cranelift-frontend" name = "cranelift-frontend"
version = "0.75.0" version = "0.75.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#3d56728b8698d538a00d9f1c295149bbf5e8b78b" source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#f2d2f3a841f4da8188df0a5f1033b5bdeaf02bcd"
dependencies = [ dependencies = [
"cranelift-codegen", "cranelift-codegen",
"log", "log",
@ -88,7 +88,7 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-jit" name = "cranelift-jit"
version = "0.75.0" version = "0.75.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#3d56728b8698d538a00d9f1c295149bbf5e8b78b" source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#f2d2f3a841f4da8188df0a5f1033b5bdeaf02bcd"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cranelift-codegen", "cranelift-codegen",
@ -105,7 +105,7 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-module" name = "cranelift-module"
version = "0.75.0" version = "0.75.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#3d56728b8698d538a00d9f1c295149bbf5e8b78b" source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#f2d2f3a841f4da8188df0a5f1033b5bdeaf02bcd"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cranelift-codegen", "cranelift-codegen",
@ -116,16 +116,17 @@ dependencies = [
[[package]] [[package]]
name = "cranelift-native" name = "cranelift-native"
version = "0.75.0" version = "0.75.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#3d56728b8698d538a00d9f1c295149bbf5e8b78b" source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#f2d2f3a841f4da8188df0a5f1033b5bdeaf02bcd"
dependencies = [ dependencies = [
"cranelift-codegen", "cranelift-codegen",
"libc",
"target-lexicon", "target-lexicon",
] ]
[[package]] [[package]]
name = "cranelift-object" name = "cranelift-object"
version = "0.75.0" version = "0.75.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#3d56728b8698d538a00d9f1c295149bbf5e8b78b" source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=main#f2d2f3a841f4da8188df0a5f1033b5bdeaf02bcd"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cranelift-codegen", "cranelift-codegen",
@ -171,9 +172,9 @@ dependencies = [
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.86" version = "0.2.97"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" checksum = "12b8adadd720df158f4d70dfe7ccc6adb0472d7c55ca83445f6a5ab3e36f8fb6"
[[package]] [[package]]
name = "libloading" name = "libloading"
@ -211,9 +212,9 @@ checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
[[package]] [[package]]
name = "object" name = "object"
version = "0.25.2" version = "0.25.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8bc1d42047cf336f0f939c99e97183cf31551bf0f2865a2ec9c8d91fd4ffb5e" checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7"
dependencies = [ dependencies = [
"crc32fast", "crc32fast",
"indexmap", "indexmap",

View File

@ -115,10 +115,16 @@ pub(crate) fn build_sysroot(
} }
} }
SysrootKind::Clif => { SysrootKind::Clif => {
build_clif_sysroot_for_triple(channel, target_dir, target_triple); build_clif_sysroot_for_triple(channel, target_dir, host_triple, None);
if host_triple != target_triple { if host_triple != target_triple {
build_clif_sysroot_for_triple(channel, target_dir, host_triple); // When cross-compiling it is often necessary to manually pick the right linker
let linker = if target_triple == "aarch64-unknown-linux-gnu" {
Some("aarch64-linux-gnu-gcc")
} else {
None
};
build_clif_sysroot_for_triple(channel, target_dir, target_triple, linker);
} }
// Copy std for the host to the lib dir. This is necessary for the jit mode to find // Copy std for the host to the lib dir. This is necessary for the jit mode to find
@ -133,7 +139,12 @@ pub(crate) fn build_sysroot(
} }
} }
fn build_clif_sysroot_for_triple(channel: &str, target_dir: &Path, triple: &str) { fn build_clif_sysroot_for_triple(
channel: &str,
target_dir: &Path,
triple: &str,
linker: Option<&str>,
) {
let build_dir = Path::new("build_sysroot").join("target").join(triple).join(channel); let build_dir = Path::new("build_sysroot").join("target").join(triple).join(channel);
let keep_sysroot = let keep_sysroot =
@ -155,6 +166,10 @@ fn build_clif_sysroot_for_triple(channel: &str, target_dir: &Path, triple: &str)
build_cmd.arg("--release"); build_cmd.arg("--release");
rustflags.push_str(" -Zmir-opt-level=3"); rustflags.push_str(" -Zmir-opt-level=3");
} }
if let Some(linker) = linker {
use std::fmt::Write;
write!(rustflags, " -Clinker={}", linker).unwrap();
}
build_cmd.env("RUSTFLAGS", rustflags); build_cmd.env("RUSTFLAGS", rustflags);
build_cmd.env( build_cmd.env(
"RUSTC", "RUSTC",

View File

@ -292,7 +292,7 @@ fn main() {
#[cfg(not(any(jit, windows)))] #[cfg(not(any(jit, windows)))]
test_tls(); test_tls();
#[cfg(all(not(jit), target_os = "linux"))] #[cfg(all(not(jit), target_arch = "x86_64", target_os = "linux"))]
unsafe { unsafe {
global_asm_test(); global_asm_test();
} }
@ -303,12 +303,12 @@ fn main() {
assert_eq!(*REF1, *REF2); assert_eq!(*REF1, *REF2);
} }
#[cfg(all(not(jit), target_os = "linux"))] #[cfg(all(not(jit), target_arch = "x86_64", target_os = "linux"))]
extern "C" { extern "C" {
fn global_asm_test(); fn global_asm_test();
} }
#[cfg(all(not(jit), target_os = "linux"))] #[cfg(all(not(jit), target_arch = "x86_64", target_os = "linux"))]
global_asm! { global_asm! {
" "
.global global_asm_test .global global_asm_test

View File

@ -287,10 +287,12 @@ fn build_isa(sess: &Session, backend_config: &BackendConfig) -> Box<dyn isa::Tar
} }
None => { None => {
let mut builder = let mut builder =
cranelift_codegen::isa::lookup_variant(target_triple, variant).unwrap(); cranelift_codegen::isa::lookup_variant(target_triple.clone(), variant).unwrap();
if target_triple.architecture == target_lexicon::Architecture::X86_64 {
// Don't use "haswell" as the default, as it implies `has_lzcnt`. // Don't use "haswell" as the default, as it implies `has_lzcnt`.
// macOS CI is still at Ivy Bridge EP, so `lzcnt` is interpreted as `bsr`. // macOS CI is still at Ivy Bridge EP, so `lzcnt` is interpreted as `bsr`.
builder.enable("nehalem").unwrap(); builder.enable("nehalem").unwrap();
}
builder builder
} }
}; };