Home | History | Annotate | Download | only in AST
      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 
     21 namespace 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 ///
     35 class 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 
     58 public:
     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