[Lldb-commits] [PATCH] D136935: [lldb][CPlusPlus] Introduce CPlusPlusLanguage::MethodName::GetReturnType
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
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