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()) {
- if (auto *func = sc.function) {
- 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);
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(),
+++ /dev/null
-"""
-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, 'b\.getWrapper\(\)',
- lldb.SBFileSpec('main.cpp', False))
-
- self.expect_expr('b.sinkWrapper(b.getWrapper())', 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"