Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 Sep 2019 17:55:40 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
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...
Message-ID:  <201909021755.x82HteWI026045@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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<char_class_type>(_ISbit(15));
+    static const mask __regex_word = static_cast<mask>(_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 <pthread.h>
 # include <sched.h>
 #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<Instruction *, 8> *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<Instruction *, 8> *UnsimplifiedUsers = nullptr) {
   bool Simplified = false;
   SmallSetVector<Instruction *, 8> 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<Instruction *, 8> *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<const SDNode *, 32> Visited;
     SmallVector<const SDNode *, 16> 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<unsigned, const TargetRegisterClass *>
   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<GlobalVariable>(GV))
+  if (TT.isWindowsGNUEnvironment() && TT.isOSBinFormatCOFF() && GV &&
+      GV->isDeclarationForLinker() && isa<GlobalVariable>(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<BasicBlock *> NextBlocks,
-                                            BasicBlock *CurrentHeader,
+                                            BasicBlock *BlockInLoop,
                                             bool NeedConditional) {
     auto *Term = cast<BranchInst>(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<llvm::StringRef, llvm::StringRef> 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<std::future<MBErrPair>>(
       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<const char *> argsArr) {
   // Needed for LTO.
   InitializeAllTargetInfos();
@@ -1421,6 +1429,13 @@ void LinkerDriver::link(ArrayRef<const char *> 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<const char *> 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<MemoryBuffer> 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<MemoryBufferRef> 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<Archive> 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<Lazy>(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<Lazy>(sym)) {
+    MemoryBufferRef mb = l->getMemberBuffer();
+    if (identify_magic(mb.getBuffer()) == llvm::file_magic::bitcode)
+      addUndefined(sym->getName());
+  }
 }
 
 std::vector<Chunk *> 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<std::string> s = lld::demangleMSVC(b.getName()))
+    if (Optional<std::string> 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<Defined>(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 <vector>
 
 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 ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201909021755.x82HteWI026045>