Skip to content

Commit 8ee4108

Browse files
committed
[lldb][DWARFASTParserClang] Complete and make use of LLVM's RTTI support (llvm#170249)
We almost had RTTI support for `DWARFASTParserClang`, but because `classof` was protected, using `llvm::cast`/etc. on it would fail to compile with: ``` llvm/include/llvm/Support/Casting.h:64:57: error: 'classof' is a protected member of 'DWARFASTParserClang' 64 | static inline bool doit(const From &Val) { return To::classof(&Val); } | ^ llvm/include/llvm/Support/Casting.h:110:32: note: in instantiation of member function 'llvm::isa_impl<DWARFASTParserClang, lldb_private::plugin::dwarf::DWARFASTParser>::doit' requested here 110 | return isa_impl<To, From>::doit(*Val); ``` This patch makes `classof` public and turns `static_cast`s of `DWARFASTParserClang` into `llvm::cast`s. (cherry picked from commit ac19d38)
1 parent 03bec58 commit 8ee4108

File tree

5 files changed

+17
-19
lines changed

5 files changed

+17
-19
lines changed

lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3848,12 +3848,10 @@ bool DWARFASTParserClang::CopyUniqueClassMethodTypes(
38483848
}
38493849
}
38503850

3851-
DWARFASTParserClang *src_dwarf_ast_parser =
3852-
static_cast<DWARFASTParserClang *>(
3853-
SymbolFileDWARF::GetDWARFParser(*src_class_die.GetCU()));
3854-
DWARFASTParserClang *dst_dwarf_ast_parser =
3855-
static_cast<DWARFASTParserClang *>(
3856-
SymbolFileDWARF::GetDWARFParser(*dst_class_die.GetCU()));
3851+
auto *src_dwarf_ast_parser = llvm::cast<DWARFASTParserClang>(
3852+
SymbolFileDWARF::GetDWARFParser(*src_class_die.GetCU()));
3853+
auto *dst_dwarf_ast_parser = llvm::cast<DWARFASTParserClang>(
3854+
SymbolFileDWARF::GetDWARFParser(*dst_class_die.GetCU()));
38573855
auto link = [&](DWARFDIE src, DWARFDIE dst) {
38583856
auto &die_to_type = dst_class_die.GetDWARF()->GetDIEToType();
38593857
clang::DeclContext *dst_decl_ctx =

lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ class DWARFASTParserClang : public lldb_private::plugin::dwarf::DWARFASTParser {
4747

4848
~DWARFASTParserClang() override;
4949

50+
// LLVM RTTI support
51+
static bool classof(const DWARFASTParser *Parser) {
52+
return Parser->GetKind() == Kind::DWARFASTParserClang;
53+
}
54+
5055
// DWARFASTParser interface.
5156
lldb::TypeSP
5257
ParseTypeFromDWARF(const lldb_private::SymbolContext &sc,
@@ -276,10 +281,6 @@ class DWARFASTParserClang : public lldb_private::plugin::dwarf::DWARFASTParser {
276281
lldb::ModuleSP
277282
GetModuleForType(const lldb_private::plugin::dwarf::DWARFDIE &die);
278283

279-
static bool classof(const DWARFASTParser *Parser) {
280-
return Parser->GetKind() == Kind::DWARFASTParserClang;
281-
}
282-
283284
private:
284285
struct FieldInfo {
285286
/// Size in bits that this field occupies. Can but

lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,17 +1573,17 @@ bool SymbolFileDWARF::HasForwardDeclForCompilerType(
15731573
auto clang_type_system = compiler_type.GetTypeSystem<TypeSystemClang>();
15741574
if (!clang_type_system)
15751575
return false;
1576-
DWARFASTParserClang *ast_parser =
1577-
static_cast<DWARFASTParserClang *>(clang_type_system->GetDWARFParser());
1576+
auto *ast_parser =
1577+
llvm::cast<DWARFASTParserClang>(clang_type_system->GetDWARFParser());
15781578
return ast_parser->GetClangASTImporter().CanImport(compiler_type);
15791579
}
15801580

15811581
bool SymbolFileDWARF::CompleteType(CompilerType &compiler_type) {
15821582
std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
15831583
auto clang_type_system = compiler_type.GetTypeSystem<TypeSystemClang>();
15841584
if (clang_type_system) {
1585-
DWARFASTParserClang *ast_parser =
1586-
static_cast<DWARFASTParserClang *>(clang_type_system->GetDWARFParser());
1585+
auto *ast_parser =
1586+
llvm::cast<DWARFASTParserClang>(clang_type_system->GetDWARFParser());
15871587
if (ast_parser &&
15881588
ast_parser->GetClangASTImporter().CanImport(compiler_type))
15891589
return ast_parser->GetClangASTImporter().CompleteType(compiler_type);
@@ -1627,8 +1627,7 @@ bool SymbolFileDWARF::CompleteType(CompilerType &compiler_type) {
16271627

16281628
if (decl_die != def_die) {
16291629
GetDIEToType()[def_die.GetDIE()] = type;
1630-
DWARFASTParserClang *ast_parser =
1631-
static_cast<DWARFASTParserClang *>(dwarf_ast);
1630+
auto *ast_parser = llvm::cast<DWARFASTParserClang>(dwarf_ast);
16321631
ast_parser->MapDeclDIEToDefDIE(decl_die, def_die);
16331632
}
16341633

lldb/unittests/Symbol/TestClangASTImporter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ TEST_F(TestClangASTImporter, RecordLayoutFromOrigin) {
287287
clang_utils::SourceASTWithRecord source;
288288

289289
auto *dwarf_parser =
290-
static_cast<DWARFASTParserClang *>(source.ast->GetDWARFParser());
290+
llvm::cast<DWARFASTParserClang>(source.ast->GetDWARFParser());
291291
auto &importer = dwarf_parser->GetClangASTImporter();
292292

293293
// Set the layout for the origin decl in the origin ClangASTImporter.

lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,7 +1223,7 @@ TEST_F(DWARFASTParserClangTests, TestParseSubroutine_ExplicitObjectParameter) {
12231223
ASSERT_TRUE(static_cast<bool>(ts_or_err));
12241224
llvm::consumeError(ts_or_err.takeError());
12251225
auto *parser =
1226-
static_cast<DWARFASTParserClang *>((*ts_or_err)->GetDWARFParser());
1226+
llvm::cast<DWARFASTParserClang>((*ts_or_err)->GetDWARFParser());
12271227

12281228
auto context_die = cu_die.GetFirstChild();
12291229
ASSERT_TRUE(context_die.IsValid());
@@ -1400,7 +1400,7 @@ TEST_F(DWARFASTParserClangTests, TestParseSubroutine_ParameterCreation) {
14001400
llvm::consumeError(ts_or_err.takeError());
14011401

14021402
auto *ts = static_cast<TypeSystemClang *>(ts_or_err->get());
1403-
auto *parser = static_cast<DWARFASTParserClang *>(ts->GetDWARFParser());
1403+
auto *parser = llvm::cast<DWARFASTParserClang>(ts->GetDWARFParser());
14041404

14051405
auto subprogram = cu_die.GetFirstChild();
14061406
ASSERT_TRUE(subprogram.IsValid());

0 commit comments

Comments
 (0)