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