Skip to content

Commit 6b30180

Browse files
committed
Revert "[serialization] no transitive decl change (#92083)"
This reverts commit ccb73e8. It looks like there are some bots complaining about the patch. See the post commit comment in #92083 to track it.
1 parent 910098e commit 6b30180

File tree

12 files changed

+147
-283
lines changed

12 files changed

+147
-283
lines changed

clang/include/clang/AST/DeclBase.h

+14-3
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,10 @@ class alignas(8) Decl {
701701

702702
/// Set the owning module ID. This may only be called for
703703
/// deserialized Decls.
704-
void setOwningModuleID(unsigned ID);
704+
void setOwningModuleID(unsigned ID) {
705+
assert(isFromASTFile() && "Only works on a deserialized declaration");
706+
*((unsigned*)this - 2) = ID;
707+
}
705708

706709
public:
707710
/// Determine the availability of the given declaration.
@@ -774,11 +777,19 @@ class alignas(8) Decl {
774777

775778
/// Retrieve the global declaration ID associated with this
776779
/// declaration, which specifies where this Decl was loaded from.
777-
GlobalDeclID getGlobalID() const;
780+
GlobalDeclID getGlobalID() const {
781+
if (isFromASTFile())
782+
return (*((const GlobalDeclID *)this - 1));
783+
return GlobalDeclID();
784+
}
778785

779786
/// Retrieve the global ID of the module that owns this particular
780787
/// declaration.
781-
unsigned getOwningModuleID() const;
788+
unsigned getOwningModuleID() const {
789+
if (isFromASTFile())
790+
return *((const unsigned*)this - 2);
791+
return 0;
792+
}
782793

783794
private:
784795
Module *getOwningModuleSlow() const;

clang/include/clang/AST/DeclID.h

+1-17
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
#include "llvm/ADT/DenseMapInfo.h"
2020
#include "llvm/ADT/iterator.h"
2121

22-
#include <climits>
23-
2422
namespace clang {
2523

2624
/// Predefined declaration IDs.
@@ -109,16 +107,12 @@ class DeclIDBase {
109107
///
110108
/// DeclID should only be used directly in serialization. All other users
111109
/// should use LocalDeclID or GlobalDeclID.
112-
using DeclID = uint64_t;
110+
using DeclID = uint32_t;
113111

114112
protected:
115113
DeclIDBase() : ID(PREDEF_DECL_NULL_ID) {}
116114
explicit DeclIDBase(DeclID ID) : ID(ID) {}
117115

118-
explicit DeclIDBase(unsigned LocalID, unsigned ModuleFileIndex) {
119-
ID = (DeclID)LocalID | ((DeclID)ModuleFileIndex << 32);
120-
}
121-
122116
public:
123117
DeclID get() const { return ID; }
124118

@@ -130,10 +124,6 @@ class DeclIDBase {
130124

131125
bool isInvalid() const { return ID == PREDEF_DECL_NULL_ID; }
132126

133-
unsigned getModuleFileIndex() const { return ID >> 32; }
134-
135-
unsigned getLocalDeclIndex() const;
136-
137127
friend bool operator==(const DeclIDBase &LHS, const DeclIDBase &RHS) {
138128
return LHS.ID == RHS.ID;
139129
}
@@ -166,9 +156,6 @@ class LocalDeclID : public DeclIDBase {
166156
LocalDeclID(PredefinedDeclIDs ID) : Base(ID) {}
167157
explicit LocalDeclID(DeclID ID) : Base(ID) {}
168158

169-
explicit LocalDeclID(unsigned LocalID, unsigned ModuleFileIndex)
170-
: Base(LocalID, ModuleFileIndex) {}
171-
172159
LocalDeclID &operator++() {
173160
++ID;
174161
return *this;
@@ -188,9 +175,6 @@ class GlobalDeclID : public DeclIDBase {
188175
GlobalDeclID() : Base() {}
189176
explicit GlobalDeclID(DeclID ID) : Base(ID) {}
190177

191-
explicit GlobalDeclID(unsigned LocalID, unsigned ModuleFileIndex)
192-
: Base(LocalID, ModuleFileIndex) {}
193-
194178
// For DeclIDIterator<GlobalDeclID> to be able to convert a GlobalDeclID
195179
// to a LocalDeclID.
196180
explicit operator LocalDeclID() const { return LocalDeclID(this->ID); }

clang/include/clang/Serialization/ASTBitCodes.h

-6
Original file line numberDiff line numberDiff line change
@@ -255,12 +255,6 @@ class DeclOffset {
255255
}
256256
};
257257

258-
// The unaligned decl ID used in the Blobs of bistreams.
259-
using unaligned_decl_id_t =
260-
llvm::support::detail::packed_endian_specific_integral<
261-
serialization::DeclID, llvm::endianness::native,
262-
llvm::support::unaligned>;
263-
264258
/// The number of predefined preprocessed entity IDs.
265259
const unsigned int NUM_PREDEF_PP_ENTITY_IDS = 1;
266260

clang/include/clang/Serialization/ASTReader.h

+20-16
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,12 @@ class ASTReader
501501
/// = I + 1 has already been loaded.
502502
llvm::PagedVector<Decl *> DeclsLoaded;
503503

504+
using GlobalDeclMapType = ContinuousRangeMap<GlobalDeclID, ModuleFile *, 4>;
505+
506+
/// Mapping from global declaration IDs to the module in which the
507+
/// declaration resides.
508+
GlobalDeclMapType GlobalDeclMap;
509+
504510
using FileOffset = std::pair<ModuleFile *, uint64_t>;
505511
using FileOffsetsTy = SmallVector<FileOffset, 2>;
506512
using DeclUpdateOffsetsMap = llvm::DenseMap<GlobalDeclID, FileOffsetsTy>;
@@ -583,11 +589,10 @@ class ASTReader
583589

584590
struct FileDeclsInfo {
585591
ModuleFile *Mod = nullptr;
586-
ArrayRef<serialization::unaligned_decl_id_t> Decls;
592+
ArrayRef<LocalDeclID> Decls;
587593

588594
FileDeclsInfo() = default;
589-
FileDeclsInfo(ModuleFile *Mod,
590-
ArrayRef<serialization::unaligned_decl_id_t> Decls)
595+
FileDeclsInfo(ModuleFile *Mod, ArrayRef<LocalDeclID> Decls)
591596
: Mod(Mod), Decls(Decls) {}
592597
};
593598

@@ -596,7 +601,11 @@ class ASTReader
596601

597602
/// An array of lexical contents of a declaration context, as a sequence of
598603
/// Decl::Kind, DeclID pairs.
599-
using LexicalContents = ArrayRef<serialization::unaligned_decl_id_t>;
604+
using unaligned_decl_id_t =
605+
llvm::support::detail::packed_endian_specific_integral<
606+
serialization::DeclID, llvm::endianness::native,
607+
llvm::support::unaligned>;
608+
using LexicalContents = ArrayRef<unaligned_decl_id_t>;
600609

601610
/// Map from a DeclContext to its lexical contents.
602611
llvm::DenseMap<const DeclContext*, std::pair<ModuleFile*, LexicalContents>>
@@ -1477,23 +1486,22 @@ class ASTReader
14771486
unsigned ClientLoadCapabilities);
14781487

14791488
public:
1480-
class ModuleDeclIterator
1481-
: public llvm::iterator_adaptor_base<
1482-
ModuleDeclIterator, const serialization::unaligned_decl_id_t *,
1483-
std::random_access_iterator_tag, const Decl *, ptrdiff_t,
1484-
const Decl *, const Decl *> {
1489+
class ModuleDeclIterator : public llvm::iterator_adaptor_base<
1490+
ModuleDeclIterator, const LocalDeclID *,
1491+
std::random_access_iterator_tag, const Decl *,
1492+
ptrdiff_t, const Decl *, const Decl *> {
14851493
ASTReader *Reader = nullptr;
14861494
ModuleFile *Mod = nullptr;
14871495

14881496
public:
14891497
ModuleDeclIterator() : iterator_adaptor_base(nullptr) {}
14901498

14911499
ModuleDeclIterator(ASTReader *Reader, ModuleFile *Mod,
1492-
const serialization::unaligned_decl_id_t *Pos)
1500+
const LocalDeclID *Pos)
14931501
: iterator_adaptor_base(Pos), Reader(Reader), Mod(Mod) {}
14941502

14951503
value_type operator*() const {
1496-
return Reader->GetDecl(Reader->getGlobalDeclID(*Mod, (LocalDeclID)*I));
1504+
return Reader->GetDecl(Reader->getGlobalDeclID(*Mod, *I));
14971505
}
14981506

14991507
value_type operator->() const { return **this; }
@@ -1533,9 +1541,6 @@ class ASTReader
15331541
StringRef Arg2 = StringRef(), StringRef Arg3 = StringRef()) const;
15341542
void Error(llvm::Error &&Err) const;
15351543

1536-
/// Translate a \param GlobalDeclID to the index of DeclsLoaded array.
1537-
unsigned translateGlobalDeclIDToIndex(GlobalDeclID ID) const;
1538-
15391544
public:
15401545
/// Load the AST file and validate its contents against the given
15411546
/// Preprocessor.
@@ -1907,8 +1912,7 @@ class ASTReader
19071912

19081913
/// Retrieve the module file that owns the given declaration, or NULL
19091914
/// if the declaration is not from a module file.
1910-
ModuleFile *getOwningModuleFile(const Decl *D) const;
1911-
ModuleFile *getOwningModuleFile(GlobalDeclID ID) const;
1915+
ModuleFile *getOwningModuleFile(const Decl *D);
19121916

19131917
/// Returns the source location for the decl \p ID.
19141918
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID);

clang/include/clang/Serialization/ModuleFile.h

+15-3
Original file line numberDiff line numberDiff line change
@@ -454,11 +454,23 @@ class ModuleFile {
454454
/// by the declaration ID (-1).
455455
const DeclOffset *DeclOffsets = nullptr;
456456

457-
/// Base declaration index in ASTReader for declarations local to this module.
458-
unsigned BaseDeclIndex = 0;
457+
/// Base declaration ID for declarations local to this module.
458+
serialization::DeclID BaseDeclID = 0;
459+
460+
/// Remapping table for declaration IDs in this module.
461+
ContinuousRangeMap<serialization::DeclID, int, 2> DeclRemap;
462+
463+
/// Mapping from the module files that this module file depends on
464+
/// to the base declaration ID for that module as it is understood within this
465+
/// module.
466+
///
467+
/// This is effectively a reverse global-to-local mapping for declaration
468+
/// IDs, so that we can interpret a true global ID (for this translation unit)
469+
/// as a local ID (for this module file).
470+
llvm::DenseMap<ModuleFile *, serialization::DeclID> GlobalToLocalDeclIDs;
459471

460472
/// Array of file-level DeclIDs sorted by file.
461-
const serialization::unaligned_decl_id_t *FileSortedDecls = nullptr;
473+
const LocalDeclID *FileSortedDecls = nullptr;
462474
unsigned NumFileSortedDecls = 0;
463475

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

clang/include/clang/Serialization/ModuleManager.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ namespace serialization {
4545
/// Manages the set of modules loaded by an AST reader.
4646
class ModuleManager {
4747
/// The chain of AST files, in the order in which we started to load
48-
/// them.
48+
/// them (this order isn't really useful for anything).
4949
SmallVector<std::unique_ptr<ModuleFile>, 2> Chain;
5050

5151
/// The chain of non-module PCH files. The first entry is the one named

clang/lib/AST/DeclBase.cpp

+7-33
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,18 @@ void *Decl::operator new(std::size_t Size, const ASTContext &Context,
7474
GlobalDeclID ID, std::size_t Extra) {
7575
// Allocate an extra 8 bytes worth of storage, which ensures that the
7676
// resulting pointer will still be 8-byte aligned.
77-
static_assert(sizeof(uint64_t) >= alignof(Decl), "Decl won't be misaligned");
77+
static_assert(sizeof(unsigned) * 2 >= alignof(Decl),
78+
"Decl won't be misaligned");
7879
void *Start = Context.Allocate(Size + Extra + 8);
7980
void *Result = (char*)Start + 8;
8081

81-
uint64_t *PrefixPtr = (uint64_t *)Result - 1;
82+
unsigned *PrefixPtr = (unsigned *)Result - 2;
8283

83-
*PrefixPtr = ID.get();
84+
// Zero out the first 4 bytes; this is used to store the owning module ID.
85+
PrefixPtr[0] = 0;
8486

85-
// We leave the upper 16 bits to store the module IDs. 48 bits should be
86-
// sufficient to store a declaration ID.
87-
assert(*PrefixPtr < llvm::maskTrailingOnes<uint64_t>(48));
87+
// Store the global declaration ID in the second 4 bytes.
88+
PrefixPtr[1] = ID.get();
8889

8990
return Result;
9091
}
@@ -110,29 +111,6 @@ void *Decl::operator new(std::size_t Size, const ASTContext &Ctx,
110111
return ::operator new(Size + Extra, Ctx);
111112
}
112113

113-
GlobalDeclID Decl::getGlobalID() const {
114-
if (!isFromASTFile())
115-
return GlobalDeclID();
116-
// See the comments in `Decl::operator new` for details.
117-
uint64_t ID = *((const uint64_t *)this - 1);
118-
return GlobalDeclID(ID & llvm::maskTrailingOnes<uint64_t>(48));
119-
}
120-
121-
unsigned Decl::getOwningModuleID() const {
122-
if (!isFromASTFile())
123-
return 0;
124-
125-
uint64_t ID = *((const uint64_t *)this - 1);
126-
return ID >> 48;
127-
}
128-
129-
void Decl::setOwningModuleID(unsigned ID) {
130-
assert(isFromASTFile() && "Only works on a deserialized declaration");
131-
uint64_t *IDAddress = (uint64_t *)this - 1;
132-
assert(!((*IDAddress) >> 48) && "We should only set the module ID once");
133-
*IDAddress |= (uint64_t)ID << 48;
134-
}
135-
136114
Module *Decl::getOwningModuleSlow() const {
137115
assert(isFromASTFile() && "Not from AST file?");
138116
return getASTContext().getExternalSource()->getModule(getOwningModuleID());
@@ -2186,7 +2164,3 @@ DependentDiagnostic *DependentDiagnostic::Create(ASTContext &C,
21862164

21872165
return DD;
21882166
}
2189-
2190-
unsigned DeclIDBase::getLocalDeclIndex() const {
2191-
return ID & llvm::maskTrailingOnes<DeclID>(32);
2192-
}

0 commit comments

Comments
 (0)