forked from OSchip/llvm-project
[modules] Emit the type of the TypeSourceInfo for a DeclaratorDecl (but
not the corresponding location information) earlier. We need the type as written in order to properly merge functions with deduced return types, so we need to load that early. But we don't want to load the location information early, because that contains problematic things such as the function parameters. llvm-svn: 336016
This commit is contained in:
parent
da1e80feb7
commit
c23d734d92
|
@ -1771,6 +1771,10 @@ public:
|
|||
TypeSourceInfo *GetTypeSourceInfo(ModuleFile &F,
|
||||
const RecordData &Record, unsigned &Idx);
|
||||
|
||||
/// Raad the type locations for the given TInfo.
|
||||
void ReadTypeLoc(ModuleFile &F, const RecordData &Record, unsigned &Idx,
|
||||
TypeLoc TL);
|
||||
|
||||
/// Resolve a type ID into a type, potentially building a new
|
||||
/// type.
|
||||
QualType GetType(serialization::TypeID ID);
|
||||
|
@ -2460,6 +2464,11 @@ public:
|
|||
return Reader->GetTypeSourceInfo(*F, Record, Idx);
|
||||
}
|
||||
|
||||
/// Reads the location information for a type.
|
||||
void readTypeLoc(TypeLoc TL) {
|
||||
return Reader->ReadTypeLoc(*F, Record, Idx, TL);
|
||||
}
|
||||
|
||||
/// Map a local type ID within a given AST file to a global type ID.
|
||||
serialization::TypeID getGlobalTypeID(unsigned LocalID) const {
|
||||
return Reader->getGlobalTypeID(*F, LocalID);
|
||||
|
|
|
@ -886,7 +886,7 @@ public:
|
|||
/// Emits a reference to a declarator info.
|
||||
void AddTypeSourceInfo(TypeSourceInfo *TInfo);
|
||||
|
||||
/// Emits a type with source-location information.
|
||||
/// Emits source location information for a type. Does not emit the type.
|
||||
void AddTypeLoc(TypeLoc TL);
|
||||
|
||||
/// Emits a template argument location info.
|
||||
|
|
|
@ -6733,6 +6733,13 @@ void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
|
|||
TL.setKWLoc(ReadSourceLocation());
|
||||
}
|
||||
|
||||
void ASTReader::ReadTypeLoc(ModuleFile &F, const ASTReader::RecordData &Record,
|
||||
unsigned &Idx, TypeLoc TL) {
|
||||
TypeLocReader TLR(F, *this, Record, Idx);
|
||||
for (; !TL.isNull(); TL = TL.getNextTypeLoc())
|
||||
TLR.Visit(TL);
|
||||
}
|
||||
|
||||
TypeSourceInfo *
|
||||
ASTReader::GetTypeSourceInfo(ModuleFile &F, const ASTReader::RecordData &Record,
|
||||
unsigned &Idx) {
|
||||
|
@ -6741,9 +6748,7 @@ ASTReader::GetTypeSourceInfo(ModuleFile &F, const ASTReader::RecordData &Record,
|
|||
return nullptr;
|
||||
|
||||
TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
|
||||
TypeLocReader TLR(F, *this, Record, Idx);
|
||||
for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
|
||||
TLR.Visit(TL);
|
||||
ReadTypeLoc(F, Record, Idx, TInfo->getTypeLoc());
|
||||
return TInfo;
|
||||
}
|
||||
|
||||
|
|
|
@ -522,13 +522,8 @@ void ASTDeclReader::Visit(Decl *D) {
|
|||
IsDeclMarkedUsed = false;
|
||||
|
||||
if (auto *DD = dyn_cast<DeclaratorDecl>(D)) {
|
||||
if (DD->DeclInfo) {
|
||||
auto *Info = DD->DeclInfo.get<DeclaratorDecl::ExtInfo *>();
|
||||
Info->TInfo = GetTypeSourceInfo();
|
||||
}
|
||||
else {
|
||||
DD->DeclInfo = GetTypeSourceInfo();
|
||||
}
|
||||
if (auto *TInfo = DD->getTypeSourceInfo())
|
||||
Record.readTypeLoc(TInfo->getTypeLoc());
|
||||
}
|
||||
|
||||
if (auto *TD = dyn_cast<TypeDecl>(D)) {
|
||||
|
@ -815,6 +810,10 @@ void ASTDeclReader::VisitDeclaratorDecl(DeclaratorDecl *DD) {
|
|||
ReadQualifierInfo(*Info);
|
||||
DD->DeclInfo = Info;
|
||||
}
|
||||
QualType TSIType = Record.readType();
|
||||
DD->setTypeSourceInfo(
|
||||
TSIType.isNull() ? nullptr
|
||||
: Reader.getContext().CreateTypeSourceInfo(TSIType));
|
||||
}
|
||||
|
||||
void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
|
||||
|
|
|
@ -5447,12 +5447,11 @@ void ASTRecordWriter::AddTypeSourceInfo(TypeSourceInfo *TInfo) {
|
|||
return;
|
||||
}
|
||||
|
||||
AddTypeRef(TInfo->getType());
|
||||
AddTypeLoc(TInfo->getTypeLoc());
|
||||
}
|
||||
|
||||
void ASTRecordWriter::AddTypeLoc(TypeLoc TL) {
|
||||
AddTypeRef(TL.getType());
|
||||
|
||||
TypeLocWriter TLW(*this);
|
||||
for (; !TL.isNull(); TL = TL.getNextTypeLoc())
|
||||
TLW.Visit(TL);
|
||||
|
@ -5777,6 +5776,7 @@ void ASTRecordWriter::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS) {
|
|||
case NestedNameSpecifier::TypeSpec:
|
||||
case NestedNameSpecifier::TypeSpecWithTemplate:
|
||||
Record->push_back(Kind == NestedNameSpecifier::TypeSpecWithTemplate);
|
||||
AddTypeRef(NNS.getTypeLoc().getType());
|
||||
AddTypeLoc(NNS.getTypeLoc());
|
||||
AddSourceLocation(NNS.getLocalSourceRange().getEnd());
|
||||
break;
|
||||
|
|
|
@ -265,7 +265,8 @@ void ASTDeclWriter::Visit(Decl *D) {
|
|||
// abbreviation infrastructure requires that arrays are encoded last, so
|
||||
// we handle it here in the case of those classes derived from DeclaratorDecl
|
||||
if (DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
|
||||
Record.AddTypeSourceInfo(DD->getTypeSourceInfo());
|
||||
if (auto *TInfo = DD->getTypeSourceInfo())
|
||||
Record.AddTypeLoc(TInfo->getTypeLoc());
|
||||
}
|
||||
|
||||
// Handle FunctionDecl's body here and write it after all other Stmts/Exprs
|
||||
|
@ -513,6 +514,9 @@ void ASTDeclWriter::VisitDeclaratorDecl(DeclaratorDecl *D) {
|
|||
Record.push_back(D->hasExtInfo());
|
||||
if (D->hasExtInfo())
|
||||
Record.AddQualifierInfo(*D->getExtInfo());
|
||||
// The location information is deferred until the end of the record.
|
||||
Record.AddTypeRef(D->getTypeSourceInfo() ? D->getTypeSourceInfo()->getType()
|
||||
: QualType());
|
||||
}
|
||||
|
||||
void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
|
||||
|
@ -1773,11 +1777,11 @@ void ASTWriter::WriteDeclAbbrevs() {
|
|||
// DeclaratorDecl
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
|
||||
Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TSIType
|
||||
// FieldDecl
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable
|
||||
Abv->Add(BitCodeAbbrevOp(0)); // InitStyle
|
||||
// Type Source Info
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
|
||||
DeclFieldAbbrev = Stream.EmitAbbrev(std::move(Abv));
|
||||
|
@ -1806,6 +1810,7 @@ void ASTWriter::WriteDeclAbbrevs() {
|
|||
// DeclaratorDecl
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
|
||||
Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TSIType
|
||||
// FieldDecl
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable
|
||||
Abv->Add(BitCodeAbbrevOp(0)); // InitStyle
|
||||
|
@ -1813,7 +1818,6 @@ void ASTWriter::WriteDeclAbbrevs() {
|
|||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getAccessControl
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getSynthesize
|
||||
// Type Source Info
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
|
||||
DeclObjCIvarAbbrev = Stream.EmitAbbrev(std::move(Abv));
|
||||
|
@ -1949,6 +1953,7 @@ void ASTWriter::WriteDeclAbbrevs() {
|
|||
// DeclaratorDecl
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
|
||||
Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TSIType
|
||||
// VarDecl
|
||||
Abv->Add(BitCodeAbbrevOp(0)); // SClass
|
||||
Abv->Add(BitCodeAbbrevOp(0)); // TSCSpec
|
||||
|
@ -1965,7 +1970,6 @@ void ASTWriter::WriteDeclAbbrevs() {
|
|||
Abv->Add(BitCodeAbbrevOp(0)); // HasInheritedDefaultArg
|
||||
Abv->Add(BitCodeAbbrevOp(0)); // HasUninstantiatedDefaultArg
|
||||
// Type Source Info
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
|
||||
DeclParmVarAbbrev = Stream.EmitAbbrev(std::move(Abv));
|
||||
|
@ -2025,6 +2029,7 @@ void ASTWriter::WriteDeclAbbrevs() {
|
|||
// DeclaratorDecl
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
|
||||
Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TSIType
|
||||
// VarDecl
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // SClass
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // TSCSpec
|
||||
|
@ -2045,7 +2050,6 @@ void ASTWriter::WriteDeclAbbrevs() {
|
|||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // IsInitICE (local)
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // VarKind (local enum)
|
||||
// Type Source Info
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
|
||||
DeclVarAbbrev = Stream.EmitAbbrev(std::move(Abv));
|
||||
|
@ -2076,6 +2080,7 @@ void ASTWriter::WriteDeclAbbrevs() {
|
|||
// DeclaratorDecl
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerLocStart
|
||||
Abv->Add(BitCodeAbbrevOp(0)); // HasExtInfo
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TSIType
|
||||
// FunctionDecl
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 11)); // IDNS
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // StorageClass
|
||||
|
|
Loading…
Reference in New Issue