Rollup merge of #146144 - heiher:entry-func-features, r=petrochenkov
compiler: Apply target features to the entry function Fixes rust-lang/rust#146143
This commit is contained in:
commit
1c2d264eb0
2 changed files with 22 additions and 10 deletions
|
|
@ -296,6 +296,19 @@ pub(crate) fn tune_cpu_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> Option<&'ll Attribu
|
|||
.map(|tune_cpu| llvm::CreateAttrStringValue(cx.llcx, "tune-cpu", tune_cpu))
|
||||
}
|
||||
|
||||
/// Get the `target-features` LLVM attribute.
|
||||
pub(crate) fn target_features_attr<'ll>(
|
||||
cx: &CodegenCx<'ll, '_>,
|
||||
function_features: Vec<String>,
|
||||
) -> Option<&'ll Attribute> {
|
||||
let global_features = cx.tcx.global_backend_features(()).iter().map(String::as_str);
|
||||
let function_features = function_features.iter().map(String::as_str);
|
||||
let target_features =
|
||||
global_features.chain(function_features).intersperse(",").collect::<String>();
|
||||
(!target_features.is_empty())
|
||||
.then(|| llvm::CreateAttrStringValue(cx.llcx, "target-features", &target_features))
|
||||
}
|
||||
|
||||
/// Get the `NonLazyBind` LLVM attribute,
|
||||
/// if the codegen options allow skipping the PLT.
|
||||
pub(crate) fn non_lazy_bind_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> Option<&'ll Attribute> {
|
||||
|
|
@ -523,14 +536,7 @@ pub(crate) fn llfn_attrs_from_instance<'ll, 'tcx>(
|
|||
}
|
||||
}
|
||||
|
||||
let global_features = cx.tcx.global_backend_features(()).iter().map(|s| s.as_str());
|
||||
let function_features = function_features.iter().map(|s| s.as_str());
|
||||
let target_features: String =
|
||||
global_features.chain(function_features).intersperse(",").collect();
|
||||
|
||||
if !target_features.is_empty() {
|
||||
to_add.push(llvm::CreateAttrStringValue(cx.llcx, "target-features", &target_features));
|
||||
}
|
||||
to_add.extend(target_features_attr(cx, function_features));
|
||||
|
||||
attributes::apply_to_llfn(llfn, Function, &to_add);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -853,7 +853,7 @@ impl<'ll, 'tcx> MiscCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
fn declare_c_main(&self, fn_type: Self::Type) -> Option<Self::Function> {
|
||||
let entry_name = self.sess().target.entry_name.as_ref();
|
||||
if self.get_declared_value(entry_name).is_none() {
|
||||
Some(self.declare_entry_fn(
|
||||
let llfn = self.declare_entry_fn(
|
||||
entry_name,
|
||||
llvm::CallConv::from_conv(
|
||||
self.sess().target.entry_abi,
|
||||
|
|
@ -861,7 +861,13 @@ impl<'ll, 'tcx> MiscCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
),
|
||||
llvm::UnnamedAddr::Global,
|
||||
fn_type,
|
||||
))
|
||||
);
|
||||
attributes::apply_to_llfn(
|
||||
llfn,
|
||||
llvm::AttributePlace::Function,
|
||||
attributes::target_features_attr(self, vec![]).as_slice(),
|
||||
);
|
||||
Some(llfn)
|
||||
} else {
|
||||
// If the symbol already exists, it is an error: for example, the user wrote
|
||||
// #[no_mangle] extern "C" fn main(..) {..}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue