diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h --- a/llvm/include/llvm/ADT/APInt.h +++ b/llvm/include/llvm/ADT/APInt.h @@ -1635,9 +1635,10 @@ void print(raw_ostream &OS, bool isSigned) const; /// Converts an APInt to a string and append it to Str. Str is commonly a - /// SmallString. + /// SmallString. If Radix > 10, UpperCase determine the case of letter + /// digits. void toString(SmallVectorImpl &Str, unsigned Radix, bool Signed, - bool formatAsCLiteral = false) const; + bool formatAsCLiteral = false, bool UpperCase = true) const; /// Considers the APInt to be unsigned and converts it into a string in the /// radix given. The radix can be 2, 8, 10 16, or 36. diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp --- a/llvm/lib/Support/APInt.cpp +++ b/llvm/lib/Support/APInt.cpp @@ -2136,8 +2136,8 @@ this->negate(); } -void APInt::toString(SmallVectorImpl &Str, unsigned Radix, - bool Signed, bool formatAsCLiteral) const { +void APInt::toString(SmallVectorImpl &Str, unsigned Radix, bool Signed, + bool formatAsCLiteral, bool UpperCase) const { assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 || Radix == 36) && "Radix should be 2, 8, 10, 16, or 36!"); @@ -2173,7 +2173,9 @@ return; } - static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + static const char LowerCaseDigits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; + static const char UpperCaseDigits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + StringRef Digits = UpperCase ? UpperCaseDigits : LowerCaseDigits; if (isSingleWord()) { char Buffer[65]; diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp --- a/llvm/unittests/ADT/APIntTest.cpp +++ b/llvm/unittests/ADT/APIntTest.cpp @@ -1388,6 +1388,9 @@ APInt(8, 255, isSigned).toString(S, 10, isSigned, true); EXPECT_EQ(std::string(S), "255"); S.clear(); + APInt(8, 255, isSigned).toString(S, 16, isSigned, true, /*UpperCase=*/false); + EXPECT_EQ(std::string(S), "0xff"); + S.clear(); APInt(8, 255, isSigned).toString(S, 16, isSigned, true); EXPECT_EQ(std::string(S), "0xFF"); S.clear();