Author: Arthur Eubanks Date: 2022-11-03T16:19:15-07:00 New Revision: 3d83a57721def7aad227d68b1e5e0afa6a74a33f
URL: https://github.com/llvm/llvm-project/commit/3d83a57721def7aad227d68b1e5e0afa6a74a33f DIFF: https://github.com/llvm/llvm-project/commit/3d83a57721def7aad227d68b1e5e0afa6a74a33f.diff LOG: [lldb] Support simplified template names when looking up functions This makes setting breakpoints work with -gsimple-template-names. Assume that callers handle false positives. For example, `Module::LookupInfo::Prune` removes wrong template instantiations when setting a breakpoint. Reviewed By: labath Differential Revision: https://reviews.llvm.org/D137098 Added: Modified: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp lldb/test/API/functionalities/breakpoint/cpp/TestCPPBreakpointLocations.py lldb/test/API/functionalities/breakpoint/cpp/main.cpp Removed: ################################################################################ diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 5d5a47bc0c92c..066fc9f434cae 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2389,6 +2389,24 @@ void SymbolFileDWARF::FindFunctions(const Module::LookupInfo &lookup_info, ResolveFunction(die, include_inlines, sc_list); return true; }); + // With -gsimple-template-names, a templated type's DW_AT_name will not + // contain the template parameters. Try again stripping '<' and anything + // after, filtering out entries with template parameters that don't match. + { + const llvm::StringRef name_ref = name.GetStringRef(); + auto it = name_ref.find('<'); + if (it != llvm::StringRef::npos) { + const llvm::StringRef name_no_template_params = name_ref.slice(0, it); + + Module::LookupInfo no_tp_lookup_info(lookup_info); + no_tp_lookup_info.SetLookupName(ConstString(name_no_template_params)); + m_index->GetFunctions(no_tp_lookup_info, *this, parent_decl_ctx, [&](DWARFDIE die) { + if (resolved_dies.insert(die.GetDIE()).second) + ResolveFunction(die, include_inlines, sc_list); + return true; + }); + } + } // Return the number of variable that were appended to the list const uint32_t num_matches = sc_list.GetSize() - original_size; diff --git a/lldb/test/API/functionalities/breakpoint/cpp/TestCPPBreakpointLocations.py b/lldb/test/API/functionalities/breakpoint/cpp/TestCPPBreakpointLocations.py index 6c86f5016a606..1dedc5d7f9bbd 100644 --- a/lldb/test/API/functionalities/breakpoint/cpp/TestCPPBreakpointLocations.py +++ b/lldb/test/API/functionalities/breakpoint/cpp/TestCPPBreakpointLocations.py @@ -12,7 +12,16 @@ class TestCPPBreakpointLocations(TestBase): @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764") def test(self): - self.build() + self.do_test(dict()) + + @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764") + @skipIf(compiler=no_match("clang")) + @skipIf(compiler_version=["<", "15.0"]) + def test_simple_template_names(self): + self.do_test(dict(CFLAGS_EXTRAS="-gsimple-template-names")) + + def do_test(self, debug_flags): + self.build(dictionary=debug_flags) self.breakpoint_id_tests() def verify_breakpoint_locations(self, target, bp_dict): @@ -57,7 +66,11 @@ def breakpoint_id_tests(self): # Template cases {'name': 'func<float>', 'loc_names': []}, + {'name': 'Foo::func<float>', 'loc_names': []}, + {'name': 'ns::Foo::func<float>', 'loc_names': []}, {'name': 'func<int>', 'loc_names': ['auto ns::Foo<double>::func<int>()']}, + {'name': 'Foo<double>::func<int>', 'loc_names': ['auto ns::Foo<double>::func<int>()']}, + {'name': 'ns::Foo<double>::func<int>', 'loc_names': ['auto ns::Foo<double>::func<int>()']}, {'name': 'func', 'loc_names': ['auto ns::Foo<double>::func<int>()', 'auto ns::Foo<double>::func<ns::Foo<int>>()']}, @@ -71,6 +84,15 @@ def breakpoint_id_tests(self): {'name': 'operator<<<int>', 'loc_names': ['void ns::Foo<double>::operator<<<int>(int)']}, {'name': 'ns::Foo<double>::operator<<', 'loc_names': ['void ns::Foo<double>::operator<<<int>(int)', 'void ns::Foo<double>::operator<<<ns::Foo<int>>(ns::Foo<int>)']}, + + {'name': 'g<float>', 'loc_names': []}, + {'name': 'g<int>', 'loc_names': ['void ns::g<int>()']}, + {'name': 'g<char>', 'loc_names': ['void ns::g<char>()']}, + {'name': 'g', 'loc_names': ['void ns::g<int>()', 'void ns::g<char>()']}, + {'name': 'ns::g<float>', 'loc_names': []}, + {'name': 'ns::g<int>', 'loc_names': ['void ns::g<int>()']}, + {'name': 'ns::g<char>', 'loc_names': ['void ns::g<char>()']}, + {'name': 'ns::g', 'loc_names': ['void ns::g<int>()', 'void ns::g<char>()']}, ] for bp_dict in bp_dicts: diff --git a/lldb/test/API/functionalities/breakpoint/cpp/main.cpp b/lldb/test/API/functionalities/breakpoint/cpp/main.cpp index 7ee61e92ffd57..b2cee995198ad 100644 --- a/lldb/test/API/functionalities/breakpoint/cpp/main.cpp +++ b/lldb/test/API/functionalities/breakpoint/cpp/main.cpp @@ -94,6 +94,8 @@ template <typename Type> struct Foo { template <typename T> void operator<<(T t) {} }; + +template <typename Type> void g() {} } // namespace ns int main (int argc, char const *argv[]) @@ -123,5 +125,8 @@ int main (int argc, char const *argv[]) f.operator<<(5); f.operator<< <ns::Foo<int>>({}); + ns::g<int>(); + ns::g<char>(); + return 0; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits