From 5f86b49146902a37ea93470b5992206b20665128 Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Mon, 6 Nov 2023 10:56:49 +0000 Subject: [PATCH] Revert "[lldb][DWARFASTParserClang] Fetch constant value from variable defintion if available (#71004)" This reverts commit ef3febadf606c2fc4f1ad8d85a7ecdde16e4cbb3. This caused an LLDB test failure on Linux for `lang/cpp/symbols/TestSymbols.test_dwo`: ``` make: Leaving directory '/home/worker/2.0.1/lldb-x86_64-debian/build/lldb-test-build.noindex/lang/cpp/symbols/TestSymbols.test_dwo' runCmd: expression -- D::i PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace. Stack dump: 0. HandleCommand(command = "expression -- D::i") 1. :1:4: current parser token 'i' 2. :44:1: parsing function body '$__lldb_expr' 3. :44:1: in compound statement ('{}') Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it): 0 _lldb.cpython-39-x86_64-linux-gnu.so 0x00007fbcfcb08b87 1 _lldb.cpython-39-x86_64-linux-gnu.so 0x00007fbcfcb067ae 2 _lldb.cpython-39-x86_64-linux-gnu.so 0x00007fbcfcb0923f 3 libpthread.so.0 0x00007fbd07ab7140 ``` And a failure in `TestCallStdStringFunction.py` on Linux aarch64: ``` -- Exit Code: -11 Command Output (stdout): -- lldb version 18.0.0git (https://github.com/llvm/llvm-project.git revision ef3febadf606c2fc4f1ad8d85a7ecdde16e4cbb3) clang revision ef3febadf606c2fc4f1ad8d85a7ecdde16e4cbb3 llvm revision ef3febadf606c2fc4f1ad8d85a7ecdde16e4cbb3 -- Command Output (stderr): -- PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace. Stack dump: 0. HandleCommand(command = "expression str") 1. :45:34: current parser token ';' 2. :44:1: parsing function body '$__lldb_expr' 3. :44:1: in compound statement ('{}') #0 0x0000ffffb72a149c llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lib/python3.8/site-packages/lldb/_[lldb.cpython-38-aarch64-linux-gnu.so](http://lldb.cpython-38-aarch64-linux-gnu.so/)+0x58c749c) #1 0x0000ffffb729f458 llvm::sys::RunSignalHandlers() (/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lib/python3.8/site-packages/lldb/_[lldb.cpython-38-aarch64-linux-gnu.so](http://lldb.cpython-38-aarch64-linux-gnu.so/)+0x58c5458) #2 0x0000ffffb72a1bd0 SignalHandler(int) (/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lib/python3.8/site-packages/lldb/_[lldb.cpython-38-aarch64-linux-gnu.so](http://lldb.cpython-38-aarch64-linux-gnu.so/)+0x58c7bd0) #3 0x0000ffffbdd9e7dc (linux-vdso.so.1+0x7dc) #4 0x0000ffffb71799d8 lldb_private::plugin::dwarf::SymbolFileDWARF::FindGlobalVariables(lldb_private::ConstString, lldb_private::CompilerDeclContext const&, unsigned int, lldb_private::VariableList&) (/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lib/python3.8/site-packages/lldb/_[lldb.cpython-38-aarch64-linux-gnu.so](http://lldb.cpython-38-aarch64-linux-gnu.so/)+0x579f9d8) #5 0x0000ffffb7197508 DWARFASTParserClang::FindConstantOnVariableDefinition(lldb_private::plugin::dwarf::DWARFDIE) (/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lib/python3.8/site-packages/lldb/_[lldb.cpython-38-aarch64-linux-gnu.so](http://lldb.cpython-38-aarch64-linux-gnu.so/)+0x57bd508) ``` --- .../SymbolFile/DWARF/DWARFASTParserClang.cpp | 63 +------------------ .../SymbolFile/DWARF/DWARFASTParserClang.h | 11 ---- .../SymbolFile/DWARF/SymbolFileDWARF.h | 10 +-- .../TestConstStaticIntegralMember.py | 21 ------- .../cpp/const_static_integral_member/main.cpp | 20 ------ 5 files changed, 6 insertions(+), 119 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index 4e41858674467a..3174c18c97d888 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -31,7 +31,6 @@ #include "lldb/Symbol/SymbolFile.h" #include "lldb/Symbol/TypeList.h" #include "lldb/Symbol/TypeMap.h" -#include "lldb/Symbol/VariableList.h" #include "lldb/Target/Language.h" #include "lldb/Utility/LLDBAssert.h" #include "lldb/Utility/Log.h" @@ -134,54 +133,6 @@ static lldb::ModuleSP GetContainingClangModule(const DWARFDIE &die) { return lldb::ModuleSP(); } -std::optional -DWARFASTParserClang::FindConstantOnVariableDefinition(DWARFDIE die) { - assert(die.Tag() == llvm::dwarf::DW_TAG_member); - - auto *dwarf = die.GetDWARF(); - if (!dwarf) - return {}; - - ConstString name{die.GetName()}; - if (!name) - return {}; - - auto *CU = die.GetCU(); - if (!CU) - return {}; - - DWARFASTParser *dwarf_ast = dwarf->GetDWARFParser(*CU); - auto parent_decl_ctx = dwarf_ast->GetDeclContextContainingUIDFromDWARF(die); - - // Make sure we populate the GetDieToVariable cache. - VariableList variables; - dwarf->FindGlobalVariables(name, parent_decl_ctx, UINT_MAX, variables); - - // The cache contains the variable definition whose DW_AT_specification - // points to our declaration DIE. Look up that definition using our - // declaration. - auto const &die_to_var = dwarf->GetDIEToVariable(); - auto it = die_to_var.find(die.GetDIE()); - if (it == die_to_var.end()) - return {}; - - auto var_sp = it->getSecond(); - assert(var_sp != nullptr); - - if (!var_sp->GetLocationIsConstantValueData()) - return {}; - - auto def = dwarf->GetDIE(var_sp->GetID()); - auto def_attrs = def.GetAttributes(); - DWARFFormValue form_value; - if (!def_attrs.ExtractFormValueAtIndex( - def_attrs.FindAttributeIndex(llvm::dwarf::DW_AT_const_value), - form_value)) - return {}; - - return form_value; -} - TypeSP DWARFASTParserClang::ParseTypeFromClangModule(const SymbolContext &sc, const DWARFDIE &die, Log *log) { @@ -2955,21 +2906,9 @@ void DWARFASTParserClang::ParseSingleMember( bool unused; // TODO: Support float/double static members as well. - if (!ct.IsIntegerOrEnumerationType(unused)) + if (!attrs.const_value_form || !ct.IsIntegerOrEnumerationType(unused)) return; - // Newer versions of Clang don't emit the DW_AT_const_value - // on the declaration of an inline static data member. Instead - // it's attached to the definition DIE. If that's the case, - // try and fetch it. - if (!attrs.const_value_form) { - auto maybe_form_value = FindConstantOnVariableDefinition(die); - if (!maybe_form_value) - return; - - attrs.const_value_form = *maybe_form_value; - } - llvm::Expected const_value_or_err = ExtractIntFromFormValue(ct, *attrs.const_value_form); if (!const_value_or_err) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h index 21fd6f9d7980ef..c381c58fba7426 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h @@ -373,17 +373,6 @@ class DWARFASTParserClang : public lldb_private::plugin::dwarf::DWARFASTParser { lldb_private::CompilerType &class_clang_type, const lldb::AccessType default_accesibility, lldb_private::ClangASTImporter::LayoutInfo &layout_info); - - /// Tries to find the definition DW_TAG_variable DIE of the the specified - /// DW_TAG_member 'die'. If such definition exists, returns the - /// DW_AT_const_value of that definition if available. Returns std::nullopt - /// otherwise. - /// - /// In newer versions of clang, DW_AT_const_value attributes are not attached - /// to the declaration of a inline static data-member anymore, but rather on - /// its definition. This function is used to locate said constant. - std::optional - FindConstantOnVariableDefinition(lldb_private::plugin::dwarf::DWARFDIE die); }; /// Parsed form of all attributes that are relevant for type reconstruction. diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index e6efbba7e24990..28430ccb87924b 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -343,11 +343,6 @@ class SymbolFileDWARF : public SymbolFileCommon { return m_forward_decl_compiler_type_to_die; } - typedef llvm::DenseMap - DIEToVariableSP; - - virtual DIEToVariableSP &GetDIEToVariable() { return m_die_to_variable_sp; } - virtual UniqueDWARFASTTypeMap &GetUniqueDWARFASTTypeMap(); bool ClassOrStructIsVirtual(const DWARFDIE &die); @@ -367,6 +362,9 @@ class SymbolFileDWARF : public SymbolFileCommon { Type *ResolveTypeUID(const DIERef &die_ref); protected: + typedef llvm::DenseMap + DIEToVariableSP; + SymbolFileDWARF(const SymbolFileDWARF &) = delete; const SymbolFileDWARF &operator=(const SymbolFileDWARF &) = delete; @@ -490,6 +488,8 @@ class SymbolFileDWARF : public SymbolFileCommon { void UpdateExternalModuleListIfNeeded(); + virtual DIEToVariableSP &GetDIEToVariable() { return m_die_to_variable_sp; } + void BuildCuTranslationTable(); std::optional GetDWARFUnitIndex(uint32_t cu_idx); diff --git a/lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py b/lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py index 555ff750b97c9f..78ea23ac8f7061 100644 --- a/lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py +++ b/lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py @@ -139,24 +139,3 @@ def test_class_with_only_constexpr_static(self): self.expect_expr( "ClassWithEnumAlias::enum_alias_alias", result_value="scoped_enum_case1" ) - - def test_shadowed_static_inline_members(self): - """Tests that the expression evaluator and SBAPI can both - correctly determine the requested inline static variable - in the presence of multiple variables of the same name.""" - - self.build() - lldbutil.run_to_name_breakpoint(self, "bar") - - self.check_global_var("ns::Foo::mem", "const int", "10") - - self.expect_expr("mem", result_value="10") - self.expect_expr("Foo::mem", result_value="10") - self.expect_expr("ns::Foo::mem", result_value="10") - self.expect_expr("::Foo::mem", result_value="-29") - - @expectedFailureAll(bugnumber="target var doesn't honour global namespace") - def test_shadowed_static_inline_members_xfail(self): - self.build() - lldbutil.run_to_name_breakpoint(self, "bar") - self.check_global_var("::Foo::mem", "const int", "-29") diff --git a/lldb/test/API/lang/cpp/const_static_integral_member/main.cpp b/lldb/test/API/lang/cpp/const_static_integral_member/main.cpp index fb0b49e2d7aad7..4275f471df6aed 100644 --- a/lldb/test/API/lang/cpp/const_static_integral_member/main.cpp +++ b/lldb/test/API/lang/cpp/const_static_integral_member/main.cpp @@ -89,25 +89,6 @@ struct ClassWithEnumAlias { ScopedEnum::scoped_enum_case1; }; -namespace ns { -struct Foo { - constexpr static int mem = 10; - - void bar() { return; } -}; -} // namespace ns - -struct Foo { - constexpr static int mem = -29; -}; - -int func() { - Foo f1; - ns::Foo f2; - f2.bar(); - return ns::Foo::mem + Foo::mem; -} - int main() { A a; @@ -143,7 +124,6 @@ int main() { auto enum_alias_val = ClassWithEnumAlias::enum_alias; auto enum_alias_alias_val = ClassWithEnumAlias::enum_alias_alias; - auto ret = func(); return 0; // break here }