Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions lldb/source/Core/FormatEntity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1809,11 +1809,12 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
case Entry::Type::FunctionReturnRight:
case Entry::Type::FunctionReturnLeft:
case Entry::Type::FunctionQualifiers: {
if (!sc->function)
return false;
Language *language_plugin = nullptr;
if (sc->function)
language_plugin = Language::FindPlugin(sc->function->GetLanguage());
else if (sc->symbol)
language_plugin = Language::FindPlugin(sc->symbol->GetLanguage());

Language *language_plugin =
Language::FindPlugin(sc->function->GetLanguage());
if (!language_plugin)
return false;

Expand Down
38 changes: 36 additions & 2 deletions lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,34 @@ GetDemangledScope(const SymbolContext &sc) {
return demangled_name.slice(info->ScopeRange.first, info->ScopeRange.second);
}

static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) {
assert(sc.symbol);

Mangled mangled = sc.GetPossiblyInlinedFunctionName();
if (!mangled)
return false;

auto demangled_name = mangled.GetDemangledName().GetStringRef();
if (demangled_name.empty())
return false;

const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo();
if (!info)
return false;

// Function without a basename is nonsense.
if (!info->hasBasename())
return false;

if (info->ArgumentsRange.second < info->ArgumentsRange.first)
return false;

s << demangled_name.slice(info->ArgumentsRange.first,
info->ArgumentsRange.second);

return true;
}

bool CPlusPlusLanguage::CxxMethodName::TrySimplifiedParse() {
// This method tries to parse simple method definitions which are presumably
// most comman in user programs. Definitions that can be parsed by this
Expand Down Expand Up @@ -1890,8 +1918,6 @@ bool CPlusPlusLanguage::GetFunctionDisplayName(
bool CPlusPlusLanguage::HandleFrameFormatVariable(
const SymbolContext &sc, const ExecutionContext *exe_ctx,
FormatEntity::Entry::Type type, Stream &s) {
assert(sc.function);

switch (type) {
case FormatEntity::Entry::Type::FunctionScope: {
std::optional<llvm::StringRef> scope = GetDemangledScope(sc);
Expand Down Expand Up @@ -1925,6 +1951,14 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
}

case FormatEntity::Entry::Type::FunctionFormattedArguments: {
// This ensures we print the arguments even when no debug-info is available.
//
// FIXME: we should have a Entry::Type::FunctionArguments and
// use it in the plugin.cplusplus.display.function-name-format
// once we have a "fallback operator" in the frame-format language.
if (!sc.function && sc.symbol)
return PrintDemangledArgumentList(s, sc);

VariableList args;
if (auto variable_list_sp = GetFunctionVariableList(sc))
variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
# RUN: %lldb -x -b -s %t/commands.input %t.out -o exit 2>&1 \
# RUN: | FileCheck %s
#
# RUN: %clang_host -O0 %t/main.cpp -o %t-nodebug.out
# RUN: %lldb -x -b -s %t/commands.input %t-nodebug.out -o exit 2>&1 \
# RUN: | FileCheck %s

#--- main.cpp
namespace ns {
template<typename T>
Expand Down Expand Up @@ -38,7 +42,7 @@ int main() {

#--- commands.input
settings set -f frame-format "custom-frame '${function.basename}'\n"
break set -l 5 -f main.cpp
break set -n bar

run
bt
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
# RUN: %clang_host -g -gdwarf %t/main.cpp -o %t.out
# RUN: %lldb -x -b -s %t/commands.input %t.out -o exit 2>&1 \
# RUN: | FileCheck %s
#
# RUN: %clang_host -O0 %t/main.cpp -o %t-nodebug.out
# RUN: %lldb -x -b -s %t/commands.input %t-nodebug.out -o exit 2>&1 \
# RUN: | FileCheck %s --check-prefix=CHECK-NODEBUG

#--- main.cpp
struct Foo {
Expand Down Expand Up @@ -42,3 +46,8 @@ bt
# CHECK: custom-frame '({{.*}}=5, x=10)'
# CHECK: custom-frame '(str="hello", fptr=({{.*}}.out`{{.*}}foo(int,{{.*}}int) at main.cpp:{{[0-9]+}}))'
# CHECK: custom-frame '(argc=1, argv={{.*}})'

# CHECK-NODEBUG: custom-frame '()'
# CHECK-NODEBUG: custom-frame '()'
# CHECK-NODEBUG: custom-frame '(int, int)'
# CHECK-NODEBUG: custom-frame '(char const*, void (*)(int, int))'
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
# RUN: %clang_host -g -gdwarf %t/main.cpp -o %t.out
# RUN: %lldb -x -b -s %t/commands.input %t.out -o exit 2>&1 \
# RUN: | FileCheck %s
#
# RUN: %clang_host -O0 %t/main.cpp -o %t-nodebug.out
# RUN: %lldb -x -b -s %t/commands.input %t-nodebug.out -o exit 2>&1 \
# RUN: | FileCheck %s

#--- main.cpp
struct Foo {
Expand Down
4 changes: 4 additions & 0 deletions lldb/test/Shell/Settings/TestFrameFormatFunctionReturn.test
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
# RUN: %clang_host -g -gdwarf %t/main.cpp -o %t.out
# RUN: %lldb -x -b -s %t/commands.input %t.out -o exit 2>&1 \
# RUN: | FileCheck %s
#
# RUN: %clang_host -O0 %t/main.cpp -o %t-nodebug.out
# RUN: %lldb -x -b -s %t/commands.input %t-nodebug.out -o exit 2>&1 \
# RUN: | FileCheck %s

#--- main.cpp
namespace ns::ns2 {
Expand Down
7 changes: 5 additions & 2 deletions lldb/test/Shell/Settings/TestFrameFormatFunctionScope.test
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@

# RUN: split-file %s %t
# RUN: %clang_host -g -gdwarf %t/main.cpp -o %t.out
# RUN: %lldb -o "settings set interpreter.stop-command-source-on-error false" \
# RUN: -x -b -s %t/commands.input %t.out -o exit 2>&1 \
# RUN: %lldb -x -b -s %t/commands.input %t.out -o exit 2>&1 \
# RUN: | FileCheck %s
#
# RUN: %clang_host -O0 %t/main.cpp -o %t-nodebug.out
# RUN: %lldb -x -b -s %t/commands.input %t-nodebug.out -o exit 2>&1 \
# RUN: | FileCheck %s

#--- main.cpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
# Test the ${function.template-arguments} frame-format variable.

# RUN: split-file %s %t
# RUN: %clang_host -g -gdwarf %t/main.cpp -o %t.cxx.out
# RUN: %lldb -x -b -s %t/commands.input %t.cxx.out -o exit 2>&1 \
# RUN: %clang_host -g -gdwarf %t/main.cpp -o %t.out
# RUN: %lldb -x -b -s %t/commands.input %t.out -o exit 2>&1 \
# RUN: | FileCheck %s
#
# RUN: %clang_host -O0 %t/main.cpp -o %t-nodebug.out
# RUN: %lldb -x -b -s %t/commands.input %t-nodebug.out -o exit 2>&1 \
# RUN: | FileCheck %s

#--- main.cpp
Expand All @@ -29,7 +33,7 @@ int main() { return bar(); }

#--- commands.input
settings set -f frame-format "custom-frame '${function.template-arguments}'\n"
break set -l 4 -f main.cpp
break set -n func

run
bt
Expand Down
Loading