Skip to content

Commit 27246c7

Browse files
committed
[lldb][ExpressionParser][NFC] Implement CompleteRedeclChain APIs
(cherry picked from commit 5a2f2f397796affd598011772ec1880ff8841093)
1 parent bc1a466 commit 27246c7

File tree

5 files changed

+76
-0
lines changed

5 files changed

+76
-0
lines changed

lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "lldb/Utility/Log.h"
2323
#include "clang/AST/ASTContext.h"
2424
#include "clang/AST/RecordLayout.h"
25+
#include "clang/AST/Type.h"
2526
#include "clang/Basic/SourceManager.h"
2627

2728
#include "Plugins/ExpressionParser/Clang/ClangUtil.h"
@@ -327,6 +328,45 @@ void ClangASTSource::CompleteType(clang::ObjCInterfaceDecl *interface_decl) {
327328
LLDB_LOG(log, " [COID] {0}", ClangUtil::DumpDecl(interface_decl));
328329
}
329330

331+
void ClangASTSource::CompleteRedeclChain(const Decl *d) {
332+
if (!TypeSystemClang::UseRedeclCompletion())
333+
return;
334+
335+
if (const clang::TagDecl *td = llvm::dyn_cast<TagDecl>(d)) {
336+
if (td->isBeingDefined())
337+
return;
338+
339+
if (td->getDefinition())
340+
return;
341+
342+
m_ast_importer_sp->CompleteTagDecl(const_cast<clang::TagDecl *>(td));
343+
if (!td->getDefinition() && m_ast_importer_sp->GetDeclOrigin(td).Valid()) {
344+
if (TagDecl *alternate = FindCompleteType(td))
345+
m_ast_importer_sp->CompleteTagDeclWithOrigin(
346+
const_cast<clang::TagDecl *>(td), alternate);
347+
}
348+
}
349+
if (const auto *od = llvm::dyn_cast<ObjCInterfaceDecl>(d)) {
350+
ClangASTImporter::DeclOrigin original =
351+
m_ast_importer_sp->GetDeclOrigin(od);
352+
if (ObjCInterfaceDecl *orig =
353+
dyn_cast_or_null<ObjCInterfaceDecl>(original.decl)) {
354+
if (ObjCInterfaceDecl *i = GetCompleteObjCInterface(orig)) {
355+
if (i != orig) {
356+
m_ast_importer_sp->SetDeclOrigin(d, i);
357+
m_ast_importer_sp->CompleteObjCInterfaceDecl(
358+
const_cast<clang::ObjCInterfaceDecl *>(od));
359+
return;
360+
}
361+
}
362+
}
363+
if (od->getDefinition())
364+
return;
365+
m_ast_importer_sp->CompleteObjCInterfaceDecl(
366+
const_cast<clang::ObjCInterfaceDecl *>(od));
367+
}
368+
}
369+
330370
clang::ObjCInterfaceDecl *ClangASTSource::GetCompleteObjCInterface(
331371
const clang::ObjCInterfaceDecl *interface_decl) {
332372
lldb::ProcessSP process(m_target->GetProcessSP());

lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ class ClangASTSource : public ImporterBackedASTSource,
154154
/// The Decl to be completed in place.
155155
void CompleteType(clang::ObjCInterfaceDecl *Class) override;
156156

157+
void CompleteRedeclChain(clang::Decl const *D) override;
158+
157159
/// Called on entering a translation unit. Tells Clang by calling
158160
/// setHasExternalVisibleStorage() and setHasExternalLexicalStorage() that
159161
/// this object has something to say about undefined names.
@@ -232,6 +234,10 @@ class ClangASTSource : public ImporterBackedASTSource,
232234
return m_original.CompleteType(Class);
233235
}
234236

237+
void CompleteRedeclChain(clang::Decl const *D) override {
238+
return m_original.CompleteRedeclChain(D);
239+
}
240+
235241
bool layoutRecordType(
236242
const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
237243
llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,

lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,25 @@ void ClangExternalASTSourceCallbacks::CompleteType(
2626
m_ast.CompleteObjCInterfaceDecl(objc_decl);
2727
}
2828

29+
void ClangExternalASTSourceCallbacks::CompleteRedeclChain(
30+
const clang::Decl *d) {
31+
if (!TypeSystemClang::UseRedeclCompletion())
32+
return;
33+
34+
if (const clang::TagDecl *td = llvm::dyn_cast<clang::TagDecl>(d)) {
35+
if (td->isBeingDefined())
36+
return;
37+
if (td->getDefinition())
38+
return;
39+
m_ast.CompleteTagDecl(const_cast<clang::TagDecl *>(td));
40+
}
41+
if (const auto *od = llvm::dyn_cast<clang::ObjCInterfaceDecl>(d)) {
42+
if (od->getDefinition())
43+
return;
44+
m_ast.CompleteObjCInterfaceDecl(const_cast<clang::ObjCInterfaceDecl *>(od));
45+
}
46+
}
47+
2948
bool ClangExternalASTSourceCallbacks::layoutRecordType(
3049
const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
3150
llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,

lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class ClangExternalASTSourceCallbacks : public ImporterBackedASTSource {
4141

4242
void CompleteType(clang::ObjCInterfaceDecl *objc_decl) override;
4343

44+
void CompleteRedeclChain(clang::Decl const *D) override;
45+
4446
bool layoutRecordType(
4547
const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
4648
llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,

lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,15 @@ class lldb_private::AppleObjCExternalASTSource
109109
}
110110
}
111111

112+
void CompleteRedeclChain(const clang::Decl *d) override {
113+
using namespace clang;
114+
auto *const_interface = llvm::dyn_cast<ObjCInterfaceDecl>(d);
115+
if (!const_interface)
116+
return;
117+
auto *interface = const_cast<ObjCInterfaceDecl *>(const_interface);
118+
m_decl_vendor.FinishDecl(interface);
119+
}
120+
112121
bool layoutRecordType(
113122
const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
114123
llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,

0 commit comments

Comments
 (0)