diff options
author | brooks <brooks@FreeBSD.org> | 2018-11-02 01:47:32 +0800 |
---|---|---|
committer | brooks <brooks@FreeBSD.org> | 2018-11-02 01:47:32 +0800 |
commit | 52ba68b74a8cd1347115ae6c86478a963a9cfeb9 (patch) | |
tree | a114d3be8a6906c3e4dd17cf3d1d911caa0b2c98 | |
parent | 59fcfafe7611f4632bd960fae2d69ddde52d5dce (diff) | |
download | freebsd-ports-gnome-52ba68b74a8cd1347115ae6c86478a963a9cfeb9.tar.gz freebsd-ports-gnome-52ba68b74a8cd1347115ae6c86478a963a9cfeb9.tar.zst freebsd-ports-gnome-52ba68b74a8cd1347115ae6c86478a963a9cfeb9.zip |
Add all patches from base llvm/clang/lld/lldb 7.0 to devel/llvm70
This adds all the patches that were applied in the past to the
clang700-import branch, under contrib/llvm. After these, there only
minimal diffs left between the port sources and the base sources.
Most of these remaining diffs are due to #ifdef shortcuts in the base
sources, because we don't compile certain features in. Other diffs are
because the port has applied a few changes that we don't have in base.
Also switch to the common LICENSE defintion in devel/llvm-devel and
chase new USE_GNOME requirements (for libxml2).
PR: 212343, 230604
Submitted by: dim
MFH: 2018Q4
Differential Revision: https://reviews.freebsd.org/D17709
-rw-r--r-- | devel/llvm70/Makefile | 23 | ||||
-rw-r--r-- | devel/llvm70/files/clang/patch-head-r339019.diff | 30 | ||||
-rw-r--r-- | devel/llvm70/files/lld/patch-head-r337282.diff | 39 | ||||
-rw-r--r-- | devel/llvm70/files/lld/patch-head-r338297.diff | 94 | ||||
-rw-r--r-- | devel/llvm70/files/lld/patch-head-r338682.diff | 64 | ||||
-rw-r--r-- | devel/llvm70/files/lld/patch-head-r339304.diff | 37 | ||||
-rw-r--r-- | devel/llvm70/files/lld/patch-lld-manpage.diff | 57 | ||||
-rw-r--r-- | devel/llvm70/files/lldb/patch-head-r332965.diff | 22 | ||||
-rw-r--r-- | devel/llvm70/files/patch-head-r308867.diff | 33 |
9 files changed, 381 insertions, 18 deletions
diff --git a/devel/llvm70/Makefile b/devel/llvm70/Makefile index 2829535876d4..30a4fe2e6200 100644 --- a/devel/llvm70/Makefile +++ b/devel/llvm70/Makefile @@ -2,7 +2,7 @@ PORTNAME= llvm DISTVERSION= 7.0.0 -PORTREVISION= 0 +PORTREVISION= 1 CATEGORIES= devel lang MASTER_SITES= http://${PRE_}releases.llvm.org/${LLVM_RELEASE}/${RCDIR} PKGNAMESUFFIX= ${LLVM_SUFFIX} @@ -12,23 +12,7 @@ DISTFILES= ${PORTNAME}-${DISTVERSION}.src${EXTRACT_SUFX} MAINTAINER= brooks@FreeBSD.org COMMENT= LLVM and Clang -# License are listed in the order they appear in LICENSE.TXT -LICENSE= LLVM GTEST REGEX MIT ARM PD -LICENSE_COMB= multi -LICENSE_NAME_LLVM= LLVM Release License -LICENSE_NAME_GTEST= Google test license -LICENSE_NAME_REGEX= OpenBSD Regex License -# pyyaml tests are under the MIT license -LICENSE_NAME_ARM= ARM Limited license -# md5 is in the public domain -LICENSE_FILE_LLVM= ${WRKSRC}/LICENSE.TXT -LICENSE_FILE_GTEST= ${WRKSRC}/utils/unittest/googletest/LICENSE.TXT -LICENSE_FILE_REGEX= ${WRKSRC}/lib/Support/COPYRIGHT.regex -LICENSE_FILE_ARM= ${WRKSRC}/lib/Target/ARM/LICENSE.TXT -LICENSE_PERMS_LLVM= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept -LICENSE_PERMS_GTEST= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept -LICENSE_PERMS_REGEX= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept -LICENSE_PERMS_ARM= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept +.include "${.CURDIR}/../llvm-devel/Makefile.LICENSE" LLVM_RELEASE= ${DISTVERSION:C/rc.*//} LLVM_MAJOR= ${LLVM_RELEASE:C/\.[0-9]\.[0-9]$//} @@ -97,10 +81,12 @@ LIT_DESC= Install lit and FileCheck test tools LIT_VARS= _USES_PYTHON=python:2.7 LLD_DESC= Install lld, the LLVM linker LLD_DISTFILES= lld-${DISTVERSION}.src${EXTRACT_SUFX} +LLD_EXTRA_PATCHES= ${PATCHDIR}/lld LLDB_BUILD_DEPENDS= swig3.0:devel/swig30 \ ${PY_ENUM34} LLDB_DESC= Install lldb, the LLVM debugger LLDB_DISTFILES= lldb-${DISTVERSION}.src${EXTRACT_SUFX} +LLDB_EXTRA_PATCHES= ${PATCHDIR}/lldb LLDB_IMPLIES= CLANG LLDB_VARS= _USES_PYTHON=python:2.7 OPENMP_DESC= Install libomp, the LLVM OpenMP runtime library @@ -246,6 +232,7 @@ CLANG_PATTERN= (c-index-test|clang|scan-|Reporter.py|ScanView.py|scanview.css|so SHEBANG_FILES+= tools/clang/tools/scan-view/bin/scan-view \ tools/clang/tools/clang-format/git-clang-format \ tools/clang/tools/clang-format/clang-format-diff.py +USES+= gnome .endif .if ${PORT_OPTIONS:MCOMPILER_RT} diff --git a/devel/llvm70/files/clang/patch-head-r339019.diff b/devel/llvm70/files/clang/patch-head-r339019.diff new file mode 100644 index 000000000000..240772d184c2 --- /dev/null +++ b/devel/llvm70/files/clang/patch-head-r339019.diff @@ -0,0 +1,30 @@ +r339019 | emaste | 2018-09-29 22:01:23 +0200 (Sat, 29 Sep 2018) | 15 lines + +clang: allow ifunc resolvers to accept arguments + +Previously Clang required ifunc resolution functions to take no +arguments, presumably because GCC documented ifunc resolvers as taking +no arguments. However, GCC accepts resolvers accepting arguments, and +our rtld passes CPU ID information (cpuid, hwcap, etc.) to ifunc +resolvers. Just remove the check from the in-tree compiler for our in- +tree compiler; a different (per-OS) approach may be required upstream. + +Reported by: mjg +Approved by: re (rgrimes) +MFC after: 1 week +Relnotes: Yes +Sponsored by: The FreeBSD Foundation + +Index: tools/clang/lib/CodeGen/CodeGenModule.cpp +=================================================================== +--- tools/clang/lib/CodeGen/CodeGenModule.cpp (revision 339018) ++++ tools/clang/lib/CodeGen/CodeGenModule.cpp (revision 339019) +@@ -321,8 +321,6 @@ void CodeGenModule::checkAliases() { + assert(FTy); + if (!FTy->getReturnType()->isPointerTy()) + Diags.Report(Location, diag::err_ifunc_resolver_return); +- if (FTy->getNumParams()) +- Diags.Report(Location, diag::err_ifunc_resolver_params); + } + + llvm::Constant *Aliasee = Alias->getIndirectSymbol(); diff --git a/devel/llvm70/files/lld/patch-head-r337282.diff b/devel/llvm70/files/lld/patch-head-r337282.diff new file mode 100644 index 000000000000..1e046d6e2b17 --- /dev/null +++ b/devel/llvm70/files/lld/patch-head-r337282.diff @@ -0,0 +1,39 @@ +r337282 | alc | 2018-08-04 04:30:51 +0200 (Sat, 04 Aug 2018) | 7 lines + +Set the default image base on arm64 and i386 to a superpage-aligned +address. + +Reviewed by: emaste, markj +Discussed with: dim +Differential Revision: https://reviews.freebsd.org/D16385 + +Index: tools/lld/ELF/Arch/AArch64.cpp +=================================================================== +--- tools/lld/ELF/Arch/AArch64.cpp (revision 337281) ++++ tools/lld/ELF/Arch/AArch64.cpp (revision 337282) +@@ -66,6 +66,10 @@ AArch64::AArch64() { + PltHeaderSize = 32; + DefaultMaxPageSize = 65536; + ++ // Align to the 2 MiB page size (known as a superpage or huge page). ++ // FreeBSD automatically promotes 2 MiB-aligned allocations. ++ DefaultImageBase = 0x200000; ++ + // It doesn't seem to be documented anywhere, but tls on aarch64 uses variant + // 1 of the tls structures and the tcb size is 16. + TcbSize = 16; +Index: tools/lld/ELF/Arch/X86.cpp +=================================================================== +--- tools/lld/ELF/Arch/X86.cpp (revision 337281) ++++ tools/lld/ELF/Arch/X86.cpp (revision 337282) +@@ -61,6 +61,10 @@ X86::X86() { + PltHeaderSize = 16; + TlsGdRelaxSkip = 2; + TrapInstr = 0xcccccccc; // 0xcc = INT3 ++ ++ // Align to the non-PAE large page size (known as a superpage or huge page). ++ // FreeBSD automatically promotes large, superpage-aligned allocations. ++ DefaultImageBase = 0x400000; + } + + static bool hasBaseReg(uint8_t ModRM) { return (ModRM & 0xc7) != 0x5; } diff --git a/devel/llvm70/files/lld/patch-head-r338297.diff b/devel/llvm70/files/lld/patch-head-r338297.diff new file mode 100644 index 000000000000..96e45ac1e0f5 --- /dev/null +++ b/devel/llvm70/files/lld/patch-head-r338297.diff @@ -0,0 +1,94 @@ +r338297 | dim | 2018-08-24 19:48:05 +0200 (Fri, 24 Aug 2018) | 6 lines + +Apply r338251 ("Preserve relocations against ifuncs when -zifunc-noplt +is specified") on top of lld 7.0.0. This is to prepare for another +merge from head. + +Obtained from: https://github.com/markjdb/freebsd-dev/commit/02f35faa6df364769b9223746b99e3c7ba05c5dd + +Index: tools/lld/ELF/Config.h +=================================================================== +--- tools/lld/ELF/Config.h (revision 338296) ++++ tools/lld/ELF/Config.h (revision 338297) +@@ -181,6 +181,7 @@ struct Configuration { + bool ZCopyreloc; + bool ZExecstack; + bool ZHazardplt; ++ bool ZIfuncnoplt; + bool ZInitfirst; + bool ZKeepTextSectionPrefix; + bool ZNodelete; +Index: tools/lld/ELF/Driver.cpp +=================================================================== +--- tools/lld/ELF/Driver.cpp (revision 338296) ++++ tools/lld/ELF/Driver.cpp (revision 338297) +@@ -338,7 +338,8 @@ static bool getZFlag(opt::InputArgList &Args, Stri + + static bool isKnown(StringRef S) { + return S == "combreloc" || S == "copyreloc" || S == "defs" || +- S == "execstack" || S == "hazardplt" || S == "initfirst" || ++ S == "execstack" || S == "hazardplt" || S == "ifunc-noplt" || ++ S == "initfirst" || + S == "keep-text-section-prefix" || S == "lazy" || S == "muldefs" || + S == "nocombreloc" || S == "nocopyreloc" || S == "nodelete" || + S == "nodlopen" || S == "noexecstack" || +@@ -843,6 +844,7 @@ void LinkerDriver::readConfigs(opt::InputArgList & + Config->ZCopyreloc = getZFlag(Args, "copyreloc", "nocopyreloc", true); + Config->ZExecstack = getZFlag(Args, "execstack", "noexecstack", false); + Config->ZHazardplt = hasZOption(Args, "hazardplt"); ++ Config->ZIfuncnoplt = hasZOption(Args, "ifunc-noplt"); + Config->ZInitfirst = hasZOption(Args, "initfirst"); + Config->ZKeepTextSectionPrefix = getZFlag( + Args, "keep-text-section-prefix", "nokeep-text-section-prefix", false); +Index: tools/lld/ELF/Relocations.cpp +=================================================================== +--- tools/lld/ELF/Relocations.cpp (revision 338296) ++++ tools/lld/ELF/Relocations.cpp (revision 338297) +@@ -366,6 +366,10 @@ static bool isStaticLinkTimeConstant(RelExpr E, Re + R_TLSLD_HINT>(E)) + return true; + ++ // The computation involves output from the ifunc resolver. ++ if (Sym.isGnuIFunc() && Config->ZIfuncnoplt) ++ return false; ++ + // These never do, except if the entire file is position dependent or if + // only the low bits are used. + if (E == R_GOT || E == R_PLT || E == R_TLSDESC) +@@ -816,6 +820,10 @@ static void processRelocAux(InputSectionBase &Sec, + Sec.Relocations.push_back({Expr, Type, Offset, Addend, &Sym}); + return; + } ++ if (Sym.isGnuIFunc() && Config->ZIfuncnoplt) { ++ InX::RelaDyn->addReloc(Type, &Sec, Offset, &Sym, Addend, R_ADDEND, Type); ++ return; ++ } + bool CanWrite = (Sec.Flags & SHF_WRITE) || !Config->ZText; + if (CanWrite) { + // R_GOT refers to a position in the got, even if the symbol is preemptible. +@@ -985,7 +993,7 @@ static void scanReloc(InputSectionBase &Sec, Offse + // all dynamic symbols that can be resolved within the executable will + // actually be resolved that way at runtime, because the main exectuable + // is always at the beginning of a search list. We can leverage that fact. +- if (Sym.isGnuIFunc()) ++ if (Sym.isGnuIFunc() && !Config->ZIfuncnoplt) + Expr = toPlt(Expr); + else if (!Sym.IsPreemptible && Expr == R_GOT_PC && !isAbsoluteValue(Sym)) + Expr = Target->adjustRelaxExpr(Type, RelocatedAddr, Expr); +Index: tools/lld/ELF/Writer.cpp +=================================================================== +--- tools/lld/ELF/Writer.cpp (revision 338296) ++++ tools/lld/ELF/Writer.cpp (revision 338297) +@@ -1561,8 +1561,11 @@ template <class ELFT> void Writer<ELFT>::finalizeS + applySynthetic({InX::EhFrame}, + [](SyntheticSection *SS) { SS->finalizeContents(); }); + +- for (Symbol *S : Symtab->getSymbols()) ++ for (Symbol *S : Symtab->getSymbols()) { + S->IsPreemptible |= computeIsPreemptible(*S); ++ if (S->isGnuIFunc() && Config->ZIfuncnoplt) ++ S->ExportDynamic = true; ++ } + + // Scan relocations. This must be done after every symbol is declared so that + // we can correctly decide if a dynamic relocation is needed. diff --git a/devel/llvm70/files/lld/patch-head-r338682.diff b/devel/llvm70/files/lld/patch-head-r338682.diff new file mode 100644 index 000000000000..38a6c84af2ca --- /dev/null +++ b/devel/llvm70/files/lld/patch-head-r338682.diff @@ -0,0 +1,64 @@ +r338682 | emaste | 2018-09-14 17:15:16 +0200 (Fri, 14 Sep 2018) | 16 lines + +lld: add -z interpose support + +-z interpose sets the DF_1_INTERPOSE flag, marking the object as an +interposer. + +Committed upstream as LLVM r342239. + +PR: 230604 +Reported by: jbeich +Reviewed by: markj +Approved by: re (kib) +MFC after: 1 week +Relnotes: Yes +Sponsored by: The FreeBSD Foundation +Differential Revision: https://reviews.freebsd.org/D17172 + +Index: tools/lld/ELF/Config.h +=================================================================== +--- tools/lld/ELF/Config.h (revision 338681) ++++ tools/lld/ELF/Config.h (revision 338682) +@@ -183,6 +183,7 @@ struct Configuration { + bool ZHazardplt; + bool ZIfuncnoplt; + bool ZInitfirst; ++ bool ZInterpose; + bool ZKeepTextSectionPrefix; + bool ZNodelete; + bool ZNodlopen; +Index: tools/lld/ELF/Driver.cpp +=================================================================== +--- tools/lld/ELF/Driver.cpp (revision 338681) ++++ tools/lld/ELF/Driver.cpp (revision 338682) +@@ -339,7 +339,7 @@ static bool getZFlag(opt::InputArgList &Args, StringRe + static bool isKnown(StringRef S) { + return S == "combreloc" || S == "copyreloc" || S == "defs" || + S == "execstack" || S == "hazardplt" || S == "ifunc-noplt" || +- S == "initfirst" || ++ S == "initfirst" || S == "interpose" || + S == "keep-text-section-prefix" || S == "lazy" || S == "muldefs" || + S == "nocombreloc" || S == "nocopyreloc" || S == "nodelete" || + S == "nodlopen" || S == "noexecstack" || +@@ -846,6 +846,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args + Config->ZHazardplt = hasZOption(Args, "hazardplt"); + Config->ZIfuncnoplt = hasZOption(Args, "ifunc-noplt"); + Config->ZInitfirst = hasZOption(Args, "initfirst"); ++ Config->ZInterpose = hasZOption(Args, "interpose"); + Config->ZKeepTextSectionPrefix = getZFlag( + Args, "keep-text-section-prefix", "nokeep-text-section-prefix", false); + Config->ZNodelete = hasZOption(Args, "nodelete"); +Index: tools/lld/ELF/SyntheticSections.cpp +=================================================================== +--- tools/lld/ELF/SyntheticSections.cpp (revision 338681) ++++ tools/lld/ELF/SyntheticSections.cpp (revision 338682) +@@ -1266,6 +1266,8 @@ template <class ELFT> void DynamicSection<ELFT>::final + DtFlags |= DF_SYMBOLIC; + if (Config->ZInitfirst) + DtFlags1 |= DF_1_INITFIRST; ++ if (Config->ZInterpose) ++ DtFlags1 |= DF_1_INTERPOSE; + if (Config->ZNodelete) + DtFlags1 |= DF_1_NODELETE; + if (Config->ZNodlopen) diff --git a/devel/llvm70/files/lld/patch-head-r339304.diff b/devel/llvm70/files/lld/patch-head-r339304.diff new file mode 100644 index 000000000000..8263f44801db --- /dev/null +++ b/devel/llvm70/files/lld/patch-head-r339304.diff @@ -0,0 +1,37 @@ +r339304 | emaste | 2018-10-11 15:19:17 +0200 (Thu, 11 Oct 2018) | 13 lines + +lld: set sh_link and sh_info for .rela.plt sections + +ELF spec says that for SHT_REL and SHT_RELA sh_link should reference the +associated string table and sh_info should reference the "section to +which the relocation applies." ELF Tool Chain's elfcopy / strip use +this (in part) to control whether or not the relocation entry is copied +to the output. + +LLVM PR 37538 https://bugs.llvm.org/show_bug.cgi?id=37538 + +Approved by: re (kib) +Obtained from: llvm r344226 (backported for 6.0) + +Index: tools/lld/ELF/SyntheticSections.cpp +=================================================================== +--- tools/lld/ELF/SyntheticSections.cpp (revision 339303) ++++ tools/lld/ELF/SyntheticSections.cpp (revision 339304) +@@ -1213,11 +1213,13 @@ void RelocationBaseSection::addReloc(const Dynamic + void RelocationBaseSection::finalizeContents() { + // If all relocations are R_*_RELATIVE they don't refer to any + // dynamic symbol and we don't need a dynamic symbol table. If that +- // is the case, just use 0 as the link. +- Link = InX::DynSymTab ? InX::DynSymTab->getParent()->SectionIndex : 0; ++ // is the case, just use the index of the regular symbol table section. ++ getParent()->Link = InX::DynSymTab ? ++ InX::DynSymTab->getParent()->SectionIndex : ++ InX::SymTab->getParent()->SectionIndex; + +- // Set required output section properties. +- getParent()->Link = Link; ++ if (InX::RelaIplt == this || InX::RelaPlt == this) ++ getParent()->Info = InX::GotPlt->getParent()->SectionIndex; + } + + RelrBaseSection::RelrBaseSection() diff --git a/devel/llvm70/files/lld/patch-lld-manpage.diff b/devel/llvm70/files/lld/patch-lld-manpage.diff new file mode 100644 index 000000000000..ce379d93fc88 --- /dev/null +++ b/devel/llvm70/files/lld/patch-lld-manpage.diff @@ -0,0 +1,57 @@ +head r329003: explain long options may use one or two dashes +head r338251: document -z ifunc-noplt option +head r338682: document -z interpose option + +--- tools/lld/docs/ld.lld.1 ++++ tools/lld/docs/ld.lld.1 +@@ -3,7 +3,7 @@ + .\" + .\" This man page documents only lld's ELF linking support, obtained originally + .\" from FreeBSD. +-.Dd July 30, 2018 ++.Dd September 14, 2018 + .Dt LD.LLD 1 + .Os + .Sh NAME +@@ -25,6 +25,17 @@ is a drop-in replacement for the GNU BFD and gold link + It accepts most of the same command line arguments and linker scripts + as GNU linkers. + .Pp ++Many options have both a single-letter and long form. ++When using the long form options other than those beginning with the ++letter ++.Cm o ++may be specified using either one or two dashes preceding the option name. ++Long options beginning with ++.Cm o ++require two dashes to avoid confusion with the ++.Fl o Ar path ++option. ++.Pp + These options are available: + .Bl -tag -width indent + .It Fl -allow-multiple-definition +@@ -440,10 +451,23 @@ Make the main stack executable. + Stack permissions are recorded in the + .Dv PT_GNU_STACK + segment. ++.It Cm ifunc-noplt ++Do not emit PLT entries for GNU ifuncs. ++Instead, preserve relocations for ifunc call sites so that they may ++be applied by a run-time loader. ++Note that this feature requires special loader support and will ++generally result in application crashes when used outside of freestanding ++environments. + .It Cm initfirst + Sets the + .Dv DF_1_INITFIRST + flag to indicate the module should be initialized first. ++.It Cm interpose ++Set the ++.Dv DF_1_INTERPOSE ++flag to indicate that the object is an interposer. ++Runtime linkers perform symbol resolution by first searching the application, ++followed by interposers, and then any other dependencies. + .It Cm muldefs + Do not error if a symbol is defined multiple times. + The first definition will be used. diff --git a/devel/llvm70/files/lldb/patch-head-r332965.diff b/devel/llvm70/files/lldb/patch-head-r332965.diff new file mode 100644 index 000000000000..30bc0253447c --- /dev/null +++ b/devel/llvm70/files/lldb/patch-head-r332965.diff @@ -0,0 +1,22 @@ +r332965 | emaste | 2018-04-24 21:26:58 +0200 (Tue, 24 Apr 2018) | 8 lines + +lldb: remove assertion that target_arch is FreeBSD + +The target is not necessarily a FreeBSD binary - for example, it may be +a Linux binary running under the linuxulator. Basic ptrace (live) +debugging already worked in this case, except for the assertion. + +Sponsored by: Turing Robotic Industries Inc. + +Index: tools/lldb/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp +=================================================================== +--- tools/lldb/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp (revision 332964) ++++ tools/lldb/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp (revision 332965) +@@ -169,7 +169,6 @@ lldb::RegisterContextSP FreeBSDThread::GetRegister + RegisterInfoInterface *reg_interface = nullptr; + const ArchSpec &target_arch = GetProcess()->GetTarget().GetArchitecture(); + +- assert(target_arch.GetTriple().getOS() == llvm::Triple::FreeBSD); + switch (target_arch.GetMachine()) { + case llvm::Triple::aarch64: + reg_interface = new RegisterInfoPOSIX_arm64(target_arch); diff --git a/devel/llvm70/files/patch-head-r308867.diff b/devel/llvm70/files/patch-head-r308867.diff new file mode 100644 index 000000000000..07efefa7c899 --- /dev/null +++ b/devel/llvm70/files/patch-head-r308867.diff @@ -0,0 +1,33 @@ +r308867 | dim | 2016-11-19 22:05:17 +0100 (Sat, 19 Nov 2016) | 15 lines + +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 + +Index: lib/Target/X86/X86CallFrameOptimization.cpp +=================================================================== +--- lib/Target/X86/X86CallFrameOptimization.cpp (revision 308866) ++++ lib/Target/X86/X86CallFrameOptimization.cpp (revision 308867) +@@ -125,6 +125,11 @@ bool X86CallFrameOptimization::isLegal(MachineFunc + 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. |