Michael137 updated this revision to Diff 496128. Michael137 added a comment.
- add `CHECK-NEXT` to test - reword commit Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D143652/new/ https://reviews.llvm.org/D143652 Files: lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp lldb/test/API/lang/cpp/external_ctor_dtor_lookup/Makefile lldb/test/API/lang/cpp/external_ctor_dtor_lookup/TestExternalCtorDtorLookup.py lldb/test/API/lang/cpp/external_ctor_dtor_lookup/lib.h lldb/test/API/lang/cpp/external_ctor_dtor_lookup/main.cpp
Index: lldb/test/API/lang/cpp/external_ctor_dtor_lookup/main.cpp =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/external_ctor_dtor_lookup/main.cpp @@ -0,0 +1,17 @@ +#include "lib.h" + +struct Foo {}; + +using FooWrapped = Wrapper<Foo>; + +struct S { + FooWrapped getTarget() { return Wrapper<Foo>(); } + int foo(FooWrapped) const { return -1; } + void bar() { foo(getTarget()); } +}; + +int main() { + S s; + s.foo(s.getTarget()); + return 0; +} Index: lldb/test/API/lang/cpp/external_ctor_dtor_lookup/lib.h =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/external_ctor_dtor_lookup/lib.h @@ -0,0 +1,11 @@ +#ifndef SPTR_H_IN +#define SPTR_H_IN + +template <typename T> class Wrapper { +public: + [[gnu::abi_tag("test")]] Wrapper(){}; + + [[gnu::abi_tag("test")]] ~Wrapper(){}; +}; + +#endif // _H_IN Index: lldb/test/API/lang/cpp/external_ctor_dtor_lookup/TestExternalCtorDtorLookup.py =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/external_ctor_dtor_lookup/TestExternalCtorDtorLookup.py @@ -0,0 +1,30 @@ +""" +Test that we can constructors/destructors +without a linkage name because they are +marked DW_AT_external and the fallback +mangled-name-guesser in LLDB doesn't account +for ABI tags. +""" + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class ExternalCtorDtorLookupTestCase(TestBase): + + def test(self): + self.build() + lldbutil.run_to_source_breakpoint(self, 'getTarget\(\)\)', + lldb.SBFileSpec('main.cpp', False)) + + self.expect_expr('s.foo(s.getTarget())', result_type='int', result_value='-1') + self.filecheck("target module dump ast", __file__) +# CHECK: ClassTemplateSpecializationDecl {{.*}} class Wrapper definition +# CHECK: |-TemplateArgument type 'Foo' +# CHECK: | `-RecordType {{.*}} 'Foo' +# CHECK: | `-CXXRecord {{.*}} 'Foo' +# CHECK: |-CXXConstructorDecl {{.*}} Wrapper 'void ()' +# CHECK-NEXT: | `-AsmLabelAttr {{.*}} Implicit "_ZN7WrapperI3FooEC1B4testEv" +# CHECK-NEXT: `-CXXDestructorDecl {{.*}} ~Wrapper 'void ()' +# CHECK-NEXT: `-AsmLabelAttr {{.*}} Implicit "_ZN7WrapperI3FooED1B4testEv" Index: lldb/test/API/lang/cpp/external_ctor_dtor_lookup/Makefile =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/external_ctor_dtor_lookup/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -888,6 +888,46 @@ return clang::CC_C; } +/// Given a DIE with an external definition (and thus no linkage name) +/// find the definitions by lookup into the DWARF name index. +/// We check the DW_AT_specification for each DIE in the index with +/// the same name as the specified 'die' until we find one that references +/// 'die'. Then return that linkage name. If no such DIE is found in the index, +/// returns nullptr. +static char const *FindLinkageName(DWARFDIE die) { + auto *dwarf = die.GetDWARF(); + if (!dwarf) + return nullptr; + + ConstString func_name(die.GetName()); + if (!func_name) + return nullptr; + + SymbolContextList sc_list; + Module::LookupInfo lookup_info(func_name, + FunctionNameType::eFunctionNameTypeMethod | + FunctionNameType::eFunctionNameTypeFull, + LanguageType::eLanguageTypeUnknown); + dwarf->FindFunctions(lookup_info, {}, true, sc_list); + + for (auto const &sc : sc_list.SymbolContexts()) { + auto *func = sc.function; + if (func) { + auto func_die = dwarf->GetDIE(func->GetID()); + if (!func_die.IsValid()) + continue; + + auto spec_die = + func_die.GetAttributeValueAsReferenceDIE(DW_AT_specification); + if (spec_die.IsValid() && spec_die == die) { + return func->GetMangled().GetMangledName().AsCString(); + } + } + } + + return nullptr; +} + TypeSP DWARFASTParserClang::ParseSubroutine(const DWARFDIE &die, ParsedDWARFTypeAttributes &attrs) { Log *log = GetLog(DWARFLog::TypeCompletion | DWARFLog::Lookups); @@ -1116,6 +1156,12 @@ if (attrs.accessibility == eAccessNone) attrs.accessibility = eAccessPublic; + // Make sure we find the linkage name here so it gets + // attached to the member function inside + // AddMethodToCXXRecordType below. + if (!attrs.mangled_name && attrs.storage == clang::SC_Extern) + attrs.mangled_name = FindLinkageName(die); + clang::CXXMethodDecl *cxx_method_decl = m_ast.AddMethodToCXXRecordType( class_opaque_type.GetOpaqueQualType(),
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits