From: Raphael Isemann Date: Mon, 23 Dec 2019 08:05:07 +0000 (+0100) Subject: [lldb][NFC] Make CompilerDeclContext construction type safe X-Git-Tag: llvmorg-11-init~1518 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=42ec584a8b4e604360b7a4d45a65c570d58b1bf9;p=platform%2Fupstream%2Fllvm.git [lldb][NFC] Make CompilerDeclContext construction type safe The CompilerDeclContext constructor takes a void* pointer which means that all callers of this constructor need to first explicitly convert all pointers to clang::DeclContext*. This causes that we for example can't just pass a TranslationUnitDecl* to the constructor without first casting it to its parent class (as it inherits from both Decl and DeclContext so the void* pointer is actually a Decl*). This patch introduces a utility function in the ClangASTContext which gets rid of the requirement to cast all pointers to clang::DeclContext. Also moves all constructor calls to use this function instead which is NFC (beside the change in DWARFASTParserClangTests.cpp). --- diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h index b0b7730..29d8521 100644 --- a/lldb/include/lldb/Symbol/ClangASTContext.h +++ b/lldb/include/lldb/Symbol/ClangASTContext.h @@ -440,6 +440,12 @@ public: // CompilerDeclContext override functions + /// Creates a CompilerDeclContext from the given DeclContext + /// with the current ClangASTContext instance as its typesystem. + /// The DeclContext has to come from the ASTContext of this + /// ClangASTContext. + CompilerDeclContext CreateDeclContext(clang::DeclContext *ctx); + std::vector DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name, const bool ignore_using_decls) override; diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp index e9ba1bf..f8ec273 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp @@ -682,9 +682,7 @@ void ClangExpressionDeclMap::FindExternalVisibleDecls( dyn_cast(context.m_decl_context)) { if (namespace_context->getName().str() == std::string(g_lldb_local_vars_namespace_cstr)) { - CompilerDeclContext compiler_decl_ctx( - GetClangASTContext(), const_cast(static_cast( - context.m_decl_context))); + CompilerDeclContext compiler_decl_ctx = GetClangASTContext()->CreateDeclContext(const_cast(context.m_decl_context)); FindExternalVisibleDecls(context, lldb::ModuleSP(), compiler_decl_ctx, current_id); return; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index 5a6ce7f..d8c2e7d 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -2218,7 +2218,7 @@ CompilerDeclContext DWARFASTParserClang::GetDeclContextForUIDFromDWARF(const DWARFDIE &die) { clang::DeclContext *clang_decl_ctx = GetClangDeclContextForDIE(die); if (clang_decl_ctx) - return CompilerDeclContext(&m_ast, clang_decl_ctx); + return m_ast.CreateDeclContext(clang_decl_ctx); return CompilerDeclContext(); } @@ -2227,7 +2227,7 @@ DWARFASTParserClang::GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) { clang::DeclContext *clang_decl_ctx = GetClangDeclContextContainingDIE(die, nullptr); if (clang_decl_ctx) - return CompilerDeclContext(&m_ast, clang_decl_ctx); + return m_ast.CreateDeclContext(clang_decl_ctx); return CompilerDeclContext(); } diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp index 2b70f46..7a1a648 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp @@ -1343,7 +1343,7 @@ CompilerType PdbAstBuilder::ToCompilerType(clang::QualType qt) { CompilerDeclContext PdbAstBuilder::ToCompilerDeclContext(clang::DeclContext &context) { - return {&m_clang, &context}; + return m_clang.CreateDeclContext(&context); } clang::Decl * PdbAstBuilder::FromCompilerDecl(CompilerDecl decl) { diff --git a/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp b/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp index bbbd341..f647abf 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp @@ -556,7 +556,7 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) { CompilerType target_ast_type = target_type->GetFullCompilerType(); ast_typedef = m_ast.CreateTypedefType( - target_ast_type, name.c_str(), CompilerDeclContext(&m_ast, decl_ctx)); + target_ast_type, name.c_str(), m_ast.CreateDeclContext(decl_ctx)); if (!ast_typedef) return nullptr; diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp index b3e06fd..917ab68 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -666,7 +666,7 @@ SymbolFilePDB::GetDeclContextForUID(lldb::user_id_t uid) { if (!decl_context) return GetDeclContextContainingUID(uid); - return CompilerDeclContext(clang_ast_ctx, decl_context); + return clang_ast_ctx->CreateDeclContext(decl_context); } lldb_private::CompilerDeclContext @@ -695,7 +695,7 @@ SymbolFilePDB::GetDeclContextContainingUID(lldb::user_id_t uid) { auto decl_context = pdb->GetDeclContextContainingSymbol(*symbol); assert(decl_context); - return CompilerDeclContext(clang_ast_ctx, decl_context); + return clang_ast_ctx->CreateDeclContext(decl_context); } void SymbolFilePDB::ParseDeclsForContext( @@ -1703,8 +1703,7 @@ lldb_private::CompilerDeclContext SymbolFilePDB::FindNamespace( if (!namespace_decl) return CompilerDeclContext(); - return CompilerDeclContext(clang_type_system, - static_cast(namespace_decl)); + return clang_type_system->CreateDeclContext(namespace_decl); } lldb_private::ConstString SymbolFilePDB::GetPluginName() { diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index 0b723ce..58ff82d 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -1205,9 +1205,13 @@ CompilerType ClangASTContext::GetTypeForDecl(void *opaque_decl) { return CompilerType(); } +CompilerDeclContext ClangASTContext::CreateDeclContext(DeclContext *ctx) { + return CompilerDeclContext(this, ctx); +} + CompilerType ClangASTContext::GetTypeForDecl(clang::NamedDecl *decl) { if (clang::ObjCInterfaceDecl *interface_decl = - llvm::dyn_cast(decl)) + llvm::dyn_cast(decl)) return GetTypeForDecl(interface_decl); if (clang::TagDecl *tag_decl = llvm::dyn_cast(decl)) return GetTypeForDecl(tag_decl); @@ -9039,10 +9043,8 @@ ConstString ClangASTContext::DeclGetMangledName(void *opaque_decl) { CompilerDeclContext ClangASTContext::DeclGetDeclContext(void *opaque_decl) { if (opaque_decl) - return CompilerDeclContext(this, - ((clang::Decl *)opaque_decl)->getDeclContext()); - else - return CompilerDeclContext(); + return CreateDeclContext(((clang::Decl *)opaque_decl)->getDeclContext()); + return CompilerDeclContext(); } CompilerType ClangASTContext::DeclGetFunctionReturnType(void *opaque_decl) { @@ -9108,7 +9110,7 @@ std::vector ClangASTContext::DeclContextFindDeclByName( if (!searched.insert(it->second).second) continue; symbol_file->ParseDeclsForContext( - CompilerDeclContext(this, it->second)); + CreateDeclContext(it->second)); for (clang::Decl *child : it->second->decls()) { if (clang::UsingDirectiveDecl *ud = @@ -9223,7 +9225,7 @@ uint32_t ClangASTContext::CountDeclLevels(clang::DeclContext *frame_decl_ctx, searched.insert(it->second); symbol_file->ParseDeclsForContext( - CompilerDeclContext(this, it->second)); + CreateDeclContext(it->second)); for (clang::Decl *child : it->second->decls()) { if (clang::UsingDirectiveDecl *ud = diff --git a/lldb/unittests/Symbol/TestClangASTContext.cpp b/lldb/unittests/Symbol/TestClangASTContext.cpp index 9cdcf32..5254b99 100644 --- a/lldb/unittests/Symbol/TestClangASTContext.cpp +++ b/lldb/unittests/Symbol/TestClangASTContext.cpp @@ -414,8 +414,7 @@ TEST_F(TestClangASTContext, TemplateArguments) { // typedef foo foo_def; CompilerType typedef_type = m_ast->CreateTypedefType( - type, "foo_def", - CompilerDeclContext(m_ast.get(), m_ast->GetTranslationUnitDecl())); + type, "foo_def", m_ast->CreateDeclContext(m_ast->GetTranslationUnitDecl())); CompilerType auto_type( m_ast.get(), diff --git a/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp b/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp index c68e351..aaa0af5 100644 --- a/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp +++ b/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp @@ -61,7 +61,7 @@ TEST_F(DWARFASTParserClangTests, for (int i = 0; i < 4; ++i) ast_parser.LinkDeclContextToDIE(decl_ctxs[i], dies[i]); ast_parser.EnsureAllDIEsInDeclContextHaveBeenParsed( - CompilerDeclContext(nullptr, decl_ctxs[1])); + ast_ctx.CreateDeclContext(decl_ctxs[1])); EXPECT_THAT(ast_parser.GetDeclContextToDIEMapKeys(), testing::UnorderedElementsAre(decl_ctxs[0], decl_ctxs[3]));