Merge pull request #1183 from bjorn3/full_aarch64_support
AArch64 support on Linux
This commit is contained in:
commit
4c440af7c1
11
.github/workflows/main.yml
vendored
11
.github/workflows/main.yml
vendored
@ -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 }}
|
||||||
|
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@ -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
29
Cargo.lock
generated
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user