From f1d9b58cd4a4d0930c5ee273f2418469898d5bed Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sat, 19 Nov 2016 21:05:17 +0000 Subject: [PATCH] Work around LLVM PR30879, which is about a bad interaction between X86 Call Frame Optimization on i386 and libunwind, by disallowing the optimization for i386-freebsd12. This should fix some instances of broken exception handling when frame pointers are omitted, in particular some unittests run during the build of editors/libreoffice. This hack will be removed as soon as upstream has implemented a more permanent fix for this problem. Upstream PR: https://llvm.org/bugs/show_bug.cgi?id=30879 Reviewed by: emaste PR: 212343 --- contrib/llvm/lib/Target/X86/X86CallFrameOptimization.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/llvm/lib/Target/X86/X86CallFrameOptimization.cpp b/contrib/llvm/lib/Target/X86/X86CallFrameOptimization.cpp index b16fa76c73f..8f6fc40159e 100644 --- a/contrib/llvm/lib/Target/X86/X86CallFrameOptimization.cpp +++ b/contrib/llvm/lib/Target/X86/X86CallFrameOptimization.cpp @@ -125,6 +125,11 @@ bool X86CallFrameOptimization::isLegal(MachineFunction &MF) { if (NoX86CFOpt.getValue()) return false; + // Work around LLVM PR30879 (bad interaction between CFO and libunwind) + if (STI->isTargetFreeBSD() && STI->is32Bit() && + STI->getTargetTriple().getOSMajorVersion() >= 12) + return false; + // We can't encode multiple DW_CFA_GNU_args_size or DW_CFA_def_cfa_offset // in the compact unwind encoding that Darwin uses. So, bail if there // is a danger of that being generated.