forked from OSchip/llvm-project
Refactor into functions PCH reading/writing the CXXBaseOrMemberInitializers. No functionality change.
llvm-svn: 110566
This commit is contained in:
parent
ec846ac2cc
commit
5b6a03f490
|
@ -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
|
||||
|
|
|
@ -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++]);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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++];
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue