summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_codegen_gcc/src/base.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /compiler/rustc_codegen_gcc/src/base.rs
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_codegen_gcc/src/base.rs')
-rw-r--r--compiler/rustc_codegen_gcc/src/base.rs76
1 files changed, 46 insertions, 30 deletions
diff --git a/compiler/rustc_codegen_gcc/src/base.rs b/compiler/rustc_codegen_gcc/src/base.rs
index 9e614ca4a..5073066c1 100644
--- a/compiler/rustc_codegen_gcc/src/base.rs
+++ b/compiler/rustc_codegen_gcc/src/base.rs
@@ -1,3 +1,4 @@
+use std::collections::HashSet;
use std::env;
use std::time::Instant;
@@ -18,6 +19,7 @@ use rustc_codegen_ssa::traits::DebugInfoMethods;
use rustc_session::config::DebugInfo;
use rustc_span::Symbol;
+use crate::{LockedTargetInfo, gcc_util};
use crate::GccContext;
use crate::builder::Builder;
use crate::context::CodegenCx;
@@ -50,6 +52,7 @@ pub fn global_linkage_to_gcc(linkage: Linkage) -> GlobalKind {
pub fn linkage_to_gcc(linkage: Linkage) -> FunctionType {
match linkage {
Linkage::External => FunctionType::Exported,
+ // TODO(antoyo): set the attribute externally_visible.
Linkage::AvailableExternally => FunctionType::Extern,
Linkage::LinkOnceAny => unimplemented!(),
Linkage::LinkOnceODR => unimplemented!(),
@@ -63,7 +66,7 @@ pub fn linkage_to_gcc(linkage: Linkage) -> FunctionType {
}
}
-pub fn compile_codegen_unit(tcx: TyCtxt<'_>, cgu_name: Symbol, supports_128bit_integers: bool) -> (ModuleCodegen<GccContext>, u64) {
+pub fn compile_codegen_unit(tcx: TyCtxt<'_>, cgu_name: Symbol, target_info: LockedTargetInfo) -> (ModuleCodegen<GccContext>, u64) {
let prof_timer = tcx.prof.generic_activity("codegen_module");
let start_time = Instant::now();
@@ -71,7 +74,7 @@ pub fn compile_codegen_unit(tcx: TyCtxt<'_>, cgu_name: Symbol, supports_128bit_i
let (module, _) = tcx.dep_graph.with_task(
dep_node,
tcx,
- (cgu_name, supports_128bit_integers),
+ (cgu_name, target_info),
module_codegen,
Some(dep_graph::hash_result),
);
@@ -82,38 +85,29 @@ pub fn compile_codegen_unit(tcx: TyCtxt<'_>, cgu_name: Symbol, supports_128bit_i
// the time we needed for codegenning it.
let cost = time_to_codegen.as_secs() * 1_000_000_000 + time_to_codegen.subsec_nanos() as u64;
- fn module_codegen(tcx: TyCtxt<'_>, (cgu_name, supports_128bit_integers): (Symbol, bool)) -> ModuleCodegen<GccContext> {
+ fn module_codegen(tcx: TyCtxt<'_>, (cgu_name, target_info): (Symbol, LockedTargetInfo)) -> ModuleCodegen<GccContext> {
let cgu = tcx.codegen_unit(cgu_name);
// Instantiate monomorphizations without filling out definitions yet...
- //let llvm_module = ModuleLlvm::new(tcx, &cgu_name.as_str());
let context = Context::default();
context.add_command_line_option("-fexceptions");
context.add_driver_option("-fexceptions");
- // TODO(antoyo): only set on x86 platforms.
- context.add_command_line_option("-masm=intel");
- // TODO(antoyo): only add the following cli argument if the feature is supported.
- context.add_command_line_option("-msse2");
- context.add_command_line_option("-mavx2");
- // FIXME(antoyo): the following causes an illegal instruction on vmovdqu64 in std_example on my CPU.
- // Only add if the CPU supports it.
- context.add_command_line_option("-msha");
- context.add_command_line_option("-mpclmul");
- context.add_command_line_option("-mfma");
- context.add_command_line_option("-mfma4");
- context.add_command_line_option("-m64");
- context.add_command_line_option("-mbmi");
- context.add_command_line_option("-mgfni");
- //context.add_command_line_option("-mavxvnni"); // The CI doesn't support this option.
- context.add_command_line_option("-mf16c");
- context.add_command_line_option("-maes");
- context.add_command_line_option("-mxsavec");
- context.add_command_line_option("-mbmi2");
- context.add_command_line_option("-mrtm");
- context.add_command_line_option("-mvaes");
- context.add_command_line_option("-mvpclmulqdq");
- context.add_command_line_option("-mavx");
+ let disabled_features: HashSet<_> = tcx.sess.opts.cg.target_feature.split(',')
+ .filter(|feature| feature.starts_with('-'))
+ .map(|string| &string[1..])
+ .collect();
+
+ if tcx.sess.target.arch == "x86" || tcx.sess.target.arch == "x86_64" {
+ context.add_command_line_option("-masm=intel");
+ }
+
+ if !disabled_features.contains("avx") && tcx.sess.target.arch == "x86_64" {
+ // NOTE: we always enable AVX because the equivalent of llvm.x86.sse2.cmp.pd in GCC for
+ // SSE2 is multiple builtins, so we use the AVX __builtin_ia32_cmppd instead.
+ // FIXME(antoyo): use the proper builtins for llvm.x86.sse2.cmp.pd and similar.
+ context.add_command_line_option("-mavx");
+ }
for arg in &tcx.sess.opts.cg.llvm_args {
context.add_command_line_option(arg);
@@ -127,6 +121,16 @@ pub fn compile_codegen_unit(tcx: TyCtxt<'_>, cgu_name: Symbol, supports_128bit_i
// NOTE: Rust relies on LLVM doing wrapping on overflow.
context.add_command_line_option("-fwrapv");
+ if tcx.sess.relocation_model() == rustc_target::spec::RelocModel::Static {
+ context.add_command_line_option("-mcmodel=kernel");
+ context.add_command_line_option("-fno-pie");
+ }
+
+ let target_cpu = gcc_util::target_cpu(tcx.sess);
+ if target_cpu != "generic" {
+ context.add_command_line_option(&format!("-march={}", target_cpu));
+ }
+
if tcx.sess.opts.unstable_opts.function_sections.unwrap_or(tcx.sess.target.function_sections) {
context.add_command_line_option("-ffunction-sections");
context.add_command_line_option("-fdata-sections");
@@ -135,8 +139,14 @@ pub fn compile_codegen_unit(tcx: TyCtxt<'_>, cgu_name: Symbol, supports_128bit_i
if env::var("CG_GCCJIT_DUMP_RTL").as_deref() == Ok("1") {
context.add_command_line_option("-fdump-rtl-vregs");
}
+ if env::var("CG_GCCJIT_DUMP_RTL_ALL").as_deref() == Ok("1") {
+ context.add_command_line_option("-fdump-rtl-all");
+ }
if env::var("CG_GCCJIT_DUMP_TREE_ALL").as_deref() == Ok("1") {
- context.add_command_line_option("-fdump-tree-all");
+ context.add_command_line_option("-fdump-tree-all-eh");
+ }
+ if env::var("CG_GCCJIT_DUMP_IPA_ALL").as_deref() == Ok("1") {
+ context.add_command_line_option("-fdump-ipa-all-eh");
}
if env::var("CG_GCCJIT_DUMP_CODE").as_deref() == Ok("1") {
context.set_dump_code_on_compile(true);
@@ -152,11 +162,15 @@ pub fn compile_codegen_unit(tcx: TyCtxt<'_>, cgu_name: Symbol, supports_128bit_i
context.set_keep_intermediates(true);
}
+ if env::var("CG_GCCJIT_VERBOSE").as_deref() == Ok("1") {
+ context.add_driver_option("-v");
+ }
+
// NOTE: The codegen generates unrechable blocks.
context.set_allow_unreachable_blocks(true);
{
- let cx = CodegenCx::new(&context, cgu, tcx, supports_128bit_integers);
+ let cx = CodegenCx::new(&context, cgu, tcx, target_info.supports_128bit_int());
let mono_items = cgu.items_in_deterministic_order(tcx);
for &(mono_item, data) in &mono_items {
@@ -181,7 +195,9 @@ pub fn compile_codegen_unit(tcx: TyCtxt<'_>, cgu_name: Symbol, supports_128bit_i
ModuleCodegen {
name: cgu_name.to_string(),
module_llvm: GccContext {
- context
+ context,
+ should_combine_object_files: false,
+ temp_dir: None,
},
kind: ModuleKind::Regular,
}