[Lldb-commits] [PATCH] D136935: [lldb][CPlusPlus] Introduce CPlusPlusLanguage::MethodName::GetReturnType

2022-10-29 Thread Michael Buch via Phabricator via lldb-commits
Michael137 updated this revision to Diff 471743.
Michael137 added a comment.

- Don't handle function-pointer return types for now
- Add more documentation


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D136935/new/

https://reviews.llvm.org/D136935

Files:
  lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
  lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
  lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
  lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h
  lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp

Index: lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
===
--- lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
+++ lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
@@ -17,130 +17,136 @@
 TEST(CPlusPlusLanguage, MethodNameParsing) {
   struct TestCase {
 std::string input;
-std::string context, basename, arguments, qualifiers, scope_qualified_name;
+std::string return_type, context, basename, arguments, qualifiers,
+scope_qualified_name;
   };
 
   TestCase test_cases[] = {
-  {"main(int, char *[]) ", "", "main", "(int, char *[])", "", "main"},
-  {"foo::bar(baz) const", "foo", "bar", "(baz)", "const", "foo::bar"},
-  {"foo::~bar(baz)", "foo", "~bar", "(baz)", "", "foo::~bar"},
-  {"a::b::c::d(e,f)", "a::b::c", "d", "(e,f)", "", "a::b::c::d"},
-  {"void f(int)", "", "f", "(int)", "", "f"},
+  {"main(int, char *[]) ", "", "", "main", "(int, char *[])", "", "main"},
+  {"foo::bar(baz) const", "", "foo", "bar", "(baz)", "const", "foo::bar"},
+  {"foo::~bar(baz)", "", "foo", "~bar", "(baz)", "", "foo::~bar"},
+  {"a::b::c::d(e,f)", "", "a::b::c", "d", "(e,f)", "", "a::b::c::d"},
+  {"void f(int)", "void", "", "f", "(int)", "", "f"},
 
   // Operators
   {"std::basic_ostream >& "
-   "std::operator<< >"
-   "(std::basic_ostream >&, char const*)",
-   "std", "operator<< >",
+   "std::operator<< >(std::basic_ostream >&, char const*)",
+   "std::basic_ostream >&", "std",
+   "operator<< >",
"(std::basic_ostream >&, char const*)", "",
"std::operator<< >"},
   {"operator delete[](void*, clang::ASTContext const&, unsigned long)", "",
-   "operator delete[]", "(void*, clang::ASTContext const&, unsigned long)",
-   "", "operator delete[]"},
-  {"llvm::Optional::operator bool() const",
+   "", "operator delete[]",
+   "(void*, clang::ASTContext const&, unsigned long)", "",
+   "operator delete[]"},
+  {"llvm::Optional::operator bool() const", "",
"llvm::Optional", "operator bool", "()", "const",
"llvm::Optional::operator bool"},
-  {"(anonymous namespace)::FactManager::operator[](unsigned short)",
+  {"(anonymous namespace)::FactManager::operator[](unsigned short)", "",
"(anonymous namespace)::FactManager", "operator[]", "(unsigned short)",
"", "(anonymous namespace)::FactManager::operator[]"},
   {"const int& std::map>::operator[](short) const",
-   "std::map>", "operator[]", "(short)", "const",
-   "std::map>::operator[]"},
-  {"CompareInsn::operator()(llvm::StringRef, InsnMatchEntry const&)",
+   "const int&", "std::map>", "operator[]", "(short)",
+   "const", "std::map>::operator[]"},
+  {"CompareInsn::operator()(llvm::StringRef, InsnMatchEntry const&)", "",
"CompareInsn", "operator()", "(llvm::StringRef, InsnMatchEntry const&)",
"", "CompareInsn::operator()"},
-  {"llvm::Optional::operator*() const &",
+  {"llvm::Optional::operator*() const &", "",
"llvm::Optional", "operator*", "()", "const &",
"llvm::Optional::operator*"},
   {"auto std::__1::ranges::__begin::__fn::operator()[abi:v16](char const (&) [18ul]) const",
-   "std::__1::ranges::__begin::__fn",
+   "auto", "std::__1::ranges::__begin::__fn",
"operator()[abi:v16]", "(char const (&) [18ul])",
"const",
"std::__1::ranges::__begin::__fn::operator()[abi:v16]"},
   // Internal classes
-  {"operator<<(Cls, Cls)::Subclass::function()",
+  {"operator<<(Cls, Cls)::Subclass::function()", "",
"operator<<(Cls, Cls)::Subclass", "function", "()", "",
"operator<<(Cls, Cls)::Subclass::function"},
-  {"SAEC::checkFunction(context&) const::CallBack::CallBack(int)",
+  {"SAEC::checkFunction(context&) const::CallBack::CallBack(int)", "",
"SAEC::checkFunction(context&) const::CallBack", "CallBack", "(int)", "",
"SAEC::checkFunction(context&) const::CallBack::CallBack"},
   // Anonymous namespace
-  {"XX::(anonymous namespace)::anon_class::anon_func() const",
+  {"XX::(anonymous namespace)::anon_class::anon_func() const", "",
"XX::(anonymous namespace)::anon_class", "anon_func", "()", "const",
"XX::(anonym

[Lldb-commits] [PATCH] D136761: [lldb][CPlusPlus] Implement CPlusPlusLanguage::GetFunctionDisplayName

2022-10-29 Thread Michael Buch via Phabricator via lldb-commits
Michael137 updated this revision to Diff 471744.
Michael137 added a comment.

- Add more tests


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D136761/new/

https://reviews.llvm.org/D136761

Files:
  lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
  lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
  lldb/test/Shell/Settings/Inputs/names.cpp
  lldb/test/Shell/Settings/TestFrameFormatNameWithArgs.test

Index: lldb/test/Shell/Settings/TestFrameFormatNameWithArgs.test
===
--- /dev/null
+++ lldb/test/Shell/Settings/TestFrameFormatNameWithArgs.test
@@ -0,0 +1,27 @@
+# RUN: %clangxx_host -g -O0 %S/Inputs/names.cpp -std=c++17 -o %t.out
+# RUN: %lldb -b -s %s %t.out | FileCheck %s
+settings set -f frame-format "frame ${function.name-with-args}\n"
+break set -n foo
+break set -n operator<<
+break set -n returns_func_ptr
+run
+# CHECK: frame int ns::foo(t={{.*}})
+c
+# CHECK: frame int ns::foo>(t= Function = bar() )
+c
+# CHECK: frame int ns::foo<(anonymous namespace)::$_0>(t={{.*}})
+c
+# CHECK: frame int ns::foo>(t= Function = (anonymous namespace)::anon_bar() )
+c
+# CHECK: frame int ns::foo const&) const noexcept>(t={{.*}})
+c
+# CHECK: frame ns::returns_func_ptr((null)={{.*}})
+c
+# CHECK: frame void Foo::foo>(this={{.*}}, t= Function = bar() ) const
+c
+# CHECK: frame void Foo::foo>(this={{.*}}, t= Function = (anonymous namespace)::anon_bar() ) const
+c
+# CHECK: frame void Foo::operator<<<1ul>(this={{.*}}, (null)=0)
+c
+# CHECK: frame Foo::returns_func_ptr(this={{.*}}, (null)={{.*}})
+q
Index: lldb/test/Shell/Settings/Inputs/names.cpp
===
--- /dev/null
+++ lldb/test/Shell/Settings/Inputs/names.cpp
@@ -0,0 +1,43 @@
+#include 
+
+namespace detail {
+template  struct Quux {};
+} // namespace detail
+
+using FuncPtr = detail::Quux (*(*)(int))(float);
+
+struct Foo {
+  template  void foo(T const &t) const noexcept(true) {}
+
+  template  void operator<<(size_t) {}
+
+  template  FuncPtr returns_func_ptr(detail::Quux &&) const noexcept(false) { return nullptr; }
+};
+
+namespace ns {
+template  int foo(T const &t) noexcept(false) { return 0; }
+
+template  FuncPtr returns_func_ptr(detail::Quux &&) { return nullptr; }
+} // namespace ns
+
+int bar() { return 1; }
+
+namespace {
+int anon_bar() { return 1; }
+auto anon_lambda = [](std::function) mutable {};
+} // namespace
+
+int main() {
+  ns::foo(bar);
+  ns::foo(std::function{bar});
+  ns::foo(anon_lambda);
+  ns::foo(std::function{anon_bar});
+  ns::foo(&Foo::foo>);
+  ns::returns_func_ptr(detail::Quux{});
+  Foo f;
+  f.foo(std::function{bar});
+  f.foo(std::function{anon_bar});
+  f.operator<< <(2 > 1)>(0);
+  f.returns_func_ptr(detail::Quux{});
+  return 0;
+}
Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
===
--- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
+++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
@@ -136,6 +136,11 @@
   ConstString
   GetDemangledFunctionNameWithoutArguments(Mangled mangled) const override;
 
+  bool GetFunctionDisplayName(const SymbolContext *sc,
+  const ExecutionContext *exe_ctx,
+  FunctionNameRepresentation representation,
+  Stream &s) override;
+
   static bool IsCPPMangledName(llvm::StringRef name);
 
   // Extract C++ context and identifier from a string using heuristic matching
Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
===
--- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -23,11 +23,13 @@
 #include "lldb/Core/Module.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/UniqueCStringMap.h"
+#include "lldb/Core/ValueObjectVariable.h"
 #include "lldb/DataFormatters/CXXFunctionPointer.h"
 #include "lldb/DataFormatters/DataVisualization.h"
 #include "lldb/DataFormatters/FormattersHelpers.h"
 #include "lldb/DataFormatters/VectorType.h"
 #include "lldb/Symbol/SymbolFile.h"
+#include "lldb/Symbol/VariableList.h"
 #include "lldb/Utility/ConstString.h"
 #include "lldb/Utility/LLDBLog.h"
 #include "lldb/Utility/Log.h"
@@ -171,6 +173,40 @@
   return idx == basename.size();
 }
 
+/// Writes out the function name in 'full_name' to 'out_stream'
+/// but replaces each argument type with the variable name
+/// and the corresponding pretty-printed value
+static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream,
+char const *full_name,
+ExecutionContextScope *exe_scope,
+VariableList const &args) {
+  CPlusPlusLanguage::MethodName cpp_method{Co