Unpin compiler-builtins

Co-authored-by: Antoni Boucher <bouanto@zoho.com>
This commit is contained in:
Guillaume Gomez 2024-08-12 16:28:27 +02:00
parent 3b45cf476a
commit afb14f75e1
8 changed files with 54 additions and 69 deletions

View File

@ -85,14 +85,14 @@ jobs:
- name: Build sample project with target defined as JSON spec - name: Build sample project with target defined as JSON spec
run: | run: |
./y.sh prepare --only-libcore --cross ./y.sh prepare --only-libcore --cross
./y.sh build --sysroot --target-triple m68k-unknown-linux-gnu --target ${{ github.workspace }}/target_specs/m68k-unknown-linux-gnu.json ./y.sh build --sysroot --features compiler_builtins/no-f16-f128 --target-triple m68k-unknown-linux-gnu --target ${{ github.workspace }}/target_specs/m68k-unknown-linux-gnu.json
./y.sh cargo build --manifest-path=./tests/hello-world/Cargo.toml --target ${{ github.workspace }}/target_specs/m68k-unknown-linux-gnu.json ./y.sh cargo build --manifest-path=./tests/hello-world/Cargo.toml --target ${{ github.workspace }}/target_specs/m68k-unknown-linux-gnu.json
./y.sh clean all ./y.sh clean all
- name: Build - name: Build
run: | run: |
./y.sh prepare --only-libcore --cross ./y.sh prepare --only-libcore --cross
./y.sh build --sysroot --target-triple m68k-unknown-linux-gnu ./y.sh build --sysroot --features compiler_builtins/no-f16-f128 --target-triple m68k-unknown-linux-gnu
CG_GCC_TEST_TARGET=m68k-unknown-linux-gnu cargo test CG_GCC_TEST_TARGET=m68k-unknown-linux-gnu cargo test
./y.sh clean all ./y.sh clean all
@ -107,4 +107,4 @@ jobs:
- name: Run tests - name: Run tests
run: | run: |
./y.sh test --release --clean --build-sysroot ${{ matrix.commands }} ./y.sh test --release --clean --build-sysroot --sysroot-features compiler_builtins/no-f16-f128 ${{ matrix.commands }}

View File

@ -17,6 +17,22 @@ rustc-std-workspace-core = { path = "./sysroot_src/library/rustc-std-workspace-c
rustc-std-workspace-alloc = { path = "./sysroot_src/library/rustc-std-workspace-alloc" } rustc-std-workspace-alloc = { path = "./sysroot_src/library/rustc-std-workspace-alloc" }
rustc-std-workspace-std = { path = "./sysroot_src/library/rustc-std-workspace-std" } rustc-std-workspace-std = { path = "./sysroot_src/library/rustc-std-workspace-std" }
# For compiler-builtins we always use a high number of codegen units.
# The goal here is to place every single intrinsic into its own object
# file to avoid symbol clashes with the system libgcc if possible. Note
# that this number doesn't actually produce this many object files, we
# just don't create more than this number of object files.
#
# It's a bit of a bummer that we have to pass this here, unfortunately.
# Ideally this would be specified through an env var to Cargo so Cargo
# knows how many CGUs are for this specific crate, but for now
# per-crate configuration isn't specifiable in the environment.
[profile.dev.package.compiler_builtins]
codegen-units = 10000
[profile.release.package.compiler_builtins]
codegen-units = 10000
[profile.release] [profile.release]
debug = "limited" debug = "limited"
#lto = "fat" # TODO(antoyo): re-enable when the failing LTO tests regarding proc-macros are fixed. #lto = "fat" # TODO(antoyo): re-enable when the failing LTO tests regarding proc-macros are fixed.

View File

@ -24,16 +24,6 @@ fn new() -> Result<Option<Self>, String> {
while let Some(arg) = args.next() { while let Some(arg) = args.next() {
match arg.as_str() { match arg.as_str() {
"--features" => {
if let Some(arg) = args.next() {
build_arg.flags.push("--features".to_string());
build_arg.flags.push(arg.as_str().into());
} else {
return Err(
"Expected a value after `--features`, found nothing".to_string()
);
}
}
"--sysroot" => { "--sysroot" => {
build_arg.build_sysroot = true; build_arg.build_sysroot = true;
} }
@ -56,7 +46,6 @@ fn usage() {
r#" r#"
`build` command help: `build` command help:
--features [arg] : Add a new feature [arg]
--sysroot : Build with sysroot"# --sysroot : Build with sysroot"#
); );
ConfigInfo::show_usage(); ConfigInfo::show_usage();
@ -150,6 +139,10 @@ pub fn build_sysroot(env: &HashMap<String, String>, config: &ConfigInfo) -> Resu
&"--features", &"--features",
&"std/compiler-builtins-no-f16-f128", &"std/compiler-builtins-no-f16-f128",
]; ];
for feature in &config.features {
args.push(&"--features");
args.push(feature);
}
if config.no_default_features { if config.no_default_features {
rustflags.push_str(" -Csymbol-mangling-version=v0"); rustflags.push_str(" -Csymbol-mangling-version=v0");

View File

@ -98,7 +98,7 @@ pub fn new(config_file: &Path) -> Result<Self, String> {
} }
} }
#[derive(Default, Debug)] #[derive(Default, Debug, Clone)]
pub struct ConfigInfo { pub struct ConfigInfo {
pub target: String, pub target: String,
pub target_triple: String, pub target_triple: String,
@ -123,6 +123,7 @@ pub struct ConfigInfo {
pub no_download: bool, pub no_download: bool,
pub no_default_features: bool, pub no_default_features: bool,
pub backend: Option<String>, pub backend: Option<String>,
pub features: Vec<String>,
} }
impl ConfigInfo { impl ConfigInfo {
@ -133,6 +134,13 @@ pub fn parse_argument(
args: &mut impl Iterator<Item = String>, args: &mut impl Iterator<Item = String>,
) -> Result<bool, String> { ) -> Result<bool, String> {
match arg { match arg {
"--features" => {
if let Some(arg) = args.next() {
self.features.push(arg);
} else {
return Err("Expected a value after `--features`, found nothing".to_string());
}
}
"--target" => { "--target" => {
if let Some(arg) = args.next() { if let Some(arg) = args.next() {
self.target = arg; self.target = arg;
@ -443,6 +451,7 @@ pub fn setup(
pub fn show_usage() { pub fn show_usage() {
println!( println!(
"\ "\
--features [arg] : Add a new feature [arg]
--target-triple [arg] : Set the target triple to [arg] --target-triple [arg] : Set the target triple to [arg]
--target [arg] : Set the target to [arg] --target [arg] : Set the target to [arg]
--out-dir : Location where the files will be generated --out-dir : Location where the files will be generated

View File

@ -92,6 +92,7 @@ struct TestArg {
current_part: Option<usize>, current_part: Option<usize>,
sysroot_panic_abort: bool, sysroot_panic_abort: bool,
config_info: ConfigInfo, config_info: ConfigInfo,
sysroot_features: Vec<String>,
} }
impl TestArg { impl TestArg {
@ -127,6 +128,14 @@ fn new() -> Result<Option<Self>, String> {
"--sysroot-panic-abort" => { "--sysroot-panic-abort" => {
test_arg.sysroot_panic_abort = true; test_arg.sysroot_panic_abort = true;
} }
"--sysroot-features" => match args.next() {
Some(feature) if !feature.is_empty() => {
test_arg.sysroot_features.push(feature);
}
_ => {
return Err(format!("Expected an argument after `{}`, found nothing", arg))
}
},
"--help" => { "--help" => {
show_usage(); show_usage();
return Ok(None); return Ok(None);
@ -250,7 +259,9 @@ fn mini_tests(env: &Env, args: &TestArg) -> Result<(), String> {
fn build_sysroot(env: &Env, args: &TestArg) -> Result<(), String> { fn build_sysroot(env: &Env, args: &TestArg) -> Result<(), String> {
// FIXME: create a function "display_if_not_quiet" or something along the line. // FIXME: create a function "display_if_not_quiet" or something along the line.
println!("[BUILD] sysroot"); println!("[BUILD] sysroot");
build::build_sysroot(env, &args.config_info)?; let mut config = args.config_info.clone();
config.features.extend(args.sysroot_features.iter().cloned());
build::build_sysroot(env, &config)?;
Ok(()) Ok(())
} }

View File

@ -227,48 +227,14 @@ pub fn new(
"__builtin_umul_overflow", "__builtin_umul_overflow",
"__builtin_usubll_overflow", "__builtin_usubll_overflow",
"__builtin_usub_overflow", "__builtin_usub_overflow",
"sqrtf",
"sqrt",
"__builtin_powif", "__builtin_powif",
"__builtin_powi", "__builtin_powi",
"sinf",
"sin",
"cosf",
"cos",
"powf",
"pow",
"expf",
"exp",
"exp2f",
"exp2",
"logf",
"log",
"log10f",
"log10",
"log2f",
"log2",
"fmaf",
"fma",
"fabsf", "fabsf",
"fabs", "fabs",
"fminf",
"fmin",
"fmaxf",
"fmax",
"copysignf", "copysignf",
"copysign", "copysign",
"floorf",
"floor",
"ceilf",
"ceil",
"truncf",
"trunc",
"rintf",
"rint",
"nearbyintf", "nearbyintf",
"nearbyint", "nearbyint",
"roundf",
"round",
]; ];
for builtin in builtins.iter() { for builtin in builtins.iter() {

View File

@ -127,20 +127,13 @@ fn codegen_intrinsic_call(
// https://github.com/rust-lang/rust-clippy/issues/12497 // https://github.com/rust-lang/rust-clippy/issues/12497
// and leave `else if use_integer_compare` to be placed "as is". // and leave `else if use_integer_compare` to be placed "as is".
#[allow(clippy::suspicious_else_formatting)] #[allow(clippy::suspicious_else_formatting)]
let llval = match name { let value = match name {
_ if simple.is_some() => { _ if simple.is_some() => {
// FIXME(antoyo): remove this cast when the API supports function. let func = simple.expect("simple function");
let func = unsafe { self.cx.context.new_call(
std::mem::transmute::<Function<'gcc>, RValue<'gcc>>(simple.expect("simple")) self.location,
};
self.call(
self.type_void(),
None,
None,
func, func,
&args.iter().map(|arg| arg.immediate()).collect::<Vec<_>>(), &args.iter().map(|arg| arg.immediate()).collect::<Vec<_>>(),
None,
None,
) )
} }
sym::likely => self.expect(args[0].immediate(), true), sym::likely => self.expect(args[0].immediate(), true),
@ -383,7 +376,7 @@ fn codegen_intrinsic_call(
_ if name_str.starts_with("simd_") => { _ if name_str.starts_with("simd_") => {
match generic_simd_intrinsic(self, name, callee_ty, args, ret_ty, llret_ty, span) { match generic_simd_intrinsic(self, name, callee_ty, args, ret_ty, llret_ty, span) {
Ok(llval) => llval, Ok(value) => value,
Err(()) => return Ok(()), Err(()) => return Ok(()),
} }
} }
@ -396,9 +389,9 @@ fn codegen_intrinsic_call(
if let PassMode::Cast { cast: ref ty, .. } = fn_abi.ret.mode { if let PassMode::Cast { cast: ref ty, .. } = fn_abi.ret.mode {
let ptr_llty = self.type_ptr_to(ty.gcc_type(self)); let ptr_llty = self.type_ptr_to(ty.gcc_type(self));
let ptr = self.pointercast(result.val.llval, ptr_llty); let ptr = self.pointercast(result.val.llval, ptr_llty);
self.store(llval, ptr, result.val.align); self.store(value, ptr, result.val.align);
} else { } else {
OperandRef::from_immediate_or_packed_pair(self, llval, result.layout) OperandRef::from_immediate_or_packed_pair(self, value, result.layout)
.val .val
.store(self, result); .store(self, result);
} }

View File

@ -763,10 +763,7 @@ macro_rules! return_error {
_ => return_error!(InvalidMonomorphization::UnrecognizedIntrinsic { span, name }), _ => return_error!(InvalidMonomorphization::UnrecognizedIntrinsic { span, name }),
}; };
let builtin_name = format!("{}{}", intr_name, elem_ty_str); let builtin_name = format!("{}{}", intr_name, elem_ty_str);
let funcs = bx.cx.functions.borrow(); let function = bx.context.get_builtin_function(builtin_name);
let function = funcs
.get(&builtin_name)
.unwrap_or_else(|| panic!("unable to find builtin function {}", builtin_name));
// TODO(antoyo): add platform-specific behavior here for architectures that have these // TODO(antoyo): add platform-specific behavior here for architectures that have these
// intrinsics as instructions (for instance, gpus) // intrinsics as instructions (for instance, gpus)
@ -784,7 +781,7 @@ macro_rules! return_error {
.map(|arg| bx.extract_element(arg.immediate(), index).to_rvalue()) .map(|arg| bx.extract_element(arg.immediate(), index).to_rvalue())
.collect() .collect()
}; };
vector_elements.push(bx.context.new_call(None, *function, &arguments)); vector_elements.push(bx.context.new_call(None, function, &arguments));
} }
let c = bx.context.new_rvalue_from_vector(None, vec_ty, &vector_elements); let c = bx.context.new_rvalue_from_vector(None, vec_ty, &vector_elements);
Ok(c) Ok(c)