AttrImpl.cpp revision 521f12d3dfdbb0e93d1bcb503d074e67acdc489c
1//===--- AttrImpl.cpp - Classes for representing attributes -----*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains out-of-line virtual methods for Attr classes. 11// 12//===----------------------------------------------------------------------===// 13 14#include "clang/AST/Attr.h" 15#include "clang/AST/ASTContext.h" 16using namespace clang; 17 18void Attr::Destroy(ASTContext &C) { 19 if (Next) { 20 Next->Destroy(C); 21 Next = 0; 22 } 23 this->~Attr(); 24 C.Deallocate((void*)this); 25} 26 27AttrWithString::AttrWithString(attr::Kind AK, ASTContext &C, llvm::StringRef s) 28 : Attr(AK) { 29 assert(!s.empty()); 30 StrLen = s.size(); 31 Str = new (C) char[StrLen]; 32 memcpy(const_cast<char*>(Str), s.data(), StrLen); 33} 34 35void AttrWithString::Destroy(ASTContext &C) { 36 C.Deallocate(const_cast<char*>(Str)); 37 Attr::Destroy(C); 38} 39 40void AttrWithString::ReplaceString(ASTContext &C, llvm::StringRef newS) { 41 if (newS.size() > StrLen) { 42 C.Deallocate(const_cast<char*>(Str)); 43 Str = new (C) char[newS.size()]; 44 } 45 StrLen = newS.size(); 46 memcpy(const_cast<char*>(Str), newS.data(), StrLen); 47} 48 49void FormatAttr::setType(ASTContext &C, llvm::StringRef type) { 50 ReplaceString(C, type); 51} 52 53NonNullAttr::NonNullAttr(ASTContext &C, unsigned* arg_nums, unsigned size) 54 : Attr(attr::NonNull), ArgNums(0), Size(0) { 55 if (size == 0) 56 return; 57 assert(arg_nums); 58 ArgNums = new (C) unsigned[size]; 59 Size = size; 60 memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size); 61} 62 63void NonNullAttr::Destroy(ASTContext &C) { 64 if (ArgNums) 65 C.Deallocate(ArgNums); 66 Attr::Destroy(C); 67} 68 69#define DEF_SIMPLE_ATTR_CLONE(ATTR) \ 70 Attr *ATTR##Attr::clone(ASTContext &C) const { \ 71 return ::new (C) ATTR##Attr; \ 72 } 73 74// FIXME: Can we use variadic macro to define DEF_SIMPLE_ATTR_CLONE for 75// "non-simple" classes? 76 77DEF_SIMPLE_ATTR_CLONE(AlignMac68k) 78DEF_SIMPLE_ATTR_CLONE(AlwaysInline) 79DEF_SIMPLE_ATTR_CLONE(AnalyzerNoReturn) 80DEF_SIMPLE_ATTR_CLONE(BaseCheck) 81DEF_SIMPLE_ATTR_CLONE(CDecl) 82DEF_SIMPLE_ATTR_CLONE(CFReturnsNotRetained) 83DEF_SIMPLE_ATTR_CLONE(CFReturnsRetained) 84DEF_SIMPLE_ATTR_CLONE(Const) 85DEF_SIMPLE_ATTR_CLONE(DLLExport) 86DEF_SIMPLE_ATTR_CLONE(DLLImport) 87DEF_SIMPLE_ATTR_CLONE(Deprecated) 88DEF_SIMPLE_ATTR_CLONE(FastCall) 89DEF_SIMPLE_ATTR_CLONE(Final) 90DEF_SIMPLE_ATTR_CLONE(Hiding) 91DEF_SIMPLE_ATTR_CLONE(Malloc) 92DEF_SIMPLE_ATTR_CLONE(NSReturnsNotRetained) 93DEF_SIMPLE_ATTR_CLONE(NSReturnsRetained) 94DEF_SIMPLE_ATTR_CLONE(NoDebug) 95DEF_SIMPLE_ATTR_CLONE(NoInline) 96DEF_SIMPLE_ATTR_CLONE(NoReturn) 97DEF_SIMPLE_ATTR_CLONE(NoThrow) 98DEF_SIMPLE_ATTR_CLONE(ObjCException) 99DEF_SIMPLE_ATTR_CLONE(ObjCNSObject) 100DEF_SIMPLE_ATTR_CLONE(Override) 101DEF_SIMPLE_ATTR_CLONE(Packed) 102DEF_SIMPLE_ATTR_CLONE(Pure) 103DEF_SIMPLE_ATTR_CLONE(StdCall) 104DEF_SIMPLE_ATTR_CLONE(ThisCall) 105DEF_SIMPLE_ATTR_CLONE(TransparentUnion) 106DEF_SIMPLE_ATTR_CLONE(Unavailable) 107DEF_SIMPLE_ATTR_CLONE(Unused) 108DEF_SIMPLE_ATTR_CLONE(Used) 109DEF_SIMPLE_ATTR_CLONE(WarnUnusedResult) 110DEF_SIMPLE_ATTR_CLONE(Weak) 111DEF_SIMPLE_ATTR_CLONE(WeakImport) 112DEF_SIMPLE_ATTR_CLONE(WeakRef) 113DEF_SIMPLE_ATTR_CLONE(X86ForceAlignArgPointer) 114 115Attr* MaxFieldAlignmentAttr::clone(ASTContext &C) const { 116 return ::new (C) MaxFieldAlignmentAttr(Alignment); 117} 118 119Attr* AlignedAttr::clone(ASTContext &C) const { 120 return ::new (C) AlignedAttr(Alignment); 121} 122 123Attr* AnnotateAttr::clone(ASTContext &C) const { 124 return ::new (C) AnnotateAttr(C, getAnnotation()); 125} 126 127Attr *AsmLabelAttr::clone(ASTContext &C) const { 128 return ::new (C) AsmLabelAttr(C, getLabel()); 129} 130 131Attr *AliasAttr::clone(ASTContext &C) const { 132 return ::new (C) AliasAttr(C, getAliasee()); 133} 134 135Attr *ConstructorAttr::clone(ASTContext &C) const { 136 return ::new (C) ConstructorAttr(priority); 137} 138 139Attr *DestructorAttr::clone(ASTContext &C) const { 140 return ::new (C) DestructorAttr(priority); 141} 142 143Attr *IBOutletAttr::clone(ASTContext &C) const { 144 return ::new (C) IBOutletAttr; 145} 146 147Attr *IBOutletCollectionAttr::clone(ASTContext &C) const { 148 return ::new (C) IBOutletCollectionAttr(D); 149} 150 151Attr *IBActionAttr::clone(ASTContext &C) const { 152 return ::new (C) IBActionAttr; 153} 154 155Attr *GNUInlineAttr::clone(ASTContext &C) const { 156 return ::new (C) GNUInlineAttr; 157} 158 159Attr *SectionAttr::clone(ASTContext &C) const { 160 return ::new (C) SectionAttr(C, getName()); 161} 162 163Attr *NonNullAttr::clone(ASTContext &C) const { 164 return ::new (C) NonNullAttr(C, ArgNums, Size); 165} 166 167Attr *FormatAttr::clone(ASTContext &C) const { 168 return ::new (C) FormatAttr(C, getType(), formatIdx, firstArg); 169} 170 171Attr *FormatArgAttr::clone(ASTContext &C) const { 172 return ::new (C) FormatArgAttr(formatIdx); 173} 174 175Attr *SentinelAttr::clone(ASTContext &C) const { 176 return ::new (C) SentinelAttr(sentinel, NullPos); 177} 178 179Attr *VisibilityAttr::clone(ASTContext &C) const { 180 return ::new (C) VisibilityAttr(VisibilityType); 181} 182 183Attr *OverloadableAttr::clone(ASTContext &C) const { 184 return ::new (C) OverloadableAttr; 185} 186 187Attr *BlocksAttr::clone(ASTContext &C) const { 188 return ::new (C) BlocksAttr(BlocksAttrType); 189} 190 191Attr *CleanupAttr::clone(ASTContext &C) const { 192 return ::new (C) CleanupAttr(FD); 193} 194 195Attr *RegparmAttr::clone(ASTContext &C) const { 196 return ::new (C) RegparmAttr(NumParams); 197} 198 199Attr *ReqdWorkGroupSizeAttr::clone(ASTContext &C) const { 200 return ::new (C) ReqdWorkGroupSizeAttr(X, Y, Z); 201} 202 203Attr *InitPriorityAttr::clone(ASTContext &C) const { 204 return ::new (C) InitPriorityAttr(Priority); 205} 206 207Attr *MSP430InterruptAttr::clone(ASTContext &C) const { 208 return ::new (C) MSP430InterruptAttr(Number); 209} 210