aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbrooks <brooks@FreeBSD.org>2018-11-02 01:47:32 +0800
committerbrooks <brooks@FreeBSD.org>2018-11-02 01:47:32 +0800
commit52ba68b74a8cd1347115ae6c86478a963a9cfeb9 (patch)
treea114d3be8a6906c3e4dd17cf3d1d911caa0b2c98
parent59fcfafe7611f4632bd960fae2d69ddde52d5dce (diff)
downloadfreebsd-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/Makefile23
-rw-r--r--devel/llvm70/files/clang/patch-head-r339019.diff30
-rw-r--r--devel/llvm70/files/lld/patch-head-r337282.diff39
-rw-r--r--devel/llvm70/files/lld/patch-head-r338297.diff94
-rw-r--r--devel/llvm70/files/lld/patch-head-r338682.diff64
-rw-r--r--devel/llvm70/files/lld/patch-head-r339304.diff37
-rw-r--r--devel/llvm70/files/lld/patch-lld-manpage.diff57
-rw-r--r--devel/llvm70/files/lldb/patch-head-r332965.diff22
-rw-r--r--devel/llvm70/files/patch-head-r308867.diff33
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.