1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===--- Attr.h - Classes for representing attributes ----------*- C++ -*-===// 2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// The LLVM Compiler Infrastructure 4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source 6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details. 7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file defines the Attr interface and subclasses. 11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_CLANG_AST_ATTR_H 15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_CLANG_AST_ATTR_H 16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/AST/AttrIterator.h" 18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/AST/Decl.h" 19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/AST/Expr.h" 20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/AST/Type.h" 21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/AttrKinds.h" 22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/LLVM.h" 23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/OpenMPKinds.h" 24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/Sanitizers.h" 25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/SourceLocation.h" 26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/VersionTuple.h" 27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/StringSwitch.h" 28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/ErrorHandling.h" 29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/raw_ostream.h" 30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <algorithm> 31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <cassert> 32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace clang { 34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class ASTContext; 35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class IdentifierInfo; 36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class ObjCInterfaceDecl; 37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class Expr; 38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class QualType; 39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class FunctionDecl; 40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class TypeSourceInfo; 41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Attr - This represents one attribute. 43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass Attr { 44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate: 45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SourceRange Range; 46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned AttrKind : 16; 47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected: 49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// An index into the spelling list of an 50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// attribute defined in Attr.td file. 51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned SpellingListIndex : 4; 52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Inherited : 1; 53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned IsPackExpansion : 1; 54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Implicit : 1; 55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned IsLateParsed : 1; 56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned DuplicatesAllowed : 1; 57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void *operator new(size_t bytes) noexcept { 59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm_unreachable("Attrs cannot be allocated with regular 'new'."); 60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void operator delete(void *data) noexcept { 62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm_unreachable("Attrs cannot be released with regular 'delete'."); 63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Forward so that the regular new and delete do not hide global ones. 67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void *operator new(size_t Bytes, ASTContext &C, 68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot size_t Alignment = 8) noexcept { 69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return ::operator new(Bytes, C, Alignment); 70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void operator delete(void *Ptr, ASTContext &C, size_t Alignment) noexcept { 72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return ::operator delete(Ptr, C, Alignment); 73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected: 76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Attr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex, 77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsLateParsed, bool DuplicatesAllowed) 78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Range(R), AttrKind(AK), SpellingListIndex(SpellingListIndex), 79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Inherited(false), IsPackExpansion(false), Implicit(false), 80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsLateParsed(IsLateParsed), DuplicatesAllowed(DuplicatesAllowed) {} 81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot attr::Kind getKind() const { 85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return static_cast<attr::Kind>(AttrKind); 86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getSpellingListIndex() const { return SpellingListIndex; } 89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *getSpelling() const; 90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SourceLocation getLocation() const { return Range.getBegin(); } 92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SourceRange getRange() const { return Range; } 93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setRange(SourceRange R) { Range = R; } 94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isInherited() const { return Inherited; } 96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Returns true if the attribute has been implicitly created instead 98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// of explicitly written by the user. 99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isImplicit() const { return Implicit; } 100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setImplicit(bool I) { Implicit = I; } 101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setPackExpansion(bool PE) { IsPackExpansion = PE; } 103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isPackExpansion() const { return IsPackExpansion; } 104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Clone this attribute. 106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Attr *clone(ASTContext &C) const; 107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isLateParsed() const { return IsLateParsed; } 109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Pretty print this attribute. 111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const; 112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief By default, attributes cannot be duplicated when being merged; 114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// however, an attribute can override this. Returns true if the attribute 115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// can be duplicated when merging. 116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool duplicatesAllowed() const { return DuplicatesAllowed; } 117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass StmtAttr : public Attr { 120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected: 121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StmtAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex, 122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsLateParsed, bool DuplicatesAllowed) 123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Attr(AK, R, SpellingListIndex, IsLateParsed, DuplicatesAllowed) {} 124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Attr *A) { 127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() >= attr::FirstStmtAttr && 128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot A->getKind() <= attr::LastStmtAttr; 129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass InheritableAttr : public Attr { 133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected: 134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot InheritableAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex, 135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsLateParsed, bool DuplicatesAllowed) 136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Attr(AK, R, SpellingListIndex, IsLateParsed, DuplicatesAllowed) {} 137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setInherited(bool I) { Inherited = I; } 140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Implement isa/cast/dyncast/etc. 142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Attr *A) { 143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() >= attr::FirstInheritableAttr && 144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot A->getKind() <= attr::LastInheritableAttr; 145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass InheritableParamAttr : public InheritableAttr { 149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected: 150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot InheritableParamAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex, 151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsLateParsed, bool DuplicatesAllowed) 152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : InheritableAttr(AK, R, SpellingListIndex, IsLateParsed, 153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DuplicatesAllowed) {} 154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Implement isa/cast/dyncast/etc. 157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Attr *A) { 158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() >= attr::FirstInheritableParamAttr && 159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot A->getKind() <= attr::LastInheritableParamAttr; 160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// A parameter attribute which changes the argument-passing ABI rule 164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// for the parameter. 165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ParameterABIAttr : public InheritableParamAttr { 166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected: 167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ParameterABIAttr(attr::Kind AK, SourceRange R, 168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned SpellingListIndex, bool IsLateParsed, 169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool DuplicatesAllowed) 170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : InheritableParamAttr(AK, R, SpellingListIndex, IsLateParsed, 171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DuplicatesAllowed) {} 172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ParameterABI getABI() const { 175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot switch (getKind()) { 176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot case attr::SwiftContext: 177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return ParameterABI::SwiftContext; 178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot case attr::SwiftErrorResult: 179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return ParameterABI::SwiftErrorResult; 180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot case attr::SwiftIndirectResult: 181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return ParameterABI::SwiftIndirectResult; 182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot default: 183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm_unreachable("bad parameter ABI attribute kind"); 184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Attr *A) { 188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() >= attr::FirstParameterABIAttr && 189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot A->getKind() <= attr::LastParameterABIAttr; 190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/AST/Attrs.inc" 194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Attr *At) { 197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DB.AddTaggedVal(reinterpret_cast<intptr_t>(At), 198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DiagnosticsEngine::ak_attr); 199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return DB; 200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, 203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Attr *At) { 204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot PD.AddTaggedVal(reinterpret_cast<intptr_t>(At), 205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DiagnosticsEngine::ak_attr); 206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return PD; 207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace clang 209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif 211