From e4e67bd489934702e4958a03bb4c948919d38920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinbrink?= Date: Fri, 11 Sep 2015 20:09:19 +0200 Subject: [PATCH] Add an attribute to mark function as unwinding --- src/librustc_trans/trans/attributes.rs | 3 ++- src/libsyntax/feature_gate.rs | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/librustc_trans/trans/attributes.rs b/src/librustc_trans/trans/attributes.rs index a1f4ed5c20d..c77cb491448 100644 --- a/src/librustc_trans/trans/attributes.rs +++ b/src/librustc_trans/trans/attributes.rs @@ -59,7 +59,6 @@ pub fn emit_uwtable(val: ValueRef, emit: bool) { /// Tell LLVM whether the function can or cannot unwind. #[inline] -#[allow(dead_code)] // possibly useful function pub fn unwind(val: ValueRef, can_unwind: bool) { if can_unwind { unsafe { @@ -118,6 +117,8 @@ pub fn from_fn_attrs(ccx: &CrateContext, attrs: &[hir::Attribute], llfn: ValueRe } } else if attr.check_name("allocator") { llvm::Attribute::NoAlias.apply_llfn(llvm::ReturnIndex as c_uint, llfn); + } else if attr.check_name("unwind") { + unwind(llfn, true); } } } diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 47f24856303..abc04102950 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -188,6 +188,9 @@ // allow `extern "platform-intrinsic" { ... }` ("platform_intrinsics", "1.4.0", Some(27731), Active), + + // allow `#[unwind]` + ("unwind_attributes", "1.4.0", None, Active), ]; // (changing above list without updating src/doc/reference.md makes @cmr sad) @@ -316,6 +319,7 @@ enum Status { ("unsafe_no_drop_flag", Whitelisted, Gated("unsafe_no_drop_flag", "unsafe_no_drop_flag has unstable semantics \ and may be removed in the future")), + ("unwind", Whitelisted, Gated("unwind_attributes", "#[unwind] is experimental")), // used in resolve ("prelude_import", Whitelisted, Gated("prelude_import", -- GitLab