From owner-svn-src-projects@freebsd.org Mon Sep 2 17:55:49 2019 Return-Path: Delivered-To: svn-src-projects@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 61A4BE4783 for ; Mon, 2 Sep 2019 17:55:49 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 46Md6Y2jXSz46mg; Mon, 2 Sep 2019 17:55:49 +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 mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 40CD81DD7E; Mon, 2 Sep 2019 17:55:49 +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 x82Htnef026090; Mon, 2 Sep 2019 17:55:49 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x82HteWI026045; Mon, 2 Sep 2019 17:55:40 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201909021755.x82HteWI026045@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Mon, 2 Sep 2019 17:55:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r351722 - in projects/clang900-import: contrib/compiler-rt/lib/asan contrib/compiler-rt/lib/msan contrib/compiler-rt/lib/sanitizer_common contrib/libc++/include contrib/llvm/include/llv... X-SVN-Group: projects X-SVN-Commit-Author: dim X-SVN-Commit-Paths: in projects/clang900-import: contrib/compiler-rt/lib/asan contrib/compiler-rt/lib/msan contrib/compiler-rt/lib/sanitizer_common contrib/libc++/include contrib/llvm/include/llvm/Analysis contrib/llvm/i... X-SVN-Commit-Revision: 351722 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Sep 2019 17:55:49 -0000 Author: dim Date: Mon Sep 2 17:55:39 2019 New Revision: 351722 URL: https://svnweb.freebsd.org/changeset/base/351722 Log: Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb, and openmp release_90 branch r370514, and update version numbers. Modified: projects/clang900-import/contrib/compiler-rt/lib/asan/asan_rtl.cc projects/clang900-import/contrib/compiler-rt/lib/msan/msan.cc projects/clang900-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc projects/clang900-import/contrib/libc++/include/__locale projects/clang900-import/contrib/libc++/include/__threading_support projects/clang900-import/contrib/llvm/include/llvm/Analysis/InstructionSimplify.h projects/clang900-import/contrib/llvm/include/llvm/IR/InlineAsm.h projects/clang900-import/contrib/llvm/lib/Analysis/InstructionSimplify.cpp projects/clang900-import/contrib/llvm/lib/IR/Core.cpp projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.h projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp projects/clang900-import/contrib/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelLowering.cpp projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelLowering.h projects/clang900-import/contrib/llvm/lib/Target/TargetMachine.cpp projects/clang900-import/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp projects/clang900-import/contrib/llvm/lib/Target/X86/X86ISelLowering.h projects/clang900-import/contrib/llvm/lib/Target/X86/X86Subtarget.cpp projects/clang900-import/contrib/llvm/lib/Transforms/Utils/LoopUnroll.cpp projects/clang900-import/contrib/llvm/tools/clang/include/clang/Frontend/LangStandards.def projects/clang900-import/contrib/llvm/tools/clang/lib/Basic/Targets/RISCV.cpp projects/clang900-import/contrib/llvm/tools/clang/lib/Basic/Targets/RISCV.h projects/clang900-import/contrib/llvm/tools/clang/lib/Headers/opencl-c.h projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp projects/clang900-import/contrib/llvm/tools/lld/CMakeLists.txt projects/clang900-import/contrib/llvm/tools/lld/COFF/Config.h projects/clang900-import/contrib/llvm/tools/lld/COFF/Driver.cpp projects/clang900-import/contrib/llvm/tools/lld/COFF/Driver.h projects/clang900-import/contrib/llvm/tools/lld/COFF/InputFiles.cpp projects/clang900-import/contrib/llvm/tools/lld/COFF/InputFiles.h projects/clang900-import/contrib/llvm/tools/lld/COFF/SymbolTable.cpp projects/clang900-import/contrib/llvm/tools/lld/COFF/SymbolTable.h projects/clang900-import/contrib/llvm/tools/lld/COFF/Symbols.cpp projects/clang900-import/contrib/llvm/tools/lld/COFF/Symbols.h projects/clang900-import/contrib/llvm/tools/lld/COFF/Writer.cpp projects/clang900-import/contrib/llvm/tools/lld/ELF/Arch/PPC.cpp projects/clang900-import/contrib/llvm/tools/lld/ELF/Arch/PPC64.cpp projects/clang900-import/contrib/llvm/tools/lld/ELF/InputFiles.cpp projects/clang900-import/contrib/llvm/tools/lld/ELF/Symbols.cpp projects/clang900-import/contrib/llvm/tools/lld/ELF/Symbols.h projects/clang900-import/contrib/llvm/tools/lld/docs/ReleaseNotes.rst projects/clang900-import/lib/clang/include/lld/Common/Version.inc projects/clang900-import/lib/clang/include/llvm/Support/VCSRevision.h Directory Properties: projects/clang900-import/contrib/compiler-rt/ (props changed) projects/clang900-import/contrib/libc++/ (props changed) projects/clang900-import/contrib/libunwind/ (props changed) projects/clang900-import/contrib/llvm/ (props changed) projects/clang900-import/contrib/llvm/tools/clang/ (props changed) projects/clang900-import/contrib/llvm/tools/lld/ (props changed) projects/clang900-import/contrib/llvm/tools/lldb/ (props changed) projects/clang900-import/contrib/openmp/ (props changed) Modified: projects/clang900-import/contrib/compiler-rt/lib/asan/asan_rtl.cc ============================================================================== --- projects/clang900-import/contrib/compiler-rt/lib/asan/asan_rtl.cc Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/compiler-rt/lib/asan/asan_rtl.cc Mon Sep 2 17:55:39 2019 (r351722) @@ -402,7 +402,6 @@ static void AsanInitInternal() { asan_init_is_running = true; CacheBinaryName(); - CheckASLR(); // Initialize flags. This must be done early, because most of the // initialization steps look at flags(). @@ -450,6 +449,7 @@ static void AsanInitInternal() { SetLowLevelAllocateCallback(OnLowLevelAllocate); InitializeAsanInterceptors(); + CheckASLR(); // Enable system log ("adb logcat") on Android. // Doing this before interceptors are initialized crashes in: Modified: projects/clang900-import/contrib/compiler-rt/lib/msan/msan.cc ============================================================================== --- projects/clang900-import/contrib/compiler-rt/lib/msan/msan.cc Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/compiler-rt/lib/msan/msan.cc Mon Sep 2 17:55:39 2019 (r351722) @@ -403,7 +403,6 @@ void __msan_init() { AvoidCVE_2016_2143(); CacheBinaryName(); - CheckASLR(); InitializeFlags(); // Install tool-specific callbacks in sanitizer_common. @@ -412,6 +411,7 @@ void __msan_init() { __sanitizer_set_report_path(common_flags()->log_path); InitializeInterceptors(); + CheckASLR(); InitTlsSize(); InstallDeadlySignalHandlers(MsanOnDeadlySignal); InstallAtExitHandler(); // Needs __cxa_atexit interceptor. Modified: projects/clang900-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc ============================================================================== --- projects/clang900-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc Mon Sep 2 17:55:39 2019 (r351722) @@ -2011,6 +2011,35 @@ void CheckASLR() { CHECK_NE(personality(old_personality | ADDR_NO_RANDOMIZE), -1); ReExec(); } +#elif SANITIZER_FREEBSD + int aslr_pie; + uptr len = sizeof(aslr_pie); +#if SANITIZER_WORDSIZE == 64 + if (UNLIKELY(internal_sysctlbyname("kern.elf64.aslr.pie_enable", + &aslr_pie, &len, NULL, 0) == -1)) { + // We're making things less 'dramatic' here since + // the OID is not necessarily guaranteed to be here + // just yet regarding FreeBSD release + return; + } + + if (aslr_pie > 0) { + Printf("This sanitizer is not compatible with enabled ASLR " + "and binaries compiled with PIE\n"); + Die(); + } +#endif + // there might be 32 bits compat for 64 bits + if (UNLIKELY(internal_sysctlbyname("kern.elf32.aslr.pie_enable", + &aslr_pie, &len, NULL, 0) == -1)) { + return; + } + + if (aslr_pie > 0) { + Printf("This sanitizer is not compatible with enabled ASLR " + "and binaries compiled with PIE\n"); + Die(); + } #else // Do nothing #endif Modified: projects/clang900-import/contrib/libc++/include/__locale ============================================================================== --- projects/clang900-import/contrib/libc++/include/__locale Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/libc++/include/__locale Mon Sep 2 17:55:39 2019 (r351722) @@ -409,7 +409,7 @@ class _LIBCPP_TYPE_VIS ctype_base (public) static const mask xdigit = _ISxdigit; static const mask blank = _ISblank; #if defined(__mips__) - static const mask __regex_word = static_cast(_ISbit(15)); + static const mask __regex_word = static_cast(_ISbit(15)); #else static const mask __regex_word = 0x80; #endif Modified: projects/clang900-import/contrib/libc++/include/__threading_support ============================================================================== --- projects/clang900-import/contrib/libc++/include/__threading_support Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/libc++/include/__threading_support Mon Sep 2 17:55:39 2019 (r351722) @@ -23,16 +23,11 @@ # include <__external_threading> #elif !defined(_LIBCPP_HAS_NO_THREADS) -typedef ::timespec __libcpp_timespec_t; - #if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) # include # include #endif -_LIBCPP_PUSH_MACROS -#include <__undef_macros> - #if defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \ defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL) || \ defined(_LIBCPP_HAS_THREAD_API_WIN32) @@ -47,8 +42,16 @@ _LIBCPP_PUSH_MACROS #define _LIBCPP_NO_THREAD_SAFETY_ANALYSIS #endif +typedef ::timespec __libcpp_timespec_t; +#endif // !defined(_LIBCPP_HAS_NO_THREADS) + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + _LIBCPP_BEGIN_NAMESPACE_STD +#if !defined(_LIBCPP_HAS_NO_THREADS) + #if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) // Mutex typedef pthread_mutex_t __libcpp_mutex_t; @@ -76,7 +79,7 @@ typedef pthread_t __libcpp_thread_t; typedef pthread_key_t __libcpp_tls_key; #define _LIBCPP_TLS_DESTRUCTOR_CC -#else +#elif !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) // Mutex typedef void* __libcpp_mutex_t; #define _LIBCPP_MUTEX_INITIALIZER 0 @@ -109,8 +112,9 @@ typedef void* __libcpp_thread_t; typedef long __libcpp_tls_key; #define _LIBCPP_TLS_DESTRUCTOR_CC __stdcall -#endif +#endif // !defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) +#if !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) // Mutex _LIBCPP_THREAD_ABI_VISIBILITY int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m); @@ -205,6 +209,8 @@ void *__libcpp_tls_get(__libcpp_tls_key __key); _LIBCPP_THREAD_ABI_VISIBILITY int __libcpp_tls_set(__libcpp_tls_key __key, void *__p); +#endif // !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) + #if (!defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \ defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL)) && \ defined(_LIBCPP_HAS_THREAD_API_PTHREAD) @@ -475,10 +481,10 @@ get_id() _NOEXCEPT } // this_thread +#endif // !_LIBCPP_HAS_NO_THREADS + _LIBCPP_END_NAMESPACE_STD _LIBCPP_POP_MACROS - -#endif // !_LIBCPP_HAS_NO_THREADS #endif // _LIBCPP_THREADING_SUPPORT Modified: projects/clang900-import/contrib/llvm/include/llvm/Analysis/InstructionSimplify.h ============================================================================== --- projects/clang900-import/contrib/llvm/include/llvm/Analysis/InstructionSimplify.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/include/llvm/Analysis/InstructionSimplify.h Mon Sep 2 17:55:39 2019 (r351722) @@ -31,6 +31,7 @@ #ifndef LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H #define LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H +#include "llvm/ADT/SetVector.h" #include "llvm/IR/Instruction.h" #include "llvm/IR/Operator.h" #include "llvm/IR/User.h" @@ -263,12 +264,14 @@ Value *SimplifyInstruction(Instruction *I, const Simpl /// This first performs a normal RAUW of I with SimpleV. It then recursively /// attempts to simplify those users updated by the operation. The 'I' /// instruction must not be equal to the simplified value 'SimpleV'. +/// If UnsimplifiedUsers is provided, instructions that could not be simplified +/// are added to it. /// /// The function returns true if any simplifications were performed. -bool replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV, - const TargetLibraryInfo *TLI = nullptr, - const DominatorTree *DT = nullptr, - AssumptionCache *AC = nullptr); +bool replaceAndRecursivelySimplify( + Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI = nullptr, + const DominatorTree *DT = nullptr, AssumptionCache *AC = nullptr, + SmallSetVector *UnsimplifiedUsers = nullptr); /// Recursively attempt to simplify an instruction. /// Modified: projects/clang900-import/contrib/llvm/include/llvm/IR/InlineAsm.h ============================================================================== --- projects/clang900-import/contrib/llvm/include/llvm/IR/InlineAsm.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/include/llvm/IR/InlineAsm.h Mon Sep 2 17:55:39 2019 (r351722) @@ -244,6 +244,7 @@ class InlineAsm final : public Value { (public) Constraint_m, Constraint_o, Constraint_v, + Constraint_A, Constraint_Q, Constraint_R, Constraint_S, Modified: projects/clang900-import/contrib/llvm/lib/Analysis/InstructionSimplify.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Analysis/InstructionSimplify.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Analysis/InstructionSimplify.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -5221,14 +5221,16 @@ Value *llvm::SimplifyInstruction(Instruction *I, const /// If we have a pre-simplified value in 'SimpleV', that is forcibly used to /// replace the instruction 'I'. Otherwise, we simply add 'I' to the list of /// instructions to process and attempt to simplify it using -/// InstructionSimplify. +/// InstructionSimplify. Recursively visited users which could not be +/// simplified themselves are to the optional UnsimplifiedUsers set for +/// further processing by the caller. /// /// This routine returns 'true' only when *it* simplifies something. The passed /// in simplified value does not count toward this. -static bool replaceAndRecursivelySimplifyImpl(Instruction *I, Value *SimpleV, - const TargetLibraryInfo *TLI, - const DominatorTree *DT, - AssumptionCache *AC) { +static bool replaceAndRecursivelySimplifyImpl( + Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI, + const DominatorTree *DT, AssumptionCache *AC, + SmallSetVector *UnsimplifiedUsers = nullptr) { bool Simplified = false; SmallSetVector Worklist; const DataLayout &DL = I->getModule()->getDataLayout(); @@ -5258,8 +5260,11 @@ static bool replaceAndRecursivelySimplifyImpl(Instruct // See if this instruction simplifies. SimpleV = SimplifyInstruction(I, {DL, TLI, DT, AC}); - if (!SimpleV) + if (!SimpleV) { + if (UnsimplifiedUsers) + UnsimplifiedUsers->insert(I); continue; + } Simplified = true; @@ -5285,16 +5290,17 @@ bool llvm::recursivelySimplifyInstruction(Instruction const TargetLibraryInfo *TLI, const DominatorTree *DT, AssumptionCache *AC) { - return replaceAndRecursivelySimplifyImpl(I, nullptr, TLI, DT, AC); + return replaceAndRecursivelySimplifyImpl(I, nullptr, TLI, DT, AC, nullptr); } -bool llvm::replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV, - const TargetLibraryInfo *TLI, - const DominatorTree *DT, - AssumptionCache *AC) { +bool llvm::replaceAndRecursivelySimplify( + Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI, + const DominatorTree *DT, AssumptionCache *AC, + SmallSetVector *UnsimplifiedUsers) { assert(I != SimpleV && "replaceAndRecursivelySimplify(X,X) is not valid!"); assert(SimpleV && "Must provide a simplified value."); - return replaceAndRecursivelySimplifyImpl(I, SimpleV, TLI, DT, AC); + return replaceAndRecursivelySimplifyImpl(I, SimpleV, TLI, DT, AC, + UnsimplifiedUsers); } namespace llvm { Modified: projects/clang900-import/contrib/llvm/lib/IR/Core.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/IR/Core.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/IR/Core.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -140,7 +140,16 @@ unsigned LLVMGetLastEnumAttributeKind(void) { LLVMAttributeRef LLVMCreateEnumAttribute(LLVMContextRef C, unsigned KindID, uint64_t Val) { - return wrap(Attribute::get(*unwrap(C), (Attribute::AttrKind)KindID, Val)); + auto &Ctx = *unwrap(C); + auto AttrKind = (Attribute::AttrKind)KindID; + + if (AttrKind == Attribute::AttrKind::ByVal) { + // After r362128, byval attributes need to have a type attribute. Provide a + // NULL one until a proper API is added for this. + return wrap(Attribute::getWithByValType(Ctx, NULL)); + } else { + return wrap(Attribute::get(Ctx, AttrKind, Val)); + } } unsigned LLVMGetEnumAttributeKind(LLVMAttributeRef A) { Modified: projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -10579,7 +10579,7 @@ static SDValue performPostLD1Combine(SDNode *N, // are predecessors to each other or the Vector. SmallPtrSet Visited; SmallVector Worklist; - Visited.insert(N); + Visited.insert(Addr.getNode()); Worklist.push_back(User); Worklist.push_back(LD); Worklist.push_back(Vector.getNode()); @@ -11993,6 +11993,14 @@ bool AArch64TargetLowering::isMaskAndCmp0FoldingBenefi if (!Mask) return false; return Mask->getValue().isPowerOf2(); +} + +bool AArch64TargetLowering::shouldExpandShift(SelectionDAG &DAG, + SDNode *N) const { + if (DAG.getMachineFunction().getFunction().hasMinSize() && + !Subtarget->isTargetWindows()) + return false; + return true; } void AArch64TargetLowering::initializeSplitCSR(MachineBasicBlock *Entry) const { Modified: projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.h ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.h Mon Sep 2 17:55:39 2019 (r351722) @@ -480,11 +480,7 @@ class AArch64TargetLowering : public TargetLowering { return VT.getSizeInBits() >= 64; // vector 'bic' } - bool shouldExpandShift(SelectionDAG &DAG, SDNode *N) const override { - if (DAG.getMachineFunction().getFunction().hasMinSize()) - return false; - return true; - } + bool shouldExpandShift(SelectionDAG &DAG, SDNode *N) const override; bool shouldTransformSignedTruncationCheck(EVT XVT, unsigned KeptBits) const override { Modified: projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -32,6 +32,7 @@ #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/IR/DebugLoc.h" #include "llvm/IR/GlobalValue.h" +#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCInstrDesc.h" #include "llvm/Support/Casting.h" @@ -1926,6 +1927,17 @@ bool AArch64InstrInfo::isCandidateToMergeOrPair(const // Check if this load/store has a hint to avoid pair formation. // MachineMemOperands hints are set by the AArch64StorePairSuppress pass. if (isLdStPairSuppressed(MI)) + return false; + + // Do not pair any callee-save store/reload instructions in the + // prologue/epilogue if the CFI information encoded the operations as separate + // instructions, as that will cause the size of the actual prologue to mismatch + // with the prologue size recorded in the Windows CFI. + const MCAsmInfo *MAI = MI.getMF()->getTarget().getMCAsmInfo(); + bool NeedsWinCFI = MAI->usesWindowsCFI() && + MI.getMF()->getFunction().needsUnwindTableEntry(); + if (NeedsWinCFI && (MI.getFlag(MachineInstr::FrameSetup) || + MI.getFlag(MachineInstr::FrameDestroy))) return false; // On some CPUs quad load/store pairs are slower than two single load/stores. Modified: projects/clang900-import/contrib/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -3625,8 +3625,25 @@ void MipsAsmParser::expandMemInst(MCInst &Inst, SMLoc TOut.emitRRR(isGP64bit() ? Mips::DADDu : Mips::ADDu, TmpReg, TmpReg, BaseReg, IDLoc, STI); TOut.emitRRI(Inst.getOpcode(), DstReg, TmpReg, LoOffset, IDLoc, STI); + return; + } + + assert(OffsetOp.isExpr() && "expected expression operand kind"); + if (inPicMode()) { + // FIXME: + // a) Fix lw/sw $reg, symbol($reg) instruction expanding. + // b) If expression includes offset (sym + number), do not + // encode the offset into a relocation. Take it in account + // in the last load/store instruction. + // c) Check that immediates of R_MIPS_GOT16/R_MIPS_LO16 relocations + // do not exceed 16-bit. + // d) Use R_MIPS_GOT_PAGE/R_MIPS_GOT_OFST relocations instead + // of R_MIPS_GOT_DISP in appropriate cases to reduce number + // of GOT entries. + expandLoadAddress(TmpReg, Mips::NoRegister, OffsetOp, !ABI.ArePtrs64bit(), + IDLoc, Out, STI); + TOut.emitRRI(Inst.getOpcode(), DstReg, TmpReg, 0, IDLoc, STI); } else { - assert(OffsetOp.isExpr() && "expected expression operand kind"); const MCExpr *ExprOffset = OffsetOp.getExpr(); MCOperand LoOperand = MCOperand::createExpr( MipsMCExpr::create(MipsMCExpr::MEK_LO, ExprOffset, getContext())); Modified: projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -179,6 +179,9 @@ bool RISCVDAGToDAGISel::SelectInlineAsmMemoryOperand( // operand and need no special handling. OutOps.push_back(Op); return false; + case InlineAsm::Constraint_A: + OutOps.push_back(Op); + return false; default: break; } Modified: projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelLowering.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelLowering.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelLowering.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -2413,6 +2413,8 @@ RISCVTargetLowering::getConstraintType(StringRef Const case 'J': case 'K': return C_Immediate; + case 'A': + return C_Memory; } } return TargetLowering::getConstraintType(Constraint); @@ -2440,6 +2442,21 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(cons } return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT); +} + +unsigned +RISCVTargetLowering::getInlineAsmMemConstraint(StringRef ConstraintCode) const { + // Currently only support length 1 constraints. + if (ConstraintCode.size() == 1) { + switch (ConstraintCode[0]) { + case 'A': + return InlineAsm::Constraint_A; + default: + break; + } + } + + return TargetLowering::getInlineAsmMemConstraint(ConstraintCode); } void RISCVTargetLowering::LowerAsmOperandForConstraint( Modified: projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelLowering.h ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelLowering.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/RISCV/RISCVISelLowering.h Mon Sep 2 17:55:39 2019 (r351722) @@ -93,6 +93,9 @@ class RISCVTargetLowering : public TargetLowering { (p const char *getTargetNodeName(unsigned Opcode) const override; ConstraintType getConstraintType(StringRef Constraint) const override; + + unsigned getInlineAsmMemConstraint(StringRef ConstraintCode) const override; + std::pair getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const override; Modified: projects/clang900-import/contrib/llvm/lib/Target/TargetMachine.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/TargetMachine.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/TargetMachine.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -140,8 +140,8 @@ bool TargetMachine::shouldAssumeDSOLocal(const Module // don't assume the variables to be DSO local unless we actually know // that for sure. This only has to be done for variables; for functions // the linker can insert thunks for calling functions from another DLL. - if (TT.isWindowsGNUEnvironment() && GV && GV->isDeclarationForLinker() && - isa(GV)) + if (TT.isWindowsGNUEnvironment() && TT.isOSBinFormatCOFF() && GV && + GV->isDeclarationForLinker() && isa(GV)) return false; // On COFF, don't mark 'extern_weak' symbols as DSO local. If these symbols @@ -154,7 +154,9 @@ bool TargetMachine::shouldAssumeDSOLocal(const Module // Make an exception for windows OS in the triple: Some firmware builds use // *-win32-macho triples. This (accidentally?) produced windows relocations // without GOT tables in older clang versions; Keep this behaviour. - if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO())) + // Some JIT users use *-win32-elf triples; these shouldn't use GOT tables + // either. + if (TT.isOSBinFormatCOFF() || TT.isOSWindows()) return true; // Most PIC code sequences that assume that a symbol is local cannot Modified: projects/clang900-import/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -5059,6 +5059,14 @@ bool X86TargetLowering::shouldFoldMaskToVariableShiftP return true; } +bool X86TargetLowering::shouldExpandShift(SelectionDAG &DAG, + SDNode *N) const { + if (DAG.getMachineFunction().getFunction().hasMinSize() && + !Subtarget.isOSWindows()) + return false; + return true; +} + bool X86TargetLowering::shouldSplatInsEltVarIndex(EVT VT) const { // Any legal vector type can be splatted more efficiently than // loading/spilling from memory. @@ -44096,7 +44104,8 @@ static SDValue combineScalarToVector(SDNode *N, Select // Simplify PMULDQ and PMULUDQ operations. static SDValue combinePMULDQ(SDNode *N, SelectionDAG &DAG, - TargetLowering::DAGCombinerInfo &DCI) { + TargetLowering::DAGCombinerInfo &DCI, + const X86Subtarget &Subtarget) { SDValue LHS = N->getOperand(0); SDValue RHS = N->getOperand(1); @@ -44106,8 +44115,9 @@ static SDValue combinePMULDQ(SDNode *N, SelectionDAG & return DAG.getNode(N->getOpcode(), SDLoc(N), N->getValueType(0), RHS, LHS); // Multiply by zero. + // Don't return RHS as it may contain UNDEFs. if (ISD::isBuildVectorAllZeros(RHS.getNode())) - return RHS; + return getZeroVector(N->getSimpleValueType(0), Subtarget, DAG, SDLoc(N)); // Aggressively peek through ops to get at the demanded low bits. APInt DemandedMask = APInt::getLowBitsSet(64, 32); @@ -44315,7 +44325,7 @@ SDValue X86TargetLowering::PerformDAGCombine(SDNode *N case X86ISD::PCMPEQ: case X86ISD::PCMPGT: return combineVectorCompare(N, DAG, Subtarget); case X86ISD::PMULDQ: - case X86ISD::PMULUDQ: return combinePMULDQ(N, DAG, DCI); + case X86ISD::PMULUDQ: return combinePMULDQ(N, DAG, DCI, Subtarget); } return SDValue(); Modified: projects/clang900-import/contrib/llvm/lib/Target/X86/X86ISelLowering.h ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/X86/X86ISelLowering.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/X86/X86ISelLowering.h Mon Sep 2 17:55:39 2019 (r351722) @@ -863,11 +863,7 @@ namespace llvm { return VTIsOk(XVT) && VTIsOk(KeptBitsVT); } - bool shouldExpandShift(SelectionDAG &DAG, SDNode *N) const override { - if (DAG.getMachineFunction().getFunction().hasMinSize()) - return false; - return true; - } + bool shouldExpandShift(SelectionDAG &DAG, SDNode *N) const override; bool shouldSplatInsEltVarIndex(EVT VT) const override; Modified: projects/clang900-import/contrib/llvm/lib/Target/X86/X86Subtarget.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Target/X86/X86Subtarget.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Target/X86/X86Subtarget.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -146,6 +146,9 @@ unsigned char X86Subtarget::classifyGlobalReference(co return X86II::MO_DLLIMPORT; return X86II::MO_COFFSTUB; } + // Some JIT users use *-win32-elf triples; these shouldn't use GOT tables. + if (isOSWindows()) + return X86II::MO_NO_FLAG; if (is64Bit()) { // ELF supports a large, truly PIC code model with non-PC relative GOT Modified: projects/clang900-import/contrib/llvm/lib/Transforms/Utils/LoopUnroll.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Transforms/Utils/LoopUnroll.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/lib/Transforms/Utils/LoopUnroll.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -711,7 +711,7 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopO auto setDest = [LoopExit, ContinueOnTrue](BasicBlock *Src, BasicBlock *Dest, ArrayRef NextBlocks, - BasicBlock *CurrentHeader, + BasicBlock *BlockInLoop, bool NeedConditional) { auto *Term = cast(Src->getTerminator()); if (NeedConditional) { @@ -723,7 +723,9 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopO if (Dest != LoopExit) { BasicBlock *BB = Src; for (BasicBlock *Succ : successors(BB)) { - if (Succ == CurrentHeader) + // Preserve the incoming value from BB if we are jumping to the block + // in the current loop. + if (Succ == BlockInLoop) continue; for (PHINode &Phi : Succ->phis()) Phi.removeIncomingValue(BB, false); @@ -794,7 +796,7 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopO // unconditional branch for some iterations. NeedConditional = false; - setDest(Headers[i], Dest, Headers, Headers[i], NeedConditional); + setDest(Headers[i], Dest, Headers, HeaderSucc[i], NeedConditional); } // Set up latches to branch to the new header in the unrolled iterations or Modified: projects/clang900-import/contrib/llvm/tools/clang/include/clang/Frontend/LangStandards.def ============================================================================== --- projects/clang900-import/contrib/llvm/tools/clang/include/clang/Frontend/LangStandards.def Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/clang/include/clang/Frontend/LangStandards.def Mon Sep 2 17:55:39 2019 (r351722) @@ -165,7 +165,7 @@ LANGSTANDARD(opencl12, "cl1.2", LANGSTANDARD(opencl20, "cl2.0", OpenCL, "OpenCL 2.0", LineComment | C99 | Digraphs | HexFloat | OpenCL) -LANGSTANDARD(openclcpp, "c++", +LANGSTANDARD(openclcpp, "clc++", OpenCL, "C++ for OpenCL", LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus17 | Digraphs | HexFloat | OpenCL) Modified: projects/clang900-import/contrib/llvm/tools/clang/lib/Basic/Targets/RISCV.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/tools/clang/lib/Basic/Targets/RISCV.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/clang/lib/Basic/Targets/RISCV.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -60,6 +60,10 @@ bool RISCVTargetInfo::validateAsmConstraint( // A floating-point register. Info.setAllowsRegister(); return true; + case 'A': + // An address that is held in a general-purpose register. + Info.setAllowsMemory(); + return true; } } Modified: projects/clang900-import/contrib/llvm/tools/clang/lib/Basic/Targets/RISCV.h ============================================================================== --- projects/clang900-import/contrib/llvm/tools/clang/lib/Basic/Targets/RISCV.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/clang/lib/Basic/Targets/RISCV.h Mon Sep 2 17:55:39 2019 (r351722) @@ -93,6 +93,13 @@ class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : publ } return false; } + + void setMaxAtomicWidth() override { + MaxAtomicPromoteWidth = 128; + + if (HasA) + MaxAtomicInlineWidth = 32; + } }; class LLVM_LIBRARY_VISIBILITY RISCV64TargetInfo : public RISCVTargetInfo { public: @@ -109,6 +116,13 @@ class LLVM_LIBRARY_VISIBILITY RISCV64TargetInfo : publ return true; } return false; + } + + void setMaxAtomicWidth() override { + MaxAtomicPromoteWidth = 128; + + if (HasA) + MaxAtomicInlineWidth = 64; } }; } // namespace targets Modified: projects/clang900-import/contrib/llvm/tools/clang/lib/Headers/opencl-c.h ============================================================================== --- projects/clang900-import/contrib/llvm/tools/clang/lib/Headers/opencl-c.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/clang/lib/Headers/opencl-c.h Mon Sep 2 17:55:39 2019 (r351722) @@ -15350,7 +15350,7 @@ ndrange_t __ovld ndrange_3D(const size_t[3]); ndrange_t __ovld ndrange_3D(const size_t[3], const size_t[3]); ndrange_t __ovld ndrange_3D(const size_t[3], const size_t[3], const size_t[3]); -int __ovld enqueue_marker(queue_t, uint, const __private clk_event_t*, __private clk_event_t*); +int __ovld enqueue_marker(queue_t, uint, const clk_event_t*, clk_event_t*); void __ovld retain_event(clk_event_t); Modified: projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -1225,7 +1225,8 @@ static bool checkTupleLikeDecomposition(Sema &S, if (E.isInvalid()) return true; RefVD->setInit(E.get()); - RefVD->checkInitIsICE(); + if (!E.get()->isValueDependent()) + RefVD->checkInitIsICE(); E = S.BuildDeclarationNameExpr(CXXScopeSpec(), DeclarationNameInfo(B->getDeclName(), Loc), Modified: projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -4692,6 +4692,7 @@ SubstDefaultTemplateArgument(Sema &SemaRef, for (unsigned i = 0, e = Param->getDepth(); i != e; ++i) TemplateArgLists.addOuterTemplateArguments(None); + Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext()); EnterExpressionEvaluationContext ConstantEvaluated( SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); return SemaRef.SubstExpr(Param->getDefaultArgument(), TemplateArgLists); Modified: projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -7390,8 +7390,22 @@ static void deduceOpenCLImplicitAddrSpace(TypeProcessi bool IsPointee = ChunkIndex > 0 && (D.getTypeObject(ChunkIndex - 1).Kind == DeclaratorChunk::Pointer || - D.getTypeObject(ChunkIndex - 1).Kind == DeclaratorChunk::BlockPointer || - D.getTypeObject(ChunkIndex - 1).Kind == DeclaratorChunk::Reference); + D.getTypeObject(ChunkIndex - 1).Kind == DeclaratorChunk::Reference || + D.getTypeObject(ChunkIndex - 1).Kind == DeclaratorChunk::BlockPointer); + // For pointers/references to arrays the next chunk is always an array + // followed by any number of parentheses. + if (!IsPointee && ChunkIndex > 1) { + auto AdjustedCI = ChunkIndex - 1; + if (D.getTypeObject(AdjustedCI).Kind == DeclaratorChunk::Array) + AdjustedCI--; + // Skip over all parentheses. + while (AdjustedCI > 0 && + D.getTypeObject(AdjustedCI).Kind == DeclaratorChunk::Paren) + AdjustedCI--; + if (D.getTypeObject(AdjustedCI).Kind == DeclaratorChunk::Pointer || + D.getTypeObject(AdjustedCI).Kind == DeclaratorChunk::Reference) + IsPointee = true; + } bool IsFuncReturnType = ChunkIndex > 0 && D.getTypeObject(ChunkIndex - 1).Kind == DeclaratorChunk::Function; Modified: projects/clang900-import/contrib/llvm/tools/lld/CMakeLists.txt ============================================================================== --- projects/clang900-import/contrib/llvm/tools/lld/CMakeLists.txt Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/lld/CMakeLists.txt Mon Sep 2 17:55:39 2019 (r351722) @@ -56,7 +56,6 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) include(HandleLLVMOptions) if(LLVM_INCLUDE_TESTS) - set(Python_ADDITIONAL_VERSIONS 2.7) include(FindPythonInterp) if(NOT PYTHONINTERP_FOUND) message(FATAL_ERROR Modified: projects/clang900-import/contrib/llvm/tools/lld/COFF/Config.h ============================================================================== --- projects/clang900-import/contrib/llvm/tools/lld/COFF/Config.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/lld/COFF/Config.h Mon Sep 2 17:55:39 2019 (r351722) @@ -189,6 +189,7 @@ struct Configuration { // Used for /thinlto-object-suffix-replace: std::pair thinLTOObjectSuffixReplace; + uint64_t align = 4096; uint64_t imageBase = -1; uint64_t fileAlign = 512; uint64_t stackReserve = 1024 * 1024; Modified: projects/clang900-import/contrib/llvm/tools/lld/COFF/Driver.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/tools/lld/COFF/Driver.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/lld/COFF/Driver.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -36,6 +36,7 @@ #include "llvm/Option/Option.h" #include "llvm/Support/Debug.h" #include "llvm/Support/LEB128.h" +#include "llvm/Support/MathExtras.h" #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" #include "llvm/Support/TarWriter.h" @@ -270,13 +271,12 @@ void LinkerDriver::addArchiveBuffer(MemoryBufferRef mb } void LinkerDriver::enqueueArchiveMember(const Archive::Child &c, - StringRef symName, + const Archive::Symbol &sym, StringRef parentName) { - auto reportBufferError = [=](Error &&e, - StringRef childName) { + auto reportBufferError = [=](Error &&e, StringRef childName) { fatal("could not get the buffer for the member defining symbol " + - symName + ": " + parentName + "(" + childName + "): " + + toCOFFString(sym) + ": " + parentName + "(" + childName + "): " + toString(std::move(e))); }; @@ -287,7 +287,8 @@ void LinkerDriver::enqueueArchiveMember(const Archive: reportBufferError(mbOrErr.takeError(), check(c.getFullName())); MemoryBufferRef mb = mbOrErr.get(); enqueueTask([=]() { - driver->addArchiveBuffer(mb, symName, parentName, offsetInArchive); + driver->addArchiveBuffer(mb, toCOFFString(sym), parentName, + offsetInArchive); }); return; } @@ -295,15 +296,16 @@ void LinkerDriver::enqueueArchiveMember(const Archive: std::string childName = CHECK( c.getFullName(), "could not get the filename for the member defining symbol " + - symName); + toCOFFString(sym)); auto future = std::make_shared>( createFutureForFile(childName)); enqueueTask([=]() { auto mbOrErr = future->get(); if (mbOrErr.second) reportBufferError(errorCodeToError(mbOrErr.second), childName); - driver->addArchiveBuffer(takeBuffer(std::move(mbOrErr.first)), symName, - parentName, /* OffsetInArchive */ 0); + driver->addArchiveBuffer(takeBuffer(std::move(mbOrErr.first)), + toCOFFString(sym), parentName, + /*OffsetInArchive=*/0); }); } @@ -1053,6 +1055,12 @@ void LinkerDriver::maybeExportMinGWSymbols(const opt:: }); } +static const char *libcallRoutineNames[] = { +#define HANDLE_LIBCALL(code, name) name, +#include "llvm/IR/RuntimeLibcalls.def" +#undef HANDLE_LIBCALL +}; + void LinkerDriver::link(ArrayRef argsArr) { // Needed for LTO. InitializeAllTargetInfos(); @@ -1421,6 +1429,13 @@ void LinkerDriver::link(ArrayRef argsArr for (auto *arg : args.filtered(OPT_section)) parseSection(arg->getValue()); + // Handle /align + if (auto *arg = args.getLastArg(OPT_align)) { + parseNumbers(arg->getValue(), &config->align); + if (!isPowerOf2_64(config->align)) + error("/align: not a power of two: " + StringRef(arg->getValue())); + } + // Handle /aligncomm for (auto *arg : args.filtered(OPT_aligncomm)) parseAligncomm(arg->getValue()); @@ -1747,6 +1762,15 @@ void LinkerDriver::link(ArrayRef argsArr if (!u->weakAlias) u->weakAlias = symtab->addUndefined(to); } + + // If any inputs are bitcode files, the LTO code generator may create + // references to library functions that are not explicit in the bitcode + // file's symbol table. If any of those library functions are defined in a + // bitcode file in an archive member, we need to arrange to use LTO to + // compile those archive members by adding them to the link beforehand. + if (!BitcodeFile::instances.empty()) + for (const char *s : libcallRoutineNames) + symtab->addLibcall(s); // Windows specific -- if __load_config_used can be resolved, resolve it. if (symtab->findUnderscore("_load_config_used")) Modified: projects/clang900-import/contrib/llvm/tools/lld/COFF/Driver.h ============================================================================== --- projects/clang900-import/contrib/llvm/tools/lld/COFF/Driver.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/lld/COFF/Driver.h Mon Sep 2 17:55:39 2019 (r351722) @@ -72,7 +72,7 @@ class LinkerDriver { (public) void parseDirectives(InputFile *file); // Used by ArchiveFile to enqueue members. - void enqueueArchiveMember(const Archive::Child &c, StringRef symName, + void enqueueArchiveMember(const Archive::Child &c, const Archive::Symbol &sym, StringRef parentName); MemoryBufferRef takeBuffer(std::unique_ptr mb); Modified: projects/clang900-import/contrib/llvm/tools/lld/COFF/InputFiles.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/tools/lld/COFF/InputFiles.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/lld/COFF/InputFiles.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -85,16 +85,16 @@ void ArchiveFile::parse() { } // Returns a buffer pointing to a member file containing a given symbol. -void ArchiveFile::addMember(const Archive::Symbol *sym) { +void ArchiveFile::addMember(const Archive::Symbol &sym) { const Archive::Child &c = - CHECK(sym->getMember(), - "could not get the member for symbol " + sym->getName()); + CHECK(sym.getMember(), + "could not get the member for symbol " + toCOFFString(sym)); // Return an empty buffer if we have already returned the same buffer. if (!seen.insert(c.getChildOffset()).second) return; - driver->enqueueArchiveMember(c, sym->getName(), getName()); + driver->enqueueArchiveMember(c, sym, getName()); } std::vector getArchiveMembers(Archive *file) { Modified: projects/clang900-import/contrib/llvm/tools/lld/COFF/InputFiles.h ============================================================================== --- projects/clang900-import/contrib/llvm/tools/lld/COFF/InputFiles.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/lld/COFF/InputFiles.h Mon Sep 2 17:55:39 2019 (r351722) @@ -96,7 +96,7 @@ class ArchiveFile : public InputFile { (public) // Enqueues an archive member load for the given symbol. If we've already // enqueued a load for the same archive member, this function does nothing, // which ensures that we don't load the same member more than once. - void addMember(const Archive::Symbol *sym); + void addMember(const Archive::Symbol &sym); private: std::unique_ptr file; Modified: projects/clang900-import/contrib/llvm/tools/lld/COFF/SymbolTable.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/tools/lld/COFF/SymbolTable.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/lld/COFF/SymbolTable.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -179,7 +179,7 @@ void SymbolTable::loadMinGWAutomaticImports() { log("Loading lazy " + l->getName() + " from " + l->file->getName() + " for automatic import"); l->pendingArchiveLoad = true; - l->file->addMember(&l->sym); + l->file->addMember(l->sym); } } @@ -363,13 +363,13 @@ Symbol *SymbolTable::addUndefined(StringRef name, Inpu if (auto *l = dyn_cast(s)) { if (!s->pendingArchiveLoad) { s->pendingArchiveLoad = true; - l->file->addMember(&l->sym); + l->file->addMember(l->sym); } } return s; } -void SymbolTable::addLazy(ArchiveFile *f, const Archive::Symbol sym) { +void SymbolTable::addLazy(ArchiveFile *f, const Archive::Symbol &sym) { StringRef name = sym.getName(); Symbol *s; bool wasInserted; @@ -382,7 +382,7 @@ void SymbolTable::addLazy(ArchiveFile *f, const Archiv if (!u || u->weakAlias || s->pendingArchiveLoad) return; s->pendingArchiveLoad = true; - f->addMember(&sym); + f->addMember(sym); } void SymbolTable::reportDuplicate(Symbol *existing, InputFile *newFile) { @@ -503,6 +503,18 @@ Symbol *SymbolTable::addImportThunk(StringRef name, De reportDuplicate(s, id->file); return nullptr; +} + +void SymbolTable::addLibcall(StringRef name) { + Symbol *sym = findUnderscore(name); + if (!sym) + return; + + if (Lazy *l = dyn_cast(sym)) { + MemoryBufferRef mb = l->getMemberBuffer(); + if (identify_magic(mb.getBuffer()) == llvm::file_magic::bitcode) + addUndefined(sym->getName()); + } } std::vector SymbolTable::getChunks() { Modified: projects/clang900-import/contrib/llvm/tools/lld/COFF/SymbolTable.h ============================================================================== --- projects/clang900-import/contrib/llvm/tools/lld/COFF/SymbolTable.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/lld/COFF/SymbolTable.h Mon Sep 2 17:55:39 2019 (r351722) @@ -83,7 +83,7 @@ class SymbolTable { (public) Symbol *addAbsolute(StringRef n, uint64_t va); Symbol *addUndefined(StringRef name, InputFile *f, bool isWeakAlias); - void addLazy(ArchiveFile *f, const Archive::Symbol sym); + void addLazy(ArchiveFile *f, const Archive::Symbol &sym); Symbol *addAbsolute(StringRef n, COFFSymbolRef s); Symbol *addRegular(InputFile *f, StringRef n, const llvm::object::coff_symbol_generic *s = nullptr, @@ -97,6 +97,7 @@ class SymbolTable { (public) Symbol *addImportData(StringRef n, ImportFile *f); Symbol *addImportThunk(StringRef name, DefinedImportData *s, uint16_t machine); + void addLibcall(StringRef name); void reportDuplicate(Symbol *existing, InputFile *newFile); Modified: projects/clang900-import/contrib/llvm/tools/lld/COFF/Symbols.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/tools/lld/COFF/Symbols.cpp Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/lld/COFF/Symbols.cpp Mon Sep 2 17:55:39 2019 (r351722) @@ -20,18 +20,23 @@ using namespace llvm::object; using namespace lld::coff; +namespace lld { + static_assert(sizeof(SymbolUnion) <= 48, "symbols should be optimized for memory usage"); // Returns a symbol name for an error message. -std::string lld::toString(coff::Symbol &b) { +static std::string demangle(StringRef symName) { if (config->demangle) - if (Optional s = lld::demangleMSVC(b.getName())) + if (Optional s = demangleMSVC(symName)) return *s; - return b.getName(); + return symName; } +std::string toString(coff::Symbol &b) { return demangle(b.getName()); } +std::string toCOFFString(const Archive::Symbol &b) { + return demangle(b.getName()); +} -namespace lld { namespace coff { StringRef Symbol::getName() { @@ -112,6 +117,15 @@ Defined *Undefined::getWeakAlias() { if (auto *d = dyn_cast(a)) return d; return nullptr; +} + +MemoryBufferRef Lazy::getMemberBuffer() { + Archive::Child c = + CHECK(sym.getMember(), + "could not get the member for symbol " + toCOFFString(sym)); + return CHECK(c.getMemoryBufferRef(), + "could not get the buffer for the member defining symbol " + + toCOFFString(sym)); } } // namespace coff } // namespace lld Modified: projects/clang900-import/contrib/llvm/tools/lld/COFF/Symbols.h ============================================================================== --- projects/clang900-import/contrib/llvm/tools/lld/COFF/Symbols.h Mon Sep 2 17:49:42 2019 (r351721) +++ projects/clang900-import/contrib/llvm/tools/lld/COFF/Symbols.h Mon Sep 2 17:55:39 2019 (r351722) @@ -21,6 +21,14 @@ #include namespace lld { + +std::string toString(coff::Symbol &b); + +// There are two different ways to convert an Archive::Symbol to a string: +// One for Microsoft name mangling and one for Itanium name mangling. +// Call the functions toCOFFString and toELFString, not just toString. +std::string toCOFFString(const coff::Archive::Symbol &b); + namespace coff { using llvm::object::Archive; @@ -257,6 +265,8 @@ class Lazy : public Symbol { (public) static bool classof(const Symbol *s) { return s->kind() == LazyKind; } + MemoryBufferRef getMemberBuffer(); + ArchiveFile *file; private: @@ -429,7 +439,6 @@ void replaceSymbol(Symbol *s, ArgT &&... arg) { } } // namespace coff -std::string toString(coff::Symbol &b); } // namespace lld #endif *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***