diff options
Diffstat (limited to 'lib/Sema/AttributeList.cpp')
| -rw-r--r-- | lib/Sema/AttributeList.cpp | 40 | 
1 files changed, 36 insertions, 4 deletions
diff --git a/lib/Sema/AttributeList.cpp b/lib/Sema/AttributeList.cpp index 9ac4c63e191e1..c9807723f064e 100644 --- a/lib/Sema/AttributeList.cpp +++ b/lib/Sema/AttributeList.cpp @@ -19,13 +19,21 @@  #include "llvm/ADT/StringSwitch.h"  using namespace clang; +IdentifierLoc *IdentifierLoc::create(ASTContext &Ctx, SourceLocation Loc, +                                     IdentifierInfo *Ident) { +  IdentifierLoc *Result = new (Ctx) IdentifierLoc; +  Result->Loc = Loc; +  Result->Ident = Ident; +  return Result; +} +  size_t AttributeList::allocated_size() const {    if (IsAvailability) return AttributeFactory::AvailabilityAllocSize;    else if (IsTypeTagForDatatype)      return AttributeFactory::TypeTagForDatatypeAllocSize;    else if (IsProperty)      return AttributeFactory::PropertyAllocSize; -  return (sizeof(AttributeList) + NumArgs * sizeof(Expr*)); +  return (sizeof(AttributeList) + NumArgs * sizeof(ArgsUnion));  }  AttributeFactory::AttributeFactory() { @@ -98,10 +106,9 @@ void AttributePool::takePool(AttributeList *pool) {  AttributeList *  AttributePool::createIntegerAttribute(ASTContext &C, IdentifierInfo *Name,                                        SourceLocation TokLoc, int Arg) { -  Expr *IArg = IntegerLiteral::Create(C, llvm::APInt(32, (uint64_t) Arg), +  ArgsUnion IArg = IntegerLiteral::Create(C, llvm::APInt(32, (uint64_t) Arg),                                        C.IntTy, TokLoc); -  return create(Name, TokLoc, 0, TokLoc, 0, TokLoc, &IArg, 1, -                AttributeList::AS_GNU); +  return create(Name, TokLoc, 0, TokLoc, &IArg, 1, AttributeList::AS_GNU);  }  #include "clang/Sema/AttrParsedAttrKinds.inc" @@ -138,3 +145,28 @@ unsigned AttributeList::getAttributeSpellingListIndex() const {  } +struct ParsedAttrInfo { +  unsigned NumArgs : 4; +  unsigned OptArgs : 4; +  unsigned HasCustomParsing : 1; +}; + +namespace { +  #include "clang/Sema/AttrParsedAttrImpl.inc" +} + +static const ParsedAttrInfo &getInfo(const AttributeList &A) { +  return AttrInfoMap[A.getKind()]; +} + +unsigned AttributeList::getMinArgs() const { +  return getInfo(*this).NumArgs; +} + +unsigned AttributeList::getMaxArgs() const { +  return getMinArgs() + getInfo(*this).OptArgs; +} + +bool AttributeList::hasCustomParsing() const { +  return getInfo(*this).HasCustomParsing; +}  | 
