DeclOpenMP.cpp revision 263508
1204076Spjd//===--- DeclOpenMP.cpp - Declaration OpenMP AST Node Implementation ------===//
2204076Spjd//
3219351Spjd//                     The LLVM Compiler Infrastructure
4204076Spjd//
5204076Spjd// This file is distributed under the University of Illinois Open Source
6204076Spjd// License. See LICENSE.TXT for details.
7204076Spjd//
8204076Spjd//===----------------------------------------------------------------------===//
9204076Spjd/// \file
10204076Spjd/// \brief This file implements OMPThreadPrivateDecl class.
11204076Spjd///
12204076Spjd//===----------------------------------------------------------------------===//
13204076Spjd
14204076Spjd#include "clang/AST/ASTContext.h"
15204076Spjd#include "clang/AST/DeclBase.h"
16204076Spjd#include "clang/AST/Decl.h"
17204076Spjd#include "clang/AST/DeclOpenMP.h"
18204076Spjd#include "clang/AST/Expr.h"
19204076Spjd
20204076Spjdusing namespace clang;
21204076Spjd
22204076Spjd//===----------------------------------------------------------------------===//
23204076Spjd// OMPThreadPrivateDecl Implementation.
24204076Spjd//===----------------------------------------------------------------------===//
25204076Spjd
26204076Spjdvoid OMPThreadPrivateDecl::anchor() { }
27204076Spjd
28204076SpjdOMPThreadPrivateDecl *OMPThreadPrivateDecl::Create(ASTContext &C,
29204076Spjd                                                   DeclContext *DC,
30204076Spjd                                                   SourceLocation L,
31204076Spjd                                                   ArrayRef<Expr *> VL) {
32204076Spjd  unsigned Size = sizeof(OMPThreadPrivateDecl) +
33204076Spjd                  (VL.size() * sizeof(Expr *));
34204076Spjd
35204076Spjd  void *Mem = C.Allocate(Size, llvm::alignOf<OMPThreadPrivateDecl>());
36204076Spjd  OMPThreadPrivateDecl *D = new (Mem) OMPThreadPrivateDecl(OMPThreadPrivate,
37204076Spjd                                                           DC, L);
38204076Spjd  D->NumVars = VL.size();
39204076Spjd  D->setVars(VL);
40204076Spjd  return D;
41204076Spjd}
42204076Spjd
43204076SpjdOMPThreadPrivateDecl *OMPThreadPrivateDecl::CreateDeserialized(ASTContext &C,
44204076Spjd                                                               unsigned ID,
45204076Spjd                                                               unsigned N) {
46204076Spjd  unsigned Size = sizeof(OMPThreadPrivateDecl) + (N * sizeof(Expr *));
47204076Spjd
48211982Spjd  void *Mem = AllocateDeserializedDecl(C, ID, Size);
49204076Spjd  OMPThreadPrivateDecl *D = new (Mem) OMPThreadPrivateDecl(OMPThreadPrivate,
50204076Spjd                                                           0, SourceLocation());
51204076Spjd  D->NumVars = N;
52204076Spjd  return D;
53204076Spjd}
54204076Spjd
55204076Spjdvoid OMPThreadPrivateDecl::setVars(ArrayRef<Expr *> VL) {
56204076Spjd  assert(VL.size() == NumVars &&
57204076Spjd         "Number of variables is not the same as the preallocated buffer");
58204076Spjd  Expr **Vars = reinterpret_cast<Expr **>(this + 1);
59204076Spjd  std::copy(VL.begin(), VL.end(), Vars);
60212038Spjd}
61204076Spjd
62204076Spjd