aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChuanqi Xu <yedeng.yd@linux.alibaba.com>2024-08-28 15:45:02 +0800
committerChuanqi Xu <yedeng.yd@linux.alibaba.com>2024-08-28 15:45:02 +0800
commit89a8d1bfc0c40a2afe5276858b4a2961c62c5e4e (patch)
treef8f6b9bd304a4aaf5a3508b44428f0baf5b4f7e8
parent88c9d8c05b97ad0c7cc1521ff9ba171504da1531 (diff)
downloadllvm-users/ChuanqiXu9/D41416_on_disk_hash_table_polishing.zip
llvm-users/ChuanqiXu9/D41416_on_disk_hash_table_polishing.tar.gz
llvm-users/ChuanqiXu9/D41416_on_disk_hash_table_polishing.tar.bz2
Do not omit data from imported modules with same keyusers/ChuanqiXu9/D41416_on_disk_hash_table_polishing
-rw-r--r--clang/lib/Serialization/ASTWriter.cpp6
-rw-r--r--clang/lib/Serialization/MultiOnDiskHashTable.h4
2 files changed, 7 insertions, 3 deletions
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index 0b0c555..e07cc26 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -4245,7 +4245,11 @@ void ASTWriter::GenerateSpecializationInfoLookupTable(
auto *Lookups =
Chain ? Chain->getLoadedSpecializationsLookupTables(D) : nullptr;
- Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table : nullptr);
+ // We can't OmitDataWithSameKeyInBase since the lazy load specialization
+ // mechanism assumes that different specializations can share the same
+ // hash key.
+ Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table : nullptr,
+ /*OmitDataWithSameKeyInBase=*/false);
}
uint64_t ASTWriter::WriteSpecializationInfoLookupTable(
diff --git a/clang/lib/Serialization/MultiOnDiskHashTable.h b/clang/lib/Serialization/MultiOnDiskHashTable.h
index a0d75ec..76910f4 100644
--- a/clang/lib/Serialization/MultiOnDiskHashTable.h
+++ b/clang/lib/Serialization/MultiOnDiskHashTable.h
@@ -306,7 +306,7 @@ public:
}
void emit(llvm::SmallVectorImpl<char> &Out, WriterInfo &Info,
- const BaseTable *Base) {
+ const BaseTable *Base, bool OmitDataWithSameKeyInBase = true) {
using namespace llvm::support;
llvm::raw_svector_ostream OutStream(Out);
@@ -326,7 +326,7 @@ public:
// Add all merged entries from Base to the generator.
for (auto &KV : Merged->Data) {
- if (!Gen.contains(KV.first, Info))
+ if (!OmitDataWithSameKeyInBase || !Gen.contains(KV.first, Info))
Gen.insert(KV.first, Info.ImportData(KV.second), Info);
}
} else {