Skip to content

Commit 0fe78c4

Browse files
committed
[NFC] [Serialization] Some Code Cleanups for Name lookup table things
1 parent af51c9d commit 0fe78c4

File tree

7 files changed

+186
-166
lines changed

7 files changed

+186
-166
lines changed

clang/include/clang/Serialization/ASTReader.h

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,25 @@ struct LazySpecializationInfoLookupTable;
373373

374374
} // namespace serialization
375375

376+
struct VisibleLookupBlockOffsets {
377+
uint64_t VisibleOffset = 0;
378+
uint64_t ModuleLocalOffset = 0;
379+
uint64_t TULocalOffset = 0;
380+
381+
operator bool() const {
382+
return VisibleOffset || ModuleLocalOffset || // ModuleUnitLocalOffset ||
383+
TULocalOffset;
384+
}
385+
};
386+
387+
struct LookupBlockOffsets : VisibleLookupBlockOffsets {
388+
uint64_t LexicalOffset = 0;
389+
390+
operator bool() const {
391+
return VisibleLookupBlockOffsets::operator bool() || LexicalOffset;
392+
}
393+
};
394+
376395
/// Reads an AST files chain containing the contents of a translation
377396
/// unit.
378397
///
@@ -535,13 +554,6 @@ class ASTReader
535554
/// in the chain.
536555
DeclUpdateOffsetsMap DeclUpdateOffsets;
537556

538-
struct LookupBlockOffsets {
539-
uint64_t LexicalOffset;
540-
uint64_t VisibleOffset;
541-
uint64_t ModuleLocalOffset;
542-
uint64_t TULocalOffset;
543-
};
544-
545557
using DelayedNamespaceOffsetMapTy =
546558
llvm::DenseMap<GlobalDeclID, LookupBlockOffsets>;
547559

clang/include/clang/Serialization/ASTRecordWriter.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,13 @@ class ASTRecordWriter
115115
Record->push_back(BitOffset);
116116
}
117117

118+
void AddLookupOffsets(const LookupBlockOffsets &Offsets) {
119+
AddOffset(Offsets.LexicalOffset);
120+
AddOffset(Offsets.VisibleOffset);
121+
AddOffset(Offsets.ModuleLocalOffset);
122+
AddOffset(Offsets.TULocalOffset);
123+
}
124+
118125
/// Add the given statement or expression to the queue of
119126
/// statements to emit.
120127
///

clang/include/clang/Serialization/ASTWriter.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ class StoredDeclsList;
7575
class SwitchCase;
7676
class Token;
7777

78+
struct VisibleLookupBlockOffsets;
79+
struct LookupBlockOffsets;
80+
7881
namespace serialization {
7982
enum class DeclUpdateKind;
8083
} // namespace serialization
@@ -606,9 +609,7 @@ class ASTWriter : public ASTDeserializationListener,
606609
uint64_t WriteDeclContextLexicalBlock(ASTContext &Context,
607610
const DeclContext *DC);
608611
void WriteDeclContextVisibleBlock(ASTContext &Context, DeclContext *DC,
609-
uint64_t &VisibleBlockOffset,
610-
uint64_t &ModuleLocalBlockOffset,
611-
uint64_t &TULocalBlockOffset);
612+
VisibleLookupBlockOffsets &Offsets);
612613
void WriteTypeDeclOffsets();
613614
void WriteFileDeclIDsMap();
614615
void WriteComments(ASTContext &Context);
@@ -777,6 +778,9 @@ class ASTWriter : public ASTDeserializationListener,
777778
return (I == DeclIDs.end() || I->second >= clang::NUM_PREDEF_DECL_IDS);
778779
};
779780

781+
void AddLookupOffsets(const LookupBlockOffsets &Offsets,
782+
RecordDataImpl &Record);
783+
780784
/// Emit a reference to a declaration.
781785
void AddDeclRef(const Decl *D, RecordDataImpl &Record);
782786
// Emit a reference to a declaration if the declaration was emitted.

clang/lib/Serialization/ASTReader.cpp

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4097,8 +4097,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
40974097
uint64_t TULocalOffset =
40984098
TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
40994099

4100-
DelayedNamespaceOffsetMap[ID] = {LexicalOffset, VisibleOffset,
4101-
ModuleLocalOffset, TULocalOffset};
4100+
DelayedNamespaceOffsetMap[ID] = {
4101+
{VisibleOffset, TULocalOffset, ModuleLocalOffset}, LexicalOffset};
41024102

41034103
assert(!GetExistingDecl(ID) &&
41044104
"We shouldn't load the namespace in the front of delayed "
@@ -8544,39 +8544,35 @@ bool ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
85448544
SmallVector<NamedDecl *, 64> Decls;
85458545
llvm::SmallPtrSet<NamedDecl *, 8> Found;
85468546

8547+
auto Find = [&, this](auto &&Table, auto &&Key) {
8548+
for (GlobalDeclID ID : Table.find(Key)) {
8549+
NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
8550+
if (ND->getDeclName() == Name && Found.insert(ND).second)
8551+
Decls.push_back(ND);
8552+
}
8553+
};
8554+
85478555
Deserializing LookupResults(this);
85488556

85498557
// FIXME: Clear the redundancy with templated lambda in C++20 when that's
85508558
// available.
85518559
if (auto It = Lookups.find(DC); It != Lookups.end()) {
85528560
++NumVisibleDeclContextsRead;
8553-
for (GlobalDeclID ID : It->second.Table.find(Name)) {
8554-
NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
8555-
if (ND->getDeclName() == Name && Found.insert(ND).second)
8556-
Decls.push_back(ND);
8557-
}
8561+
Find(It->second.Table, Name);
85588562
}
85598563

85608564
if (auto *NamedModule =
85618565
OriginalDC ? cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
85628566
: nullptr) {
85638567
if (auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
85648568
++NumModuleLocalVisibleDeclContexts;
8565-
for (GlobalDeclID ID : It->second.Table.find({Name, NamedModule})) {
8566-
NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
8567-
if (ND->getDeclName() == Name && Found.insert(ND).second)
8568-
Decls.push_back(ND);
8569-
}
8569+
Find(It->second.Table, std::make_pair(Name, NamedModule));
85708570
}
85718571
}
85728572

85738573
if (auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
85748574
++NumTULocalVisibleDeclContexts;
8575-
for (GlobalDeclID ID : It->second.Table.find(Name)) {
8576-
NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
8577-
if (ND->getDeclName() == Name && Found.insert(ND).second)
8578-
Decls.push_back(ND);
8579-
}
8575+
Find(It->second.Table, Name);
85808576
}
85818577

85828578
SetExternalVisibleDeclsForName(DC, Name, Decls);

clang/lib/Serialization/ASTReaderDecl.cpp

Lines changed: 29 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -414,9 +414,7 @@ class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> {
414414
void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D);
415415
void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D);
416416

417-
void VisitDeclContext(DeclContext *DC, uint64_t &LexicalOffset,
418-
uint64_t &VisibleOffset, uint64_t &ModuleLocalOffset,
419-
uint64_t &TULocalOffset);
417+
void VisitDeclContext(DeclContext *DC, LookupBlockOffsets &Offsets);
420418

421419
template <typename T>
422420
RedeclarableResult VisitRedeclarable(Redeclarable<T> *D);
@@ -1875,12 +1873,8 @@ void ASTDeclReader::VisitNamespaceDecl(NamespaceDecl *D) {
18751873

18761874
void ASTDeclReader::VisitHLSLBufferDecl(HLSLBufferDecl *D) {
18771875
VisitNamedDecl(D);
1878-
uint64_t LexicalOffset = 0;
1879-
uint64_t VisibleOffset = 0;
1880-
uint64_t ModuleLocalOffset = 0;
1881-
uint64_t TULocalOffset = 0;
1882-
VisitDeclContext(D, LexicalOffset, VisibleOffset, ModuleLocalOffset,
1883-
TULocalOffset);
1876+
LookupBlockOffsets Offsets;
1877+
VisitDeclContext(D, Offsets);
18841878
D->IsCBuffer = Record.readBool();
18851879
D->KwLoc = readSourceLocation();
18861880
D->LBraceLoc = readSourceLocation();
@@ -2794,14 +2788,12 @@ void ASTDeclReader::VisitLifetimeExtendedTemporaryDecl(
27942788
mergeMergeable(D);
27952789
}
27962790

2797-
void ASTDeclReader::VisitDeclContext(DeclContext *DC, uint64_t &LexicalOffset,
2798-
uint64_t &VisibleOffset,
2799-
uint64_t &ModuleLocalOffset,
2800-
uint64_t &TULocalOffset) {
2801-
LexicalOffset = ReadLocalOffset();
2802-
VisibleOffset = ReadLocalOffset();
2803-
ModuleLocalOffset = ReadLocalOffset();
2804-
TULocalOffset = ReadLocalOffset();
2791+
void ASTDeclReader::VisitDeclContext(DeclContext *DC,
2792+
LookupBlockOffsets &Offsets) {
2793+
Offsets.LexicalOffset = ReadLocalOffset();
2794+
Offsets.VisibleOffset = ReadLocalOffset();
2795+
Offsets.ModuleLocalOffset = ReadLocalOffset();
2796+
Offsets.TULocalOffset = ReadLocalOffset();
28052797
}
28062798

28072799
template <typename T>
@@ -4249,42 +4241,37 @@ Decl *ASTReader::ReadDeclRecord(GlobalDeclID ID) {
42494241
// If this declaration is also a declaration context, get the
42504242
// offsets for its tables of lexical and visible declarations.
42514243
if (auto *DC = dyn_cast<DeclContext>(D)) {
4252-
uint64_t LexicalOffset = 0;
4253-
uint64_t VisibleOffset = 0;
4254-
uint64_t ModuleLocalOffset = 0;
4255-
uint64_t TULocalOffset = 0;
4244+
LookupBlockOffsets Offsets;
42564245

4257-
Reader.VisitDeclContext(DC, LexicalOffset, VisibleOffset, ModuleLocalOffset,
4258-
TULocalOffset);
4246+
Reader.VisitDeclContext(DC, Offsets);
42594247

42604248
// Get the lexical and visible block for the delayed namespace.
42614249
// It is sufficient to judge if ID is in DelayedNamespaceOffsetMap.
42624250
// But it may be more efficient to filter the other cases.
4263-
if (!LexicalOffset && !VisibleOffset && !ModuleLocalOffset &&
4264-
isa<NamespaceDecl>(D))
4251+
if (!Offsets && isa<NamespaceDecl>(D))
42654252
if (auto Iter = DelayedNamespaceOffsetMap.find(ID);
4266-
Iter != DelayedNamespaceOffsetMap.end()) {
4267-
LexicalOffset = Iter->second.LexicalOffset;
4268-
VisibleOffset = Iter->second.VisibleOffset;
4269-
ModuleLocalOffset = Iter->second.ModuleLocalOffset;
4270-
TULocalOffset = Iter->second.TULocalOffset;
4271-
}
4253+
Iter != DelayedNamespaceOffsetMap.end())
4254+
Offsets = Iter->second;
42724255

4273-
if (LexicalOffset &&
4274-
ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor, LexicalOffset, DC))
4275-
return nullptr;
4276-
if (VisibleOffset && ReadVisibleDeclContextStorage(
4277-
*Loc.F, DeclsCursor, VisibleOffset, ID,
4278-
VisibleDeclContextStorageKind::GenerallyVisible))
4256+
if (Offsets.VisibleOffset &&
4257+
ReadVisibleDeclContextStorage(
4258+
*Loc.F, DeclsCursor, Offsets.VisibleOffset, ID,
4259+
VisibleDeclContextStorageKind::GenerallyVisible))
42794260
return nullptr;
4280-
if (ModuleLocalOffset &&
4261+
if (Offsets.ModuleLocalOffset &&
42814262
ReadVisibleDeclContextStorage(
4282-
*Loc.F, DeclsCursor, ModuleLocalOffset, ID,
4263+
*Loc.F, DeclsCursor, Offsets.ModuleLocalOffset, ID,
42834264
VisibleDeclContextStorageKind::ModuleLocalVisible))
42844265
return nullptr;
4285-
if (TULocalOffset && ReadVisibleDeclContextStorage(
4286-
*Loc.F, DeclsCursor, TULocalOffset, ID,
4287-
VisibleDeclContextStorageKind::TULocalVisible))
4266+
if (Offsets.TULocalOffset &&
4267+
ReadVisibleDeclContextStorage(
4268+
*Loc.F, DeclsCursor, Offsets.TULocalOffset, ID,
4269+
VisibleDeclContextStorageKind::TULocalVisible))
4270+
return nullptr;
4271+
4272+
if (Offsets.LexicalOffset &&
4273+
ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,
4274+
Offsets.LexicalOffset, DC))
42884275
return nullptr;
42894276
}
42904277
assert(Record.getIdx() == Record.size());

0 commit comments

Comments
 (0)