DeclOpenMP.h revision 6af701f29be43e49a25ab098c79940ae4cbb69c7
1//===- DeclOpenMP.h - Classes for representing OpenMP directives -*- 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/// \file 11/// \brief This file defines OpenMP nodes for declarative directives. 12/// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_CLANG_AST_OPENMP_H 16#define LLVM_CLANG_AST_OPENMP_H 17 18#include "clang/AST/DeclBase.h" 19#include "llvm/ADT/ArrayRef.h" 20 21namespace clang { 22 23/// \brief This represents '#pragma omp threadprivate ...' directive. 24/// For example, in the following, both 'a' and 'A::b' are threadprivate: 25/// 26/// \code 27/// int a; 28/// #pragma omp threadprivate(a) 29/// struct A { 30/// static int b; 31/// #pragma omp threadprivate(b) 32/// }; 33/// \endcode 34/// 35class OMPThreadPrivateDecl : public Decl { 36 friend class ASTDeclReader; 37 unsigned NumVars; 38 39 virtual void anchor(); 40 41 OMPThreadPrivateDecl(Kind DK, DeclContext *DC, SourceLocation L) : 42 Decl(DK, DC, L), NumVars(0) { } 43 44 ArrayRef<const Expr *> getVars() const { 45 return ArrayRef<const Expr *>( 46 reinterpret_cast<const Expr * const *>(this + 1), 47 NumVars); 48 } 49 50 llvm::MutableArrayRef<Expr *> getVars() { 51 return llvm::MutableArrayRef<Expr *>( 52 reinterpret_cast<Expr **>(this + 1), 53 NumVars); 54 } 55 56 void setVars(ArrayRef<Expr *> VL); 57 58public: 59 static OMPThreadPrivateDecl *Create(ASTContext &C, DeclContext *DC, 60 SourceLocation L, 61 ArrayRef<Expr *> VL); 62 static OMPThreadPrivateDecl *CreateDeserialized(ASTContext &C, 63 unsigned ID, unsigned N); 64 65 typedef llvm::MutableArrayRef<Expr *>::iterator varlist_iterator; 66 typedef ArrayRef<const Expr *>::iterator varlist_const_iterator; 67 68 unsigned varlist_size() const { return NumVars; } 69 bool varlist_empty() const { return NumVars == 0; } 70 varlist_iterator varlist_begin() { return getVars().begin(); } 71 varlist_iterator varlist_end() { return getVars().end(); } 72 varlist_const_iterator varlist_begin() const { return getVars().begin(); } 73 varlist_const_iterator varlist_end() const { return getVars().end(); } 74 75 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 76 static bool classofKind(Kind K) { return K == OMPThreadPrivate; } 77}; 78 79} // end namespace clang 80 81#endif 82