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

Alex L arphaman at gmail.com
Wed Jun 24 09:54:28 PDT 2015


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/0384cce2/attachment.html>


More information about the llvm-commits mailing list