1263508Sdim//===- DeclOpenMP.h - Classes for representing OpenMP directives -*- C++ -*-===// 2249261Sdim// 3249261Sdim// The LLVM Compiler Infrastructure 4249261Sdim// 5249261Sdim// This file is distributed under the University of Illinois Open Source 6249261Sdim// License. See LICENSE.TXT for details. 7249261Sdim// 8249261Sdim//===----------------------------------------------------------------------===// 9249261Sdim/// 10249261Sdim/// \file 11263508Sdim/// \brief This file defines OpenMP nodes for declarative directives. 12249261Sdim/// 13249261Sdim//===----------------------------------------------------------------------===// 14249261Sdim 15249261Sdim#ifndef LLVM_CLANG_AST_OPENMP_H 16249261Sdim#define LLVM_CLANG_AST_OPENMP_H 17249261Sdim 18249261Sdim#include "clang/AST/DeclBase.h" 19249261Sdim#include "llvm/ADT/ArrayRef.h" 20249261Sdim 21249261Sdimnamespace clang { 22249261Sdim 23249261Sdim/// \brief This represents '#pragma omp threadprivate ...' directive. 24249261Sdim/// For example, in the following, both 'a' and 'A::b' are threadprivate: 25249261Sdim/// 26249261Sdim/// \code 27249261Sdim/// int a; 28249261Sdim/// #pragma omp threadprivate(a) 29249261Sdim/// struct A { 30249261Sdim/// static int b; 31249261Sdim/// #pragma omp threadprivate(b) 32249261Sdim/// }; 33249261Sdim/// \endcode 34249261Sdim/// 35249261Sdimclass OMPThreadPrivateDecl : public Decl { 36249261Sdim friend class ASTDeclReader; 37249261Sdim unsigned NumVars; 38249261Sdim 39249261Sdim virtual void anchor(); 40249261Sdim 41249261Sdim OMPThreadPrivateDecl(Kind DK, DeclContext *DC, SourceLocation L) : 42249261Sdim Decl(DK, DC, L), NumVars(0) { } 43249261Sdim 44263508Sdim ArrayRef<const Expr *> getVars() const { 45263508Sdim return ArrayRef<const Expr *>( 46263508Sdim reinterpret_cast<const Expr * const *>(this + 1), 47249261Sdim NumVars); 48249261Sdim } 49249261Sdim 50263508Sdim llvm::MutableArrayRef<Expr *> getVars() { 51263508Sdim return llvm::MutableArrayRef<Expr *>( 52263508Sdim reinterpret_cast<Expr **>(this + 1), 53249261Sdim NumVars); 54249261Sdim } 55249261Sdim 56263508Sdim void setVars(ArrayRef<Expr *> VL); 57249261Sdim 58249261Sdimpublic: 59249261Sdim static OMPThreadPrivateDecl *Create(ASTContext &C, DeclContext *DC, 60249261Sdim SourceLocation L, 61263508Sdim ArrayRef<Expr *> VL); 62249261Sdim static OMPThreadPrivateDecl *CreateDeserialized(ASTContext &C, 63249261Sdim unsigned ID, unsigned N); 64249261Sdim 65263508Sdim typedef llvm::MutableArrayRef<Expr *>::iterator varlist_iterator; 66263508Sdim typedef ArrayRef<const Expr *>::iterator varlist_const_iterator; 67249261Sdim 68249261Sdim unsigned varlist_size() const { return NumVars; } 69249261Sdim bool varlist_empty() const { return NumVars == 0; } 70249261Sdim varlist_iterator varlist_begin() { return getVars().begin(); } 71249261Sdim varlist_iterator varlist_end() { return getVars().end(); } 72249261Sdim varlist_const_iterator varlist_begin() const { return getVars().begin(); } 73249261Sdim varlist_const_iterator varlist_end() const { return getVars().end(); } 74249261Sdim 75249261Sdim static bool classof(const Decl *D) { return classofKind(D->getKind()); } 76249261Sdim static bool classofKind(Kind K) { return K == OMPThreadPrivate; } 77249261Sdim}; 78249261Sdim 79249261Sdim} // end namespace clang 80249261Sdim 81249261Sdim#endif 82