use rustc::session::Session;
use rustc::session::config::Sanitizer;
use rustc::ty::TyCtxt;
+use rustc::ty::layout::HasTyCtxt;
use rustc::ty::query::Providers;
use rustc_data_structures::sync::Lrc;
use rustc_data_structures::fx::FxHashMap;
/// Mark LLVM function to use provided inline heuristic.
#[inline]
-pub fn inline(val: &'ll Value, inline: InlineAttr) {
+pub fn inline(cx: &CodegenCx<'ll, '_>, val: &'ll Value, inline: InlineAttr) {
use self::InlineAttr::*;
match inline {
Hint => Attribute::InlineHint.apply_llfn(Function, val),
Always => Attribute::AlwaysInline.apply_llfn(Function, val),
- Never => Attribute::NoInline.apply_llfn(Function, val),
+ Never => {
+ if cx.tcx().sess.target.target.arch != "amdgpu" {
+ Attribute::NoInline.apply_llfn(Function, val);
+ }
+ },
None => {
Attribute::InlineHint.unapply_llfn(Function, val);
Attribute::AlwaysInline.unapply_llfn(Function, val);
let codegen_fn_attrs = id.map(|id| cx.tcx.codegen_fn_attrs(id))
.unwrap_or(CodegenFnAttrs::new());
- inline(llfn, codegen_fn_attrs.inline);
+ inline(cx, llfn, codegen_fn_attrs.inline);
// The `uwtable` attribute according to LLVM is:
//
debug!("get_fn: not casting pointer!");
if instance.def.is_inline(tcx) {
- attributes::inline(llfn, attributes::InlineAttr::Hint);
+ attributes::inline(cx, llfn, attributes::InlineAttr::Hint);
}
attributes::from_fn_attrs(cx, llfn, Some(instance.def.def_id()));
debug!("predefine_fn: mono_ty = {:?} instance = {:?}", mono_ty, instance);
if instance.def.is_inline(cx.tcx) {
- attributes::inline(lldecl, attributes::InlineAttr::Hint);
+ attributes::inline(cx, lldecl, attributes::InlineAttr::Hint);
}
attributes::from_fn_attrs(cx, lldecl, Some(instance.def.def_id()));