[llvm] r240436 - ADT: Add a string APSInt constructor.

Alex L arphaman at gmail.com
Wed Jun 24 10:10:04 PDT 2015


This fix got committed in r240553.

Cheers,
Alex

2015-06-24 9:54 GMT-07:00 Alex L <arphaman at gmail.com>:

> Yeah, this seems better. I'll commit a fix.
>
> Alex
>
> 2015-06-24 9:16 GMT-07:00 Duncan P. N. Exon Smith <dexonsmith at apple.com>:
>
>>
>> > On 2015 Jun 23, at 11:22, Alex Lorenz <arphaman at gmail.com> wrote:
>> >
>> > Author: arphaman
>> > Date: Tue Jun 23 13:22:10 2015
>> > New Revision: 240436
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=240436&view=rev
>> > Log:
>> > ADT: Add a string APSInt constructor.
>> >
>> > This commit moves the APSInt initialization code that's used by
>> > the LLLexer class into a new APSInt constructor that constructs
>> > APSInts from strings.
>> >
>> > This change is useful for MIR Serialization, as it would allow
>> > the MILexer class to use the same APSInt initialization as
>> > LLexer when parsing immediate machine operands.
>> >
>> > Modified:
>> >    llvm/trunk/include/llvm/ADT/APSInt.h
>> >    llvm/trunk/lib/AsmParser/LLLexer.cpp
>> >    llvm/trunk/lib/Support/APSInt.cpp
>> >    llvm/trunk/unittests/ADT/APSIntTest.cpp
>> >
>> > Modified: llvm/trunk/include/llvm/ADT/APSInt.h
>> > URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/APSInt.h?rev=240436&r1=240435&r2=240436&view=diff
>> >
>> ==============================================================================
>> > --- llvm/trunk/include/llvm/ADT/APSInt.h (original)
>> > +++ llvm/trunk/include/llvm/ADT/APSInt.h Tue Jun 23 13:22:10 2015
>> > @@ -33,6 +33,15 @@ public:
>> >   explicit APSInt(APInt I, bool isUnsigned = true)
>> >    : APInt(std::move(I)), IsUnsigned(isUnsigned) {}
>> >
>> > +  /// Construct an APSInt from a string representation.
>> > +  ///
>> > +  /// This constructor interprets the string \p Str using the radix of
>> 10.
>> > +  /// The interpretation stops at the end of the string. The bit width
>> of the
>> > +  /// constructed APSInt is determined automatically.
>> > +  ///
>> > +  /// \param Str the string to be interpreted.
>> > +  explicit APSInt(StringRef Str);
>> > +
>> >   APSInt &operator=(APInt RHS) {
>> >     // Retain our current sign.
>> >     APInt::operator=(std::move(RHS));
>> >
>> > Modified: llvm/trunk/lib/AsmParser/LLLexer.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLLexer.cpp?rev=240436&r1=240435&r2=240436&view=diff
>> >
>> ==============================================================================
>> > --- llvm/trunk/lib/AsmParser/LLLexer.cpp (original)
>> > +++ llvm/trunk/lib/AsmParser/LLLexer.cpp Tue Jun 23 13:22:10 2015
>> > @@ -903,20 +903,7 @@ lltok::Kind LLLexer::LexDigitOrNegative(
>> >   if (CurPtr[0] != '.') {
>> >     if (TokStart[0] == '0' && TokStart[1] == 'x')
>> >       return Lex0x();
>> > -    unsigned Len = CurPtr-TokStart;
>> > -    uint32_t numBits = ((Len * 64) / 19) + 2;
>> > -    APInt Tmp(numBits, StringRef(TokStart, Len), 10);
>> > -    if (TokStart[0] == '-') {
>> > -      uint32_t minBits = Tmp.getMinSignedBits();
>> > -      if (minBits > 0 && minBits < numBits)
>> > -        Tmp = Tmp.trunc(minBits);
>> > -      APSIntVal = APSInt(Tmp, false);
>> > -    } else {
>> > -      uint32_t activeBits = Tmp.getActiveBits();
>> > -      if (activeBits > 0 && activeBits < numBits)
>> > -        Tmp = Tmp.trunc(activeBits);
>> > -      APSIntVal = APSInt(Tmp, true);
>> > -    }
>> > +    APSIntVal = APSInt(StringRef(TokStart, CurPtr - TokStart));
>> >     return lltok::APSInt;
>> >   }
>> >
>> >
>> > Modified: llvm/trunk/lib/Support/APSInt.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/APSInt.cpp?rev=240436&r1=240435&r2=240436&view=diff
>> >
>> ==============================================================================
>> > --- llvm/trunk/lib/Support/APSInt.cpp (original)
>> > +++ llvm/trunk/lib/Support/APSInt.cpp Tue Jun 23 13:22:10 2015
>> > @@ -17,6 +17,25 @@
>> >
>> > using namespace llvm;
>> >
>> > +APSInt::APSInt(StringRef Str) {
>> > +  assert(!Str.empty() && "Invalid string length");
>> > +
>> > +  // (Over-)estimate the required number of bits.
>> > +  unsigned NumBits = ((Str.size() * 64) / 19) + 2;
>> > +  APInt Tmp(NumBits, Str, /*Radix=*/10);
>> > +  if (Str[0] == '-') {
>> > +    unsigned MinBits = Tmp.getMinSignedBits();
>> > +    if (MinBits > 0 && MinBits < NumBits)
>> > +      Tmp = Tmp.trunc(MinBits);
>> > +    *this = APSInt(Tmp, /*IsUnsigned=*/false);
>> > +    return;
>> > +  }
>> > +  unsigned ActiveBits = Tmp.getActiveBits();
>> > +  if (ActiveBits > 0 && ActiveBits < NumBits)
>> > +    Tmp = Tmp.trunc(ActiveBits);
>> > +  *this = APSInt(Tmp, /*IsUnsigned=*/true);
>> > +}
>> > +
>> > void APSInt::Profile(FoldingSetNodeID& ID) const {
>> >   ID.AddInteger((unsigned) (IsUnsigned ? 1 : 0));
>> >   APInt::Profile(ID);
>> >
>> > Modified: llvm/trunk/unittests/ADT/APSIntTest.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/APSIntTest.cpp?rev=240436&r1=240435&r2=240436&view=diff
>> >
>> ==============================================================================
>> > --- llvm/trunk/unittests/ADT/APSIntTest.cpp (original)
>> > +++ llvm/trunk/unittests/ADT/APSIntTest.cpp Tue Jun 23 13:22:10 2015
>> > @@ -143,4 +143,23 @@ TEST(APSIntTest, compareValues) {
>> >   EXPECT_TRUE(APSInt::compareValues(U(8), S(-7).trunc(32)) > 0);
>> > }
>> >
>> > +TEST(APSIntTest, FromString) {
>> > +  EXPECT_EQ(APSInt("1").getExtValue(), 1);
>> > +  EXPECT_EQ(APSInt("-1").getExtValue(), -1);
>> > +  EXPECT_EQ(APSInt("0").getExtValue(), 0);
>> > +  EXPECT_EQ(APSInt("56789").getExtValue(), 56789);
>> > +  EXPECT_EQ(APSInt("-1234").getExtValue(), -1234);
>> > }
>> > +
>> > +#ifdef GTEST_HAS_DEATH_TEST
>> > +#ifndef NDEBUG
>>
>> I think you can merge these checks:
>>
>>     #if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG)
>>
>> Then you just have a single closing #endif.  Seems a little cleaner
>> to me.
>>
>> > +
>> > +TEST(APSIntTest, StringDeath) {
>> > +  EXPECT_DEATH(APSInt(""), "Invalid string length");
>> > +  EXPECT_DEATH(APSInt("1a"), "Invalid character in digit string");
>> > +}
>> > +
>> > +#endif
>> > +#endif
>> > +
>> > +} // end anonymous namespace
>> >
>> >
>> > _______________________________________________
>> > llvm-commits mailing list
>> > llvm-commits at cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150624/9b7e4c4c/attachment.html>


More information about the llvm-commits mailing list