1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari//===- StmtOpenMP.h - Classes for OpenMP directives and clauses --*- C++ -*-===// 2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari// 3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari// The LLVM Compiler Infrastructure 4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari// 5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari// This file is distributed under the University of Illinois Open Source 6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari// License. See LICENSE.TXT for details. 7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari// 8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari//===----------------------------------------------------------------------===// 9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \file 10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \brief This file defines OpenMP AST classes for executable directives and 11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// clauses. 12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// 13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari//===----------------------------------------------------------------------===// 14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef LLVM_CLANG_AST_STMTOPENMP_H 16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define LLVM_CLANG_AST_STMTOPENMP_H 17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "clang/Basic/OpenMPKinds.h" 19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "clang/Basic/SourceLocation.h" 20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "clang/AST/Expr.h" 21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "clang/AST/Stmt.h" 22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinamespace clang { 24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari//===----------------------------------------------------------------------===// 26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari// AST classes for clauses. 27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari//===----------------------------------------------------------------------===// 28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \brief This is a basic class for representing single OpenMP clause. 30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// 31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariclass OMPClause { 32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Starting location of the clause (the clause keyword). 33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation StartLoc; 34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Ending location of the clause. 35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation EndLoc; 36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Kind of the clause. 37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OpenMPClauseKind Kind; 38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariprotected: 39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OMPClause(OpenMPClauseKind K, SourceLocation StartLoc, SourceLocation EndLoc) 40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari : StartLoc(StartLoc), EndLoc(EndLoc), Kind(K) {} 41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaripublic: 43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns the starting location of the clause. 45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation getLocStart() const { return StartLoc; } 46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns the ending location of the clause. 47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation getLocEnd() const { return EndLoc; } 48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Sets the starting location of the clause. 50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setLocStart(SourceLocation Loc) { StartLoc = Loc; } 51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Sets the ending location of the clause. 52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setLocEnd(SourceLocation Loc) { EndLoc = Loc; } 53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns kind of OpenMP clause (private, shared, reduction, etc.). 55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OpenMPClauseKind getClauseKind() const { return Kind; } 56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari bool isImplicit() const { return StartLoc.isInvalid();} 58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari StmtRange children(); 60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ConstStmtRange children() const { 61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return const_cast<OMPClause *>(this)->children(); 62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari static bool classof(const OMPClause *T) { 64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return true; 65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \brief This represents clauses with the list of variables like 'private', 69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// 'firstprivate', 'copyin', 'shared', or 'reduction' clauses in the 70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// '#pragma omp ...' directives. 71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritemplate <class T> 72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariclass OMPVarList { 73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari friend class OMPClauseReader; 74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Location of '('. 75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation LParenLoc; 76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Number of variables in the list. 77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned NumVars; 78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariprotected: 79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Fetches list of variables associated with this clause. 80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari llvm::MutableArrayRef<Expr *> getVarRefs() { 81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return llvm::MutableArrayRef<Expr *>( 82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari reinterpret_cast<Expr **>(static_cast<T *>(this) + 1), 83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NumVars); 84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Sets the list of variables for this clause. 87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setVarRefs(ArrayRef<Expr *> VL) { 88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari assert(VL.size() == NumVars && 89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "Number of variables is not the same as the preallocated buffer"); 90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari std::copy(VL.begin(), VL.end(), 91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari reinterpret_cast<Expr **>(static_cast<T *>(this) + 1)); 92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Build clause with number of variables \a N. 95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param N Number of the variables in the clause. 97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OMPVarList(SourceLocation LParenLoc, unsigned N) 99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari : LParenLoc(LParenLoc), NumVars(N) { } 100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaripublic: 101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari typedef llvm::MutableArrayRef<Expr *>::iterator varlist_iterator; 102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari typedef ArrayRef<const Expr *>::iterator varlist_const_iterator; 103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned varlist_size() const { return NumVars; } 105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari bool varlist_empty() const { return NumVars == 0; } 106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari varlist_iterator varlist_begin() { return getVarRefs().begin(); } 107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari varlist_iterator varlist_end() { return getVarRefs().end(); } 108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); } 109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari varlist_const_iterator varlist_end() const { return getVarRefs().end(); } 110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Sets the location of '('. 112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; } 113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns the location of '('. 114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation getLParenLoc() const { return LParenLoc; } 115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Fetches list of all variables in the clause. 117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ArrayRef<const Expr *> getVarRefs() const { 118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return ArrayRef<const Expr *>( 119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari reinterpret_cast<const Expr *const *>(static_cast<const T *>(this) + 1), 120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NumVars); 121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \brief This represents 'default' clause in the '#pragma omp ...' directive. 125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// 126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \code 127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// #pragma omp parallel default(shared) 128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \endcode 129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// In this example directive '#pragma omp parallel' has simple 'default' 130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// clause with kind 'shared'. 131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// 132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariclass OMPDefaultClause : public OMPClause { 133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari friend class OMPClauseReader; 134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Location of '('. 135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation LParenLoc; 136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief A kind of the 'default' clause. 137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OpenMPDefaultClauseKind Kind; 138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Start location of the kind in source code. 139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation KindKwLoc; 140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Set kind of the clauses. 142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param K Argument of clause. 144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setDefaultKind(OpenMPDefaultClauseKind K) { Kind = K; } 146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Set argument location. 148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param KLoc Argument location. 150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setDefaultKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; } 152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaripublic: 153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Build 'default' clause with argument \a A ('none' or 'shared'). 154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param A Argument of the clause ('none' or 'shared'). 156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param ALoc Starting location of the argument. 157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param StartLoc Starting location of the clause. 158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param LParenLoc Location of '('. 159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param EndLoc Ending location of the clause. 160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OMPDefaultClause(OpenMPDefaultClauseKind A, SourceLocation ALoc, 162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation StartLoc, SourceLocation LParenLoc, 163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation EndLoc) 164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari : OMPClause(OMPC_default, StartLoc, EndLoc), LParenLoc(LParenLoc), 165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari Kind(A), KindKwLoc(ALoc) { } 166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Build an empty clause. 168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OMPDefaultClause() 170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari : OMPClause(OMPC_default, SourceLocation(), SourceLocation()), 171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari LParenLoc(SourceLocation()), Kind(OMPC_DEFAULT_unknown), 172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari KindKwLoc(SourceLocation()) { } 173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Sets the location of '('. 175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; } 176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns the location of '('. 177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation getLParenLoc() const { return LParenLoc; } 178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns kind of the clause. 180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OpenMPDefaultClauseKind getDefaultKind() const { return Kind; } 181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns location of clause kind. 183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation getDefaultKindKwLoc() const { return KindKwLoc; } 184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari static bool classof(const OMPClause *T) { 186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return T->getClauseKind() == OMPC_default; 187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari StmtRange children() { 190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return StmtRange(); 191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \brief This represents clause 'private' in the '#pragma omp ...' directives. 195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// 196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \code 197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// #pragma omp parallel private(a,b) 198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \endcode 199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// In this example directive '#pragma omp parallel' has clause 'private' 200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// with the variables 'a' and 'b'. 201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// 202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariclass OMPPrivateClause : public OMPClause, public OMPVarList<OMPPrivateClause> { 203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Build clause with number of variables \a N. 204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param StartLoc Starting location of the clause. 206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param LParenLoc Location of '('. 207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param EndLoc Ending location of the clause. 208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param N Number of the variables in the clause. 209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OMPPrivateClause(SourceLocation StartLoc, SourceLocation LParenLoc, 211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation EndLoc, unsigned N) 212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari : OMPClause(OMPC_private, StartLoc, EndLoc), 213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OMPVarList<OMPPrivateClause>(LParenLoc, N) { } 214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Build an empty clause. 216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param N Number of variables. 218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari explicit OMPPrivateClause(unsigned N) 220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari : OMPClause(OMPC_private, SourceLocation(), SourceLocation()), 221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OMPVarList<OMPPrivateClause>(SourceLocation(), N) { } 222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaripublic: 223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Creates clause with a list of variables \a VL. 224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param C AST context. 226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param StartLoc Starting location of the clause. 227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param LParenLoc Location of '('. 228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param EndLoc Ending location of the clause. 229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param VL List of references to the variables. 230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari static OMPPrivateClause *Create(ASTContext &C, SourceLocation StartLoc, 232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation LParenLoc, 233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation EndLoc, 234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ArrayRef<Expr *> VL); 235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Creates an empty clause with the place for \a N variables. 236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param C AST context. 238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param N The number of variables. 239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari static OMPPrivateClause *CreateEmpty(ASTContext &C, unsigned N); 241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari StmtRange children() { 243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()), 244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari reinterpret_cast<Stmt **>(varlist_end())); 245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari static bool classof(const OMPClause *T) { 248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return T->getClauseKind() == OMPC_private; 249386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 250386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 251386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 252386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari//===----------------------------------------------------------------------===// 253386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari// AST classes for directives. 254386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari//===----------------------------------------------------------------------===// 255386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 256386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \brief This is a basic class for representing single OpenMP executable 257386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// directive. 258386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// 259386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariclass OMPExecutableDirective : public Stmt { 260386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari friend class ASTStmtReader; 261386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Kind of the directive. 262386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OpenMPDirectiveKind Kind; 263386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Starting location of the directive (directive keyword). 264386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation StartLoc; 265386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Ending location of the directive. 266386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation EndLoc; 267386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Pointer to the list of clauses. 268386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari llvm::MutableArrayRef<OMPClause *> Clauses; 269386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Associated statement (if any) and expressions. 270386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari llvm::MutableArrayRef<Stmt *> StmtAndExpressions; 271386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariprotected: 272386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Build instance of directive of class \a K. 273386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 274386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param SC Statement class. 275386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param K Kind of OpenMP directive. 276386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param StartLoc Starting location of the directive (directive keyword). 277386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param EndLoc Ending location of the directive. 278386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 279386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari template <typename T> 280386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OMPExecutableDirective(const T *, StmtClass SC, OpenMPDirectiveKind K, 281386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation StartLoc, SourceLocation EndLoc, 282386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned NumClauses, unsigned NumberOfExpressions) 283386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari : Stmt(SC), Kind(K), StartLoc(StartLoc), EndLoc(EndLoc), 284386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari Clauses(reinterpret_cast<OMPClause **>(static_cast<T *>(this) + 1), 285386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NumClauses), 286386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari StmtAndExpressions(reinterpret_cast<Stmt **>(Clauses.end()), 287386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari NumberOfExpressions) { } 288386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 289386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Sets the list of variables for this clause. 290386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 291386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param Clauses The list of clauses for the directive. 292386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 293386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setClauses(ArrayRef<OMPClause *> Clauses); 294386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 295386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Set the associated statement for the directive. 296386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 297386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// /param S Associated statement. 298386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 299386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setAssociatedStmt(Stmt *S) { 300386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari StmtAndExpressions[0] = S; 301386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 302386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 303386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaripublic: 304386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns starting location of directive kind. 305386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation getLocStart() const { return StartLoc; } 306386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns ending location of directive. 307386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation getLocEnd() const { return EndLoc; } 308386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 309386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Set starting location of directive kind. 310386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 311386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param Loc New starting location of directive. 312386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 313386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setLocStart(SourceLocation Loc) { StartLoc = Loc; } 314386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Set ending location of directive. 315386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 316386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param Loc New ending location of directive. 317386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 318386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari void setLocEnd(SourceLocation Loc) { EndLoc = Loc; } 319386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 320386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Get number of clauses. 321386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned getNumClauses() const { return Clauses.size(); } 322386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 323386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns specified clause. 324386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 325386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param i Number of clause. 326386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 327386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OMPClause *getClause(unsigned i) const { 328386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari assert(i < Clauses.size() && "index out of bound!"); 329386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return Clauses[i]; 330386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 331386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 332386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Returns statement associated with the directive. 333386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari Stmt *getAssociatedStmt() const { 334386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return StmtAndExpressions[0]; 335386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 336386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 337386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OpenMPDirectiveKind getDirectiveKind() const { return Kind; } 338386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 339386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari static bool classof(const Stmt *S) { 340386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return S->getStmtClass() >= firstOMPExecutableDirectiveConstant && 341386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari S->getStmtClass() <= lastOMPExecutableDirectiveConstant; 342386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 343386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 344386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari child_range children() { 345386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return child_range(StmtAndExpressions.begin(), StmtAndExpressions.end()); 346386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 347386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 348386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ArrayRef<OMPClause *> clauses() { return Clauses; } 349386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 350386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ArrayRef<OMPClause *> clauses() const { return Clauses; } 351386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 352386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 353386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \brief This represents '#pragma omp parallel' directive. 354386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// 355386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \code 356386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// #pragma omp parallel private(a,b) reduction(+: c,d) 357386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// \endcode 358386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// In this example directive '#pragma omp parallel' has clauses 'private' 359386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// with the variables 'a' and 'b' and 'reduction' with operator '+' and 360386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// variables 'c' and 'd'. 361386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/// 362386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariclass OMPParallelDirective : public OMPExecutableDirective { 363386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Build directive with the given start and end location. 364386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 365386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param StartLoc Starting location of the directive (directive keyword). 366386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param EndLoc Ending Location of the directive. 367386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 368386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari OMPParallelDirective(SourceLocation StartLoc, SourceLocation EndLoc, 369386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned N) 370386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari : OMPExecutableDirective(this, OMPParallelDirectiveClass, OMPD_parallel, 371386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari StartLoc, EndLoc, N, 1) { } 372386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 373386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Build an empty directive. 374386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 375386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param N Number of clauses. 376386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 377386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari explicit OMPParallelDirective(unsigned N) 378386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari : OMPExecutableDirective(this, OMPParallelDirectiveClass, OMPD_parallel, 379386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation(), SourceLocation(), N, 1) { } 380386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaripublic: 381386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Creates directive with a list of \a Clauses. 382386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 383386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param C AST context. 384386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param StartLoc Starting location of the directive kind. 385386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param EndLoc Ending Location of the directive. 386386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param Clauses List of clauses. 387386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param AssociatedStmt Statement associated with the directive. 388386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 389386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari static OMPParallelDirective *Create(ASTContext &C, SourceLocation StartLoc, 390386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari SourceLocation EndLoc, 391386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ArrayRef<OMPClause *> Clauses, 392386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari Stmt *AssociatedStmt); 393386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 394386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \brief Creates an empty directive with the place for \a N clauses. 395386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 396386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param C AST context. 397386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// \param N The number of clauses. 398386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /// 399386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari static OMPParallelDirective *CreateEmpty(ASTContext &C, unsigned N, 400386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari EmptyShell); 401386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 402386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari static bool classof(const Stmt *T) { 403386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return T->getStmtClass() == OMPParallelDirectiveClass; 404386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 405386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 406386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 407386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} // end namespace clang 408386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 409386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif 410386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari