Skip to content

Sync rustc_codegen_cranelift #94285

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 83 commits into from
Feb 23, 2022
Merged
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
0ef1158
Remove NullOp::Box
nbdd0121 Sep 26, 2021
a5a1425
Merge commit '40b00f4200fbdeefd11815398cb46394b8cb0a5e' into sync_cg_…
bjorn3 Dec 30, 2021
720cd94
Merge branch 'sync_from_rust'
bjorn3 Dec 30, 2021
1da0071
Rollup merge of #90102 - nbdd0121:box3, r=jonas-schievink
matthiaskrgr Jan 3, 2022
e4fff03
Update Cranelift to 0.79.1
bjorn3 Jan 5, 2022
9913630
Reduce usage of subst types in the intrinsic code
bjorn3 Jan 9, 2022
c5b9695
Split codegen_intrinsic_call function
bjorn3 Jan 9, 2022
70cc242
Remove a couple of duplicate calls
bjorn3 Jan 9, 2022
409e3eb
Remove unnecessary argument
bjorn3 Jan 9, 2022
046e094
Only use a single bug!() invocation in call_intrinsic_match
bjorn3 Jan 9, 2022
a1a1640
Move call_intrinsic_match macro into codegen_float_intrinsic_call
bjorn3 Jan 9, 2022
3009747
Dedup write_cvalue calls in codegen_float_intrinsic_call
bjorn3 Jan 9, 2022
baad993
Dedup codegen_operand calls in codegen_float_intrinsic_call
bjorn3 Jan 9, 2022
9e6d8c1
Remove the call_intrinsic_match macro
bjorn3 Jan 9, 2022
9295b08
Turn validate_simd_type into a function
bjorn3 Jan 9, 2022
4e3a8d5
Move validate_simd_type from intrinsics to intrinsics::simd
bjorn3 Jan 9, 2022
8ace43e
Move a couple of macros to intrinsics::simd
bjorn3 Jan 9, 2022
78e2d4a
Remove support for vector icmp for now
bjorn3 Jan 9, 2022
d4d2b24
Slightly simplify some macros by removing an extra case for when sign…
bjorn3 Jan 9, 2022
57d25ef
Use simplified version of bool_to_zero_or_max_uint in simd_cmp
bjorn3 Jan 9, 2022
b60eced
Return Value instead of CValue from the simd_for_each_lane closure
bjorn3 Jan 9, 2022
2633024
Don't monomorphize the simd helpers for each closure
bjorn3 Jan 9, 2022
b7cda37
Pass Ty instead of TyAndLayout to the closure of various simd helpers
bjorn3 Jan 9, 2022
f328359
Merge pull request #1216 from bjorn3/reduce_cg_clif_compile_times
bjorn3 Jan 9, 2022
4dbd319
Move most code from y.rs to build_system/mod.rs
bjorn3 Jan 9, 2022
759c4ac
Update to Cranelift 0.80.0
bjorn3 Jan 10, 2022
8f02c4e
Add y.bin to clean_all.sh
bjorn3 Jan 10, 2022
409276c
Store a `Symbol` instead of an `Ident` in `VariantDef`/`FieldDef`
Aaron1011 Jan 3, 2022
7ec4de3
Remove deprecated LLVM-style inline assembly
tmiasko Jan 12, 2022
eef3530
initial revert
BoxyUwU Jan 12, 2022
0b58e52
Auto merge of #92816 - tmiasko:rm-llvm-asm, r=Amanieu
bors Jan 17, 2022
48abe3c
Use Symbol for target features in asm handling
bjorn3 Jan 10, 2022
e59b024
Pass target_features set instead of has_feature closure
bjorn3 Jan 10, 2022
489bff5
Sync from rust 7531d2fdd49966d83830a7b4596c95587b1e9573
bjorn3 Jan 18, 2022
b85cbdd
Rustup to rustc 1.60.0-nightly (ee5d8d37b 2022-01-17)
bjorn3 Jan 18, 2022
0472f6c
Use 2021 edition for libcore tests
bjorn3 Jan 18, 2022
b91ecc7
Update rustc test ignore list
bjorn3 Jan 18, 2022
f3b2d37
Record object file artifact size in self profile data
bjorn3 Jan 18, 2022
5f6c59e
Pass only the Function to write_clif_file
bjorn3 Jan 18, 2022
78b6571
Split compile_fn out of codegen_fn
bjorn3 Jan 18, 2022
513d72d
remove `is_noop`
lcnr Jan 19, 2022
400f122
Sync from rust 2f004d2d401682e553af3984ebd9a3976885e752
bjorn3 Jan 19, 2022
7a8227e
Rustup to rustc 1.60.0-nightly (9ad5d82f8 2022-01-18)
bjorn3 Jan 19, 2022
c6e607a
Implement unchecked_mul intrinsic
bjorn3 Jan 19, 2022
cc24cea
Rustfmt
bjorn3 Jan 19, 2022
2c26139
Use an `indexmap` to avoid sorting `LocalDefId`s
pierwill Jan 6, 2022
2d32e51
Sync from rust a00e130dae74a213338e2b095ec855156d8f3d8a
bjorn3 Jan 30, 2022
96dc846
Rustup to rustc 1.60.0-nightly (a00e130da 2022-01-29)
bjorn3 Jan 30, 2022
3ff158e
Update dependencies
bjorn3 Jan 30, 2022
1b8ea07
Add const_allocate and const_deallocate intrinsics
bjorn3 Jan 30, 2022
246998f
Remove some unused lint allows
bjorn3 Jan 30, 2022
5efd778
Don't generate unnecessary let $arg=$arg for intrinsics
bjorn3 Jan 30, 2022
bb1b5cd
Remove validate_atomic_type
bjorn3 Jan 30, 2022
037aafb
Fix simd type validation
bjorn3 Jan 30, 2022
1ae27ea
Remove simd_cmp macro
bjorn3 Jan 30, 2022
c1d699d
Remove the remaining simd intrinsic macros
bjorn3 Jan 30, 2022
5a3cfb2
Merge codegen of several simd intrinsics
bjorn3 Jan 30, 2022
bccf0a1
Merge codegen of a couple more simd intrinsics
bjorn3 Jan 30, 2022
441e2e6
Rustup to rustc 1.60.0-nightly (88fb06a1f 2022-02-05)
bjorn3 Feb 6, 2022
583333a
Don't try to reinstall ripgrep if it is already installed
bjorn3 Feb 6, 2022
75a463a
Update Cranelift to 0.81.0
bjorn3 Feb 8, 2022
d416c68
Ensure that queries only return Copy types.
cjgillot Jan 31, 2022
cf9c65b
Make FnAbiError Copy.
cjgillot Feb 1, 2022
4e39cde
Unconditionally update symbols
bjorn3 Feb 10, 2022
2ef3114
Sync from rust 9a60099cc43c8a07abb280be323d1ed9afc27f2c
bjorn3 Feb 13, 2022
d459445
Rustup to rustc 1.60.0-nightly (5d8767cb2 2022-02-12)
bjorn3 Feb 13, 2022
6a20fa9
Overhaul `TyS` and `Ty`.
nnethercote Jan 25, 2022
18e7b7e
Overhaul `RegionKind` and `Region`.
nnethercote Jan 28, 2022
06bc64d
Overhaul `Const`.
nnethercote Feb 2, 2022
4563abd
Sync from rust a240ccd81c74c105b6f5fe84c46f8d36edb7e306
bjorn3 Feb 16, 2022
f606a58
Rustup to rustc 1.60.0-nightly (09cb29c64 2022-02-15)
bjorn3 Feb 16, 2022
7e80bc3
Move ty::print methods to Drop-based scope guards
Mark-Simulacrum Feb 16, 2022
4a5b069
Rustup to rustc 1.61.0-nightly (3b348d932 2022-02-19)
bjorn3 Feb 20, 2022
2aad006
Update ignored rustc tests list
bjorn3 Feb 20, 2022
d34bcdd
use `List<Ty<'tcx>>` for tuples
lcnr Feb 7, 2022
e62c26e
On ARM, use relocation_model to detect whether r9 should be reserved
Amanieu Feb 17, 2022
73cf3aa
Take CodegenFnAttrs into account when validating asm! register operands
Amanieu Feb 17, 2022
a063e13
Rollup merge of #94169 - Amanieu:asm_stuff, r=nagisa
matthiaskrgr Feb 22, 2022
33cf8fa
Sync from rust 03a8cc7df1d65554a4d40825b0490c93ac0f0236
bjorn3 Feb 22, 2022
dc973ae
Rustup to rustc 1.61.0-nightly (03a8cc7df 2022-02-21)
bjorn3 Feb 22, 2022
ca1f3e7
Sync from rust bafe8d06e015eb00724d3d497516191d6681943f
bjorn3 Feb 23, 2022
35d9c6b
Rustup to rustc 1.61.0-nightly (68369a041 2022-02-22)
bjorn3 Feb 23, 2022
f596dce
Merge commit '35d9c6bf256968e1b40e0d554607928bdf9cebea' into sync_cg_…
bjorn3 Feb 23, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 32 additions & 35 deletions compiler/rustc_codegen_cranelift/Cargo.lock
Original file line number Diff line number Diff line change
@@ -4,9 +4,9 @@ version = 3

[[package]]
name = "anyhow"
version = "1.0.51"
version = "1.0.53"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b26702f315f53b6071259e15dd9d64528213b44d61de1ec926eca7715d62203"
checksum = "94a45b455c14666b85fc40a019e8ab9eb75e3a124e05494f5397122bc9eb06e0"

[[package]]
name = "ar"
@@ -33,18 +33,18 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"

[[package]]
name = "cranelift-bforest"
version = "0.78.0"
version = "0.81.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc0cb7df82c8cf8f2e6a8dd394a0932a71369c160cc9b027dca414fced242513"
checksum = "71447555acc6c875c52c407d572fc1327dc5c34cba72b4b2e7ad048aa4e4fd19"
dependencies = [
"cranelift-entity",
]

[[package]]
name = "cranelift-codegen"
version = "0.78.0"
version = "0.81.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe4463c15fa42eee909e61e5eac4866b7c6d22d0d8c621e57a0c5380753bfa8c"
checksum = "ec9a10261891a7a919b0d4f6aa73582e88441d9a8f6173c88efbe4a5a362ea67"
dependencies = [
"cranelift-bforest",
"cranelift-codegen-meta",
@@ -59,31 +59,30 @@ dependencies = [

[[package]]
name = "cranelift-codegen-meta"
version = "0.78.0"
version = "0.81.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "793f6a94a053a55404ea16e1700202a88101672b8cd6b4df63e13cde950852bf"
checksum = "815755d76fcbcf6e17ab888545b28ab775f917cb12ce0797e60cd41a2288692c"
dependencies = [
"cranelift-codegen-shared",
"cranelift-entity",
]

[[package]]
name = "cranelift-codegen-shared"
version = "0.78.0"
version = "0.81.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44aa1846df275bce5eb30379d65964c7afc63c05a117076e62a119c25fe174be"
checksum = "23ea92f2a67335a2e4d3c9c65624c3b14ae287d595b0650822c41824febab66b"

[[package]]
name = "cranelift-entity"
version = "0.78.0"
version = "0.81.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3a45d8d6318bf8fc518154d9298eab2a8154ec068a8885ff113f6db8d69bb3a"
checksum = "bd25847875e388c500ad3624b4d2e14067955c93185194a7222246a25b91c975"

[[package]]
name = "cranelift-frontend"
version = "0.78.0"
version = "0.81.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e07339bd461766deb7605169de039e01954768ff730fa1254e149001884a8525"
checksum = "308bcfb7eb47bdf5ff6e1ace262af4ed39ec19f204c751fffb037e0e82a0c8bf"
dependencies = [
"cranelift-codegen",
"log",
@@ -93,9 +92,9 @@ dependencies = [

[[package]]
name = "cranelift-jit"
version = "0.78.0"
version = "0.81.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e8f0d60fb5d67f7a1e5c49db38ba96d1c846921faef02085fc5590b74781747"
checksum = "f560b3a314b8d15facf411e5d29b917c3e787a2bbc3fcdc5183bc0c5b7d4fe01"
dependencies = [
"anyhow",
"cranelift-codegen",
@@ -111,21 +110,19 @@ dependencies = [

[[package]]
name = "cranelift-module"
version = "0.78.0"
version = "0.81.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "825ac7e0959cbe7ddc9cc21209f0319e611a57f9fcb2b723861fe7ef2017e651"
checksum = "3a57aba9e603d694d1430ff38bd914bae23ef9c2e44b25a65e318905807e654c"
dependencies = [
"anyhow",
"cranelift-codegen",
"cranelift-entity",
"log",
]

[[package]]
name = "cranelift-native"
version = "0.78.0"
version = "0.81.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03e2fca76ff57e0532936a71e3fc267eae6a19a86656716479c66e7f912e3d7b"
checksum = "12cdc799aee673be2317e631d4569a1ba0a7e77a07a7ce45557086d2e02e9514"
dependencies = [
"cranelift-codegen",
"libc",
@@ -134,9 +131,9 @@ dependencies = [

[[package]]
name = "cranelift-object"
version = "0.78.0"
version = "0.81.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55500d0fc9bb05c0944fc4506649249d28f55bd4fe95b87f0e55bf41058f0e6d"
checksum = "502a7333836052fcdf4425d7f7a21264d99f862d32b9c3a0e47cd920487a9b60"
dependencies = [
"anyhow",
"cranelift-codegen",
@@ -148,18 +145,18 @@ dependencies = [

[[package]]
name = "crc32fast"
version = "1.3.0"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836"
checksum = "a2209c310e29876f7f0b2721e7e26b84aff178aa3da5d091f9bfbf47669e60e3"
dependencies = [
"cfg-if",
]

[[package]]
name = "gimli"
version = "0.25.0"
version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7"
checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4"
dependencies = [
"indexmap",
]
@@ -182,9 +179,9 @@ dependencies = [

[[package]]
name = "libc"
version = "0.2.112"
version = "0.2.116"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125"
checksum = "565dbd88872dbe4cc8a46e527f26483c1d1f7afa6b884a3bd6cd893d4f98da74"

[[package]]
name = "libloading"
@@ -233,9 +230,9 @@ dependencies = [

[[package]]
name = "regalloc"
version = "0.0.32"
version = "0.0.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6304468554ed921da3d32c355ea107b8d13d7b8996c3adfb7aab48d3bc321f4"
checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02"
dependencies = [
"log",
"rustc-hash",
@@ -281,9 +278,9 @@ dependencies = [

[[package]]
name = "smallvec"
version = "1.7.0"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309"
checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83"

[[package]]
name = "target-lexicon"
14 changes: 7 additions & 7 deletions compiler/rustc_codegen_cranelift/Cargo.toml
Original file line number Diff line number Diff line change
@@ -8,14 +8,14 @@ crate-type = ["dylib"]

[dependencies]
# These have to be in sync with each other
cranelift-codegen = { version = "0.78.0", features = ["unwind", "all-arch"] }
cranelift-frontend = "0.78.0"
cranelift-module = "0.78.0"
cranelift-native = "0.78.0"
cranelift-jit = { version = "0.78.0", optional = true }
cranelift-object = "0.78.0"
cranelift-codegen = { version = "0.81.0", features = ["unwind", "all-arch"] }
cranelift-frontend = "0.81.0"
cranelift-module = "0.81.0"
cranelift-native = "0.81.0"
cranelift-jit = { version = "0.81.0", optional = true }
cranelift-object = "0.81.0"
target-lexicon = "0.12.0"
gimli = { version = "0.25.0", default-features = false, features = ["write"]}
gimli = { version = "0.26.0", default-features = false, features = ["write"]}
object = { version = "0.27.0", default-features = false, features = ["std", "read_core", "write", "archive", "coff", "elf", "macho", "pe"] }

ar = { git = "https://github.com/bjorn3/rust-ar.git", branch = "do_not_remove_cg_clif_ranlib" }
26 changes: 13 additions & 13 deletions compiler/rustc_codegen_cranelift/build_sysroot/Cargo.lock
Original file line number Diff line number Diff line change
@@ -34,15 +34,15 @@ dependencies = [

[[package]]
name = "autocfg"
version = "1.0.1"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"

[[package]]
name = "cc"
version = "1.0.72"
version = "1.0.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"

[[package]]
name = "cfg-if"
@@ -56,7 +56,7 @@ dependencies = [

[[package]]
name = "compiler_builtins"
version = "0.1.66"
version = "0.1.70"
dependencies = [
"rustc-std-workspace-core",
]
@@ -110,9 +110,9 @@ dependencies = [

[[package]]
name = "hashbrown"
version = "0.11.2"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758"
dependencies = [
"compiler_builtins",
"rustc-std-workspace-alloc",
@@ -121,9 +121,9 @@ dependencies = [

[[package]]
name = "hermit-abi"
version = "0.1.19"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
checksum = "1ab7905ea95c6d9af62940f9d7dd9596d54c334ae2c15300c482051292d5637f"
dependencies = [
"compiler_builtins",
"libc",
@@ -132,9 +132,9 @@ dependencies = [

[[package]]
name = "libc"
version = "0.2.112"
version = "0.2.119"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125"
checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4"
dependencies = [
"rustc-std-workspace-core",
]
@@ -319,9 +319,9 @@ dependencies = [

[[package]]
name = "wasi"
version = "0.9.0+wasi-snapshot-preview1"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
dependencies = [
"compiler_builtins",
"rustc-std-workspace-alloc",
Original file line number Diff line number Diff line change
@@ -49,7 +49,7 @@ pub(crate) fn build_backend(
cmd.env("RUSTFLAGS", rustflags);

eprintln!("[BUILD] rustc_codegen_cranelift");
crate::utils::spawn_and_wait(cmd);
super::utils::spawn_and_wait(cmd);

Path::new("target").join(host_triple).join(channel)
}
10 changes: 5 additions & 5 deletions compiler/rustc_codegen_cranelift/build_system/build_sysroot.rs
Original file line number Diff line number Diff line change
@@ -3,9 +3,9 @@ use std::fs;
use std::path::{Path, PathBuf};
use std::process::{self, Command};

use crate::rustc_info::{get_file_name, get_rustc_version};
use crate::utils::{spawn_and_wait, try_hard_link};
use crate::SysrootKind;
use super::rustc_info::{get_file_name, get_rustc_version};
use super::utils::{spawn_and_wait, try_hard_link};
use super::SysrootKind;

pub(crate) fn build_sysroot(
channel: &str,
@@ -52,7 +52,7 @@ pub(crate) fn build_sysroot(
.arg("-g");
spawn_and_wait(build_cargo_wrapper_cmd);

let default_sysroot = crate::rustc_info::get_default_sysroot();
let default_sysroot = super::rustc_info::get_default_sysroot();

let rustlib = target_dir.join("lib").join("rustlib");
let host_rustlib_lib = rustlib.join(host_triple).join("lib");
@@ -167,7 +167,7 @@ fn build_clif_sysroot_for_triple(

let build_dir = Path::new("build_sysroot").join("target").join(triple).join(channel);

if !crate::config::get_bool("keep_sysroot") {
if !super::config::get_bool("keep_sysroot") {
// Cleanup the target dir with the exception of build scripts and the incremental cache
for dir in ["build", "deps", "examples", "native"] {
if build_dir.join(dir).exists() {
127 changes: 127 additions & 0 deletions compiler/rustc_codegen_cranelift/build_system/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
use std::env;
use std::path::PathBuf;
use std::process;

mod build_backend;
mod build_sysroot;
mod config;
mod prepare;
mod rustc_info;
mod utils;

fn usage() {
eprintln!("Usage:");
eprintln!(" ./y.rs prepare");
eprintln!(
" ./y.rs build [--debug] [--sysroot none|clif|llvm] [--target-dir DIR] [--no-unstable-features]"
);
}

macro_rules! arg_error {
($($err:tt)*) => {{
eprintln!($($err)*);
usage();
std::process::exit(1);
}};
}

enum Command {
Build,
}

#[derive(Copy, Clone)]
pub(crate) enum SysrootKind {
None,
Clif,
Llvm,
}

pub fn main() {
env::set_var("CG_CLIF_DISPLAY_CG_TIME", "1");
env::set_var("CG_CLIF_DISABLE_INCR_CACHE", "1");
// The target dir is expected in the default location. Guard against the user changing it.
env::set_var("CARGO_TARGET_DIR", "target");

let mut args = env::args().skip(1);
let command = match args.next().as_deref() {
Some("prepare") => {
if args.next().is_some() {
arg_error!("./x.rs prepare doesn't expect arguments");
}
prepare::prepare();
process::exit(0);
}
Some("build") => Command::Build,
Some(flag) if flag.starts_with('-') => arg_error!("Expected command found flag {}", flag),
Some(command) => arg_error!("Unknown command {}", command),
None => {
usage();
process::exit(0);
}
};

let mut target_dir = PathBuf::from("build");
let mut channel = "release";
let mut sysroot_kind = SysrootKind::Clif;
let mut use_unstable_features = true;
while let Some(arg) = args.next().as_deref() {
match arg {
"--target-dir" => {
target_dir = PathBuf::from(args.next().unwrap_or_else(|| {
arg_error!("--target-dir requires argument");
}))
}
"--debug" => channel = "debug",
"--sysroot" => {
sysroot_kind = match args.next().as_deref() {
Some("none") => SysrootKind::None,
Some("clif") => SysrootKind::Clif,
Some("llvm") => SysrootKind::Llvm,
Some(arg) => arg_error!("Unknown sysroot kind {}", arg),
None => arg_error!("--sysroot requires argument"),
}
}
"--no-unstable-features" => use_unstable_features = false,
flag if flag.starts_with("-") => arg_error!("Unknown flag {}", flag),
arg => arg_error!("Unexpected argument {}", arg),
}
}

let host_triple = if let Ok(host_triple) = std::env::var("HOST_TRIPLE") {
host_triple
} else if let Some(host_triple) = config::get_value("host") {
host_triple
} else {
rustc_info::get_host_triple()
};
let target_triple = if let Ok(target_triple) = std::env::var("TARGET_TRIPLE") {
if target_triple != "" {
target_triple
} else {
host_triple.clone() // Empty target triple can happen on GHA
}
} else if let Some(target_triple) = config::get_value("target") {
target_triple
} else {
host_triple.clone()
};

if target_triple.ends_with("-msvc") {
eprintln!("The MSVC toolchain is not yet supported by rustc_codegen_cranelift.");
eprintln!("Switch to the MinGW toolchain for Windows support.");
eprintln!("Hint: You can use `rustup set default-host x86_64-pc-windows-gnu` to");
eprintln!("set the global default target to MinGW");
process::exit(1);
}

let cg_clif_build_dir =
build_backend::build_backend(channel, &host_triple, use_unstable_features);
build_sysroot::build_sysroot(
channel,
sysroot_kind,
&target_dir,
cg_clif_build_dir,
&host_triple,
&target_triple,
);
}
6 changes: 3 additions & 3 deletions compiler/rustc_codegen_cranelift/build_system/prepare.rs
Original file line number Diff line number Diff line change
@@ -5,8 +5,8 @@ use std::fs;
use std::path::Path;
use std::process::Command;

use crate::rustc_info::{get_file_name, get_rustc_path, get_rustc_version};
use crate::utils::{copy_dir_recursively, spawn_and_wait};
use super::rustc_info::{get_file_name, get_rustc_path, get_rustc_version};
use super::utils::{copy_dir_recursively, spawn_and_wait};

pub(crate) fn prepare() {
prepare_sysroot();
@@ -92,7 +92,7 @@ fn prepare_sysroot() {
clone_repo(
"build_sysroot/compiler-builtins",
"https://github.com/rust-lang/compiler-builtins.git",
"0.1.66",
"0.1.70",
);
apply_patches("compiler-builtins", Path::new("build_sysroot/compiler-builtins"));
}
2 changes: 1 addition & 1 deletion compiler/rustc_codegen_cranelift/clean_all.sh
Original file line number Diff line number Diff line change
@@ -2,5 +2,5 @@
set -e

rm -rf build_sysroot/{sysroot_src/,target/,compiler-builtins/,rustc_version}
rm -rf target/ build/ perf.data{,.old}
rm -rf target/ build/ perf.data{,.old} y.bin
rm -rf rand/ regex/ simple-raytracer/ portable-simd/
Original file line number Diff line number Diff line change
@@ -13,33 +13,33 @@ index 107762c..2d1ae10 100644
--- a/src/mem/mod.rs
+++ b/src/mem/mod.rs
@@ -137,10 +137,6 @@ intrinsics! {
pub extern "C" fn __llvm_memcpy_element_unordered_atomic_8(dest: *mut u64, src: *const u64, bytes: usize) -> () {
pub unsafe extern "C" fn __llvm_memcpy_element_unordered_atomic_8(dest: *mut u64, src: *const u64, bytes: usize) -> () {
memcpy_element_unordered_atomic(dest, src, bytes);
}
- #[cfg(target_has_atomic_load_store = "128")]
- pub extern "C" fn __llvm_memcpy_element_unordered_atomic_16(dest: *mut u128, src: *const u128, bytes: usize) -> () {
- pub unsafe extern "C" fn __llvm_memcpy_element_unordered_atomic_16(dest: *mut u128, src: *const u128, bytes: usize) -> () {
- memcpy_element_unordered_atomic(dest, src, bytes);
- }

#[cfg(target_has_atomic_load_store = "8")]
pub extern "C" fn __llvm_memmove_element_unordered_atomic_1(dest: *mut u8, src: *const u8, bytes: usize) -> () {
pub unsafe extern "C" fn __llvm_memmove_element_unordered_atomic_1(dest: *mut u8, src: *const u8, bytes: usize) -> () {
@@ -158,10 +154,6 @@ intrinsics! {
pub extern "C" fn __llvm_memmove_element_unordered_atomic_8(dest: *mut u64, src: *const u64, bytes: usize) -> () {
pub unsafe extern "C" fn __llvm_memmove_element_unordered_atomic_8(dest: *mut u64, src: *const u64, bytes: usize) -> () {
memmove_element_unordered_atomic(dest, src, bytes);
}
- #[cfg(target_has_atomic_load_store = "128")]
- pub extern "C" fn __llvm_memmove_element_unordered_atomic_16(dest: *mut u128, src: *const u128, bytes: usize) -> () {
- pub unsafe extern "C" fn __llvm_memmove_element_unordered_atomic_16(dest: *mut u128, src: *const u128, bytes: usize) -> () {
- memmove_element_unordered_atomic(dest, src, bytes);
- }

#[cfg(target_has_atomic_load_store = "8")]
pub extern "C" fn __llvm_memset_element_unordered_atomic_1(s: *mut u8, c: u8, bytes: usize) -> () {
pub unsafe extern "C" fn __llvm_memset_element_unordered_atomic_1(s: *mut u8, c: u8, bytes: usize) -> () {
@@ -179,8 +171,4 @@ intrinsics! {
pub extern "C" fn __llvm_memset_element_unordered_atomic_8(s: *mut u64, c: u8, bytes: usize) -> () {
pub unsafe extern "C" fn __llvm_memset_element_unordered_atomic_8(s: *mut u64, c: u8, bytes: usize) -> () {
memset_element_unordered_atomic(s, c, bytes);
}
- #[cfg(target_has_atomic_load_store = "128")]
- pub extern "C" fn __llvm_memset_element_unordered_atomic_16(s: *mut u128, c: u8, bytes: usize) -> () {
- pub unsafe extern "C" fn __llvm_memset_element_unordered_atomic_16(s: *mut u128, c: u8, bytes: usize) -> () {
- memset_element_unordered_atomic(s, c, bytes);
- }
}
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@ index 0000000..46fd999
+[package]
+name = "core"
+version = "0.0.0"
+edition = "2018"
+edition = "2021"
+
+[lib]
+name = "coretests"
@@ -44,7 +44,7 @@ index 1a6be3a..42dbd59 100644
--- a/library/core/tests/ptr.rs
+++ b/library/core/tests/ptr.rs
@@ -250,6 +250,7 @@ fn test_unsized_nonnull() {
assert!(ys == zs);
};
}

+/*
Original file line number Diff line number Diff line change
@@ -8,7 +8,6 @@ Cranelift doesn't support them yet
library/core/src/panic/unwind_safe.rs | 6 -----
library/core/src/sync/atomic.rs | 38 ---------------------------
library/core/tests/atomic.rs | 4 ---
library/std/src/time/monotonic.rs | 6 +++--
4 files changed, 4 insertions(+), 50 deletions(-)

diff --git a/library/core/src/panic/unwind_safe.rs b/library/core/src/panic/unwind_safe.rs
@@ -99,38 +98,6 @@ index b735957..ea728b6 100644
#[cfg(target_has_atomic = "ptr")]
assert_eq!(align_of::<AtomicUsize>(), size_of::<AtomicUsize>());
#[cfg(target_has_atomic = "ptr")]
diff --git a/library/std/src/time/monotonic.rs b/library/std/src/time/monotonic.rs
index fa96b7a..2854f9c 100644
--- a/library/std/src/time/monotonic.rs
+++ b/library/std/src/time/monotonic.rs
@@ -5,7 +5,7 @@ pub(super) fn monotonize(raw: time::Instant) -> time::Instant {
inner::monotonize(raw)
}

-#[cfg(any(all(target_has_atomic = "64", not(target_has_atomic = "128")), target_arch = "aarch64"))]
+#[cfg(target_has_atomic = "64")]
pub mod inner {
use crate::sync::atomic::AtomicU64;
use crate::sync::atomic::Ordering::*;
@@ -70,6 +70,7 @@ pub mod inner {
}
}

+/*
#[cfg(all(target_has_atomic = "128", not(target_arch = "aarch64")))]
pub mod inner {
use crate::sync::atomic::AtomicU128;
@@ -94,8 +95,9 @@ pub mod inner {
ZERO.checked_add_duration(&Duration::new(secs, nanos)).unwrap()
}
}
+*/

-#[cfg(not(any(target_has_atomic = "64", target_has_atomic = "128")))]
+#[cfg(not(target_has_atomic = "64"))]
pub mod inner {
use crate::cmp;
use crate::sys::time;
--
2.26.2.7.g19db9cfb68

2 changes: 1 addition & 1 deletion compiler/rustc_codegen_cranelift/rust-toolchain
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[toolchain]
channel = "nightly-2021-12-30"
channel = "nightly-2022-02-23"
components = ["rust-src", "rustc-dev", "llvm-tools-preview"]
5 changes: 4 additions & 1 deletion compiler/rustc_codegen_cranelift/scripts/test_rustc_tests.sh
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@ source ./scripts/setup_rust_fork.sh
echo "[TEST] Test suite of rustc"
pushd rust

cargo install ripgrep
command -v rg >/dev/null 2>&1 || cargo install ripgrep

rm -r src/test/ui/{extern/,panics/,unsized-locals/,lto/,simd*,linkage*,unwind-*.rs} || true
for test in $(rg --files-with-matches "asm!|catch_unwind|should_panic|lto|// needs-asm-support" src/test/ui); do
@@ -78,6 +78,8 @@ rm src/test/ui/intrinsics/const-eval-select-x86_64.rs # same
rm src/test/ui/match/issue-82392.rs # differing error
rm src/test/ui/consts/min_const_fn/address_of_const.rs # same
rm src/test/ui/consts/issue-miri-1910.rs # same
rm src/test/ui/generic-associated-types/bugs/issue-80626.rs # same
rm src/test/ui/generic-associated-types/bugs/issue-89008.rs # same
rm src/test/ui/type-alias-impl-trait/cross_crate_ice*.rs # requires removed aux dep

rm src/test/ui/allocator/no_std-alloc-error-handler-default.rs # missing rust_oom definition
@@ -98,6 +100,7 @@ rm src/test/ui/abi/stack-protector.rs # requires stack protector support
rm src/test/incremental/issue-80691-bad-eval-cache.rs # wrong exit code
rm src/test/incremental/spike-neg1.rs # errors out for some reason
rm src/test/incremental/spike-neg2.rs # same
rm src/test/ui/issues/issue-74564-if-expr-stack-overflow.rs # gives a stackoverflow before the backend runs

rm src/test/incremental/thinlto/cgu_invalidated_when_import_{added,removed}.rs # requires LLVM

9 changes: 2 additions & 7 deletions compiler/rustc_codegen_cranelift/src/allocator.rs
Original file line number Diff line number Diff line change
@@ -3,7 +3,6 @@

use crate::prelude::*;

use cranelift_codegen::binemit::{NullStackMapSink, NullTrapSink};
use rustc_ast::expand::allocator::{AllocatorKind, AllocatorTy, ALLOCATOR_METHODS};

/// Returns whether an allocator shim was created
@@ -91,9 +90,7 @@ fn codegen_inner(
bcx.seal_all_blocks();
bcx.finalize();
}
module
.define_function(func_id, &mut ctx, &mut NullTrapSink {}, &mut NullStackMapSink {})
.unwrap();
module.define_function(func_id, &mut ctx).unwrap();
unwind_context.add_function(func_id, &ctx, module.isa());
}

@@ -130,8 +127,6 @@ fn codegen_inner(
bcx.seal_all_blocks();
bcx.finalize();
}
module
.define_function(func_id, &mut ctx, &mut NullTrapSink {}, &mut NullStackMapSink {})
.unwrap();
module.define_function(func_id, &mut ctx).unwrap();
unwind_context.add_function(func_id, &ctx, module.isa());
}
56 changes: 40 additions & 16 deletions compiler/rustc_codegen_cranelift/src/base.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
//! Codegen of a single function
use cranelift_codegen::binemit::{NullStackMapSink, NullTrapSink};
use rustc_ast::InlineAsmOptions;
use rustc_index::vec::IndexVec;
use rustc_middle::ty::adjustment::PointerCast;
use rustc_middle::ty::layout::FnAbiOf;

use indexmap::IndexSet;

use crate::constant::ConstantCx;
use crate::prelude::*;
use crate::pretty_clif::CommentWriter;

pub(crate) fn codegen_fn<'tcx>(
cx: &mut crate::CodegenCx<'tcx>,
@@ -99,27 +101,54 @@ pub(crate) fn codegen_fn<'tcx>(

// Recover all necessary data from fx, before accessing func will prevent future access to it.
let instance = fx.instance;
let mut clif_comments = fx.clif_comments;
let clif_comments = fx.clif_comments;
let source_info_set = fx.source_info_set;
let local_map = fx.local_map;

fx.constants_cx.finalize(fx.tcx, &mut *fx.module);

// Store function in context
let context = &mut cx.cached_context;
context.func = func;

crate::pretty_clif::write_clif_file(
tcx,
"unopt",
module.isa(),
instance,
&context,
&func,
&clif_comments,
);

// Verify function
verify_func(tcx, &clif_comments, &context.func);
verify_func(tcx, &clif_comments, &func);

compile_fn(
cx,
module,
instance,
symbol_name.name,
func_id,
func,
clif_comments,
source_info_set,
local_map,
);
}

fn compile_fn<'tcx>(
cx: &mut crate::CodegenCx<'tcx>,
module: &mut dyn Module,
instance: Instance<'tcx>,
symbol_name: &str,
func_id: FuncId,
func: Function,
mut clif_comments: CommentWriter,
source_info_set: IndexSet<SourceInfo>,
local_map: IndexVec<mir::Local, CPlace<'tcx>>,
) {
let tcx = cx.tcx;

// Store function in context
let context = &mut cx.cached_context;
context.clear();
context.func = func;

// If the return block is not reachable, then the SSA builder may have inserted an `iconst.i128`
// instruction, which doesn't have an encoding.
@@ -145,9 +174,7 @@ pub(crate) fn codegen_fn<'tcx>(
// Define function
tcx.sess.time("define function", || {
context.want_disasm = crate::pretty_clif::should_write_ir(tcx);
module
.define_function(func_id, context, &mut NullTrapSink {}, &mut NullStackMapSink {})
.unwrap()
module.define_function(func_id, context).unwrap()
});

// Write optimized function to file for debugging
@@ -156,7 +183,7 @@ pub(crate) fn codegen_fn<'tcx>(
"opt",
module.isa(),
instance,
&context,
&context.func,
&clif_comments,
);

@@ -177,7 +204,7 @@ pub(crate) fn codegen_fn<'tcx>(
debug_context.define_function(
instance,
func_id,
symbol_name.name,
symbol_name,
isa,
context,
&source_info_set,
@@ -186,9 +213,6 @@ pub(crate) fn codegen_fn<'tcx>(
}
unwind_context.add_function(func_id, &context, isa);
});

// Clear context to make it usable for the next function
context.clear();
}

pub(crate) fn verify_func(
3 changes: 3 additions & 0 deletions compiler/rustc_codegen_cranelift/src/driver/aot.rs
Original file line number Diff line number Diff line change
@@ -56,6 +56,9 @@ fn emit_module(

let tmp_file = tcx.output_filenames(()).temp_path(OutputType::Object, Some(&name));
let obj = product.object.write().unwrap();

tcx.sess.prof.artifact_size("object_file", name.clone(), obj.len().try_into().unwrap());

if let Err(err) = std::fs::write(&tmp_file, obj) {
tcx.sess.fatal(&format!("error writing object file: {}", err));
}
10 changes: 1 addition & 9 deletions compiler/rustc_codegen_cranelift/src/driver/jit.rs
Original file line number Diff line number Diff line change
@@ -7,7 +7,6 @@ use std::lazy::SyncOnceCell;
use std::os::raw::{c_char, c_int};
use std::sync::{mpsc, Mutex};

use cranelift_codegen::binemit::{NullStackMapSink, NullTrapSink};
use rustc_codegen_ssa::CrateInfo;
use rustc_middle::mir::mono::MonoItem;
use rustc_session::Session;
@@ -381,12 +380,5 @@ fn codegen_shim<'tcx>(cx: &mut CodegenCx<'tcx>, module: &mut JITModule, inst: In
let ret_vals = trampoline_builder.func.dfg.inst_results(call_inst).to_vec();
trampoline_builder.ins().return_(&ret_vals);

module
.define_function(
func_id,
&mut cx.cached_context,
&mut NullTrapSink {},
&mut NullStackMapSink {},
)
.unwrap();
module.define_function(func_id, &mut cx.cached_context).unwrap();
}
30 changes: 14 additions & 16 deletions compiler/rustc_codegen_cranelift/src/intrinsics/llvm.rs
Original file line number Diff line number Diff line change
@@ -8,14 +8,14 @@ use rustc_middle::ty::subst::SubstsRef;
pub(crate) fn codegen_llvm_intrinsic_call<'tcx>(
fx: &mut FunctionCx<'_, '_, 'tcx>,
intrinsic: &str,
substs: SubstsRef<'tcx>,
_substs: SubstsRef<'tcx>,
args: &[mir::Operand<'tcx>],
destination: Option<(CPlace<'tcx>, BasicBlock)>,
) {
let ret = destination.unwrap().0;

intrinsic_match! {
fx, intrinsic, substs, args,
fx, intrinsic, args,
_ => {
fx.tcx.sess.warn(&format!("unsupported llvm intrinsic {}; replacing with trap", intrinsic));
crate::trap::trap_unimplemented(fx, intrinsic);
@@ -52,8 +52,8 @@ pub(crate) fn codegen_llvm_intrinsic_call<'tcx>(
ret.write_cvalue(fx, res);
};
"llvm.x86.sse2.cmp.ps" | "llvm.x86.sse2.cmp.pd", (c x, c y, o kind) {
let kind_const = crate::constant::mir_operand_get_const_val(fx, kind).expect("llvm.x86.sse2.cmp.* kind not const");
let flt_cc = match kind_const.try_to_bits(Size::from_bytes(1)).unwrap_or_else(|| panic!("kind not scalar: {:?}", kind_const)) {
let kind = crate::constant::mir_operand_get_const_val(fx, kind).expect("llvm.x86.sse2.cmp.* kind not const");
let flt_cc = match kind.try_to_bits(Size::from_bytes(1)).unwrap_or_else(|| panic!("kind not scalar: {:?}", kind)) {
0 => FloatCC::Equal,
1 => FloatCC::LessThan,
2 => FloatCC::LessThanOrEqual,
@@ -73,32 +73,30 @@ pub(crate) fn codegen_llvm_intrinsic_call<'tcx>(
kind => unreachable!("kind {:?}", kind),
};

simd_pair_for_each_lane(fx, x, y, ret, |fx, lane_layout, res_lane_layout, x_lane, y_lane| {
let res_lane = match lane_layout.ty.kind() {
simd_pair_for_each_lane(fx, x, y, ret, &|fx, lane_ty, res_lane_ty, x_lane, y_lane| {
let res_lane = match lane_ty.kind() {
ty::Float(_) => fx.bcx.ins().fcmp(flt_cc, x_lane, y_lane),
_ => unreachable!("{:?}", lane_layout.ty),
_ => unreachable!("{:?}", lane_ty),
};
bool_to_zero_or_max_uint(fx, res_lane_layout, res_lane)
bool_to_zero_or_max_uint(fx, res_lane_ty, res_lane)
});
};
"llvm.x86.sse2.psrli.d", (c a, o imm8) {
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8).expect("llvm.x86.sse2.psrli.d imm8 not const");
simd_for_each_lane(fx, a, ret, |fx, _lane_layout, res_lane_layout, lane| {
let res_lane = match imm8.try_to_bits(Size::from_bytes(4)).unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8)) {
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| {
match imm8.try_to_bits(Size::from_bytes(4)).unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8)) {
imm8 if imm8 < 32 => fx.bcx.ins().ushr_imm(lane, i64::from(imm8 as u8)),
_ => fx.bcx.ins().iconst(types::I32, 0),
};
CValue::by_val(res_lane, res_lane_layout)
}
});
};
"llvm.x86.sse2.pslli.d", (c a, o imm8) {
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8).expect("llvm.x86.sse2.psrli.d imm8 not const");
simd_for_each_lane(fx, a, ret, |fx, _lane_layout, res_lane_layout, lane| {
let res_lane = match imm8.try_to_bits(Size::from_bytes(4)).unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8)) {
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| {
match imm8.try_to_bits(Size::from_bytes(4)).unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8)) {
imm8 if imm8 < 32 => fx.bcx.ins().ishl_imm(lane, i64::from(imm8 as u8)),
_ => fx.bcx.ins().iconst(types::I32, 0),
};
CValue::by_val(res_lane, res_lane_layout)
}
});
};
"llvm.x86.sse2.storeu.dq", (v mem_addr, c a) {
632 changes: 300 additions & 332 deletions compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs

Large diffs are not rendered by default.

447 changes: 270 additions & 177 deletions compiler/rustc_codegen_cranelift/src/intrinsics/simd.rs

Large diffs are not rendered by default.

4 changes: 1 addition & 3 deletions compiler/rustc_codegen_cranelift/src/main_shim.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use cranelift_codegen::binemit::{NullStackMapSink, NullTrapSink};
use rustc_hir::LangItem;
use rustc_middle::ty::subst::GenericArg;
use rustc_middle::ty::AssocKind;
@@ -152,8 +151,7 @@ pub(crate) fn maybe_create_entry_wrapper(
bcx.seal_all_blocks();
bcx.finalize();
}
m.define_function(cmain_func_id, &mut ctx, &mut NullTrapSink {}, &mut NullStackMapSink {})
.unwrap();
m.define_function(cmain_func_id, &mut ctx).unwrap();
unwind_context.add_function(cmain_func_id, &ctx, m.isa());
}
}
2 changes: 1 addition & 1 deletion compiler/rustc_codegen_cranelift/src/optimize/mod.rs
Original file line number Diff line number Diff line change
@@ -15,6 +15,6 @@ pub(crate) fn optimize_function<'tcx>(
) {
// FIXME classify optimizations over opt levels once we have more

crate::pretty_clif::write_clif_file(tcx, "preopt", isa, instance, &ctx, &*clif_comments);
crate::pretty_clif::write_clif_file(tcx, "preopt", isa, instance, &ctx.func, &*clif_comments);
crate::base::verify_func(tcx, &*clif_comments, &ctx.func);
}
10 changes: 3 additions & 7 deletions compiler/rustc_codegen_cranelift/src/pretty_clif.rs
Original file line number Diff line number Diff line change
@@ -234,20 +234,16 @@ pub(crate) fn write_clif_file<'tcx>(
postfix: &str,
isa: &dyn cranelift_codegen::isa::TargetIsa,
instance: Instance<'tcx>,
context: &cranelift_codegen::Context,
func: &cranelift_codegen::ir::Function,
mut clif_comments: &CommentWriter,
) {
write_ir_file(
tcx,
|| format!("{}.{}.clif", tcx.symbol_name(instance).name, postfix),
|file| {
let mut clif = String::new();
cranelift_codegen::write::decorate_function(
&mut clif_comments,
&mut clif,
&context.func,
)
.unwrap();
cranelift_codegen::write::decorate_function(&mut clif_comments, &mut clif, func)
.unwrap();

for flag in isa.flags().iter() {
writeln!(file, "set {}", flag)?;
133 changes: 3 additions & 130 deletions compiler/rustc_codegen_cranelift/y.rs
Original file line number Diff line number Diff line change
@@ -23,136 +23,9 @@ exec ${0/.rs/.bin} $@
//!
//! The name `y.rs` was chosen to not conflict with rustc's `x.py`.

use std::env;
use std::path::PathBuf;
use std::process;

#[path = "build_system/build_backend.rs"]
mod build_backend;
#[path = "build_system/build_sysroot.rs"]
mod build_sysroot;
#[path = "build_system/config.rs"]
mod config;
#[path = "build_system/prepare.rs"]
mod prepare;
#[path = "build_system/rustc_info.rs"]
mod rustc_info;
#[path = "build_system/utils.rs"]
mod utils;

fn usage() {
eprintln!("Usage:");
eprintln!(" ./y.rs prepare");
eprintln!(
" ./y.rs build [--debug] [--sysroot none|clif|llvm] [--target-dir DIR] [--no-unstable-features]"
);
}

macro_rules! arg_error {
($($err:tt)*) => {{
eprintln!($($err)*);
usage();
std::process::exit(1);
}};
}

enum Command {
Build,
}

#[derive(Copy, Clone)]
enum SysrootKind {
None,
Clif,
Llvm,
}
#[path = "build_system/mod.rs"]
mod build_system;

fn main() {
env::set_var("CG_CLIF_DISPLAY_CG_TIME", "1");
env::set_var("CG_CLIF_DISABLE_INCR_CACHE", "1");
// The target dir is expected in the default location. Guard against the user changing it.
env::set_var("CARGO_TARGET_DIR", "target");

let mut args = env::args().skip(1);
let command = match args.next().as_deref() {
Some("prepare") => {
if args.next().is_some() {
arg_error!("./x.rs prepare doesn't expect arguments");
}
prepare::prepare();
process::exit(0);
}
Some("build") => Command::Build,
Some(flag) if flag.starts_with('-') => arg_error!("Expected command found flag {}", flag),
Some(command) => arg_error!("Unknown command {}", command),
None => {
usage();
process::exit(0);
}
};

let mut target_dir = PathBuf::from("build");
let mut channel = "release";
let mut sysroot_kind = SysrootKind::Clif;
let mut use_unstable_features = true;
while let Some(arg) = args.next().as_deref() {
match arg {
"--target-dir" => {
target_dir = PathBuf::from(args.next().unwrap_or_else(|| {
arg_error!("--target-dir requires argument");
}))
}
"--debug" => channel = "debug",
"--sysroot" => {
sysroot_kind = match args.next().as_deref() {
Some("none") => SysrootKind::None,
Some("clif") => SysrootKind::Clif,
Some("llvm") => SysrootKind::Llvm,
Some(arg) => arg_error!("Unknown sysroot kind {}", arg),
None => arg_error!("--sysroot requires argument"),
}
}
"--no-unstable-features" => use_unstable_features = false,
flag if flag.starts_with("-") => arg_error!("Unknown flag {}", flag),
arg => arg_error!("Unexpected argument {}", arg),
}
}

let host_triple = if let Ok(host_triple) = std::env::var("HOST_TRIPLE") {
host_triple
} else if let Some(host_triple) = crate::config::get_value("host") {
host_triple
} else {
rustc_info::get_host_triple()
};
let target_triple = if let Ok(target_triple) = std::env::var("TARGET_TRIPLE") {
if target_triple != "" {
target_triple
} else {
host_triple.clone() // Empty target triple can happen on GHA
}
} else if let Some(target_triple) = crate::config::get_value("target") {
target_triple
} else {
host_triple.clone()
};

if target_triple.ends_with("-msvc") {
eprintln!("The MSVC toolchain is not yet supported by rustc_codegen_cranelift.");
eprintln!("Switch to the MinGW toolchain for Windows support.");
eprintln!("Hint: You can use `rustup set default-host x86_64-pc-windows-gnu` to");
eprintln!("set the global default target to MinGW");
process::exit(1);
}

let cg_clif_build_dir =
build_backend::build_backend(channel, &host_triple, use_unstable_features);
build_sysroot::build_sysroot(
channel,
sysroot_kind,
&target_dir,
cg_clif_build_dir,
&host_triple,
&target_triple,
);
build_system::main();
}