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