Refactor into functions PCH reading/writing the CXXBaseOrMemberInitializers. No functionality change.

llvm-svn: 110566
This commit is contained in:
Argyrios Kyrtzidis 2010-08-09 10:54:12 +00:00
parent ec846ac2cc
commit 5b6a03f490
7 changed files with 110 additions and 85 deletions

View File

@ -1283,7 +1283,7 @@ public:
/// getMember - If this is a member initializer, returns the
/// declaration of the non-static data member being
/// initialized. Otherwise, returns NULL.
FieldDecl *getMember() {
FieldDecl *getMember() const {
if (isMemberInitializer())
return BaseOrMember.get<FieldDecl*>();
else
@ -1361,7 +1361,7 @@ public:
reinterpret_cast<VarDecl **>(this + 1)[I] = Index;
}
Expr *getInit() { return static_cast<Expr *>(Init); }
Expr *getInit() const { return static_cast<Expr *>(Init); }
};
/// CXXConstructorDecl - Represents a C++ constructor within a

View File

@ -876,6 +876,11 @@ public:
CXXBaseSpecifier ReadCXXBaseSpecifier(llvm::BitstreamCursor &DeclsCursor,
const RecordData &Record,unsigned &Idx);
/// \brief Read a CXXBaseOrMemberInitializer array.
std::pair<CXXBaseOrMemberInitializer **, unsigned>
ReadCXXBaseOrMemberInitializers(llvm::BitstreamCursor &DeclsCursor,
const RecordData &Record, unsigned &Idx);
/// \brief Read a source location.
SourceLocation ReadSourceLocation(const RecordData &Record, unsigned& Idx) {
return SourceLocation::getFromRawEncoding(Record[Idx++]);

View File

@ -401,6 +401,11 @@ public:
/// \brief Emit a C++ base specifier.
void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base, RecordData &Record);
/// \brief Emit a CXXBaseOrMemberInitializer array.
void AddCXXBaseOrMemberInitializers(
const CXXBaseOrMemberInitializer * const *BaseOrMembers,
unsigned NumBaseOrMembers, RecordData &Record);
/// \brief Add a string to the given record.
void AddString(const std::string &Str, RecordData &Record);

View File

@ -3579,6 +3579,70 @@ PCHReader::ReadCXXBaseSpecifier(llvm::BitstreamCursor &DeclsCursor,
return CXXBaseSpecifier(Range, isVirtual, isBaseOfClass, AS, TInfo);
}
std::pair<CXXBaseOrMemberInitializer **, unsigned>
PCHReader::ReadCXXBaseOrMemberInitializers(llvm::BitstreamCursor &Cursor,
const RecordData &Record,
unsigned &Idx) {
CXXBaseOrMemberInitializer **BaseOrMemberInitializers = 0;
unsigned NumInitializers = Record[Idx++];
if (NumInitializers) {
ASTContext &C = *getContext();
BaseOrMemberInitializers
= new (C) CXXBaseOrMemberInitializer*[NumInitializers];
for (unsigned i=0; i != NumInitializers; ++i) {
TypeSourceInfo *BaseClassInfo = 0;
bool IsBaseVirtual = false;
FieldDecl *Member = 0;
bool IsBaseInitializer = Record[Idx++];
if (IsBaseInitializer) {
BaseClassInfo = GetTypeSourceInfo(Cursor, Record, Idx);
IsBaseVirtual = Record[Idx++];
} else {
Member = cast<FieldDecl>(GetDecl(Record[Idx++]));
}
SourceLocation MemberLoc = ReadSourceLocation(Record, Idx);
Expr *Init = ReadExpr(Cursor);
FieldDecl *AnonUnionMember
= cast_or_null<FieldDecl>(GetDecl(Record[Idx++]));
SourceLocation LParenLoc = ReadSourceLocation(Record, Idx);
SourceLocation RParenLoc = ReadSourceLocation(Record, Idx);
bool IsWritten = Record[Idx++];
unsigned SourceOrderOrNumArrayIndices;
llvm::SmallVector<VarDecl *, 8> Indices;
if (IsWritten) {
SourceOrderOrNumArrayIndices = Record[Idx++];
} else {
SourceOrderOrNumArrayIndices = Record[Idx++];
Indices.reserve(SourceOrderOrNumArrayIndices);
for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
Indices.push_back(cast<VarDecl>(GetDecl(Record[Idx++])));
}
CXXBaseOrMemberInitializer *BOMInit;
if (IsBaseInitializer) {
BOMInit = new (C) CXXBaseOrMemberInitializer(C, BaseClassInfo,
IsBaseVirtual, LParenLoc,
Init, RParenLoc);
} else if (IsWritten) {
BOMInit = new (C) CXXBaseOrMemberInitializer(C, Member, MemberLoc,
LParenLoc, Init, RParenLoc);
} else {
BOMInit = CXXBaseOrMemberInitializer::Create(C, Member, MemberLoc,
LParenLoc, Init, RParenLoc,
Indices.data(),
Indices.size());
}
BOMInit->setAnonUnionMember(AnonUnionMember);
BaseOrMemberInitializers[i] = BOMInit;
}
}
return std::make_pair(BaseOrMemberInitializers, NumInitializers);
}
NestedNameSpecifier *
PCHReader::ReadNestedNameSpecifier(const RecordData &Record, unsigned &Idx) {
unsigned N = Record[Idx++];

View File

@ -783,63 +783,8 @@ void PCHDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
D->IsExplicitSpecified = Record[Idx++];
D->ImplicitlyDefined = Record[Idx++];
unsigned NumInitializers = Record[Idx++];
D->NumBaseOrMemberInitializers = NumInitializers;
if (NumInitializers) {
ASTContext &C = *Reader.getContext();
D->BaseOrMemberInitializers
= new (C) CXXBaseOrMemberInitializer*[NumInitializers];
for (unsigned i=0; i != NumInitializers; ++i) {
TypeSourceInfo *BaseClassInfo = 0;
bool IsBaseVirtual = false;
FieldDecl *Member = 0;
bool IsBaseInitializer = Record[Idx++];
if (IsBaseInitializer) {
BaseClassInfo = Reader.GetTypeSourceInfo(Cursor, Record, Idx);
IsBaseVirtual = Record[Idx++];
} else {
Member = cast<FieldDecl>(Reader.GetDecl(Record[Idx++]));
}
SourceLocation MemberLoc = Reader.ReadSourceLocation(Record, Idx);
Expr *Init = Reader.ReadExpr(Cursor);
FieldDecl *AnonUnionMember
= cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++]));
SourceLocation LParenLoc = Reader.ReadSourceLocation(Record, Idx);
SourceLocation RParenLoc = Reader.ReadSourceLocation(Record, Idx);
bool IsWritten = Record[Idx++];
unsigned SourceOrderOrNumArrayIndices;
llvm::SmallVector<VarDecl *, 8> Indices;
if (IsWritten) {
SourceOrderOrNumArrayIndices = Record[Idx++];
} else {
SourceOrderOrNumArrayIndices = Record[Idx++];
Indices.reserve(SourceOrderOrNumArrayIndices);
for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
Indices.push_back(cast<VarDecl>(Reader.GetDecl(Record[Idx++])));
}
CXXBaseOrMemberInitializer *BOMInit;
if (IsBaseInitializer) {
BOMInit = new (C) CXXBaseOrMemberInitializer(C, BaseClassInfo,
IsBaseVirtual, LParenLoc,
Init, RParenLoc);
} else if (IsWritten) {
BOMInit = new (C) CXXBaseOrMemberInitializer(C, Member, MemberLoc,
LParenLoc, Init, RParenLoc);
} else {
BOMInit = CXXBaseOrMemberInitializer::Create(C, Member, MemberLoc,
LParenLoc, Init, RParenLoc,
Indices.data(),
Indices.size());
}
BOMInit->setAnonUnionMember(AnonUnionMember);
D->BaseOrMemberInitializers[i] = BOMInit;
}
}
llvm::tie(D->BaseOrMemberInitializers, D->NumBaseOrMemberInitializers)
= Reader.ReadCXXBaseOrMemberInitializers(Cursor, Record, Idx);
}
void PCHDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) {

View File

@ -3015,6 +3015,36 @@ void PCHWriter::AddCXXBaseSpecifier(const CXXBaseSpecifier &Base,
AddSourceRange(Base.getSourceRange(), Record);
}
void PCHWriter::AddCXXBaseOrMemberInitializers(
const CXXBaseOrMemberInitializer * const *BaseOrMembers,
unsigned NumBaseOrMembers, RecordData &Record) {
Record.push_back(NumBaseOrMembers);
for (unsigned i=0; i != NumBaseOrMembers; ++i) {
const CXXBaseOrMemberInitializer *Init = BaseOrMembers[i];
Record.push_back(Init->isBaseInitializer());
if (Init->isBaseInitializer()) {
AddTypeSourceInfo(Init->getBaseClassInfo(), Record);
Record.push_back(Init->isBaseVirtual());
} else {
AddDeclRef(Init->getMember(), Record);
}
AddSourceLocation(Init->getMemberLocation(), Record);
AddStmt(Init->getInit());
AddDeclRef(Init->getAnonUnionMember(), Record);
AddSourceLocation(Init->getLParenLoc(), Record);
AddSourceLocation(Init->getRParenLoc(), Record);
Record.push_back(Init->isWritten());
if (Init->isWritten()) {
Record.push_back(Init->getSourceOrder());
} else {
Record.push_back(Init->getNumArrayIndices());
for (unsigned i=0, e=Init->getNumArrayIndices(); i != e; ++i)
AddDeclRef(Init->getArrayIndex(i), Record);
}
}
}
void PCHWriter::SetReader(PCHReader *Reader) {
assert(Reader && "Cannot remove chain");
assert(FirstDeclID == NextDeclID &&

View File

@ -760,32 +760,8 @@ void PCHDeclWriter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
Record.push_back(D->IsExplicitSpecified);
Record.push_back(D->ImplicitlyDefined);
Record.push_back(D->NumBaseOrMemberInitializers);
for (unsigned i=0; i != D->NumBaseOrMemberInitializers; ++i) {
CXXBaseOrMemberInitializer *Init = D->BaseOrMemberInitializers[i];
Record.push_back(Init->isBaseInitializer());
if (Init->isBaseInitializer()) {
Writer.AddTypeSourceInfo(Init->getBaseClassInfo(), Record);
Record.push_back(Init->isBaseVirtual());
} else {
Writer.AddDeclRef(Init->getMember(), Record);
}
Writer.AddSourceLocation(Init->getMemberLocation(), Record);
Writer.AddStmt(Init->getInit());
Writer.AddDeclRef(Init->getAnonUnionMember(), Record);
Writer.AddSourceLocation(Init->getLParenLoc(), Record);
Writer.AddSourceLocation(Init->getRParenLoc(), Record);
Record.push_back(Init->isWritten());
if (Init->isWritten()) {
Record.push_back(Init->getSourceOrder());
} else {
Record.push_back(Init->getNumArrayIndices());
for (unsigned i=0, e=Init->getNumArrayIndices(); i != e; ++i)
Writer.AddDeclRef(Init->getArrayIndex(i), Record);
}
}
Writer.AddCXXBaseOrMemberInitializers(D->BaseOrMemberInitializers,
D->NumBaseOrMemberInitializers, Record);
Code = pch::DECL_CXX_CONSTRUCTOR;
}