diff options
Diffstat (limited to 'lib/Support')
| -rw-r--r-- | lib/Support/ErrorHandling.cpp | 22 | ||||
| -rw-r--r-- | lib/Support/Host.cpp | 41 | ||||
| -rw-r--r-- | lib/Support/Path.cpp | 2 | ||||
| -rw-r--r-- | lib/Support/TargetParser.cpp | 2 | ||||
| -rw-r--r-- | lib/Support/YAMLTraits.cpp | 8 | ||||
| -rw-r--r-- | lib/Support/raw_ostream.cpp | 29 | 
6 files changed, 67 insertions, 37 deletions
| diff --git a/lib/Support/ErrorHandling.cpp b/lib/Support/ErrorHandling.cpp index fe69151665c68..2fd4f3ea0d452 100644 --- a/lib/Support/ErrorHandling.cpp +++ b/lib/Support/ErrorHandling.cpp @@ -45,22 +45,36 @@ static void *ErrorHandlerUserData = nullptr;  static fatal_error_handler_t BadAllocErrorHandler = nullptr;  static void *BadAllocErrorHandlerUserData = nullptr; +#if LLVM_ENABLE_THREADS == 1  // Mutexes to synchronize installing error handlers and calling error handlers.  // Do not use ManagedStatic, or that may allocate memory while attempting to  // report an OOM. +// +// This usage of std::mutex has to be conditionalized behind ifdefs because +// of this script: +//   compiler-rt/lib/sanitizer_common/symbolizer/scripts/build_symbolizer.sh +// That script attempts to statically link the LLVM symbolizer library with the +// STL and hide all of its symbols with 'opt -internalize'. To reduce size, it +// cuts out the threading portions of the hermetic copy of libc++ that it +// builds. We can remove these ifdefs if that script goes away.  static std::mutex ErrorHandlerMutex;  static std::mutex BadAllocErrorHandlerMutex; +#endif  void llvm::install_fatal_error_handler(fatal_error_handler_t handler,                                         void *user_data) { +#if LLVM_ENABLE_THREADS == 1    std::lock_guard<std::mutex> Lock(ErrorHandlerMutex); +#endif    assert(!ErrorHandler && "Error handler already registered!\n");    ErrorHandler = handler;    ErrorHandlerUserData = user_data;  }  void llvm::remove_fatal_error_handler() { +#if LLVM_ENABLE_THREADS == 1    std::lock_guard<std::mutex> Lock(ErrorHandlerMutex); +#endif    ErrorHandler = nullptr;    ErrorHandlerUserData = nullptr;  } @@ -83,7 +97,9 @@ void llvm::report_fatal_error(const Twine &Reason, bool GenCrashDiag) {    {      // Only acquire the mutex while reading the handler, so as not to invoke a      // user-supplied callback under a lock. +#if LLVM_ENABLE_THREADS == 1      std::lock_guard<std::mutex> Lock(ErrorHandlerMutex); +#endif      handler = ErrorHandler;      handlerData = ErrorHandlerUserData;    } @@ -112,14 +128,18 @@ void llvm::report_fatal_error(const Twine &Reason, bool GenCrashDiag) {  void llvm::install_bad_alloc_error_handler(fatal_error_handler_t handler,                                             void *user_data) { +#if LLVM_ENABLE_THREADS == 1    std::lock_guard<std::mutex> Lock(BadAllocErrorHandlerMutex); +#endif    assert(!ErrorHandler && "Bad alloc error handler already registered!\n");    BadAllocErrorHandler = handler;    BadAllocErrorHandlerUserData = user_data;  }  void llvm::remove_bad_alloc_error_handler() { +#if LLVM_ENABLE_THREADS == 1    std::lock_guard<std::mutex> Lock(BadAllocErrorHandlerMutex); +#endif    BadAllocErrorHandler = nullptr;    BadAllocErrorHandlerUserData = nullptr;  } @@ -130,7 +150,9 @@ void llvm::report_bad_alloc_error(const char *Reason, bool GenCrashDiag) {    {      // Only acquire the mutex while reading the handler, so as not to invoke a      // user-supplied callback under a lock. +#if LLVM_ENABLE_THREADS == 1      std::lock_guard<std::mutex> Lock(BadAllocErrorHandlerMutex); +#endif      Handler = BadAllocErrorHandler;      HandlerData = BadAllocErrorHandlerUserData;    } diff --git a/lib/Support/Host.cpp b/lib/Support/Host.cpp index 9f22f89b3c9ef..5cf0316d4d718 100644 --- a/lib/Support/Host.cpp +++ b/lib/Support/Host.cpp @@ -250,6 +250,8 @@ StringRef sys::detail::getHostCPUNameForS390x(          Pos += sizeof("machine = ") - 1;          unsigned int Id;          if (!Lines[I].drop_front(Pos).getAsInteger(10, Id)) { +          if (Id >= 3906 && HaveVectorSupport) +            return "z14";            if (Id >= 2964 && HaveVectorSupport)              return "z13";            if (Id >= 2827) @@ -460,8 +462,8 @@ static bool getX86CpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX,  static bool getX86CpuIDAndInfoEx(unsigned value, unsigned subleaf,                                   unsigned *rEAX, unsigned *rEBX, unsigned *rECX,                                   unsigned *rEDX) { -#if defined(__x86_64__) || defined(_M_X64)  #if defined(__GNUC__) || defined(__clang__) +#if defined(__x86_64__)    // gcc doesn't know cpuid would clobber ebx/rbx. Preserve it manually.    // FIXME: should we save this for Clang?    __asm__("movq\t%%rbx, %%rsi\n\t" @@ -470,43 +472,24 @@ static bool getX86CpuIDAndInfoEx(unsigned value, unsigned subleaf,            : "=a"(*rEAX), "=S"(*rEBX), "=c"(*rECX), "=d"(*rEDX)            : "a"(value), "c"(subleaf));    return false; -#elif defined(_MSC_VER) -  int registers[4]; -  __cpuidex(registers, value, subleaf); -  *rEAX = registers[0]; -  *rEBX = registers[1]; -  *rECX = registers[2]; -  *rEDX = registers[3]; -  return false; -#else -  return true; -#endif -#elif defined(__i386__) || defined(_M_IX86) -#if defined(__GNUC__) || defined(__clang__) +#elif defined(__i386__)    __asm__("movl\t%%ebx, %%esi\n\t"            "cpuid\n\t"            "xchgl\t%%ebx, %%esi\n\t"            : "=a"(*rEAX), "=S"(*rEBX), "=c"(*rECX), "=d"(*rEDX)            : "a"(value), "c"(subleaf));    return false; -#elif defined(_MSC_VER) -  __asm { -      mov   eax,value -      mov   ecx,subleaf -      cpuid -      mov   esi,rEAX -      mov   dword ptr [esi],eax -      mov   esi,rEBX -      mov   dword ptr [esi],ebx -      mov   esi,rECX -      mov   dword ptr [esi],ecx -      mov   esi,rEDX -      mov   dword ptr [esi],edx -  } -  return false;  #else    return true;  #endif +#elif defined(_MSC_VER) +  int registers[4]; +  __cpuidex(registers, value, subleaf); +  *rEAX = registers[0]; +  *rEBX = registers[1]; +  *rECX = registers[2]; +  *rEDX = registers[3]; +  return false;  #else    return true;  #endif diff --git a/lib/Support/Path.cpp b/lib/Support/Path.cpp index e58f856ca244e..ea59ba62d7bdf 100644 --- a/lib/Support/Path.cpp +++ b/lib/Support/Path.cpp @@ -13,8 +13,6 @@  #include "llvm/Support/Path.h"  #include "llvm/ADT/ArrayRef.h" -#include "llvm/BinaryFormat/COFF.h" -#include "llvm/BinaryFormat/MachO.h"  #include "llvm/Support/Endian.h"  #include "llvm/Support/Errc.h"  #include "llvm/Support/ErrorHandling.h" diff --git a/lib/Support/TargetParser.cpp b/lib/Support/TargetParser.cpp index 13bb6f23bc83f..e8ef1d2fd8b9b 100644 --- a/lib/Support/TargetParser.cpp +++ b/lib/Support/TargetParser.cpp @@ -452,6 +452,8 @@ bool llvm::AArch64::getExtensionFeatures(unsigned Extensions,      Features.push_back("+ras");    if (Extensions & AArch64::AEK_LSE)      Features.push_back("+lse"); +  if (Extensions & AArch64::AEK_SVE) +    Features.push_back("+sve");    return true;  } diff --git a/lib/Support/YAMLTraits.cpp b/lib/Support/YAMLTraits.cpp index 601084f9eae3c..65eda246a7fea 100644 --- a/lib/Support/YAMLTraits.cpp +++ b/lib/Support/YAMLTraits.cpp @@ -60,6 +60,14 @@ Input::Input(StringRef InputContent, void *Ctxt,    DocIterator = Strm->begin();  } +Input::Input(MemoryBufferRef Input, void *Ctxt, +             SourceMgr::DiagHandlerTy DiagHandler, void *DiagHandlerCtxt) +    : IO(Ctxt), Strm(new Stream(Input, SrcMgr, false, &EC)) { +  if (DiagHandler) +    SrcMgr.setDiagHandler(DiagHandler, DiagHandlerCtxt); +  DocIterator = Strm->begin(); +} +  Input::~Input() = default;  std::error_code Input::error() { return EC; } diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index 9480cd46d28fc..dd58eccee9579 100644 --- a/lib/Support/raw_ostream.cpp +++ b/lib/Support/raw_ostream.cpp @@ -326,13 +326,30 @@ raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) {  }  raw_ostream &raw_ostream::operator<<(const FormattedString &FS) { -  unsigned Len = FS.Str.size();  -  int PadAmount = FS.Width - Len; -  if (FS.RightJustify && (PadAmount > 0)) -    this->indent(PadAmount); -  this->operator<<(FS.Str); -  if (!FS.RightJustify && (PadAmount > 0)) +  if (FS.Str.size() >= FS.Width || FS.Justify == FormattedString::JustifyNone) { +    this->operator<<(FS.Str); +    return *this; +  } +  const size_t Difference = FS.Width - FS.Str.size(); +  switch (FS.Justify) { +  case FormattedString::JustifyLeft: +    this->operator<<(FS.Str); +    this->indent(Difference); +    break; +  case FormattedString::JustifyRight: +    this->indent(Difference); +    this->operator<<(FS.Str); +    break; +  case FormattedString::JustifyCenter: { +    int PadAmount = Difference / 2;      this->indent(PadAmount); +    this->operator<<(FS.Str); +    this->indent(Difference - PadAmount); +    break; +  } +  default: +    llvm_unreachable("Bad Justification"); +  }    return *this;  } | 
