@@ -116,12 +116,8 @@ class DeclIDBase {
116116 DeclIDBase () : ID(PREDEF_DECL_NULL_ID) {}
117117 explicit DeclIDBase (DeclID ID) : ID(ID) {}
118118
119- explicit DeclIDBase (unsigned LocalID, unsigned ModuleFileIndex) {
120- ID = (DeclID)LocalID | ((DeclID)ModuleFileIndex << 32 );
121- }
122-
123119public:
124- DeclID get () const { return ID; }
120+ DeclID getRawValue () const { return ID; }
125121
126122 explicit operator DeclID () const { return ID; }
127123
@@ -135,12 +131,33 @@ class DeclIDBase {
135131
136132 unsigned getLocalDeclIndex () const ;
137133
134+ // The DeclID may be compared with predefined decl ID.
135+ friend bool operator ==(const DeclIDBase &LHS, const DeclID &RHS) {
136+ return LHS.ID == RHS;
137+ }
138+ friend bool operator !=(const DeclIDBase &LHS, const DeclID &RHS) {
139+ return !operator ==(LHS, RHS);
140+ }
141+ friend bool operator <(const DeclIDBase &LHS, const DeclID &RHS) {
142+ return LHS.ID < RHS;
143+ }
144+ friend bool operator <=(const DeclIDBase &LHS, const DeclID &RHS) {
145+ return LHS.ID <= RHS;
146+ }
147+ friend bool operator >(const DeclIDBase &LHS, const DeclID &RHS) {
148+ return LHS.ID > RHS;
149+ }
150+ friend bool operator >=(const DeclIDBase &LHS, const DeclID &RHS) {
151+ return LHS.ID >= RHS;
152+ }
153+
138154 friend bool operator ==(const DeclIDBase &LHS, const DeclIDBase &RHS) {
139155 return LHS.ID == RHS.ID ;
140156 }
141157 friend bool operator !=(const DeclIDBase &LHS, const DeclIDBase &RHS) {
142158 return LHS.ID != RHS.ID ;
143159 }
160+
144161 // We may sort the decl ID.
145162 friend bool operator <(const DeclIDBase &LHS, const DeclIDBase &RHS) {
146163 return LHS.ID < RHS.ID ;
@@ -159,16 +176,27 @@ class DeclIDBase {
159176 DeclID ID;
160177};
161178
179+ class ASTWriter ;
180+ class ASTReader ;
181+ namespace serialization {
182+ class ModuleFile ;
183+ } // namespace serialization
184+
162185class LocalDeclID : public DeclIDBase {
163186 using Base = DeclIDBase;
164187
165- public:
166- LocalDeclID () : Base() {}
167188 LocalDeclID (PredefinedDeclIDs ID) : Base(ID) {}
168189 explicit LocalDeclID (DeclID ID) : Base(ID) {}
169190
170- explicit LocalDeclID (unsigned LocalID, unsigned ModuleFileIndex)
171- : Base(LocalID, ModuleFileIndex) {}
191+ // Every Decl ID is a local decl ID to the module being writing in ASTWriter.
192+ friend class ASTWriter ;
193+ friend class GlobalDeclID ;
194+
195+ public:
196+ LocalDeclID () : Base() {}
197+
198+ static LocalDeclID get (ASTReader &Reader, serialization::ModuleFile &MF,
199+ DeclID ID);
172200
173201 LocalDeclID &operator ++() {
174202 ++ID;
@@ -189,8 +217,8 @@ class GlobalDeclID : public DeclIDBase {
189217 GlobalDeclID () : Base() {}
190218 explicit GlobalDeclID (DeclID ID) : Base(ID) {}
191219
192- explicit GlobalDeclID (unsigned LocalID , unsigned ModuleFileIndex )
193- : Base(LocalID, ModuleFileIndex) {}
220+ explicit GlobalDeclID (unsigned ModuleFileIndex , unsigned LocalID )
221+ : Base((DeclID) ModuleFileIndex << 32 | (DeclID)LocalID ) {}
194222
195223 // For DeclIDIterator<GlobalDeclID> to be able to convert a GlobalDeclID
196224 // to a LocalDeclID.
@@ -235,7 +263,7 @@ template <> struct DenseMapInfo<clang::GlobalDeclID> {
235263 // In GlobalDeclID's case, it is pretty common that the lower 32 bits can
236264 // be same.
237265 // FIXME: Remove this when we fix the underlying issue.
238- return llvm::hash_value (Key.get ());
266+ return llvm::hash_value (Key.getRawValue ());
239267 }
240268
241269 static bool isEqual (const GlobalDeclID &L, const GlobalDeclID &R) {
0 commit comments