diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2010-01-10 14:38:13 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2010-01-10 14:38:13 +0000 |
commit | fc5d5133357e36b9b83edd7cd10080d783f19010 (patch) | |
tree | c961fa634f1546e6f6dac27a7a9817d6f26a4229 | |
parent | f3e27bf71d9f157071ef65258945abe57f49a6a1 (diff) |
Make clone() method out-of-line for Attr classes.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93120 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/Attr.h | 62 | ||||
-rw-r--r-- | lib/AST/AttrImpl.cpp | 143 | ||||
-rw-r--r-- | lib/AST/CMakeLists.txt | 1 |
3 files changed, 166 insertions, 40 deletions
diff --git a/include/clang/AST/Attr.h b/include/clang/AST/Attr.h index f11374b70b..03ab0f0702 100644 --- a/include/clang/AST/Attr.h +++ b/include/clang/AST/Attr.h @@ -161,7 +161,7 @@ public: class ATTR##Attr : public Attr { \ public: \ ATTR##Attr() : Attr(ATTR) {} \ - virtual Attr *clone(ASTContext &C) const { return ::new (C) ATTR##Attr; }\ + virtual Attr *clone(ASTContext &C) const; \ static bool classof(const Attr *A) { return A->getKind() == ATTR; } \ static bool classof(const ATTR##Attr *A) { return true; } \ } @@ -177,9 +177,7 @@ public: /// getAlignment - The specified alignment in bits. unsigned getAlignment() const { return Alignment; } - virtual Attr* clone(ASTContext &C) const { - return ::new (C) PragmaPackAttr(Alignment); - } + virtual Attr* clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { @@ -206,9 +204,7 @@ public: return Alignment; } - virtual Attr* clone(ASTContext &C) const { - return ::new (C) AlignedAttr(Alignment); - } + virtual Attr* clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { @@ -224,7 +220,7 @@ public: const std::string& getAnnotation() const { return Annotation; } - virtual Attr* clone(ASTContext &C) const { return ::new (C) AnnotateAttr(Annotation); } + virtual Attr* clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { @@ -240,7 +236,7 @@ public: const std::string& getLabel() const { return Label; } - virtual Attr* clone(ASTContext &C) const { return ::new (C) AsmLabelAttr(Label); } + virtual Attr* clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { @@ -258,7 +254,7 @@ public: const std::string& getAliasee() const { return Aliasee; } - virtual Attr *clone(ASTContext &C) const { return ::new (C) AliasAttr(Aliasee); } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == Alias; } @@ -272,7 +268,7 @@ public: int getPriority() const { return priority; } - virtual Attr *clone(ASTContext &C) const { return ::new (C) ConstructorAttr(priority); } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == Constructor; } @@ -286,7 +282,7 @@ public: int getPriority() const { return priority; } - virtual Attr *clone(ASTContext &C) const { return ::new (C) DestructorAttr(priority); } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == Destructor; } @@ -297,7 +293,7 @@ class GNUInlineAttr : public Attr { public: GNUInlineAttr() : Attr(GNUInline) {} - virtual Attr *clone(ASTContext &C) const { return ::new (C) GNUInlineAttr; } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { @@ -310,7 +306,7 @@ class IBOutletAttr : public Attr { public: IBOutletAttr() : Attr(IBOutletKind) {} - virtual Attr *clone(ASTContext &C) const { return ::new (C) IBOutletAttr; } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { @@ -332,7 +328,7 @@ public: const std::string& getName() const { return Name; } - virtual Attr *clone(ASTContext &C) const { return ::new (C) SectionAttr(Name); } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { @@ -377,7 +373,7 @@ public: return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true; } - virtual Attr *clone(ASTContext &C) const { return ::new (C) NonNullAttr(ArgNums, Size); } + virtual Attr *clone(ASTContext &C) const; static bool classof(const Attr *A) { return A->getKind() == NonNull; } static bool classof(const NonNullAttr *A) { return true; } @@ -395,9 +391,7 @@ public: int getFormatIdx() const { return formatIdx; } int getFirstArg() const { return firstArg; } - virtual Attr *clone(ASTContext &C) const { - return ::new (C) FormatAttr(Type, formatIdx, firstArg); - } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == Format; } @@ -410,9 +404,7 @@ public: FormatArgAttr(int idx) : Attr(FormatArg), formatIdx(idx) {} int getFormatIdx() const { return formatIdx; } - virtual Attr *clone(ASTContext &C) const { - return ::new (C) FormatArgAttr(formatIdx); - } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == FormatArg; } @@ -427,9 +419,7 @@ public: int getSentinel() const { return sentinel; } int getNullPos() const { return NullPos; } - virtual Attr *clone(ASTContext &C) const { - return ::new (C) SentinelAttr(sentinel, NullPos); - } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == Sentinel; } @@ -452,7 +442,7 @@ public: VisibilityTypes getVisibility() const { return VisibilityType; } - virtual Attr *clone(ASTContext &C) const { return ::new (C) VisibilityAttr(VisibilityType); } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == Visibility; } @@ -472,9 +462,7 @@ public: virtual bool isMerged() const { return false; } - virtual Attr *clone(ASTContext &C) const { - return ::new (C) OverloadableAttr; - } + virtual Attr *clone(ASTContext &C) const; static bool classof(const Attr *A) { return A->getKind() == Overloadable; } static bool classof(const OverloadableAttr *) { return true; } @@ -492,7 +480,7 @@ public: BlocksAttrTypes getType() const { return BlocksAttrType; } - virtual Attr *clone(ASTContext &C) const { return ::new (C) BlocksAttr(BlocksAttrType); } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == Blocks; } @@ -509,7 +497,7 @@ public: const FunctionDecl *getFunctionDecl() const { return FD; } - virtual Attr *clone(ASTContext &C) const { return ::new (C) CleanupAttr(FD); } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == Cleanup; } @@ -528,9 +516,7 @@ public: unsigned getNumParams() const { return NumParams; } - virtual Attr *clone(ASTContext &C) const { - return ::new (C) RegparmAttr(NumParams); - } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == Regparm; } @@ -547,9 +533,7 @@ public: unsigned getYDim() const { return Y; } unsigned getZDim() const { return Z; } - virtual Attr *clone(ASTContext &C) const { - return ::new (C) ReqdWorkGroupSizeAttr(X, Y, Z); - } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { @@ -579,9 +563,7 @@ public: unsigned getNumber() const { return Number; } - virtual Attr *clone(ASTContext &C) const { - return ::new (C) MSP430InterruptAttr(Number); - } + virtual Attr *clone(ASTContext &C) const; // Implement isa/cast/dyncast/etc. static bool classof(const Attr *A) { return A->getKind() == MSP430Interrupt; } diff --git a/lib/AST/AttrImpl.cpp b/lib/AST/AttrImpl.cpp new file mode 100644 index 0000000000..02c70b6511 --- /dev/null +++ b/lib/AST/AttrImpl.cpp @@ -0,0 +1,143 @@ +//===--- AttrImpl.cpp - Classes for representing attributes -----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains out-of-line virtual methods for Attr classes. +// +//===----------------------------------------------------------------------===// + + +#include "clang/AST/Attr.h" +#include "clang/AST/ASTContext.h" +using namespace clang; + +#define DEF_SIMPLE_ATTR_CLONE(ATTR) \ + Attr *ATTR##Attr::clone(ASTContext &C) const { \ + return ::new (C) ATTR##Attr; \ + } + +// FIXME: Can we use variadic macro to define DEF_SIMPLE_ATTR_CLONE for +// "non-simple" classes? + +DEF_SIMPLE_ATTR_CLONE(Packed) +DEF_SIMPLE_ATTR_CLONE(AlwaysInline) +DEF_SIMPLE_ATTR_CLONE(Malloc) +DEF_SIMPLE_ATTR_CLONE(NoReturn) +DEF_SIMPLE_ATTR_CLONE(AnalyzerNoReturn) +DEF_SIMPLE_ATTR_CLONE(Deprecated) +DEF_SIMPLE_ATTR_CLONE(Final) +DEF_SIMPLE_ATTR_CLONE(Unavailable) +DEF_SIMPLE_ATTR_CLONE(Unused) +DEF_SIMPLE_ATTR_CLONE(Used) +DEF_SIMPLE_ATTR_CLONE(Weak) +DEF_SIMPLE_ATTR_CLONE(WeakImport) +DEF_SIMPLE_ATTR_CLONE(NoThrow) +DEF_SIMPLE_ATTR_CLONE(Const) +DEF_SIMPLE_ATTR_CLONE(Pure) +DEF_SIMPLE_ATTR_CLONE(FastCall) +DEF_SIMPLE_ATTR_CLONE(StdCall) +DEF_SIMPLE_ATTR_CLONE(CDecl) +DEF_SIMPLE_ATTR_CLONE(TransparentUnion) +DEF_SIMPLE_ATTR_CLONE(ObjCNSObject) +DEF_SIMPLE_ATTR_CLONE(ObjCException) +DEF_SIMPLE_ATTR_CLONE(NoDebug) +DEF_SIMPLE_ATTR_CLONE(WarnUnusedResult) +DEF_SIMPLE_ATTR_CLONE(NoInline) +DEF_SIMPLE_ATTR_CLONE(CFReturnsRetained) +DEF_SIMPLE_ATTR_CLONE(NSReturnsRetained) +DEF_SIMPLE_ATTR_CLONE(BaseCheck) +DEF_SIMPLE_ATTR_CLONE(Hiding) +DEF_SIMPLE_ATTR_CLONE(Override) +DEF_SIMPLE_ATTR_CLONE(DLLImport) +DEF_SIMPLE_ATTR_CLONE(DLLExport) + +Attr* PragmaPackAttr::clone(ASTContext &C) const { + return ::new (C) PragmaPackAttr(Alignment); +} + +Attr* AlignedAttr::clone(ASTContext &C) const { + return ::new (C) AlignedAttr(Alignment); +} + +Attr* AnnotateAttr::clone(ASTContext &C) const { + return ::new (C) AnnotateAttr(Annotation); +} + +Attr *AsmLabelAttr::clone(ASTContext &C) const { + return ::new (C) AsmLabelAttr(Label); +} + +Attr *AliasAttr::clone(ASTContext &C) const { + return ::new (C) AliasAttr(Aliasee); +} + +Attr *ConstructorAttr::clone(ASTContext &C) const { + return ::new (C) ConstructorAttr(priority); +} + +Attr *DestructorAttr::clone(ASTContext &C) const { + return ::new (C) DestructorAttr(priority); +} + +Attr *IBOutletAttr::clone(ASTContext &C) const { + return ::new (C) IBOutletAttr; +} + +Attr *GNUInlineAttr::clone(ASTContext &C) const { + return ::new (C) GNUInlineAttr; +} + +Attr *SectionAttr::clone(ASTContext &C) const { + return ::new (C) SectionAttr(Name); +} + +Attr *NonNullAttr::clone(ASTContext &C) const { + return ::new (C) NonNullAttr(ArgNums, Size); +} + +Attr *FormatAttr::clone(ASTContext &C) const { + return ::new (C) FormatAttr(Type, formatIdx, firstArg); +} + +Attr *FormatArgAttr::clone(ASTContext &C) const { + return ::new (C) FormatArgAttr(formatIdx); +} + +Attr *SentinelAttr::clone(ASTContext &C) const { + return ::new (C) SentinelAttr(sentinel, NullPos); +} + +Attr *VisibilityAttr::clone(ASTContext &C) const { + return ::new (C) VisibilityAttr(VisibilityType); +} + +Attr *OverloadableAttr::clone(ASTContext &C) const { + return ::new (C) OverloadableAttr; +} + +Attr *BlocksAttr::clone(ASTContext &C) const { + return ::new (C) BlocksAttr(BlocksAttrType); +} + +Attr *CleanupAttr::clone(ASTContext &C) const { + return ::new (C) CleanupAttr(FD); +} + +Attr *RegparmAttr::clone(ASTContext &C) const { + return ::new (C) RegparmAttr(NumParams); +} + +Attr *ReqdWorkGroupSizeAttr::clone(ASTContext &C) const { + return ::new (C) ReqdWorkGroupSizeAttr(X, Y, Z); +} + +Attr *MSP430InterruptAttr::clone(ASTContext &C) const { + return ::new (C) MSP430InterruptAttr(Number); +} + + diff --git a/lib/AST/CMakeLists.txt b/lib/AST/CMakeLists.txt index 5aecf878c9..dea96e7866 100644 --- a/lib/AST/CMakeLists.txt +++ b/lib/AST/CMakeLists.txt @@ -4,6 +4,7 @@ add_clang_library(clangAST APValue.cpp ASTConsumer.cpp ASTContext.cpp + AttrImpl.cpp CXXInheritance.cpp Decl.cpp DeclBase.cpp |