diff options
Diffstat (limited to 'lib/Support')
| -rw-r--r-- | lib/Support/APFloat.cpp | 67 | ||||
| -rw-r--r-- | lib/Support/APInt.cpp | 9 | ||||
| -rw-r--r-- | lib/Support/BinaryStreamReader.cpp | 6 | ||||
| -rw-r--r-- | lib/Support/CachePruning.cpp | 55 | ||||
| -rw-r--r-- | lib/Support/CommandLine.cpp | 11 | ||||
| -rw-r--r-- | lib/Support/DataExtractor.cpp | 7 | ||||
| -rw-r--r-- | lib/Support/GraphWriter.cpp | 19 | ||||
| -rw-r--r-- | lib/Support/Triple.cpp | 2 | ||||
| -rw-r--r-- | lib/Support/Unix/Host.inc | 6 | ||||
| -rw-r--r-- | lib/Support/Unix/Memory.inc | 4 | ||||
| -rw-r--r-- | lib/Support/Unix/Program.inc | 13 | ||||
| -rw-r--r-- | lib/Support/Windows/Host.inc | 10 | ||||
| -rw-r--r-- | lib/Support/YAMLParser.cpp | 58 | ||||
| -rw-r--r-- | lib/Support/YAMLTraits.cpp | 50 | ||||
| -rw-r--r-- | lib/Support/raw_ostream.cpp | 4 | 
15 files changed, 207 insertions, 114 deletions
diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp index f36c25a0ce914..deb76cb565d1e 100644 --- a/lib/Support/APFloat.cpp +++ b/lib/Support/APFloat.cpp @@ -37,10 +37,6 @@  using namespace llvm; -// TODO: Remove these and use APInt qualified types directly. -typedef APInt::WordType integerPart; -const unsigned int integerPartWidth = APInt::APINT_BITS_PER_WORD; -  /// A macro used to combine two fcCategory enums into one key which can be used  /// in a switch statement to classify how the interaction of two APFloat's  /// categories affects an operation. @@ -51,7 +47,7 @@ const unsigned int integerPartWidth = APInt::APINT_BITS_PER_WORD;  /* Assumed in hexadecimal significand parsing, and conversion to     hexadecimal strings.  */ -static_assert(integerPartWidth % 4 == 0, "Part width must be divisible by 4!"); +static_assert(APFloatBase::integerPartWidth % 4 == 0, "Part width must be divisible by 4!");  namespace llvm {    /* Represents floating point arithmetic semantics.  */ @@ -153,8 +149,7 @@ namespace llvm {    const unsigned int maxExponent = 16383;    const unsigned int maxPrecision = 113;    const unsigned int maxPowerOfFiveExponent = maxExponent + maxPrecision - 1; -  const unsigned int maxPowerOfFiveParts = 2 + ((maxPowerOfFiveExponent * 815) -                                                / (351 * integerPartWidth)); +  const unsigned int maxPowerOfFiveParts = 2 + ((maxPowerOfFiveExponent * 815) / (351 * APFloatBase::integerPartWidth));    unsigned int APFloatBase::semanticsPrecision(const fltSemantics &semantics) {      return semantics.precision; @@ -180,7 +175,7 @@ namespace llvm {  static inline unsigned int  partCountForBits(unsigned int bits)  { -  return ((bits) + integerPartWidth - 1) / integerPartWidth; +  return ((bits) + APFloatBase::integerPartWidth - 1) / APFloatBase::integerPartWidth;  }  /* Returns 0U-9U.  Return values >= 10U are not digits.  */ @@ -420,7 +415,7 @@ trailingHexadecimalFraction(StringRef::iterator p, StringRef::iterator end,  /* Return the fraction lost were a bignum truncated losing the least     significant BITS bits.  */  static lostFraction -lostFractionThroughTruncation(const integerPart *parts, +lostFractionThroughTruncation(const APFloatBase::integerPart *parts,                                unsigned int partCount,                                unsigned int bits)  { @@ -433,7 +428,7 @@ lostFractionThroughTruncation(const integerPart *parts,      return lfExactlyZero;    if (bits == lsb + 1)      return lfExactlyHalf; -  if (bits <= partCount * integerPartWidth && +  if (bits <= partCount * APFloatBase::integerPartWidth &&        APInt::tcExtractBit(parts, bits - 1))      return lfMoreThanHalf; @@ -442,7 +437,7 @@ lostFractionThroughTruncation(const integerPart *parts,  /* Shift DST right BITS bits noting lost fraction.  */  static lostFraction -shiftRight(integerPart *dst, unsigned int parts, unsigned int bits) +shiftRight(APFloatBase::integerPart *dst, unsigned int parts, unsigned int bits)  {    lostFraction lost_fraction; @@ -489,22 +484,22 @@ HUerrBound(bool inexactMultiply, unsigned int HUerr1, unsigned int HUerr2)  /* The number of ulps from the boundary (zero, or half if ISNEAREST)     when the least significant BITS are truncated.  BITS cannot be     zero.  */ -static integerPart -ulpsFromBoundary(const integerPart *parts, unsigned int bits, bool isNearest) -{ +static APFloatBase::integerPart +ulpsFromBoundary(const APFloatBase::integerPart *parts, unsigned int bits, +                 bool isNearest) {    unsigned int count, partBits; -  integerPart part, boundary; +  APFloatBase::integerPart part, boundary;    assert(bits != 0);    bits--; -  count = bits / integerPartWidth; -  partBits = bits % integerPartWidth + 1; +  count = bits / APFloatBase::integerPartWidth; +  partBits = bits % APFloatBase::integerPartWidth + 1; -  part = parts[count] & (~(integerPart) 0 >> (integerPartWidth - partBits)); +  part = parts[count] & (~(APFloatBase::integerPart) 0 >> (APFloatBase::integerPartWidth - partBits));    if (isNearest) -    boundary = (integerPart) 1 << (partBits - 1); +    boundary = (APFloatBase::integerPart) 1 << (partBits - 1);    else      boundary = 0; @@ -518,32 +513,30 @@ ulpsFromBoundary(const integerPart *parts, unsigned int bits, bool isNearest)    if (part == boundary) {      while (--count)        if (parts[count]) -        return ~(integerPart) 0; /* A lot.  */ +        return ~(APFloatBase::integerPart) 0; /* A lot.  */      return parts[0];    } else if (part == boundary - 1) {      while (--count)        if (~parts[count]) -        return ~(integerPart) 0; /* A lot.  */ +        return ~(APFloatBase::integerPart) 0; /* A lot.  */      return -parts[0];    } -  return ~(integerPart) 0; /* A lot.  */ +  return ~(APFloatBase::integerPart) 0; /* A lot.  */  }  /* Place pow(5, power) in DST, and return the number of parts used.     DST must be at least one part larger than size of the answer.  */  static unsigned int -powerOf5(integerPart *dst, unsigned int power) -{ -  static const integerPart firstEightPowers[] = { 1, 5, 25, 125, 625, 3125, -                                                  15625, 78125 }; -  integerPart pow5s[maxPowerOfFiveParts * 2 + 5]; +powerOf5(APFloatBase::integerPart *dst, unsigned int power) { +  static const APFloatBase::integerPart firstEightPowers[] = { 1, 5, 25, 125, 625, 3125, 15625, 78125 }; +  APFloatBase::integerPart pow5s[maxPowerOfFiveParts * 2 + 5];    pow5s[0] = 78125 * 5;    unsigned int partsCount[16] = { 1 }; -  integerPart scratch[maxPowerOfFiveParts], *p1, *p2, *pow5; +  APFloatBase::integerPart scratch[maxPowerOfFiveParts], *p1, *p2, *pow5;    unsigned int result;    assert(power <= maxExponent); @@ -572,7 +565,7 @@ powerOf5(integerPart *dst, unsigned int power)      }      if (power & 1) { -      integerPart *tmp; +      APFloatBase::integerPart *tmp;        APInt::tcFullMultiply(p2, p1, pow5, result, pc);        result += pc; @@ -608,14 +601,14 @@ static const char NaNU[] = "NAN";     significant nibble.  Write out exactly COUNT hexdigits, return     COUNT.  */  static unsigned int -partAsHex (char *dst, integerPart part, unsigned int count, +partAsHex (char *dst, APFloatBase::integerPart part, unsigned int count,             const char *hexDigitChars)  {    unsigned int result = count; -  assert(count != 0 && count <= integerPartWidth / 4); +  assert(count != 0 && count <= APFloatBase::integerPartWidth / 4); -  part >>= (integerPartWidth - 4 * count); +  part >>= (APFloatBase::integerPartWidth - 4 * count);    while (count--) {      dst[count] = hexDigitChars[part & 0xf];      part >>= 4; @@ -889,11 +882,11 @@ unsigned int IEEEFloat::partCount() const {    return partCountForBits(semantics->precision + 1);  } -const integerPart *IEEEFloat::significandParts() const { +const IEEEFloat::integerPart *IEEEFloat::significandParts() const {    return const_cast<IEEEFloat *>(this)->significandParts();  } -integerPart *IEEEFloat::significandParts() { +IEEEFloat::integerPart *IEEEFloat::significandParts() {    if (partCount() > 1)      return significand.parts;    else @@ -916,7 +909,7 @@ void IEEEFloat::incrementSignificand() {  }  /* Add the significand of the RHS.  Returns the carry flag.  */ -integerPart IEEEFloat::addSignificand(const IEEEFloat &rhs) { +IEEEFloat::integerPart IEEEFloat::addSignificand(const IEEEFloat &rhs) {    integerPart *parts;    parts = significandParts(); @@ -929,8 +922,8 @@ integerPart IEEEFloat::addSignificand(const IEEEFloat &rhs) {  /* Subtract the significand of the RHS with a borrow flag.  Returns     the borrow flag.  */ -integerPart IEEEFloat::subtractSignificand(const IEEEFloat &rhs, -                                           integerPart borrow) { +IEEEFloat::integerPart IEEEFloat::subtractSignificand(const IEEEFloat &rhs, +                                                      integerPart borrow) {    integerPart *parts;    parts = significandParts(); diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index e9716e3b1e872..c558ddd82161d 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -546,10 +546,7 @@ unsigned APInt::countLeadingZerosSlowCase() const {    return Count;  } -unsigned APInt::countLeadingOnes() const { -  if (isSingleWord()) -    return llvm::countLeadingOnes(U.VAL << (APINT_BITS_PER_WORD - BitWidth)); - +unsigned APInt::countLeadingOnesSlowCase() const {    unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;    unsigned shift;    if (!highWordBits) { @@ -573,9 +570,7 @@ unsigned APInt::countLeadingOnes() const {    return Count;  } -unsigned APInt::countTrailingZeros() const { -  if (isSingleWord()) -    return std::min(unsigned(llvm::countTrailingZeros(U.VAL)), BitWidth); +unsigned APInt::countTrailingZerosSlowCase() const {    unsigned Count = 0;    unsigned i = 0;    for (; i < getNumWords() && U.pVal[i] == 0; ++i) diff --git a/lib/Support/BinaryStreamReader.cpp b/lib/Support/BinaryStreamReader.cpp index bfb658cfa0b74..e00527f2519e1 100644 --- a/lib/Support/BinaryStreamReader.cpp +++ b/lib/Support/BinaryStreamReader.cpp @@ -109,6 +109,12 @@ Error BinaryStreamReader::readStreamRef(BinaryStreamRef &Ref, uint32_t Length) {    return Error::success();  } +Error BinaryStreamReader::readSubstream(BinarySubstreamRef &Stream, +                                        uint32_t Size) { +  Stream.Offset = getOffset(); +  return readStreamRef(Stream.StreamData, Size); +} +  Error BinaryStreamReader::skip(uint32_t Amount) {    if (Amount > bytesRemaining())      return make_error<BinaryStreamError>(stream_error_code::stream_too_short); diff --git a/lib/Support/CachePruning.cpp b/lib/Support/CachePruning.cpp index aca1236395655..60d0964f27646 100644 --- a/lib/Support/CachePruning.cpp +++ b/lib/Support/CachePruning.cpp @@ -82,7 +82,7 @@ llvm::parseCachePruningPolicy(StringRef PolicyStr) {        if (Value.back() != '%')          return make_error<StringError>("'" + Value + "' must be a percentage",                                         inconvertibleErrorCode()); -      StringRef SizeStr = Value.slice(0, Value.size() - 1); +      StringRef SizeStr = Value.drop_back();        uint64_t Size;        if (SizeStr.getAsInteger(0, Size))          return make_error<StringError>("'" + SizeStr + "' not an integer", @@ -91,7 +91,28 @@ llvm::parseCachePruningPolicy(StringRef PolicyStr) {          return make_error<StringError>("'" + SizeStr +                                             "' must be between 0 and 100",                                         inconvertibleErrorCode()); -      Policy.PercentageOfAvailableSpace = Size; +      Policy.MaxSizePercentageOfAvailableSpace = Size; +    } else if (Key == "cache_size_bytes") { +      uint64_t Mult = 1; +      switch (tolower(Value.back())) { +      case 'k': +        Mult = 1024; +        Value = Value.drop_back(); +        break; +      case 'm': +        Mult = 1024 * 1024; +        Value = Value.drop_back(); +        break; +      case 'g': +        Mult = 1024 * 1024 * 1024; +        Value = Value.drop_back(); +        break; +      } +      uint64_t Size; +      if (Value.getAsInteger(0, Size)) +        return make_error<StringError>("'" + Value + "' not an integer", +                                       inconvertibleErrorCode()); +      Policy.MaxSizeBytes = Size * Mult;      } else {        return make_error<StringError>("Unknown key: '" + Key + "'",                                       inconvertibleErrorCode()); @@ -115,11 +136,12 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) {    if (!isPathDir)      return false; -  Policy.PercentageOfAvailableSpace = -      std::min(Policy.PercentageOfAvailableSpace, 100u); +  Policy.MaxSizePercentageOfAvailableSpace = +      std::min(Policy.MaxSizePercentageOfAvailableSpace, 100u);    if (Policy.Expiration == seconds(0) && -      Policy.PercentageOfAvailableSpace == 0) { +      Policy.MaxSizePercentageOfAvailableSpace == 0 && +      Policy.MaxSizeBytes == 0) {      DEBUG(dbgs() << "No pruning settings set, exit early\n");      // Nothing will be pruned, early exit      return false; @@ -157,7 +179,8 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) {      writeTimestampFile(TimestampFile);    } -  bool ShouldComputeSize = (Policy.PercentageOfAvailableSpace > 0); +  bool ShouldComputeSize = +      (Policy.MaxSizePercentageOfAvailableSpace > 0 || Policy.MaxSizeBytes > 0);    // Keep track of space    std::set<std::pair<uint64_t, std::string>> FileSizes; @@ -216,14 +239,22 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) {      }      sys::fs::space_info SpaceInfo = ErrOrSpaceInfo.get();      auto AvailableSpace = TotalSize + SpaceInfo.free; -    auto FileAndSize = FileSizes.rbegin(); + +    if (Policy.MaxSizePercentageOfAvailableSpace == 0) +      Policy.MaxSizePercentageOfAvailableSpace = 100; +    if (Policy.MaxSizeBytes == 0) +      Policy.MaxSizeBytes = AvailableSpace; +    auto TotalSizeTarget = std::min<uint64_t>( +        AvailableSpace * Policy.MaxSizePercentageOfAvailableSpace / 100ull, +        Policy.MaxSizeBytes); +      DEBUG(dbgs() << "Occupancy: " << ((100 * TotalSize) / AvailableSpace) -                 << "% target is: " << Policy.PercentageOfAvailableSpace -                 << "\n"); +                 << "% target is: " << Policy.MaxSizePercentageOfAvailableSpace +                 << "%, " << Policy.MaxSizeBytes << " bytes\n"); + +    auto FileAndSize = FileSizes.rbegin();      // Remove the oldest accessed files first, till we get below the threshold -    while (((100 * TotalSize) / AvailableSpace) > -               Policy.PercentageOfAvailableSpace && -           FileAndSize != FileSizes.rend()) { +    while (TotalSize > TotalSizeTarget && FileAndSize != FileSizes.rend()) {        // Remove the file.        sys::fs::remove(FileAndSize->second);        // Update size diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp index de0ca940b405f..0345a5e3d2a1d 100644 --- a/lib/Support/CommandLine.cpp +++ b/lib/Support/CommandLine.cpp @@ -24,6 +24,7 @@  #include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/SmallPtrSet.h"  #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringExtras.h"  #include "llvm/ADT/StringMap.h"  #include "llvm/ADT/Twine.h"  #include "llvm/Config/config.h" @@ -1522,13 +1523,9 @@ bool parser<unsigned long long>::parse(Option &O, StringRef ArgName,  // parser<double>/parser<float> implementation  //  static bool parseDouble(Option &O, StringRef Arg, double &Value) { -  SmallString<32> TmpStr(Arg.begin(), Arg.end()); -  const char *ArgStart = TmpStr.c_str(); -  char *End; -  Value = strtod(ArgStart, &End); -  if (*End != 0) -    return O.error("'" + Arg + "' value invalid for floating point argument!"); -  return false; +  if (to_float(Arg, Value)) +    return false; +  return O.error("'" + Arg + "' value invalid for floating point argument!");  }  bool parser<double>::parse(Option &O, StringRef ArgName, StringRef Arg, diff --git a/lib/Support/DataExtractor.cpp b/lib/Support/DataExtractor.cpp index 53c10bcc562e3..0199b300ba72d 100644 --- a/lib/Support/DataExtractor.cpp +++ b/lib/Support/DataExtractor.cpp @@ -68,6 +68,13 @@ uint16_t *DataExtractor::getU16(uint32_t *offset_ptr, uint16_t *dst,                          Data.data());  } +uint32_t DataExtractor::getU24(uint32_t *offset_ptr) const { +  uint24_t ExtractedVal = +      getU<uint24_t>(offset_ptr, this, IsLittleEndian, Data.data()); +  // The 3 bytes are in the correct byte order for the host. +  return ExtractedVal.getAsUint32(sys::IsLittleEndianHost); +} +  uint32_t DataExtractor::getU32(uint32_t *offset_ptr) const {    return getU<uint32_t>(offset_ptr, this, IsLittleEndian, Data.data());  } diff --git a/lib/Support/GraphWriter.cpp b/lib/Support/GraphWriter.cpp index f70b77da8de47..e04bd8bb3b9a1 100644 --- a/lib/Support/GraphWriter.cpp +++ b/lib/Support/GraphWriter.cpp @@ -1,4 +1,4 @@ -//===-- GraphWriter.cpp - Implements GraphWriter support routines ---------===// +//===- GraphWriter.cpp - Implements GraphWriter support routines ----------===//  //  //                     The LLVM Compiler Infrastructure  // @@ -12,10 +12,22 @@  //===----------------------------------------------------------------------===//  #include "llvm/Support/GraphWriter.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringRef.h"  #include "llvm/Config/config.h"  #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/ErrorOr.h"  #include "llvm/Support/FileSystem.h"  #include "llvm/Support/Program.h" +#include "llvm/Support/raw_ostream.h" +#include <cassert> +#include <system_error> +#include <string> +#include <vector> +  using namespace llvm;  static cl::opt<bool> ViewBackground("view-background", cl::Hidden, @@ -99,8 +111,10 @@ static bool ExecGraphViewer(StringRef ExecPath, std::vector<const char *> &args,  }  namespace { +  struct GraphSession {    std::string LogBuffer; +    bool TryFindProgram(StringRef Names, std::string &ProgramPath) {      raw_string_ostream Log(LogBuffer);      SmallVector<StringRef, 8> parts; @@ -115,7 +129,8 @@ struct GraphSession {      return false;    }  }; -} // namespace + +} // end anonymous namespace  static const char *getProgramName(GraphProgram::Name program) {    switch (program) { diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp index 320aede79fbb0..2687a67556d3e 100644 --- a/lib/Support/Triple.cpp +++ b/lib/Support/Triple.cpp @@ -174,6 +174,7 @@ StringRef Triple::getOSTypeName(OSType Kind) {    switch (Kind) {    case UnknownOS: return "unknown"; +  case Ananas: return "ananas";    case CloudABI: return "cloudabi";    case Darwin: return "darwin";    case DragonFly: return "dragonfly"; @@ -455,6 +456,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) {  static Triple::OSType parseOS(StringRef OSName) {    return StringSwitch<Triple::OSType>(OSName) +    .StartsWith("ananas", Triple::Ananas)      .StartsWith("cloudabi", Triple::CloudABI)      .StartsWith("darwin", Triple::Darwin)      .StartsWith("dragonfly", Triple::DragonFly) diff --git a/lib/Support/Unix/Host.inc b/lib/Support/Unix/Host.inc index 457217125a222..0ba6a25aa198d 100644 --- a/lib/Support/Unix/Host.inc +++ b/lib/Support/Unix/Host.inc @@ -45,5 +45,11 @@ std::string sys::getDefaultTargetTriple() {      TargetTripleString += getOSVersion();    } +  // Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV. +#if defined(LLVM_TARGET_TRIPLE_ENV) +  if (const char *EnvTriple = std::getenv(LLVM_TARGET_TRIPLE_ENV)) +    TargetTripleString = EnvTriple; +#endif +    return Triple::normalize(TargetTripleString);  } diff --git a/lib/Support/Unix/Memory.inc b/lib/Support/Unix/Memory.inc index edbc7938f0cbf..dd39ef935bf92 100644 --- a/lib/Support/Unix/Memory.inc +++ b/lib/Support/Unix/Memory.inc @@ -195,6 +195,10 @@ Memory::AllocateRWX(size_t NumBytes, const MemoryBlock* NearBlock,  #if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))    void *pa = ::mmap(start, PageSize*NumPages, PROT_READ|PROT_EXEC,                      flags, fd, 0); +#elif defined(__NetBSD__) && defined(PROT_MPROTECT) +  void *pa = +      ::mmap(start, PageSize * NumPages, +             PROT_READ | PROT_WRITE | PROT_MPROTECT(PROT_EXEC), flags, fd, 0);  #else    void *pa = ::mmap(start, PageSize*NumPages, PROT_READ|PROT_WRITE|PROT_EXEC,                      flags, fd, 0); diff --git a/lib/Support/Unix/Program.inc b/lib/Support/Unix/Program.inc index 2df0eaff47e52..1704fa4799428 100644 --- a/lib/Support/Unix/Program.inc +++ b/lib/Support/Unix/Program.inc @@ -449,11 +449,22 @@ bool llvm::sys::commandLineFitsWithinSystemLimits(StringRef Program, ArrayRef<co    size_t ArgLength = Program.size() + 1;    for (ArrayRef<const char*>::iterator I = Args.begin(), E = Args.end();         I != E; ++I) { -    ArgLength += strlen(*I) + 1; +    size_t length = strlen(*I); + +    // Ensure that we do not exceed the MAX_ARG_STRLEN constant on Linux, which +    // does not have a constant unlike what the man pages would have you +    // believe. Since this limit is pretty high, perform the check +    // unconditionally rather than trying to be aggressive and limiting it to +    // Linux only. +    if (length >= (32 * 4096)) +      return false; + +    ArgLength += length + 1;      if (ArgLength > size_t(HalfArgMax)) {        return false;      }    } +    return true;  }  } diff --git a/lib/Support/Windows/Host.inc b/lib/Support/Windows/Host.inc index fe89fe0aad8c4..7e196cf0ce18a 100644 --- a/lib/Support/Windows/Host.inc +++ b/lib/Support/Windows/Host.inc @@ -18,5 +18,13 @@  using namespace llvm;  std::string sys::getDefaultTargetTriple() { -  return Triple::normalize(LLVM_DEFAULT_TARGET_TRIPLE); +  const char *Triple = LLVM_DEFAULT_TARGET_TRIPLE; + +  // Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV. +#if defined(LLVM_TARGET_TRIPLE_ENV) +  if (const char *EnvTriple = std::getenv(LLVM_TARGET_TRIPLE_ENV)) +    Triple = EnvTriple; +#endif + +  return Triple::normalize(Triple);  } diff --git a/lib/Support/YAMLParser.cpp b/lib/Support/YAMLParser.cpp index 01ae3214453dc..e2f21a56a810a 100644 --- a/lib/Support/YAMLParser.cpp +++ b/lib/Support/YAMLParser.cpp @@ -1,4 +1,4 @@ -//===--- YAMLParser.cpp - Simple YAML parser ------------------------------===// +//===- YAMLParser.cpp - Simple YAML parser --------------------------------===//  //  //                     The LLVM Compiler Infrastructure  // @@ -13,15 +13,29 @@  #include "llvm/Support/YAMLParser.h"  #include "llvm/ADT/AllocatorList.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/None.h"  #include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/SmallString.h"  #include "llvm/ADT/SmallVector.h"  #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringRef.h"  #include "llvm/ADT/Twine.h" +#include "llvm/Support/Compiler.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/SMLoc.h"  #include "llvm/Support/SourceMgr.h"  #include "llvm/Support/raw_ostream.h" +#include <algorithm> +#include <cassert> +#include <cstddef> +#include <cstdint> +#include <map> +#include <memory> +#include <string> +#include <system_error> +#include <utility>  using namespace llvm;  using namespace yaml; @@ -37,7 +51,7 @@ enum UnicodeEncodingForm {  /// EncodingInfo - Holds the encoding type and length of the byte order mark if  ///                it exists. Length is in {0, 2, 3, 4}. -typedef std::pair<UnicodeEncodingForm, unsigned> EncodingInfo; +using EncodingInfo = std::pair<UnicodeEncodingForm, unsigned>;  /// getUnicodeEncoding - Reads up to the first 4 bytes to determine the Unicode  ///                      encoding form of \a Input. @@ -46,7 +60,7 @@ typedef std::pair<UnicodeEncodingForm, unsigned> EncodingInfo;  /// @returns An EncodingInfo indicating the Unicode encoding form of the input  ///          and how long the byte order mark is if one exists.  static EncodingInfo getUnicodeEncoding(StringRef Input) { -  if (Input.size() == 0) +  if (Input.empty())      return std::make_pair(UEF_Unknown, 0);    switch (uint8_t(Input[0])) { @@ -95,8 +109,6 @@ static EncodingInfo getUnicodeEncoding(StringRef Input) {    return std::make_pair(UEF_UTF8, 0);  } -namespace llvm { -namespace yaml {  /// Pin the vtables to this file.  void Node::anchor() {}  void NullNode::anchor() {} @@ -107,6 +119,9 @@ void MappingNode::anchor() {}  void SequenceNode::anchor() {}  void AliasNode::anchor() {} +namespace llvm { +namespace yaml { +  /// Token - A single YAML token.  struct Token {    enum TokenKind { @@ -133,7 +148,7 @@ struct Token {      TK_Alias,      TK_Anchor,      TK_Tag -  } Kind; +  } Kind = TK_Error;    /// A string of length 0 or more whose begin() points to the logical location    /// of the token in the input. @@ -142,14 +157,16 @@ struct Token {    /// The value of a block scalar node.    std::string Value; -  Token() : Kind(TK_Error) {} +  Token() = default;  }; -} -} -typedef llvm::BumpPtrList<Token> TokenQueueT; +} // end namespace yaml +} // end namespace llvm + +using TokenQueueT = BumpPtrList<Token>;  namespace { +  /// @brief This struct is used to track simple keys.  ///  /// Simple keys are handled by creating an entry in SimpleKeys for each Token @@ -170,12 +187,13 @@ struct SimpleKey {      return Tok == Other.Tok;    }  }; -} + +} // end anonymous namespace  /// @brief The Unicode scalar value of a UTF-8 minimal well-formed code unit  ///        subsequence and the subsequence's length in code units (uint8_t).  ///        A length of 0 represents an error. -typedef std::pair<uint32_t, unsigned> UTF8Decoded; +using UTF8Decoded = std::pair<uint32_t, unsigned>;  static UTF8Decoded decodeUTF8(StringRef Range) {    StringRef::iterator Position= Range.begin(); @@ -229,6 +247,7 @@ static UTF8Decoded decodeUTF8(StringRef Range) {  namespace llvm {  namespace yaml { +  /// @brief Scans YAML tokens from a MemoryBuffer.  class Scanner {  public: @@ -350,7 +369,8 @@ private:    ///          ns-char.    StringRef::iterator skip_ns_char(StringRef::iterator Position); -  typedef StringRef::iterator (Scanner::*SkipWhileFunc)(StringRef::iterator); +  using SkipWhileFunc = StringRef::iterator (Scanner::*)(StringRef::iterator); +    /// @brief Skip minimal well-formed code unit subsequences until Func    ///        returns its input.    /// @@ -655,10 +675,10 @@ bool yaml::dumpTokens(StringRef Input, raw_ostream &OS) {  }  bool yaml::scanTokens(StringRef Input) { -  llvm::SourceMgr SM; -  llvm::yaml::Scanner scanner(Input, SM); -  for (;;) { -    llvm::yaml::Token T = scanner.getNext(); +  SourceMgr SM; +  Scanner scanner(Input, SM); +  while (true) { +    Token T = scanner.getNext();      if (T.Kind == Token::TK_StreamEnd)        break;      else if (T.Kind == Token::TK_Error) @@ -1744,7 +1764,7 @@ Stream::Stream(MemoryBufferRef InputBuffer, SourceMgr &SM, bool ShowColors,                 std::error_code *EC)      : scanner(new Scanner(InputBuffer, SM, ShowColors, EC)), CurrentDoc() {} -Stream::~Stream() {} +Stream::~Stream() = default;  bool Stream::failed() { return scanner->failed(); } @@ -1851,8 +1871,6 @@ bool Node::failed() const {    return Doc->failed();  } - -  StringRef ScalarNode::getValue(SmallVectorImpl<char> &Storage) const {    // TODO: Handle newlines properly. We need to remove leading whitespace.    if (Value[0] == '"') { // Double quoted. diff --git a/lib/Support/YAMLTraits.cpp b/lib/Support/YAMLTraits.cpp index c410b1d560860..601084f9eae3c 100644 --- a/lib/Support/YAMLTraits.cpp +++ b/lib/Support/YAMLTraits.cpp @@ -8,17 +8,27 @@  //===----------------------------------------------------------------------===//  #include "llvm/Support/YAMLTraits.h" +#include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringRef.h"  #include "llvm/ADT/Twine.h"  #include "llvm/Support/Casting.h"  #include "llvm/Support/Errc.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/Format.h"  #include "llvm/Support/LineIterator.h" +#include "llvm/Support/MemoryBuffer.h"  #include "llvm/Support/YAMLParser.h"  #include "llvm/Support/raw_ostream.h" -#include <cctype> +#include <algorithm> +#include <cassert> +#include <cstdint> +#include <cstdlib>  #include <cstring> +#include <string> +#include <vector> +  using namespace llvm;  using namespace yaml; @@ -26,11 +36,9 @@ using namespace yaml;  //  IO  //===----------------------------------------------------------------------===// -IO::IO(void *Context) : Ctxt(Context) { -} +IO::IO(void *Context) : Ctxt(Context) {} -IO::~IO() { -} +IO::~IO() = default;  void *IO::getContext() {    return Ctxt; @@ -46,15 +54,13 @@ void IO::setContext(void *Context) {  Input::Input(StringRef InputContent, void *Ctxt,               SourceMgr::DiagHandlerTy DiagHandler, void *DiagHandlerCtxt) -    : IO(Ctxt), Strm(new Stream(InputContent, SrcMgr, false, &EC)), -      CurrentNode(nullptr) { +    : IO(Ctxt), Strm(new Stream(InputContent, SrcMgr, false, &EC)) {    if (DiagHandler)      SrcMgr.setDiagHandler(DiagHandler, DiagHandlerCtxt);    DocIterator = Strm->begin();  } -Input::~Input() { -} +Input::~Input() = default;  std::error_code Input::error() { return EC; } @@ -398,13 +404,9 @@ bool Input::canElideEmptySequence() {  //===----------------------------------------------------------------------===//  Output::Output(raw_ostream &yout, void *context, int WrapColumn) -    : IO(context), Out(yout), WrapColumn(WrapColumn), Column(0), -      ColumnAtFlowStart(0), ColumnAtMapFlowStart(0), NeedBitValueComma(false), -      NeedFlowSequenceComma(false), EnumerationMatchFound(false), -      NeedsNewLine(false), WriteDefaultValues(false) {} +    : IO(context), Out(yout), WrapColumn(WrapColumn) {} -Output::~Output() { -} +Output::~Output() = default;  bool Output::outputting() {    return true; @@ -911,12 +913,9 @@ void ScalarTraits<double>::output(const double &Val, void *, raw_ostream &Out) {  }  StringRef ScalarTraits<double>::input(StringRef Scalar, void *, double &Val) { -  SmallString<32> buff(Scalar.begin(), Scalar.end()); -  char *end; -  Val = strtod(buff.c_str(), &end); -  if (*end != '\0') -    return "invalid floating point number"; -  return StringRef(); +  if (to_float(Scalar, Val)) +    return StringRef(); +  return "invalid floating point number";  }  void ScalarTraits<float>::output(const float &Val, void *, raw_ostream &Out) { @@ -924,12 +923,9 @@ void ScalarTraits<float>::output(const float &Val, void *, raw_ostream &Out) {  }  StringRef ScalarTraits<float>::input(StringRef Scalar, void *, float &Val) { -  SmallString<32> buff(Scalar.begin(), Scalar.end()); -  char *end; -  Val = strtod(buff.c_str(), &end); -  if (*end != '\0') -    return "invalid floating point number"; -  return StringRef(); +  if (to_float(Scalar, Val)) +    return StringRef(); +  return "invalid floating point number";  }  void ScalarTraits<Hex8>::output(const Hex8 &Val, void *, raw_ostream &Out) { diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index 1abc8ed8683d5..9480cd46d28fc 100644 --- a/lib/Support/raw_ostream.cpp +++ b/lib/Support/raw_ostream.cpp @@ -548,7 +548,11 @@ void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {    pos += Size;  #ifndef LLVM_ON_WIN32 +#if defined(__linux__) +  bool ShouldWriteInChunks = true; +#else    bool ShouldWriteInChunks = false; +#endif  #else    // Writing a large size of output to Windows console returns ENOMEM. It seems    // that, prior to Windows 8, WriteFile() is redirecting to WriteConsole(), and  | 
