[Lldb-commits] [lldb] bf7c421 - Revert "Reland "[lldb][DWARFASTParserClang] Attach linkage name to ctors/dtors if missing""

Michael Buch via lldb-commits lldb-commits at lists.llvm.org
Mon Feb 13 10:09:56 PST 2023


Author: Michael Buch
Date: 2023-02-13T18:09:32Z
New Revision: bf7c421617007d7202dcd74762cef3a49425bfab

URL: https://github.com/llvm/llvm-project/commit/bf7c421617007d7202dcd74762cef3a49425bfab
DIFF: https://github.com/llvm/llvm-project/commit/bf7c421617007d7202dcd74762cef3a49425bfab.diff

LOG: Revert "Reland "[lldb][DWARFASTParserClang] Attach linkage name to ctors/dtors if missing""

This reverts commit 19128792e2aa320c1a149f7f93638cbd7f3c83c6.

As pointed out in https://reviews.llvm.org/D143652 this implementation
doesn't quite work for subobject constructors/destructors because DWARF
can map multiple definitions of a ctor/dtor to the same specification DIE.
With the current implementation we would pick the first definition we
find and use that linkage name which means we can sometimes pick the
wrong dtor/ctor and fail to execute a valid expression.

Differential Revision: https://reviews.llvm.org/D143652

Added: 
    

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

Removed: 
    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


################################################################################
diff  --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
index 9a7fa415c437..717456698eb2 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
@@ -888,46 +888,6 @@ ConvertDWARFCallingConventionToClang(const ParsedDWARFTypeAttributes &attrs) {
   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->GetObjectFile()->GetModule()->FindFunctions(lookup_info, {}, {},
-                                                     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);
@@ -1156,9 +1116,6 @@ TypeSP DWARFASTParserClang::ParseSubroutine(const DWARFDIE &die,
                   if (attrs.accessibility == eAccessNone)
                     attrs.accessibility = eAccessPublic;
 
-                  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(),

diff  --git a/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/Makefile b/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/Makefile
deleted file mode 100644
index eba15476332f..000000000000
--- a/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-CXX_SOURCES := main.cpp
-                       
-include Makefile.rules 

diff  --git a/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/TestExternalCtorDtorLookup.py b/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/TestExternalCtorDtorLookup.py
deleted file mode 100644
index e436252800a7..000000000000
--- a/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/TestExternalCtorDtorLookup.py
+++ /dev/null
@@ -1,31 +0,0 @@
-"""
-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):
-
-    @skipIfWindows
-    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 "_ZN7WrapperI3Foo{{.*}}testEv"
-# CHECK-NEXT:      `-CXXDestructorDecl {{.*}} ~Wrapper 'void ()'
-# CHECK-NEXT:        `-AsmLabelAttr {{.*}} Implicit "_ZN7WrapperI3Foo{{.*}}testEv"

diff  --git a/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/lib.h b/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/lib.h
deleted file mode 100644
index 9664068b6e14..000000000000
--- a/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/lib.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef LIB_H_IN
-#define LIB_H_IN
-
-template <typename T> class Wrapper {
-public:
-  [[gnu::abi_tag("test")]] Wrapper(){};
-
-  [[gnu::abi_tag("test")]] ~Wrapper(){};
-};
-
-#endif // _H_IN
-

diff  --git a/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/main.cpp b/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/main.cpp
deleted file mode 100644
index 3904646c05db..000000000000
--- a/lldb/test/API/lang/cpp/external_ctor_dtor_lookup/main.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "lib.h"
-
-struct Foo {};
-
-struct Bar {
-  Wrapper<Foo> getWrapper() { return Wrapper<Foo>(); }
-  int sinkWrapper(Wrapper<Foo>) { return -1; }
-};
-
-int main() {
-  Bar b;
-  return b.sinkWrapper(b.getWrapper());
-}
-


        


More information about the lldb-commits mailing list