From owner-svn-src-all@freebsd.org Mon Jan 9 21:23:52 2017 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 5D5D1CA81E2; Mon, 9 Jan 2017 21:23:52 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 1041115CC; Mon, 9 Jan 2017 21:23:51 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v09LNpJG095958; Mon, 9 Jan 2017 21:23:51 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v09LNnPh095936; Mon, 9 Jan 2017 21:23:49 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201701092123.v09LNnPh095936@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Mon, 9 Jan 2017 21:23:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org Subject: svn commit: r311826 - in vendor/lld/dist: ELF cmake/modules include/lld/Core lib/Config lib/Core lib/Driver lib/ReaderWriter lib/ReaderWriter/MachO lib/ReaderWriter/YAML test/COFF test/ELF test/ELF... X-SVN-Group: vendor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 09 Jan 2017 21:23:52 -0000 Author: dim Date: Mon Jan 9 21:23:48 2017 New Revision: 311826 URL: https://svnweb.freebsd.org/changeset/base/311826 Log: Vendor import of lld trunk r291476: https://llvm.org/svn/llvm-project/lld/trunk@291476 Added: vendor/lld/dist/test/ELF/comdat-linkonce.s (contents, props changed) vendor/lld/dist/test/ELF/undefined-versioned-symbol.s (contents, props changed) Modified: vendor/lld/dist/ELF/Driver.cpp vendor/lld/dist/ELF/Driver.h vendor/lld/dist/ELF/InputFiles.cpp vendor/lld/dist/ELF/InputFiles.h vendor/lld/dist/ELF/LinkerScript.cpp vendor/lld/dist/ELF/Symbols.cpp vendor/lld/dist/cmake/modules/AddLLD.cmake vendor/lld/dist/include/lld/Core/Reproduce.h vendor/lld/dist/lib/Config/CMakeLists.txt vendor/lld/dist/lib/Core/CMakeLists.txt vendor/lld/dist/lib/Core/Reproduce.cpp vendor/lld/dist/lib/Driver/CMakeLists.txt vendor/lld/dist/lib/ReaderWriter/CMakeLists.txt vendor/lld/dist/lib/ReaderWriter/MachO/CMakeLists.txt vendor/lld/dist/lib/ReaderWriter/YAML/CMakeLists.txt vendor/lld/dist/test/COFF/linkrepro.test vendor/lld/dist/test/ELF/linkerscript/symbol-assignexpr.s vendor/lld/dist/test/ELF/mips-gp-ext.s vendor/lld/dist/test/ELF/reproduce-linkerscript.s vendor/lld/dist/tools/lld/CMakeLists.txt Modified: vendor/lld/dist/ELF/Driver.cpp ============================================================================== --- vendor/lld/dist/ELF/Driver.cpp Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/ELF/Driver.cpp Mon Jan 9 21:23:48 2017 (r311826) @@ -26,6 +26,7 @@ #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Path.h" +#include "llvm/Support/TarWriter.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/raw_ostream.h" #include @@ -51,6 +52,7 @@ bool elf::link(ArrayRef Ar ErrorCount = 0; ErrorOS = &Error; Argv0 = Args[0]; + Tar = nullptr; Config = make(); Driver = make(); @@ -170,25 +172,6 @@ void LinkerDriver::addFile(StringRef Pat } } -Optional LinkerDriver::readFile(StringRef Path) { - if (Config->Verbose) - outs() << Path << "\n"; - - auto MBOrErr = MemoryBuffer::getFile(Path); - if (auto EC = MBOrErr.getError()) { - error(EC, "cannot open " + Path); - return None; - } - std::unique_ptr &MB = *MBOrErr; - MemoryBufferRef MBRef = MB->getMemBufferRef(); - make>(std::move(MB)); // take MB ownership - - if (Tar) - Tar->append(relativeToRoot(Path), MBRef.getBuffer()); - - return MBRef; -} - // Add a given library by searching it from input search paths. void LinkerDriver::addLibrary(StringRef Name) { if (Optional Path = searchLibrary(Name)) @@ -313,9 +296,10 @@ void LinkerDriver::main(ArrayRef> ErrOrWriter = TarWriter::create(Path, path::stem(Path)); if (ErrOrWriter) { - Tar = std::move(*ErrOrWriter); + Tar = ErrOrWriter->get(); Tar->append("response.txt", createResponseFile(Args)); Tar->append("version.txt", getLLDVersion() + "\n"); + make>(std::move(*ErrOrWriter)); } else { error(Twine("--reproduce: failed to open ") + Path + ": " + toString(ErrOrWriter.takeError())); Modified: vendor/lld/dist/ELF/Driver.h ============================================================================== --- vendor/lld/dist/ELF/Driver.h Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/ELF/Driver.h Mon Jan 9 21:23:48 2017 (r311826) @@ -17,7 +17,6 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" #include "llvm/Option/ArgList.h" -#include "llvm/Support/TarWriter.h" #include "llvm/Support/raw_ostream.h" namespace lld { @@ -30,11 +29,9 @@ public: void main(ArrayRef Args, bool CanExitEarly); void addFile(StringRef Path); void addLibrary(StringRef Name); - std::unique_ptr Tar; // for reproduce private: std::vector getArchiveMembers(MemoryBufferRef MB); - llvm::Optional readFile(StringRef Path); void readConfigs(llvm::opt::InputArgList &Args); void createFiles(llvm::opt::InputArgList &Args); void inferMachineType(); Modified: vendor/lld/dist/ELF/InputFiles.cpp ============================================================================== --- vendor/lld/dist/ELF/InputFiles.cpp Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/ELF/InputFiles.cpp Mon Jan 9 21:23:48 2017 (r311826) @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// #include "InputFiles.h" -#include "Driver.h" #include "Error.h" #include "InputSection.h" #include "LinkerScript.h" @@ -26,6 +25,7 @@ #include "llvm/MC/StringTableBuilder.h" #include "llvm/Object/ELFObjectFile.h" #include "llvm/Support/Path.h" +#include "llvm/Support/TarWriter.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -36,6 +36,8 @@ using namespace llvm::sys::fs; using namespace lld; using namespace lld::elf; +TarWriter *elf::Tar; + namespace { // In ELF object file all section addresses are zero. If we have multiple // .text sections (when using -ffunction-section or comdat group) then @@ -53,6 +55,24 @@ public: }; } +Optional elf::readFile(StringRef Path) { + if (Config->Verbose) + outs() << Path << "\n"; + + auto MBOrErr = MemoryBuffer::getFile(Path); + if (auto EC = MBOrErr.getError()) { + error(EC, "cannot open " + Path); + return None; + } + std::unique_ptr &MB = *MBOrErr; + MemoryBufferRef MBRef = MB->getMemBufferRef(); + make>(std::move(MB)); // take MB ownership + + if (Tar) + Tar->append(relativeToRoot(Path), MBRef.getBuffer()); + return MBRef; +} + template void elf::ObjectFile::initializeDwarfLine() { std::unique_ptr Obj = check(object::ObjectFile::createObjectFile(this->MB), @@ -398,6 +418,14 @@ elf::ObjectFile::createInputSectio if (Config->Strip != StripPolicy::None && Name.startswith(".debug")) return &InputSection::Discarded; + // The linkonce feature is a sort of proto-comdat. Some glibc i386 object + // files contain definitions of symbol "__x86.get_pc_thunk.bx" in linkonce + // sections. Drop those sections to avoid duplicate symbol errors. + // FIXME: This is glibc PR20543, we should remove this hack once that has been + // fixed for a while. + if (Name.startswith(".gnu.linkonce.")) + return &InputSection::Discarded; + // The linker merges EH (exception handling) frames and creates a // .eh_frame_hdr section for runtime. So we handle them with a special // class. For relocatable outputs, they are just passed through. @@ -524,9 +552,8 @@ ArchiveFile::getMember(const Archive::Sy "could not get the buffer for the member defining symbol " + Sym->getName()); - if (C.getParent()->isThin() && Driver->Tar) - Driver->Tar->append(relativeToRoot(check(C.getFullName())), - Ret.getBuffer()); + if (C.getParent()->isThin() && Tar) + Tar->append(relativeToRoot(check(C.getFullName())), Ret.getBuffer()); if (C.getParent()->isThin()) return {Ret, 0}; return {Ret, C.getChildOffset()}; @@ -651,6 +678,8 @@ template void SharedFilevs_index; ++Versym; } + bool Hidden = VersymIndex & VERSYM_HIDDEN; + VersymIndex = VersymIndex & ~VERSYM_HIDDEN; StringRef Name = check(Sym.getName(this->StringTable)); if (Sym.isUndefined()) { @@ -658,15 +687,23 @@ template void SharedFile::X->addShared(this, Name, Sym, V); + + if (!Hidden) + elf::Symtab::X->addShared(this, Name, Sym, V); + + // Also add the symbol with the versioned name to handle undefined symbols + // with explicit versions. + if (V) { + StringRef VerName = this->StringTable.data() + V->getAux()->vda_name; + Name = Saver.save(Twine(Name) + "@" + VerName); + elf::Symtab::X->addShared(this, Name, Sym, V); + } } } Modified: vendor/lld/dist/ELF/InputFiles.h ============================================================================== --- vendor/lld/dist/ELF/InputFiles.h Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/ELF/InputFiles.h Mon Jan 9 21:23:48 2017 (r311826) @@ -29,6 +29,7 @@ namespace llvm { class DWARFDebugLine; +class TarWriter; namespace lto { class InputFile; } @@ -49,6 +50,13 @@ using llvm::object::Archive; class Lazy; class SymbolBody; +// If -reproduce option is given, all input files are written +// to this tar archive. +extern llvm::TarWriter *Tar; + +// Opens a given file. +llvm::Optional readFile(StringRef Path); + // The root class of input files. class InputFile { public: Modified: vendor/lld/dist/ELF/LinkerScript.cpp ============================================================================== --- vendor/lld/dist/ELF/LinkerScript.cpp Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/ELF/LinkerScript.cpp Mon Jan 9 21:23:48 2017 (r311826) @@ -56,29 +56,30 @@ using namespace lld::elf; LinkerScriptBase *elf::ScriptBase; ScriptConfiguration *elf::ScriptConfig; -template static void addRegular(SymbolAssignment *Cmd) { +template static SymbolBody *addRegular(SymbolAssignment *Cmd) { uint8_t Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT; - Symbol *Sym = Symtab::X->addRegular(Cmd->Name, Visibility, STT_NOTYPE, - 0, 0, STB_GLOBAL, nullptr, nullptr); - Cmd->Sym = Sym->body(); - - // If we have no SECTIONS then we don't have '.' and don't call - // assignAddresses(). We calculate symbol value immediately in this case. - if (!ScriptConfig->HasSections) - cast>(Cmd->Sym)->Value = Cmd->Expression(0); + Symbol *Sym = Symtab::X->addUndefined( + Cmd->Name, /*IsLocal=*/false, STB_GLOBAL, Visibility, + /*Type*/ 0, + /*CanOmitFromDynSym*/ false, /*File*/ nullptr); + + replaceBody>(Sym, Cmd->Name, /*IsLocal=*/false, + Visibility, STT_NOTYPE, 0, 0, nullptr, + nullptr); + return Sym->body(); } -template static void addSynthetic(SymbolAssignment *Cmd) { - // If we have SECTIONS block then output sections haven't been created yet. +template static SymbolBody *addSynthetic(SymbolAssignment *Cmd) { + uint8_t Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT; const OutputSectionBase *Sec = ScriptConfig->HasSections ? nullptr : Cmd->Expression.Section(); - Symbol *Sym = Symtab::X->addSynthetic( - Cmd->Name, Sec, 0, Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT); - Cmd->Sym = Sym->body(); - - // If we already know section then we can calculate symbol value immediately. - if (Sec) - cast(Cmd->Sym)->Value = Cmd->Expression(0) - Sec->Addr; + Symbol *Sym = Symtab::X->addUndefined( + Cmd->Name, /*IsLocal=*/false, STB_GLOBAL, Visibility, + /*Type*/ 0, + /*CanOmitFromDynSym*/ false, /*File*/ nullptr); + + replaceBody(Sym, Cmd->Name, 0, Sec); + return Sym->body(); } static bool isUnderSysroot(StringRef Path) { @@ -90,21 +91,39 @@ static bool isUnderSysroot(StringRef Pat return false; } -template static void addSymbol(SymbolAssignment *Cmd) { - if (Cmd->Expression.IsAbsolute()) - addRegular(Cmd); - else - addSynthetic(Cmd); +template static void assignSymbol(SymbolAssignment *Cmd) { + // If there are sections, then let the value be assigned later in + // `assignAddresses`. + if (ScriptConfig->HasSections) + return; + + uint64_t Value = Cmd->Expression(0); + if (Cmd->Expression.IsAbsolute()) { + cast>(Cmd->Sym)->Value = Value; + } else { + const OutputSectionBase *Sec = Cmd->Expression.Section(); + if (Sec) + cast(Cmd->Sym)->Value = Value - Sec->Addr; + } } -// If a symbol was in PROVIDE(), we need to define it only when -// it is an undefined symbol. -template static bool shouldDefine(SymbolAssignment *Cmd) { + +template static void addSymbol(SymbolAssignment *Cmd) { if (Cmd->Name == ".") - return false; - if (!Cmd->Provide) - return true; + return; + + // If a symbol was in PROVIDE(), we need to define it only when + // it is a referenced undefined symbol. SymbolBody *B = Symtab::X->find(Cmd->Name); - return B && B->isUndefined(); + if (Cmd->Provide && (!B || B->isDefined())) + return; + + // Otherwise, create a new symbol if one does not exist or an + // undefined one does exist. + if (Cmd->Expression.IsAbsolute()) + Cmd->Sym = addRegular(Cmd); + else + Cmd->Sym = addSynthetic(Cmd); + assignSymbol(Cmd); } bool SymbolAssignment::classof(const BaseCommand *C) { @@ -283,8 +302,7 @@ void LinkerScript::processCommands // Handle symbol assignments outside of any output section. if (auto *Cmd = dyn_cast(Base1.get())) { - if (shouldDefine(Cmd)) - addSymbol(Cmd); + addSymbol(Cmd); continue; } @@ -326,8 +344,7 @@ void LinkerScript::processCommands // ".foo : { ...; bar = .; }". Handle them. for (const std::unique_ptr &Base : Cmd->Commands) if (auto *OutCmd = dyn_cast(Base.get())) - if (shouldDefine(OutCmd)) - addSymbol(OutCmd); + addSymbol(OutCmd); // Handle subalign (e.g. ".foo : SUBALIGN(32) { ... }"). If subalign // is given, input sections are aligned to that value, whether the @@ -1143,20 +1160,21 @@ void ScriptParser::readGroup() { void ScriptParser::readInclude() { StringRef Tok = unquote(next()); + // https://sourceware.org/binutils/docs/ld/File-Commands.html: // The file will be searched for in the current directory, and in any // directory specified with the -L option. - auto MBOrErr = MemoryBuffer::getFile(Tok); - if (!MBOrErr) - if (Optional Path = findFromSearchPaths(Tok)) - MBOrErr = MemoryBuffer::getFile(*Path); - if (!MBOrErr) { - setError("cannot open " + Tok); + if (sys::fs::exists(Tok)) { + if (Optional MB = readFile(Tok)) + tokenize(*MB); + return; + } + if (Optional Path = findFromSearchPaths(Tok)) { + if (Optional MB = readFile(*Path)) + tokenize(*MB); return; } - MemoryBufferRef MBRef = (*MBOrErr)->getMemBufferRef(); - make>(std::move(*MBOrErr)); // take MB ownership - tokenize(MBRef); + setError("cannot open " + Tok); } void ScriptParser::readOutput() { Modified: vendor/lld/dist/ELF/Symbols.cpp ============================================================================== --- vendor/lld/dist/ELF/Symbols.cpp Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/ELF/Symbols.cpp Mon Jan 9 21:23:48 2017 (r311826) @@ -202,6 +202,10 @@ void SymbolBody::parseSymbolVersion() { // Truncate the symbol name so that it doesn't include the version string. Name = {S.data(), Pos}; + // If this is an undefined or shared symbol it is not a definition. + if (isUndefined() || isShared()) + return; + // '@@' in a symbol name means the default version. // It is usually the most recent one. bool IsDefault = (Verstr[0] == '@'); Modified: vendor/lld/dist/cmake/modules/AddLLD.cmake ============================================================================== --- vendor/lld/dist/cmake/modules/AddLLD.cmake Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/cmake/modules/AddLLD.cmake Mon Jan 9 21:23:48 2017 (r311826) @@ -1,5 +1,5 @@ macro(add_lld_library name) - add_llvm_library(${name} ${ARGN}) + llvm_add_library(${name} ${ARGN}) set_target_properties(${name} PROPERTIES FOLDER "lld libraries") endmacro(add_lld_library) Modified: vendor/lld/dist/include/lld/Core/Reproduce.h ============================================================================== --- vendor/lld/dist/include/lld/Core/Reproduce.h Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/include/lld/Core/Reproduce.h Mon Jan 9 21:23:48 2017 (r311826) @@ -34,9 +34,6 @@ std::string rewritePath(StringRef S); // Returns the string form of the given argument. std::string toString(llvm::opt::Arg *Arg); - -// Replaces backslashes with slashes if Windows. -std::string convertToUnixPathSeparator(StringRef S); } #endif Modified: vendor/lld/dist/lib/Config/CMakeLists.txt ============================================================================== --- vendor/lld/dist/lib/Config/CMakeLists.txt Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/lib/Config/CMakeLists.txt Mon Jan 9 21:23:48 2017 (r311826) @@ -4,6 +4,6 @@ add_lld_library(lldConfig ADDITIONAL_HEADER_DIRS ${LLD_INCLUDE_DIR}/lld/Config - LINK_LIBS - LLVMSupport + LINK_COMPONENTS + Support ) Modified: vendor/lld/dist/lib/Core/CMakeLists.txt ============================================================================== --- vendor/lld/dist/lib/Core/CMakeLists.txt Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/lib/Core/CMakeLists.txt Mon Jan 9 21:23:48 2017 (r311826) @@ -12,6 +12,6 @@ add_lld_library(lldCore ADDITIONAL_HEADER_DIRS ${LLD_INCLUDE_DIR}/lld/Core - LINK_LIBS - LLVMSupport + LINK_COMPONENTS + Support ) Modified: vendor/lld/dist/lib/Core/Reproduce.cpp ============================================================================== --- vendor/lld/dist/lib/Core/Reproduce.cpp Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/lib/Core/Reproduce.cpp Mon Jan 9 21:23:48 2017 (r311826) @@ -39,7 +39,7 @@ std::string lld::relativeToRoot(StringRe Res = Root.substr(2); path::append(Res, path::relative_path(Abs)); - return convertToUnixPathSeparator(Res); + return path::convert_to_slash(Res); } // Quote a given string if it contains a space character. @@ -64,13 +64,3 @@ std::string lld::toString(opt::Arg *Arg) return K + V; return K + " " + V; } - -std::string lld::convertToUnixPathSeparator(StringRef S) { -#ifdef LLVM_ON_WIN32 - std::string Ret = S.str(); - std::replace(Ret.begin(), Ret.end(), '\\', '/'); - return Ret; -#else - return S; -#endif -} Modified: vendor/lld/dist/lib/Driver/CMakeLists.txt ============================================================================== --- vendor/lld/dist/lib/Driver/CMakeLists.txt Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/lib/Driver/CMakeLists.txt Mon Jan 9 21:23:48 2017 (r311826) @@ -8,15 +8,17 @@ add_lld_library(lldDriver ADDITIONAL_HEADER_DIRS ${LLD_INCLUDE_DIR}/lld/Driver + LINK_COMPONENTS + Object + Option + Support + LINK_LIBS lldConfig lldMachO lldCore lldReaderWriter lldYAML - LLVMObject - LLVMOption - LLVMSupport ) add_dependencies(lldDriver DriverOptionsTableGen) Modified: vendor/lld/dist/lib/ReaderWriter/CMakeLists.txt ============================================================================== --- vendor/lld/dist/lib/ReaderWriter/CMakeLists.txt Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/lib/ReaderWriter/CMakeLists.txt Mon Jan 9 21:23:48 2017 (r311826) @@ -11,9 +11,11 @@ add_lld_library(lldReaderWriter ADDITIONAL_HEADER_DIRS ${LLD_INCLUDE_DIR}/lld/ReaderWriter + LINK_COMPONENTS + Object + Support + LINK_LIBS lldCore lldYAML - LLVMObject - LLVMSupport ) Modified: vendor/lld/dist/lib/ReaderWriter/MachO/CMakeLists.txt ============================================================================== --- vendor/lld/dist/lib/ReaderWriter/MachO/CMakeLists.txt Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/lib/ReaderWriter/MachO/CMakeLists.txt Mon Jan 9 21:23:48 2017 (r311826) @@ -18,13 +18,16 @@ add_lld_library(lldMachO StubsPass.cpp TLVPass.cpp WriterMachO.cpp + + LINK_COMPONENTS + DebugInfoDWARF + Object + Support + Demangle + LINK_LIBS lldCore lldYAML - LLVMDebugInfoDWARF - LLVMObject - LLVMSupport - LLVMDemangle ${PTHREAD_LIB} ) Modified: vendor/lld/dist/lib/ReaderWriter/YAML/CMakeLists.txt ============================================================================== --- vendor/lld/dist/lib/ReaderWriter/YAML/CMakeLists.txt Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/lib/ReaderWriter/YAML/CMakeLists.txt Mon Jan 9 21:23:48 2017 (r311826) @@ -1,6 +1,9 @@ add_lld_library(lldYAML ReaderWriterYAML.cpp + + LINK_COMPONENTS + Support + LINK_LIBS lldCore - LLVMSupport ) Modified: vendor/lld/dist/test/COFF/linkrepro.test ============================================================================== --- vendor/lld/dist/test/COFF/linkrepro.test Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/test/COFF/linkrepro.test Mon Jan 9 21:23:48 2017 (r311826) @@ -1,3 +1,5 @@ +# REQUIRES: x86, shell + # RUN: rm -rf %t.dir # RUN: mkdir -p %t.dir/build1 %t.dir/build2 %t.dir/build3 # RUN: yaml2obj < %p/Inputs/hello32.yaml > %t.obj Added: vendor/lld/dist/test/ELF/comdat-linkonce.s ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ vendor/lld/dist/test/ELF/comdat-linkonce.s Mon Jan 9 21:23:48 2017 (r311826) @@ -0,0 +1,9 @@ +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/comdat.s -o %t2.o +// RUN: ld.lld -shared %t.o %t2.o -o %t +// RUN: ld.lld -shared %t2.o %t.o -o %t + +.section .gnu.linkonce.t.zed +.globl abc +abc: +nop Modified: vendor/lld/dist/test/ELF/linkerscript/symbol-assignexpr.s ============================================================================== --- vendor/lld/dist/test/ELF/linkerscript/symbol-assignexpr.s Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/test/ELF/linkerscript/symbol-assignexpr.s Mon Jan 9 21:23:48 2017 (r311826) @@ -13,14 +13,20 @@ # RUN: symbol9 = - 4; \ # RUN: symbol10 = 0xfedcba9876543210; \ # RUN: symbol11 = ((0x28000 + 0x1fff) & ~(0x1000 + -1)); \ +# RUN: symbol12 = 0x1234; \ +# RUN: symbol12 += 1; \ +# RUN: bar = 0x5678; \ +# RUN: baz = 0x9abc; \ # RUN: }" > %t.script # RUN: ld.lld -o %t1 --script %t.script %t # RUN: llvm-objdump -t %t1 | FileCheck %s # CHECK: SYMBOL TABLE: # CHECK-NEXT: 0000000000000000 *UND* 00000000 -# CHECK-NEXT: .text 00000000 _start -# CHECK-NEXT: .text 00000000 foo +# CHECK-NEXT: 0000000000000000 .text 00000000 _start +# CHECK-NEXT: 0000000000005678 *ABS* 00000000 bar +# CHECK-NEXT: 0000000000009abc *ABS* 00000000 baz +# CHECK-NEXT: 0000000000000001 .text 00000000 foo # CHECK-NEXT: 0000000000001000 *ABS* 00000000 symbol # CHECK-NEXT: 0000000000002234 *ABS* 00000000 symbol2 # CHECK-NEXT: 0000000000002234 *ABS* 00000000 symbol3 @@ -32,6 +38,7 @@ # CHECK-NEXT: fffffffffffffffc *ABS* 00000000 symbol9 # CHECK-NEXT: fedcba9876543210 *ABS* 00000000 symbol10 # CHECK-NEXT: 0000000000029000 *ABS* 00000000 symbol11 +# CHECK-NEXT: 0000000000001235 *ABS* 00000000 symbol12 # RUN: echo "SECTIONS { \ # RUN: symbol2 = symbol; \ @@ -46,3 +53,9 @@ _start: .global foo foo: + nop + +.global bar +bar = 0x1234 + +.comm baz,8,8 Modified: vendor/lld/dist/test/ELF/mips-gp-ext.s ============================================================================== --- vendor/lld/dist/test/ELF/mips-gp-ext.s Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/test/ELF/mips-gp-ext.s Mon Jan 9 21:23:48 2017 (r311826) @@ -1,8 +1,10 @@ # Check that the linker use a value of _gp symbol defined # in a linker script to calculate GOT relocations. -# FIXME: This test is xfailed because it depends on D27276 patch -# that enables absolute symbols redefinition by a linker's script. +# FIXME: This test is xfailed because there is currently a bug +# that causes symbols defined by linker scripts to be put in the +# wrong sections. In particular, `_gp = . + 0x100` ends up in +# `.text` when it should be in `*ABS*`. # XFAIL: * # RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o Modified: vendor/lld/dist/test/ELF/reproduce-linkerscript.s ============================================================================== --- vendor/lld/dist/test/ELF/reproduce-linkerscript.s Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/test/ELF/reproduce-linkerscript.s Mon Jan 9 21:23:48 2017 (r311826) @@ -4,10 +4,13 @@ # RUN: mkdir -p %t.dir/build # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.dir/build/foo.o # RUN: echo "INPUT(\"%t.dir/build/foo.o\")" > %t.dir/build/foo.script +# RUN: echo "INCLUDE \"%t.dir/build/bar.script\"" >> %t.dir/build/foo.script +# RUN: echo "/* empty */" > %t.dir/build/bar.script # RUN: cd %t.dir # RUN: ld.lld build/foo.script -o bar --reproduce repro.tar # RUN: tar xf repro.tar # RUN: diff build/foo.script repro/%:t.dir/build/foo.script +# RUN: diff build/bar.script repro/%:t.dir/build/bar.script # RUN: diff build/foo.o repro/%:t.dir/build/foo.o .globl _start Added: vendor/lld/dist/test/ELF/undefined-versioned-symbol.s ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ vendor/lld/dist/test/ELF/undefined-versioned-symbol.s Mon Jan 9 21:23:48 2017 (r311826) @@ -0,0 +1,74 @@ +// REQUIRES: x86 +// RUN: echo ".data; \ +// RUN: .quad \"basename\"; \ +// RUN: .quad \"basename@FBSD_1.0\"; \ +// RUN: .quad \"basename@FBSD_1.1\" " > %t.s +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %t.s -o %t.o +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t2.o +// RUN: echo "FBSD_1.0 { local: *; }; FBSD_1.1 { };" > %t2.ver +// RUN: ld.lld --shared --version-script %t2.ver %t2.o -o %t2.so +// RUN: echo "LIBPKG_1.3 { };" > %t.ver +// RUN: ld.lld --shared %t.o --version-script %t.ver %t2.so -o %t.so +// RUN: llvm-readobj --dyn-symbols -r --expand-relocs %t.so | FileCheck %s + +// Test that each relocation points to the correct version. + +// CHECK: Section ({{.*}}) .rela.dyn { +// CHECK-NEXT: Relocation { +// CHECK-NEXT: Offset: 0x2000 +// CHECK-NEXT: Type: R_X86_64_64 (1) +// CHECK-NEXT: Symbol: basename (1) +// CHECK-NEXT: Addend: 0x0 +// CHECK-NEXT: } +// CHECK-NEXT: Relocation { +// CHECK-NEXT: Offset: 0x2008 +// CHECK-NEXT: Type: R_X86_64_64 (1) +// CHECK-NEXT: Symbol: basename (2) +// CHECK-NEXT: Addend: 0x0 +// CHECK-NEXT: } +// CHECK-NEXT: Relocation { +// CHECK-NEXT: Offset: 0x2010 +// CHECK-NEXT: Type: R_X86_64_64 (1) +// CHECK-NEXT: Symbol: basename (3) +// CHECK-NEXT: Addend: 0x0 +// CHECK-NEXT: } +// CHECK-NEXT: } + + +// CHECK: DynamicSymbols [ +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: +// CHECK-NEXT: Value: +// CHECK-NEXT: Size: +// CHECK-NEXT: Binding: +// CHECK-NEXT: Type: +// CHECK-NEXT: Other: +// CHECK-NEXT: Section: +// CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: basename@FBSD_1.1 +// CHECK-NEXT: Value: +// CHECK-NEXT: Size: +// CHECK-NEXT: Binding: +// CHECK-NEXT: Type: +// CHECK-NEXT: Other: +// CHECK-NEXT: Section: +// CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: basename@FBSD_1.0 +// CHECK-NEXT: Value: +// CHECK-NEXT: Size: +// CHECK-NEXT: Binding: +// CHECK-NEXT: Type: +// CHECK-NEXT: Other: +// CHECK-NEXT: Section: +// CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: basename@FBSD_1.1 + + +.global "basename@FBSD_1.0" +"basename@FBSD_1.0": + +.global "basename@@FBSD_1.1" +"basename@@FBSD_1.1": Modified: vendor/lld/dist/tools/lld/CMakeLists.txt ============================================================================== --- vendor/lld/dist/tools/lld/CMakeLists.txt Mon Jan 9 21:23:46 2017 (r311825) +++ vendor/lld/dist/tools/lld/CMakeLists.txt Mon Jan 9 21:23:48 2017 (r311826) @@ -1,3 +1,7 @@ +set(LLVM_LINK_COMPONENTS + Support + ) + add_lld_tool(lld lld.cpp ) @@ -6,7 +10,6 @@ target_link_libraries(lld lldDriver lldCOFF lldELF - LLVMSupport ) install(TARGETS lld