[PATCH] D86514: Correctly parse LateParsedTemplates in case of multiple dependent modules
Vaibhav Garg via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 25 02:53:38 PDT 2020
gargvaibhav64 created this revision.
gargvaibhav64 added reviewers: rsmith, v.g.vassilev.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
gargvaibhav64 requested review of this revision.
While parsing LateParsedTemplates, Clang assumes that the Global DeclID matches with the Local DeclID of a Decl. This is not the case when we have multiple dependent modules have their own LateParsedTemplate section. In such a case, a Local/Global DeclID confusion occurs which leads to improper casting of Functions.
This commit creates a MapVector to map the LateParsedTemplate section of each Module with their module file and therefore resolving the Global/Local DeclID confusion.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D86514
Files:
clang/include/clang/Serialization/ASTReader.h
clang/lib/Serialization/ASTReader.cpp
Index: clang/lib/Serialization/ASTReader.cpp
===================================================================
--- clang/lib/Serialization/ASTReader.cpp
+++ clang/lib/Serialization/ASTReader.cpp
@@ -3721,6 +3721,9 @@
case LATE_PARSED_TEMPLATE:
LateParsedTemplates.append(Record.begin(), Record.end());
+ LateParsedTemplatesModulesMap.insert(
+ std::make_pair(&F, std::move(LateParsedTemplates)));
+ LateParsedTemplates.clear();
break;
case OPTIMIZE_PRAGMA_OPTIONS:
@@ -8386,25 +8389,28 @@
void ASTReader::ReadLateParsedTemplates(
llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
&LPTMap) {
- for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
- /* In loop */) {
- FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
+ for (auto &LPT : LateParsedTemplatesModulesMap) {
+ ModuleFile *FMod = LPT.first;
+ SmallVector<uint64_t, 1> LateParsed(LPT.second);
+ for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
+ /* In loop */) {
+ FunctionDecl *FD =
+ cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++]));
- auto LT = std::make_unique<LateParsedTemplate>();
- LT->D = GetDecl(LateParsedTemplates[Idx++]);
+ auto LT = llvm::make_unique<LateParsedTemplate>();
+ LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]);
- ModuleFile *F = getOwningModuleFile(LT->D);
- assert(F && "No module");
+ ModuleFile *F = getOwningModuleFile(LT->D);
+ assert(F && "No module");
- unsigned TokN = LateParsedTemplates[Idx++];
- LT->Toks.reserve(TokN);
- for (unsigned T = 0; T < TokN; ++T)
- LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
+ unsigned TokN = LateParsed[Idx++];
+ LT->Toks.reserve(TokN);
+ for (unsigned T = 0; T < TokN; ++T)
+ LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
- LPTMap.insert(std::make_pair(FD, std::move(LT)));
+ LPTMap.insert(std::make_pair(FD, std::move(LT)));
+ }
}
-
- LateParsedTemplates.clear();
}
void ASTReader::LoadSelector(Selector Sel) {
Index: clang/include/clang/Serialization/ASTReader.h
===================================================================
--- clang/include/clang/Serialization/ASTReader.h
+++ clang/include/clang/Serialization/ASTReader.h
@@ -903,6 +903,10 @@
// A list of late parsed template function data.
SmallVector<uint64_t, 1> LateParsedTemplates;
+ // A list of LateParsedTemplates paired with their module files.
+ llvm::MapVector<ModuleFile *, SmallVector<uint64_t, 1>>
+ LateParsedTemplatesModulesMap;
+
/// The IDs of all decls to be checked for deferred diags.
///
/// Sema tracks these to emit deferred diags.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D86514.287604.patch
Type: text/x-patch
Size: 2772 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200825/3be53218/attachment.bin>
More information about the cfe-commits
mailing list