Rollup merge of #94001 - durin42:llvm-15-uwtable, r=nikic
llvm: migrate to new parameter-bearing uwtable attr In https://reviews.llvm.org/D114543 the uwtable attribute gained a flag so that we can ask for sync uwtables instead of async, as the former are much cheaper. The default is async, so that's what I've done here, but I left a TODO that we might be able to do better. While in here I went ahead and dropped support for removing uwtable attributes in rustc: we never did it, so I didn't write the extra C++ bridge code to make it work. Maybe I should have done the same thing with the `sync|async` parameter but we'll see.
This commit is contained in:
commit
a87be980d8
5 changed files with 24 additions and 5 deletions
|
@ -64,7 +64,7 @@ pub(crate) unsafe fn codegen(
|
|||
llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
|
||||
}
|
||||
if tcx.sess.must_emit_unwind_tables() {
|
||||
attributes::emit_uwtable(llfn, true);
|
||||
attributes::emit_uwtable(llfn);
|
||||
}
|
||||
|
||||
let callee = kind.fn_name(method.name);
|
||||
|
@ -111,7 +111,7 @@ pub(crate) unsafe fn codegen(
|
|||
llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
|
||||
}
|
||||
if tcx.sess.must_emit_unwind_tables() {
|
||||
attributes::emit_uwtable(llfn, true);
|
||||
attributes::emit_uwtable(llfn);
|
||||
}
|
||||
|
||||
let kind = if has_alloc_error_handler { AllocatorKind::Global } else { AllocatorKind::Default };
|
||||
|
|
|
@ -59,8 +59,11 @@ pub fn sanitize<'ll>(cx: &CodegenCx<'ll, '_>, no_sanitize: SanitizerSet, llfn: &
|
|||
|
||||
/// Tell LLVM to emit or not emit the information necessary to unwind the stack for the function.
|
||||
#[inline]
|
||||
pub fn emit_uwtable(val: &Value, emit: bool) {
|
||||
Attribute::UWTable.toggle_llfn(Function, val, emit);
|
||||
pub fn emit_uwtable(val: &Value) {
|
||||
// NOTE: We should determine if we even need async unwind tables, as they
|
||||
// take have more overhead and if we can use sync unwind tables we
|
||||
// probably should.
|
||||
llvm::EmitUWTableAttr(val, true);
|
||||
}
|
||||
|
||||
/// Tell LLVM if this function should be 'naked', i.e., skip the epilogue and prologue.
|
||||
|
@ -275,7 +278,7 @@ pub fn from_fn_attrs<'ll, 'tcx>(
|
|||
// You can also find more info on why Windows always requires uwtables here:
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1302078
|
||||
if cx.sess().must_emit_unwind_tables() {
|
||||
attributes::emit_uwtable(llfn, true);
|
||||
attributes::emit_uwtable(llfn);
|
||||
}
|
||||
|
||||
if cx.sess().opts.debugging_opts.profile_sample_use.is_some() {
|
||||
|
|
|
@ -1182,6 +1182,7 @@ extern "C" {
|
|||
pub fn LLVMRustAddByValAttr(Fn: &Value, index: c_uint, ty: &Type);
|
||||
pub fn LLVMRustAddStructRetAttr(Fn: &Value, index: c_uint, ty: &Type);
|
||||
pub fn LLVMRustAddFunctionAttribute(Fn: &Value, index: c_uint, attr: Attribute);
|
||||
pub fn LLVMRustEmitUWTableAttr(Fn: &Value, async_: bool);
|
||||
pub fn LLVMRustAddFunctionAttrStringValue(
|
||||
Fn: &Value,
|
||||
index: c_uint,
|
||||
|
|
|
@ -31,6 +31,10 @@ impl LLVMRustResult {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn EmitUWTableAttr(llfn: &Value, async_: bool) {
|
||||
unsafe { LLVMRustEmitUWTableAttr(llfn, async_) }
|
||||
}
|
||||
|
||||
pub fn AddFunctionAttrStringValue(llfn: &Value, idx: AttributePlace, attr: &CStr, value: &CStr) {
|
||||
unsafe {
|
||||
LLVMRustAddFunctionAttrStringValue(llfn, idx.as_uint(), attr.as_ptr(), value.as_ptr())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue