1a5e23f6bSTed Kremenek //===--- DeclGroup.cpp - Classes for representing groups of Decls -*- C++ -*-==//
2a5e23f6bSTed Kremenek //
3a5e23f6bSTed Kremenek //                     The LLVM Compiler Infrastructure
4a5e23f6bSTed Kremenek //
5a5e23f6bSTed Kremenek // This file is distributed under the University of Illinois Open Source
6a5e23f6bSTed Kremenek // License. See LICENSE.TXT for details.
7a5e23f6bSTed Kremenek //
8a5e23f6bSTed Kremenek //===----------------------------------------------------------------------===//
9a5e23f6bSTed Kremenek //
104feb36deSDouglas Gregor //  This file defines the DeclGroup and DeclGroupRef classes.
11a5e23f6bSTed Kremenek //
12a5e23f6bSTed Kremenek //===----------------------------------------------------------------------===//
13a5e23f6bSTed Kremenek 
14a5e23f6bSTed Kremenek #include "clang/AST/DeclGroup.h"
15a5e23f6bSTed Kremenek #include "clang/AST/Decl.h"
16a5e23f6bSTed Kremenek #include "clang/AST/ASTContext.h"
17a5e23f6bSTed Kremenek #include "llvm/Support/Allocator.h"
1865537485STed Kremenek #include "llvm/Bitcode/Serialize.h"
1965537485STed Kremenek #include "llvm/Bitcode/Deserialize.h"
20a5e23f6bSTed Kremenek using namespace clang;
21a5e23f6bSTed Kremenek 
22*5bbb3c8aSChris Lattner DeclGroup* DeclGroup::Create(ASTContext &C, Decl **Decls, unsigned NumDecls) {
23*5bbb3c8aSChris Lattner   assert(NumDecls > 1 && "Invalid DeclGroup");
24*5bbb3c8aSChris Lattner   unsigned Size = sizeof(DeclGroup) + sizeof(Decl*) * NumDecls;
25*5bbb3c8aSChris Lattner   void* Mem = C.Allocate(Size, llvm::AlignOf<DeclGroup>::Alignment);
26*5bbb3c8aSChris Lattner   new (Mem) DeclGroup(NumDecls, Decls);
27*5bbb3c8aSChris Lattner   return static_cast<DeclGroup*>(Mem);
28a5e23f6bSTed Kremenek }
29a5e23f6bSTed Kremenek 
3065537485STed Kremenek /// Emit - Serialize a DeclGroup to Bitcode.
3165537485STed Kremenek void DeclGroup::Emit(llvm::Serializer& S) const {
3265537485STed Kremenek   S.EmitInt(NumDecls);
3365537485STed Kremenek   S.BatchEmitOwnedPtrs(NumDecls, &(*this)[0]);
3465537485STed Kremenek }
3565537485STed Kremenek 
3665537485STed Kremenek /// Read - Deserialize a DeclGroup from Bitcode.
374feb36deSDouglas Gregor DeclGroup* DeclGroup::Read(llvm::Deserializer& D, ASTContext& C) {
3865537485STed Kremenek   unsigned NumDecls = (unsigned) D.ReadInt();
39*5bbb3c8aSChris Lattner   unsigned Size = sizeof(DeclGroup) + sizeof(Decl*) * NumDecls;
4065537485STed Kremenek   unsigned alignment = llvm::AlignOf<DeclGroup>::Alignment;
41*5bbb3c8aSChris Lattner   DeclGroup* DG = (DeclGroup*) C.Allocate(Size, alignment);
4265537485STed Kremenek   new (DG) DeclGroup();
4365537485STed Kremenek   DG->NumDecls = NumDecls;
4465537485STed Kremenek   D.BatchReadOwnedPtrs(NumDecls, &(*DG)[0], C);
4565537485STed Kremenek   return DG;
4665537485STed Kremenek }
4765537485STed Kremenek 
4812183e25STed Kremenek DeclGroup::DeclGroup(unsigned numdecls, Decl** decls) : NumDecls(numdecls) {
49a5e23f6bSTed Kremenek   assert(numdecls > 0);
50a5e23f6bSTed Kremenek   assert(decls);
51a5e23f6bSTed Kremenek   memcpy(this+1, decls, numdecls * sizeof(*decls));
52a5e23f6bSTed Kremenek }
53a5e23f6bSTed Kremenek 
54a5e23f6bSTed Kremenek void DeclGroup::Destroy(ASTContext& C) {
55a5e23f6bSTed Kremenek   this->~DeclGroup();
5613ae6f47SSteve Naroff   C.Deallocate((void*) this);
57a5e23f6bSTed Kremenek }
58a5e23f6bSTed Kremenek 
5965537485STed Kremenek void DeclGroupRef::Emit(llvm::Serializer& S) const {
6023b88b73SChris Lattner   if (isSingleDecl()) {
6165537485STed Kremenek     S.EmitBool(false);
6265537485STed Kremenek     S.EmitPtr(D);
6323b88b73SChris Lattner   } else {
6465537485STed Kremenek     S.EmitBool(true);
6523b88b73SChris Lattner     S.EmitPtr(&getDeclGroup());
6665537485STed Kremenek   }
6765537485STed Kremenek }
6865537485STed Kremenek 
6965537485STed Kremenek DeclGroupRef DeclGroupRef::ReadVal(llvm::Deserializer& D) {
7065537485STed Kremenek   if (D.ReadBool())
7165537485STed Kremenek     return DeclGroupRef(D.ReadPtr<Decl>());
7265537485STed Kremenek 
7365537485STed Kremenek   return DeclGroupRef(D.ReadPtr<DeclGroup>());
7465537485STed Kremenek }
75