Skip to content

Commit ac19d38

Browse files
authored
[lldb][DWARFASTParserClang] Complete and make use of LLVM's RTTI support (#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.
1 parent dea86c6 commit ac19d38

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
@@ -3707,12 +3707,10 @@ bool DWARFASTParserClang::CopyUniqueClassMethodTypes(
37073707
}
37083708
}
37093709

3710-
DWARFASTParserClang *src_dwarf_ast_parser =
3711-
static_cast<DWARFASTParserClang *>(
3712-
SymbolFileDWARF::GetDWARFParser(*src_class_die.GetCU()));
3713-
DWARFASTParserClang *dst_dwarf_ast_parser =
3714-
static_cast<DWARFASTParserClang *>(
3715-
SymbolFileDWARF::GetDWARFParser(*dst_class_die.GetCU()));
3710+
auto *src_dwarf_ast_parser = llvm::cast<DWARFASTParserClang>(
3711+
SymbolFileDWARF::GetDWARFParser(*src_class_die.GetCU()));
3712+
auto *dst_dwarf_ast_parser = llvm::cast<DWARFASTParserClang>(
3713+
SymbolFileDWARF::GetDWARFParser(*dst_class_die.GetCU()));
37163714
auto link = [&](DWARFDIE src, DWARFDIE dst) {
37173715
auto &die_to_type = dst_class_die.GetDWARF()->GetDIEToType();
37183716
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,
@@ -264,10 +269,6 @@ class DWARFASTParserClang : public lldb_private::plugin::dwarf::DWARFASTParser {
264269
lldb::ModuleSP
265270
GetModuleForType(const lldb_private::plugin::dwarf::DWARFDIE &die);
266271

267-
static bool classof(const DWARFASTParser *Parser) {
268-
return Parser->GetKind() == Kind::DWARFASTParserClang;
269-
}
270-
271272
private:
272273
struct FieldInfo {
273274
/// 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
@@ -1560,17 +1560,17 @@ bool SymbolFileDWARF::HasForwardDeclForCompilerType(
15601560
auto clang_type_system = compiler_type.GetTypeSystem<TypeSystemClang>();
15611561
if (!clang_type_system)
15621562
return false;
1563-
DWARFASTParserClang *ast_parser =
1564-
static_cast<DWARFASTParserClang *>(clang_type_system->GetDWARFParser());
1563+
auto *ast_parser =
1564+
llvm::cast<DWARFASTParserClang>(clang_type_system->GetDWARFParser());
15651565
return ast_parser->GetClangASTImporter().CanImport(compiler_type);
15661566
}
15671567

15681568
bool SymbolFileDWARF::CompleteType(CompilerType &compiler_type) {
15691569
std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
15701570
auto clang_type_system = compiler_type.GetTypeSystem<TypeSystemClang>();
15711571
if (clang_type_system) {
1572-
DWARFASTParserClang *ast_parser =
1573-
static_cast<DWARFASTParserClang *>(clang_type_system->GetDWARFParser());
1572+
auto *ast_parser =
1573+
llvm::cast<DWARFASTParserClang>(clang_type_system->GetDWARFParser());
15741574
if (ast_parser &&
15751575
ast_parser->GetClangASTImporter().CanImport(compiler_type))
15761576
return ast_parser->GetClangASTImporter().CompleteType(compiler_type);
@@ -1614,8 +1614,7 @@ bool SymbolFileDWARF::CompleteType(CompilerType &compiler_type) {
16141614

16151615
if (decl_die != def_die) {
16161616
GetDIEToType()[def_die.GetDIE()] = type;
1617-
DWARFASTParserClang *ast_parser =
1618-
static_cast<DWARFASTParserClang *>(dwarf_ast);
1617+
auto *ast_parser = llvm::cast<DWARFASTParserClang>(dwarf_ast);
16191618
ast_parser->MapDeclDIEToDefDIE(decl_die, def_die);
16201619
}
16211620

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
@@ -1257,7 +1257,7 @@ TEST_F(DWARFASTParserClangTests, TestParseSubroutine_ExplicitObjectParameter) {
12571257
ASSERT_TRUE(static_cast<bool>(ts_or_err));
12581258
llvm::consumeError(ts_or_err.takeError());
12591259
auto *parser =
1260-
static_cast<DWARFASTParserClang *>((*ts_or_err)->GetDWARFParser());
1260+
llvm::cast<DWARFASTParserClang>((*ts_or_err)->GetDWARFParser());
12611261

12621262
auto context_die = cu_die.GetFirstChild();
12631263
ASSERT_TRUE(context_die.IsValid());
@@ -1434,7 +1434,7 @@ TEST_F(DWARFASTParserClangTests, TestParseSubroutine_ParameterCreation) {
14341434
llvm::consumeError(ts_or_err.takeError());
14351435

14361436
auto *ts = static_cast<TypeSystemClang *>(ts_or_err->get());
1437-
auto *parser = static_cast<DWARFASTParserClang *>(ts->GetDWARFParser());
1437+
auto *parser = llvm::cast<DWARFASTParserClang>(ts->GetDWARFParser());
14381438

14391439
auto subprogram = cu_die.GetFirstChild();
14401440
ASSERT_TRUE(subprogram.IsValid());

0 commit comments

Comments
 (0)