AsmParser: Simplify MDUnsignedField
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 4 Feb 2015 21:57:52 +0000 (21:57 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 4 Feb 2015 21:57:52 +0000 (21:57 +0000)
We only need `uint64_t` for storage.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228205 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AsmParser/LLParser.cpp
lib/AsmParser/LLParser.h

index 1f5087c152c0ceabcda02324964df179004ec36e..6441dc3f6f57b50b4bec456029d5a9298eb3ffbf 100644 (file)
@@ -2924,23 +2924,23 @@ bool LLParser::ParseMDNodeTail(MDNode *&N) {
 }
 
 bool LLParser::ParseMDField(LocTy Loc, StringRef Name,
-                            MDUnsignedField<uint32_t> &Result) {
+                            MDUnsignedField &Result) {
   if (Lex.getKind() != lltok::APSInt || Lex.getAPSIntVal().isSigned())
     return TokError("expected unsigned integer");
-  uint64_t Val64 = Lex.getAPSIntVal().getLimitedValue(Result.Max + 1ull);
 
-  if (Val64 > Result.Max)
+  auto &U = Lex.getAPSIntVal();
+  if (U.ugt(Result.Max))
     return TokError("value for '" + Name + "' too large, limit is " +
                     Twine(Result.Max));
-  Result.assign(Val64);
+  Result.assign(U.getZExtValue());
+  assert(Result.Val <= Result.Max && "Expected value in range");
   Lex.Lex();
   return false;
 }
 
 bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DwarfTagField &Result) {
   if (Lex.getKind() == lltok::APSInt)
-    return ParseMDField(Loc, Name,
-                        static_cast<MDUnsignedField<uint32_t> &>(Result));
+    return ParseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
 
   if (Result.Seen)
     return Error(Loc,
@@ -3063,8 +3063,8 @@ bool LLParser::ParseSpecializedMDNode(MDNode *&N, bool IsDistinct) {
 ///   ::= !MDLocation(line: 43, column: 8, scope: !5, inlinedAt: !6)
 bool LLParser::ParseMDLocation(MDNode *&Result, bool IsDistinct) {
 #define VISIT_MD_FIELDS(OPTIONAL, REQUIRED)                                    \
-  OPTIONAL(line, MDUnsignedField<uint32_t>, (0, ~0u >> 8));                    \
-  OPTIONAL(column, MDUnsignedField<uint32_t>, (0, ~0u >> 16));                 \
+  OPTIONAL(line, MDUnsignedField, (0, ~0u >> 8));                              \
+  OPTIONAL(column, MDUnsignedField, (0, ~0u >> 16));                           \
   REQUIRED(scope, MDField, );                                                  \
   OPTIONAL(inlinedAt, MDField, );
   PARSE_MD_FIELDS();
index 240fb60813871187829e576c1fbc9a1951a2c4be..c9aafd997404ac10093e69430b95b43730d13b01 100644 (file)
@@ -94,16 +94,14 @@ namespace llvm {
     explicit MDFieldImpl(FieldTy Default)
         : Val(std::move(Default)), Seen(false) {}
   };
-  template <class NumTy> struct MDUnsignedField : public MDFieldImpl<NumTy> {
-    typedef typename MDUnsignedField::ImplTy ImplTy;
-    NumTy Max;
+  struct MDUnsignedField : public MDFieldImpl<uint64_t> {
+    uint64_t Max;
 
-    MDUnsignedField(NumTy Default = 0,
-                    NumTy Max = std::numeric_limits<NumTy>::max())
+    MDUnsignedField(uint64_t Default = 0, uint64_t Max = UINT64_MAX)
         : ImplTy(Default), Max(Max) {}
   };
-  struct DwarfTagField : public MDUnsignedField<uint32_t> {
-    DwarfTagField() : MDUnsignedField<uint32_t>(0, ~0u >> 16) {}
+  struct DwarfTagField : public MDUnsignedField {
+    DwarfTagField() : MDUnsignedField(0, ~0u >> 16) {}
   };
   struct MDField : public MDFieldImpl<Metadata *> {
     MDField() : ImplTy(nullptr) {}
@@ -428,8 +426,7 @@ namespace llvm {
     bool ParseMDNodeVector(SmallVectorImpl<Metadata *> &MDs);
     bool ParseInstructionMetadata(Instruction *Inst, PerFunctionState *PFS);
 
-    bool ParseMDField(LocTy Loc, StringRef Name,
-                      MDUnsignedField<uint32_t> &Result);
+    bool ParseMDField(LocTy Loc, StringRef Name, MDUnsignedField &Result);
     bool ParseMDField(LocTy Loc, StringRef Name, DwarfTagField &Result);
     bool ParseMDField(LocTy Loc, StringRef Name, MDField &Result);
     bool ParseMDField(LocTy Loc, StringRef Name, MDStringField &Result);