blob: d835edf0b3248f1722f3932671057a5d3ae5c7f6 [file] [log] [blame]
Anton Korobeynikovfc5d5132010-01-10 14:38:13 +00001//===--- 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
Anton Korobeynikovfc5d5132010-01-10 14:38:13 +000014#include "clang/AST/Attr.h"
15#include "clang/AST/ASTContext.h"
16using namespace clang;
17
Ted Kremenek3d2c43e2010-02-11 05:28:37 +000018void 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 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
Anton Korobeynikovfc5d5132010-01-10 14:38:13 +000053#define DEF_SIMPLE_ATTR_CLONE(ATTR) \
54 Attr *ATTR##Attr::clone(ASTContext &C) const { \
55 return ::new (C) ATTR##Attr; \
56 }
57
58// FIXME: Can we use variadic macro to define DEF_SIMPLE_ATTR_CLONE for
59// "non-simple" classes?
60
61DEF_SIMPLE_ATTR_CLONE(Packed)
62DEF_SIMPLE_ATTR_CLONE(AlwaysInline)
63DEF_SIMPLE_ATTR_CLONE(Malloc)
64DEF_SIMPLE_ATTR_CLONE(NoReturn)
65DEF_SIMPLE_ATTR_CLONE(AnalyzerNoReturn)
66DEF_SIMPLE_ATTR_CLONE(Deprecated)
67DEF_SIMPLE_ATTR_CLONE(Final)
68DEF_SIMPLE_ATTR_CLONE(Unavailable)
69DEF_SIMPLE_ATTR_CLONE(Unused)
70DEF_SIMPLE_ATTR_CLONE(Used)
71DEF_SIMPLE_ATTR_CLONE(Weak)
72DEF_SIMPLE_ATTR_CLONE(WeakImport)
73DEF_SIMPLE_ATTR_CLONE(NoThrow)
74DEF_SIMPLE_ATTR_CLONE(Const)
75DEF_SIMPLE_ATTR_CLONE(Pure)
76DEF_SIMPLE_ATTR_CLONE(FastCall)
77DEF_SIMPLE_ATTR_CLONE(StdCall)
78DEF_SIMPLE_ATTR_CLONE(CDecl)
79DEF_SIMPLE_ATTR_CLONE(TransparentUnion)
80DEF_SIMPLE_ATTR_CLONE(ObjCNSObject)
81DEF_SIMPLE_ATTR_CLONE(ObjCException)
82DEF_SIMPLE_ATTR_CLONE(NoDebug)
83DEF_SIMPLE_ATTR_CLONE(WarnUnusedResult)
84DEF_SIMPLE_ATTR_CLONE(NoInline)
85DEF_SIMPLE_ATTR_CLONE(CFReturnsRetained)
86DEF_SIMPLE_ATTR_CLONE(NSReturnsRetained)
87DEF_SIMPLE_ATTR_CLONE(BaseCheck)
88DEF_SIMPLE_ATTR_CLONE(Hiding)
89DEF_SIMPLE_ATTR_CLONE(Override)
90DEF_SIMPLE_ATTR_CLONE(DLLImport)
91DEF_SIMPLE_ATTR_CLONE(DLLExport)
Charles Davis5a0164d2010-02-10 23:06:52 +000092DEF_SIMPLE_ATTR_CLONE(X86ForceAlignArgPointer)
Anton Korobeynikovfc5d5132010-01-10 14:38:13 +000093
94Attr* PragmaPackAttr::clone(ASTContext &C) const {
95 return ::new (C) PragmaPackAttr(Alignment);
96}
97
98Attr* AlignedAttr::clone(ASTContext &C) const {
99 return ::new (C) AlignedAttr(Alignment);
100}
101
102Attr* AnnotateAttr::clone(ASTContext &C) const {
Ted Kremenek3d2c43e2010-02-11 05:28:37 +0000103 return ::new (C) AnnotateAttr(C, getAnnotation());
Anton Korobeynikovfc5d5132010-01-10 14:38:13 +0000104}
105
106Attr *AsmLabelAttr::clone(ASTContext &C) const {
Ted Kremenek3d2c43e2010-02-11 05:28:37 +0000107 return ::new (C) AsmLabelAttr(C, getLabel());
Anton Korobeynikovfc5d5132010-01-10 14:38:13 +0000108}
109
110Attr *AliasAttr::clone(ASTContext &C) const {
Ted Kremenek3d2c43e2010-02-11 05:28:37 +0000111 return ::new (C) AliasAttr(C, getAliasee());
Anton Korobeynikovfc5d5132010-01-10 14:38:13 +0000112}
113
114Attr *ConstructorAttr::clone(ASTContext &C) const {
115 return ::new (C) ConstructorAttr(priority);
116}
117
118Attr *DestructorAttr::clone(ASTContext &C) const {
119 return ::new (C) DestructorAttr(priority);
120}
121
122Attr *IBOutletAttr::clone(ASTContext &C) const {
123 return ::new (C) IBOutletAttr;
124}
125
126Attr *GNUInlineAttr::clone(ASTContext &C) const {
127 return ::new (C) GNUInlineAttr;
128}
129
130Attr *SectionAttr::clone(ASTContext &C) const {
Ted Kremenek3d2c43e2010-02-11 05:28:37 +0000131 return ::new (C) SectionAttr(C, getName());
Anton Korobeynikovfc5d5132010-01-10 14:38:13 +0000132}
133
134Attr *NonNullAttr::clone(ASTContext &C) const {
135 return ::new (C) NonNullAttr(ArgNums, Size);
136}
137
138Attr *FormatAttr::clone(ASTContext &C) const {
Ted Kremenek3d2c43e2010-02-11 05:28:37 +0000139 return ::new (C) FormatAttr(C, getType(), formatIdx, firstArg);
Anton Korobeynikovfc5d5132010-01-10 14:38:13 +0000140}
141
142Attr *FormatArgAttr::clone(ASTContext &C) const {
143 return ::new (C) FormatArgAttr(formatIdx);
144}
145
146Attr *SentinelAttr::clone(ASTContext &C) const {
147 return ::new (C) SentinelAttr(sentinel, NullPos);
148}
149
150Attr *VisibilityAttr::clone(ASTContext &C) const {
151 return ::new (C) VisibilityAttr(VisibilityType);
152}
153
154Attr *OverloadableAttr::clone(ASTContext &C) const {
155 return ::new (C) OverloadableAttr;
156}
157
158Attr *BlocksAttr::clone(ASTContext &C) const {
159 return ::new (C) BlocksAttr(BlocksAttrType);
160}
161
162Attr *CleanupAttr::clone(ASTContext &C) const {
163 return ::new (C) CleanupAttr(FD);
164}
165
166Attr *RegparmAttr::clone(ASTContext &C) const {
167 return ::new (C) RegparmAttr(NumParams);
168}
169
170Attr *ReqdWorkGroupSizeAttr::clone(ASTContext &C) const {
171 return ::new (C) ReqdWorkGroupSizeAttr(X, Y, Z);
172}
173
174Attr *MSP430InterruptAttr::clone(ASTContext &C) const {
175 return ::new (C) MSP430InterruptAttr(Number);
176}
177
178