}
pub fn need_invoke(bcx: Block) -> bool {
- if bcx.sess().no_landing_pads() {
- return false
- }
-
- // Currently 32-bit MSVC unwinding is not super well implemented in LLVM, so
- // we avoid it entirely.
- if bcx.sess().target.target.options.is_like_msvc &&
- bcx.sess().target.target.arch == "x86" {
- return false
+ // FIXME(#25869) currently unwinding is not implemented for MSVC and our
+ // normal unwinding infrastructure ends up just causing linker
+ // errors with the current LLVM implementation, so landing
+ // pads are disabled entirely for MSVC targets
+ if bcx.sess().no_landing_pads() ||
+ bcx.sess().target.target.options.is_like_msvc {
+ return false;
}
// Avoid using invoke if we are already inside a landing pad.
use middle::subst;
use middle::subst::{Subst, Substs};
use middle::ty::{self, Ty};
-use trans::adt::GetDtorType; // for tcx.dtor_type()
use trans::adt;
-use trans::attributes;
+use trans::adt::GetDtorType; // for tcx.dtor_type()
use trans::base::*;
use trans::build::*;
use trans::callee;
use arena::TypedArena;
use libc::c_uint;
use syntax::ast;
-use syntax::attr::InlineAttr;
pub fn trans_exchange_free_dyn<'blk, 'tcx>(cx: Block<'blk, 'tcx>,
v: ValueRef,
update_linkage(ccx, llfn, None, OriginalTranslation);
- // FIXME: Currently LLVM has a bug where if an SSA value is created in one
- // landing pad and then used in another it will abort during
- // compilation. The compiler never actually generates nested landing
- // pads, but this often arises when destructors are inlined into
- // other functions. To prevent this inlining from happening (and thus
- // preventing the LLVM abort) we mark all drop glue as inline(never)
- // on MSVC.
- //
- // For more information about the bug, see:
- //
- // https://llvm.org/bugs/show_bug.cgi?id=23884
- //
- // This is clearly not the ideal solution to the problem (due to the
- // perf hits), so this should be removed once the upstream bug is
- // fixed.
- if ccx.sess().target.target.options.is_like_msvc {
- attributes::inline(llfn, InlineAttr::Never);
- }
-
ccx.stats().n_glues_created.set(ccx.stats().n_glues_created.get() + 1);
// All glue functions take values passed *by alias*; this is a
// requirement since in many contexts glue is invoked indirectly and