Skip to content

Commit b8e3b2a

Browse files
committed
[NFC] [Serialization] Turn type alias LocalDeclID into class
Previously, the LocalDeclID and GlobalDeclID are defined as: ``` using LocalDeclID = DeclID; using GlobalDeclID = DeclID; ``` This is more or less concerning that we may misuse LocalDeclID and GlobalDeclID without understanding it. There is also a FIXME saying this. This patch tries to turn LocalDeclID into a class to improve the type safety here.
1 parent c921ac7 commit b8e3b2a

File tree

6 files changed

+65
-42
lines changed

6 files changed

+65
-42
lines changed

clang/include/clang/Serialization/ASTBitCodes.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,18 @@ using IdentifierID = uint32_t;
6969
/// FIXME: Merge with Decl::DeclID
7070
using DeclID = uint32_t;
7171

72-
// FIXME: Turn these into classes so we can have some type safety when
72+
class LocalDeclID {
73+
public:
74+
explicit LocalDeclID(DeclID ID) : ID(ID) {}
75+
76+
DeclID get() const { return ID; }
77+
78+
private:
79+
DeclID ID;
80+
};
81+
82+
// FIXME: Turn GlobalDeclID into class so we can have some type safety when
7383
// we go from local ID to global and vice-versa.
74-
using LocalDeclID = DeclID;
7584
using GlobalDeclID = DeclID;
7685

7786
/// An ID number that refers to a type in an AST file.

clang/include/clang/Serialization/ASTReader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1924,15 +1924,15 @@ class ASTReader
19241924
Decl *GetExistingDecl(serialization::DeclID ID);
19251925

19261926
/// Reads a declaration with the given local ID in the given module.
1927-
Decl *GetLocalDecl(ModuleFile &F, serialization::DeclID LocalID) {
1927+
Decl *GetLocalDecl(ModuleFile &F, serialization::LocalDeclID LocalID) {
19281928
return GetDecl(getGlobalDeclID(F, LocalID));
19291929
}
19301930

19311931
/// Reads a declaration with the given local ID in the given module.
19321932
///
19331933
/// \returns The requested declaration, casted to the given return type.
19341934
template <typename T>
1935-
T *GetLocalDeclAs(ModuleFile &F, serialization::DeclID LocalID) {
1935+
T *GetLocalDeclAs(ModuleFile &F, serialization::LocalDeclID LocalID) {
19361936
return cast_or_null<T>(GetLocalDecl(F, LocalID));
19371937
}
19381938

clang/include/clang/Serialization/ModuleFile.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ class ModuleFile {
474474
llvm::DenseMap<ModuleFile *, serialization::DeclID> GlobalToLocalDeclIDs;
475475

476476
/// Array of file-level DeclIDs sorted by file.
477-
const serialization::DeclID *FileSortedDecls = nullptr;
477+
const serialization::LocalDeclID *FileSortedDecls = nullptr;
478478
unsigned NumFileSortedDecls = 0;
479479

480480
/// Array of category list location information within this

clang/lib/Serialization/ASTReader.cpp

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -954,14 +954,16 @@ ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
954954
// Load instance methods
955955
for (unsigned I = 0; I != NumInstanceMethods; ++I) {
956956
if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
957-
F, endian::readNext<DeclID, llvm::endianness::little>(d)))
957+
F,
958+
LocalDeclID(endian::readNext<DeclID, llvm::endianness::little>(d))))
958959
Result.Instance.push_back(Method);
959960
}
960961

961962
// Load factory methods
962963
for (unsigned I = 0; I != NumFactoryMethods; ++I) {
963964
if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
964-
F, endian::readNext<DeclID, llvm::endianness::little>(d)))
965+
F,
966+
LocalDeclID(endian::readNext<DeclID, llvm::endianness::little>(d))))
965967
Result.Factory.push_back(Method);
966968
}
967969

@@ -1091,7 +1093,8 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
10911093
SmallVector<DeclID, 4> DeclIDs;
10921094
for (; DataLen > 0; DataLen -= sizeof(DeclID))
10931095
DeclIDs.push_back(Reader.getGlobalDeclID(
1094-
F, endian::readNext<DeclID, llvm::endianness::little>(d)));
1096+
F,
1097+
LocalDeclID(endian::readNext<DeclID, llvm::endianness::little>(d))));
10951098
Reader.SetGloballyVisibleDecls(II, DeclIDs);
10961099
}
10971100

@@ -1212,7 +1215,7 @@ void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
12121215
using namespace llvm::support;
12131216

12141217
for (unsigned NumDecls = DataLen / sizeof(DeclID); NumDecls; --NumDecls) {
1215-
DeclID LocalID = endian::readNext<DeclID, llvm::endianness::little>(d);
1218+
LocalDeclID LocalID(endian::readNext<DeclID, llvm::endianness::little>(d));
12161219
Val.insert(Reader.getGlobalDeclID(F, LocalID));
12171220
}
12181221
}
@@ -1652,7 +1655,7 @@ bool ASTReader::ReadSLocEntry(int ID) {
16521655

16531656
unsigned NumFileDecls = Record[7];
16541657
if (NumFileDecls && ContextObj) {
1655-
const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1658+
const LocalDeclID *FirstDecl = F->FileSortedDecls + Record[6];
16561659
assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
16571660
FileDeclIDs[FID] =
16581661
FileDeclsInfo(F, llvm::ArrayRef(FirstDecl, NumFileDecls));
@@ -3458,7 +3461,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
34583461
// FIXME: Skip reading this record if our ASTConsumer doesn't care
34593462
// about "interesting" decls (for instance, if we're building a module).
34603463
for (unsigned I = 0, N = Record.size(); I != N; ++I)
3461-
EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
3464+
EagerlyDeserializedDecls.push_back(
3465+
getGlobalDeclID(F, LocalDeclID(Record[I])));
34623466
break;
34633467

34643468
case MODULAR_CODEGEN_DECLS:
@@ -3467,7 +3471,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
34673471
if (F.Kind == MK_MainFile ||
34683472
getContext().getLangOpts().BuildingPCHWithObjectFile)
34693473
for (unsigned I = 0, N = Record.size(); I != N; ++I)
3470-
EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
3474+
EagerlyDeserializedDecls.push_back(
3475+
getGlobalDeclID(F, LocalDeclID(Record[I])));
34713476
break;
34723477

34733478
case SPECIAL_TYPES:
@@ -3499,12 +3504,14 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
34993504

35003505
case UNUSED_FILESCOPED_DECLS:
35013506
for (unsigned I = 0, N = Record.size(); I != N; ++I)
3502-
UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
3507+
UnusedFileScopedDecls.push_back(
3508+
getGlobalDeclID(F, LocalDeclID(Record[I])));
35033509
break;
35043510

35053511
case DELEGATING_CTORS:
35063512
for (unsigned I = 0, N = Record.size(); I != N; ++I)
3507-
DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
3513+
DelegatingCtorDecls.push_back(
3514+
getGlobalDeclID(F, LocalDeclID(Record[I])));
35083515
break;
35093516

35103517
case WEAK_UNDECLARED_IDENTIFIERS:
@@ -3612,7 +3619,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
36123619
break;
36133620

36143621
case FILE_SORTED_DECLS:
3615-
F.FileSortedDecls = (const DeclID *)Blob.data();
3622+
F.FileSortedDecls = (const LocalDeclID *)Blob.data();
36163623
F.NumFileSortedDecls = Record[0];
36173624
break;
36183625

@@ -3667,7 +3674,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
36673674

36683675
case EXT_VECTOR_DECLS:
36693676
for (unsigned I = 0, N = Record.size(); I != N; ++I)
3670-
ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3677+
ExtVectorDecls.push_back(getGlobalDeclID(F, LocalDeclID(Record[I])));
36713678
break;
36723679

36733680
case VTABLE_USES:
@@ -3681,7 +3688,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
36813688
VTableUses.clear();
36823689

36833690
for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3684-
VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3691+
VTableUses.push_back(getGlobalDeclID(F, LocalDeclID(Record[Idx++])));
36853692
VTableUses.push_back(
36863693
ReadSourceLocation(F, Record, Idx).getRawEncoding());
36873694
VTableUses.push_back(Record[Idx++]);
@@ -3700,7 +3707,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
37003707
"Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
37013708

37023709
for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3703-
PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3710+
PendingInstantiations.push_back(
3711+
getGlobalDeclID(F, LocalDeclID(Record[I++])));
37043712
PendingInstantiations.push_back(
37053713
ReadSourceLocation(F, Record, I).getRawEncoding());
37063714
}
@@ -3711,7 +3719,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
37113719
return llvm::createStringError(std::errc::illegal_byte_sequence,
37123720
"Invalid SEMA_DECL_REFS block");
37133721
for (unsigned I = 0, N = Record.size(); I != N; ++I)
3714-
SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3722+
SemaDeclRefs.push_back(getGlobalDeclID(F, LocalDeclID(Record[I])));
37153723
break;
37163724

37173725
case PPD_ENTITIES_OFFSETS: {
@@ -3770,7 +3778,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
37703778
std::errc::illegal_byte_sequence,
37713779
"invalid DECL_UPDATE_OFFSETS block in AST file");
37723780
for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3773-
GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3781+
GlobalDeclID ID = getGlobalDeclID(F, LocalDeclID(Record[I]));
37743782
DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
37753783

37763784
// If we've already loaded the decl, perform the updates when we finish
@@ -3788,7 +3796,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
37883796
"invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
37893797
"file");
37903798
for (unsigned I = 0, N = Record.size(); I != N; I += 3) {
3791-
GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3799+
GlobalDeclID ID = getGlobalDeclID(F, LocalDeclID(Record[I]));
37923800

37933801
uint64_t BaseOffset = F.DeclsBlockStartOffset;
37943802
assert(BaseOffset && "Invalid DeclsBlockStartOffset for module file!");
@@ -3823,7 +3831,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
38233831
// FIXME: Modules will have trouble with this.
38243832
CUDASpecialDeclRefs.clear();
38253833
for (unsigned I = 0, N = Record.size(); I != N; ++I)
3826-
CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3834+
CUDASpecialDeclRefs.push_back(
3835+
getGlobalDeclID(F, LocalDeclID(Record[I])));
38273836
break;
38283837

38293838
case HEADER_SEARCH_TABLE:
@@ -3864,12 +3873,13 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
38643873

38653874
case TENTATIVE_DEFINITIONS:
38663875
for (unsigned I = 0, N = Record.size(); I != N; ++I)
3867-
TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3876+
TentativeDefinitions.push_back(
3877+
getGlobalDeclID(F, LocalDeclID(Record[I])));
38683878
break;
38693879

38703880
case KNOWN_NAMESPACES:
38713881
for (unsigned I = 0, N = Record.size(); I != N; ++I)
3872-
KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3882+
KnownNamespaces.push_back(getGlobalDeclID(F, LocalDeclID(Record[I])));
38733883
break;
38743884

38753885
case UNDEFINED_BUT_USED:
@@ -3881,15 +3891,17 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
38813891
return llvm::createStringError(std::errc::illegal_byte_sequence,
38823892
"invalid undefined-but-used record");
38833893
for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3884-
UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3894+
UndefinedButUsed.push_back(
3895+
getGlobalDeclID(F, LocalDeclID(Record[I++])));
38853896
UndefinedButUsed.push_back(
38863897
ReadSourceLocation(F, Record, I).getRawEncoding());
38873898
}
38883899
break;
38893900

38903901
case DELETE_EXPRS_TO_ANALYZE:
38913902
for (unsigned I = 0, N = Record.size(); I != N;) {
3892-
DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
3903+
DelayedDeleteExprs.push_back(
3904+
getGlobalDeclID(F, LocalDeclID(Record[I++])));
38933905
const uint64_t Count = Record[I++];
38943906
DelayedDeleteExprs.push_back(Count);
38953907
for (uint64_t C = 0; C < Count; ++C) {
@@ -3974,7 +3986,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
39743986
case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
39753987
for (unsigned I = 0, N = Record.size(); I != N; ++I)
39763988
UnusedLocalTypedefNameCandidates.push_back(
3977-
getGlobalDeclID(F, Record[I]));
3989+
getGlobalDeclID(F, LocalDeclID(Record[I])));
39783990
break;
39793991

39803992
case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
@@ -4030,7 +4042,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
40304042

40314043
case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS:
40324044
for (unsigned I = 0, N = Record.size(); I != N; ++I)
4033-
DeclsToCheckForDeferredDiags.insert(getGlobalDeclID(F, Record[I]));
4045+
DeclsToCheckForDeferredDiags.insert(
4046+
getGlobalDeclID(F, LocalDeclID(Record[I])));
40344047
break;
40354048
}
40364049
}
@@ -6010,7 +6023,7 @@ llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F,
60106023
break;
60116024
SmallVector<DeclID, 16> Inits;
60126025
for (auto &ID : Record)
6013-
Inits.push_back(getGlobalDeclID(F, ID));
6026+
Inits.push_back(getGlobalDeclID(F, LocalDeclID(ID)));
60146027
ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
60156028
break;
60166029
}
@@ -7650,17 +7663,18 @@ CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
76507663

76517664
serialization::DeclID
76527665
ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
7653-
if (LocalID < NUM_PREDEF_DECL_IDS)
7654-
return LocalID;
7666+
DeclID ID = LocalID.get();
7667+
if (ID < NUM_PREDEF_DECL_IDS)
7668+
return ID;
76557669

76567670
if (!F.ModuleOffsetMap.empty())
76577671
ReadModuleOffsetMap(F);
76587672

76597673
ContinuousRangeMap<DeclID, int, 2>::iterator I =
7660-
F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
7674+
F.DeclRemap.find(ID - NUM_PREDEF_DECL_IDS);
76617675
assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
76627676

7663-
return LocalID + I->second;
7677+
return ID + I->second;
76647678
}
76657679

76667680
bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
@@ -7830,7 +7844,7 @@ serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
78307844
return 0;
78317845
}
78327846

7833-
return getGlobalDeclID(F, Record[Idx++]);
7847+
return getGlobalDeclID(F, LocalDeclID(Record[Idx++]));
78347848
}
78357849

78367850
/// Resolve the offset of a statement into a statement.
@@ -7877,7 +7891,7 @@ void ASTReader::FindExternalLexicalDecls(
78777891
PredefsVisited[ID] = true;
78787892
}
78797893

7880-
if (Decl *D = GetLocalDecl(*M, ID)) {
7894+
if (Decl *D = GetLocalDecl(*M, LocalDeclID(ID))) {
78817895
assert(D->getKind() == K && "wrong kind for lexical decl");
78827896
if (!DC->isDeclInLexicalTraversal(D))
78837897
Decls.push_back(D);
@@ -8767,11 +8781,11 @@ void ASTReader::ReadLateParsedTemplates(
87678781
RecordDataImpl &LateParsed = LPT.second;
87688782
for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
87698783
/* In loop */) {
8770-
FunctionDecl *FD =
8771-
cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++]));
8784+
FunctionDecl *FD = cast<FunctionDecl>(
8785+
GetLocalDecl(*FMod, LocalDeclID(LateParsed[Idx++])));
87728786

87738787
auto LT = std::make_unique<LateParsedTemplate>();
8774-
LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]);
8788+
LT->D = GetLocalDecl(*FMod, LocalDeclID(LateParsed[Idx++]));
87758789
LT->FPO = FPOptions::getFromOpaqueInt(LateParsed[Idx++]);
87768790

87778791
ModuleFile *F = getOwningModuleFile(LT->D);

clang/lib/Serialization/ASTReaderDecl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3140,7 +3140,7 @@ class AttrReader {
31403140

31413141
OMPTraitInfo *readOMPTraitInfo() { return Reader.readOMPTraitInfo(); }
31423142

3143-
template <typename T> T *GetLocalDeclAs(DeclID LocalID) {
3143+
template <typename T> T *GetLocalDeclAs(LocalDeclID LocalID) {
31443144
return Reader.GetLocalDeclAs<T>(LocalID);
31453145
}
31463146
};
@@ -4327,7 +4327,7 @@ void ASTReader::loadPendingDeclChain(Decl *FirstLocal, uint64_t LocalOffset) {
43274327
// we should instead generate one loop per kind and dispatch up-front?
43284328
Decl *MostRecent = FirstLocal;
43294329
for (unsigned I = 0, N = Record.size(); I != N; ++I) {
4330-
auto *D = GetLocalDecl(*M, Record[N - I - 1]);
4330+
auto *D = GetLocalDecl(*M, LocalDeclID(Record[N - I - 1]));
43314331
ASTDeclReader::attachPreviousDecl(*this, D, MostRecent, CanonDecl);
43324332
MostRecent = D;
43334333
}
@@ -4437,7 +4437,7 @@ namespace {
44374437
M.ObjCCategories[Offset++] = 0; // Don't try to deserialize again
44384438
for (unsigned I = 0; I != N; ++I)
44394439
add(cast_or_null<ObjCCategoryDecl>(
4440-
Reader.GetLocalDecl(M, M.ObjCCategories[Offset++])));
4440+
Reader.GetLocalDecl(M, LocalDeclID(M.ObjCCategories[Offset++]))));
44414441
return true;
44424442
}
44434443
};

clang/utils/TableGen/ClangAttrEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ static std::string ReadPCHRecord(StringRef type) {
107107
return StringSwitch<std::string>(type)
108108
.EndsWith("Decl *", "Record.GetLocalDeclAs<" +
109109
std::string(type.data(), 0, type.size() - 1) +
110-
">(Record.readInt())")
110+
">(LocalDeclID(Record.readInt()))")
111111
.Case("TypeSourceInfo *", "Record.readTypeSourceInfo()")
112112
.Case("Expr *", "Record.readExpr()")
113113
.Case("IdentifierInfo *", "Record.readIdentifier()")

0 commit comments

Comments
 (0)