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
This commit is contained in:
Brooks Davis 2018-11-01 17:47:32 +00:00
parent 639af15655
commit d38df13120
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=483690
9 changed files with 381 additions and 18 deletions

View file

@ -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}

View file

@ -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();

View file

@ -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; }

View file

@ -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.

View file

@ -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)

View file

@ -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()

View file

@ -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.

View file

@ -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);

View file

@ -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.