1
Fork 0

Add -Zuse-sync-unwind

This flag specifies whether LLVM generates async unwind or sync unwind.
This commit is contained in:
quininer 2023-11-09 16:46:32 +08:00
parent fcfe05aa75
commit 12784c3166
3 changed files with 8 additions and 4 deletions

View file

@ -134,7 +134,8 @@ fn create_wrapper_function(
llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden); llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
} }
if tcx.sess.must_emit_unwind_tables() { if tcx.sess.must_emit_unwind_tables() {
let uwtable = attributes::uwtable_attr(llcx); let uwtable =
attributes::uwtable_attr(llcx, tcx.sess.opts.unstable_opts.use_sync_unwind);
attributes::apply_to_llfn(llfn, llvm::AttributePlace::Function, &[uwtable]); attributes::apply_to_llfn(llfn, llvm::AttributePlace::Function, &[uwtable]);
} }

View file

@ -95,11 +95,12 @@ pub fn sanitize_attrs<'ll>(
/// Tell LLVM to emit or not emit the information necessary to unwind the stack for the function. /// Tell LLVM to emit or not emit the information necessary to unwind the stack for the function.
#[inline] #[inline]
pub fn uwtable_attr(llcx: &llvm::Context) -> &Attribute { pub fn uwtable_attr(llcx: &llvm::Context, use_sync_unwind: Option<bool>) -> &Attribute {
// NOTE: We should determine if we even need async unwind tables, as they // 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 // take have more overhead and if we can use sync unwind tables we
// probably should. // probably should.
llvm::CreateUWTableAttr(llcx, true) let async_unwind = !use_sync_unwind.unwrap_or(false);
llvm::CreateUWTableAttr(llcx, async_unwind)
} }
pub fn frame_pointer_type_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> Option<&'ll Attribute> { pub fn frame_pointer_type_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> Option<&'ll Attribute> {
@ -333,7 +334,7 @@ pub fn from_fn_attrs<'ll, 'tcx>(
// You can also find more info on why Windows always requires uwtables here: // You can also find more info on why Windows always requires uwtables here:
// https://bugzilla.mozilla.org/show_bug.cgi?id=1302078 // https://bugzilla.mozilla.org/show_bug.cgi?id=1302078
if cx.sess().must_emit_unwind_tables() { if cx.sess().must_emit_unwind_tables() {
to_add.push(uwtable_attr(cx.llcx)); to_add.push(uwtable_attr(cx.llcx, cx.sess().opts.unstable_opts.use_sync_unwind));
} }
if cx.sess().opts.unstable_opts.profile_sample_use.is_some() { if cx.sess().opts.unstable_opts.profile_sample_use.is_some() {

View file

@ -1991,6 +1991,8 @@ written to standard error output)"),
"adds unstable command line options to rustc interface (default: no)"), "adds unstable command line options to rustc interface (default: no)"),
use_ctors_section: Option<bool> = (None, parse_opt_bool, [TRACKED], use_ctors_section: Option<bool> = (None, parse_opt_bool, [TRACKED],
"use legacy .ctors section for initializers rather than .init_array"), "use legacy .ctors section for initializers rather than .init_array"),
use_sync_unwind: Option<bool> = (None, parse_opt_bool, [TRACKED],
"Generate sync unwind tables instead of async unwind tables (default: no)"),
validate_mir: bool = (false, parse_bool, [UNTRACKED], validate_mir: bool = (false, parse_bool, [UNTRACKED],
"validate MIR after each transformation"), "validate MIR after each transformation"),
#[rustc_lint_opt_deny_field_access("use `Session::verbose_internals` instead of this field")] #[rustc_lint_opt_deny_field_access("use `Session::verbose_internals` instead of this field")]