Unpin compiler-builtins
Co-authored-by: Antoni Boucher <bouanto@zoho.com>
This commit is contained in:
parent
3b45cf476a
commit
afb14f75e1
6
.github/workflows/m68k.yml
vendored
6
.github/workflows/m68k.yml
vendored
@ -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 }}
|
||||||
|
@ -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.
|
||||||
|
@ -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");
|
||||||
|
@ -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
|
||||||
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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() {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user