DeclOpenMP.h revision ef8225444452a1486bd721f3285301fe84643b00
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  MutableArrayRef<Expr *> getVars() {
51    return 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 MutableArrayRef<Expr *>::iterator varlist_iterator;
66  typedef ArrayRef<const Expr *>::iterator varlist_const_iterator;
67  typedef llvm::iterator_range<varlist_iterator> varlist_range;
68  typedef llvm::iterator_range<varlist_const_iterator> varlist_const_range;
69
70  unsigned varlist_size() const { return NumVars; }
71  bool varlist_empty() const { return NumVars == 0; }
72
73  varlist_range varlists() {
74    return varlist_range(varlist_begin(), varlist_end());
75  }
76  varlist_const_range varlists() const {
77    return varlist_const_range(varlist_begin(), varlist_end());
78  }
79  varlist_iterator varlist_begin() { return getVars().begin(); }
80  varlist_iterator varlist_end() { return getVars().end(); }
81  varlist_const_iterator varlist_begin() const { return getVars().begin(); }
82  varlist_const_iterator varlist_end() const { return getVars().end(); }
83
84  static bool classof(const Decl *D) { return classofKind(D->getKind()); }
85  static bool classofKind(Kind K) { return K == OMPThreadPrivate; }
86};
87
88}  // end namespace clang
89
90#endif
91