From: Duncan P. N. Exon Smith Date: Wed, 4 Feb 2015 21:57:52 +0000 (+0000) Subject: AsmParser: Simplify MDUnsignedField X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=321b43e7cc078cc11da26c02add7279bc7db6133;p=oota-llvm.git AsmParser: Simplify MDUnsignedField We only need `uint64_t` for storage. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228205 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 1f5087c152c..6441dc3f6f5 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -2924,23 +2924,23 @@ bool LLParser::ParseMDNodeTail(MDNode *&N) { } bool LLParser::ParseMDField(LocTy Loc, StringRef Name, - MDUnsignedField &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 &>(Result)); + return ParseMDField(Loc, Name, static_cast(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, (0, ~0u >> 8)); \ - OPTIONAL(column, MDUnsignedField, (0, ~0u >> 16)); \ + OPTIONAL(line, MDUnsignedField, (0, ~0u >> 8)); \ + OPTIONAL(column, MDUnsignedField, (0, ~0u >> 16)); \ REQUIRED(scope, MDField, ); \ OPTIONAL(inlinedAt, MDField, ); PARSE_MD_FIELDS(); diff --git a/lib/AsmParser/LLParser.h b/lib/AsmParser/LLParser.h index 240fb608138..c9aafd99740 100644 --- a/lib/AsmParser/LLParser.h +++ b/lib/AsmParser/LLParser.h @@ -94,16 +94,14 @@ namespace llvm { explicit MDFieldImpl(FieldTy Default) : Val(std::move(Default)), Seen(false) {} }; - template struct MDUnsignedField : public MDFieldImpl { - typedef typename MDUnsignedField::ImplTy ImplTy; - NumTy Max; + struct MDUnsignedField : public MDFieldImpl { + uint64_t Max; - MDUnsignedField(NumTy Default = 0, - NumTy Max = std::numeric_limits::max()) + MDUnsignedField(uint64_t Default = 0, uint64_t Max = UINT64_MAX) : ImplTy(Default), Max(Max) {} }; - struct DwarfTagField : public MDUnsignedField { - DwarfTagField() : MDUnsignedField(0, ~0u >> 16) {} + struct DwarfTagField : public MDUnsignedField { + DwarfTagField() : MDUnsignedField(0, ~0u >> 16) {} }; struct MDField : public MDFieldImpl { MDField() : ImplTy(nullptr) {} @@ -428,8 +426,7 @@ namespace llvm { bool ParseMDNodeVector(SmallVectorImpl &MDs); bool ParseInstructionMetadata(Instruction *Inst, PerFunctionState *PFS); - bool ParseMDField(LocTy Loc, StringRef Name, - MDUnsignedField &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);