X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FSupport%2FAPInt.cpp;h=eca632484787025385ccbf19c4ff38af6f48a6c5;hp=6943d279767f23a3a729d97ff2c2580f5d4341eb;hb=56c39eb232bea1fbf8e5d8ffee36168f43285208;hpb=5504225c2accd5331ec56a739576c5b027ca868a diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index 6943d279767..eca63248478 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -46,30 +46,27 @@ inline static uint64_t* getMemory(unsigned numWords) { /// A utility function that converts a character to a digit. inline static unsigned getDigit(char cdigit, uint8_t radix) { - // Get a digit - unsigned digit = 0; + unsigned r; + if (radix == 16) { - if (!isxdigit(cdigit)) - llvm_unreachable("Invalid hex digit in string"); - if (isdigit(cdigit)) - digit = cdigit - '0'; - else if (cdigit >= 'a') - digit = cdigit - 'a' + 10; - else if (cdigit >= 'A') - digit = cdigit - 'A' + 10; - else - llvm_unreachable("huh? we shouldn't get here"); - } else if (isdigit(cdigit)) { - digit = cdigit - '0'; - assert((radix == 10 || - (radix == 8 && digit != 8 && digit != 9) || - (radix == 2 && (digit == 0 || digit == 1))) && - "Invalid digit in string for given radix"); - } else { - llvm_unreachable("Invalid character in digit string"); + r = cdigit - '0'; + if (r <= 9) + return r; + + r = cdigit - 'A'; + if (r <= 5) + return r + 10; + + r = cdigit - 'a'; + if (r <= 5) + return r + 10; } - return digit; + r = cdigit - '0'; + if (r < radix) + return r; + + return -1U; } @@ -2076,6 +2073,7 @@ void APInt::fromString(unsigned numbits, const StringRef& str, uint8_t radix) { // Enter digit traversal loop for (StringRef::iterator e = str.end(); p != e; ++p) { unsigned digit = getDigit(*p, radix); + assert(digit < radix && "Invalid character in digit string"); // Shift or multiply the value by the radix if (slen > 1) {