diff --git a/lldb/docs/use/formatting.rst b/lldb/docs/use/formatting.rst --- a/lldb/docs/use/formatting.rst +++ b/lldb/docs/use/formatting.rst @@ -92,6 +92,8 @@ +---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``function.name-without-args`` | The name of the current function without arguments and values (used to include a function name in-line in the ``disassembly-format``) | +---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``function.mangled-name`` | The mangled name of the current function or symbol. | ++---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``function.pc-offset`` | The program counter offset within the current function or symbol | +---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``function.addr-offset`` | The offset in bytes of the current function, formatted as " + dddd" | diff --git a/lldb/include/lldb/Core/FormatEntity.h b/lldb/include/lldb/Core/FormatEntity.h --- a/lldb/include/lldb/Core/FormatEntity.h +++ b/lldb/include/lldb/Core/FormatEntity.h @@ -85,6 +85,7 @@ FunctionName, FunctionNameWithArgs, FunctionNameNoArgs, + FunctionMangledName, FunctionAddrOffset, FunctionAddrOffsetConcrete, FunctionLineOffset, diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjNSException.py b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjNSException.py --- a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjNSException.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjNSException.py @@ -25,11 +25,11 @@ 'frame variable except0 except1 except2 except3', substrs=[ '(NSException *) except0 = ', - 'name: @"TheGuyWhoHasNoName" - reason: @"cuz it\'s funny"', + '@"First"', '(NSException *) except1 = ', - 'name: @"TheGuyWhoHasNoName~1" - reason: @"cuz it\'s funny"', + '@"Second"', '(NSException *) except2 = ', - 'name: @"TheGuyWhoHasNoName`2" - reason: @"cuz it\'s funny"', + ' @"Third"', '(NSException *) except3 = ', - 'name: @"TheGuyWhoHasNoName/3" - reason: @"cuz it\'s funny"' + ' @"Fourth"' ]) diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m --- a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m +++ b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m @@ -492,10 +492,10 @@ nsurl0 = [bundle bundleURL]; } - NSException* except0 = [[NSException alloc] initWithName:@"TheGuyWhoHasNoName" reason:@"cuz it's funny" userInfo:nil]; - NSException* except1 = [[NSException alloc] initWithName:@"TheGuyWhoHasNoName~1" reason:@"cuz it's funny" userInfo:nil]; - NSException* except2 = [[NSException alloc] initWithName:@"TheGuyWhoHasNoName`2" reason:@"cuz it's funny" userInfo:nil]; - NSException* except3 = [[NSException alloc] initWithName:@"TheGuyWhoHasNoName/3" reason:@"cuz it's funny" userInfo:nil]; + NSException* except0 = [[NSException alloc] initWithName:@"TheGuyWhoHasNoName" reason:@"First" userInfo:nil]; + NSException* except1 = [[NSException alloc] initWithName:@"TheGuyWhoHasNoName~1" reason:@"Second" userInfo:nil]; + NSException* except2 = [[NSException alloc] initWithName:@"TheGuyWhoHasNoName`2" reason:@"Third" userInfo:nil]; + NSException* except3 = [[NSException alloc] initWithName:@"TheGuyWhoHasNoName/3" reason:@"Fourth" userInfo:nil]; NSURL *nsurl = [[NSURL alloc] initWithString:@"http://www.foo.bar"]; NSURL *nsurl2 = [NSURL URLWithString:@"page.html" relativeToURL:nsurl]; diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py b/lldb/packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py --- a/lldb/packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py +++ b/lldb/packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py @@ -31,7 +31,7 @@ self.expect('thread exception', substrs=[ '(NSException *) exception = ', - 'name: "ThrownException" - reason: "SomeReason"', + '"SomeReason"', ]) target = self.dbg.GetSelectedTarget() @@ -63,7 +63,7 @@ 'frame variable e1', substrs=[ '(NSException *) e1 = ', - 'name: "ExceptionName" - reason: "SomeReason"' + '"SomeReason"' ]) self.expect( @@ -79,7 +79,7 @@ e1 = frame.FindVariable("e1") self.assertTrue(e1) self.assertEqual(e1.type.name, "NSException *") - self.assertEqual(e1.GetSummary(), 'name: "ExceptionName" - reason: "SomeReason"') + self.assertEqual(e1.GetSummary(), '"SomeReason"') self.assertEqual(e1.GetChildMemberWithName("name").description, "ExceptionName") self.assertEqual(e1.GetChildMemberWithName("reason").description, "SomeReason") userInfo = e1.GetChildMemberWithName("userInfo").dynamic @@ -92,7 +92,7 @@ 'frame variable e2', substrs=[ '(NSException *) e2 = ', - 'name: "ThrownException" - reason: "SomeReason"' + '"SomeReason"' ]) self.expect( @@ -108,7 +108,7 @@ e2 = frame.FindVariable("e2") self.assertTrue(e2) self.assertEqual(e2.type.name, "NSException *") - self.assertEqual(e2.GetSummary(), 'name: "ThrownException" - reason: "SomeReason"') + self.assertEqual(e2.GetSummary(), '"SomeReason"') self.assertEqual(e2.GetChildMemberWithName("name").description, "ThrownException") self.assertEqual(e2.GetChildMemberWithName("reason").description, "SomeReason") userInfo = e2.GetChildMemberWithName("userInfo").dynamic @@ -141,7 +141,7 @@ self.expect('thread exception', substrs=[ '(NSException *) exception = ', - 'name: "ThrownException" - reason: "SomeReason"', + '"SomeReason"', 'libobjc.A.dylib`objc_exception_throw', 'a.out`foo', 'at main.mm:24', 'a.out`rethrow', 'at main.mm:35', diff --git a/lldb/source/Core/FormatEntity.cpp b/lldb/source/Core/FormatEntity.cpp --- a/lldb/source/Core/FormatEntity.cpp +++ b/lldb/source/Core/FormatEntity.cpp @@ -125,6 +125,7 @@ ENTRY("name", FunctionName), ENTRY("name-without-args", FunctionNameNoArgs), ENTRY("name-with-args", FunctionNameWithArgs), + ENTRY("mangled-name", FunctionMangledName), ENTRY("addr-offset", FunctionAddrOffset), ENTRY("concrete-only-addr-offset-no-padding", FunctionAddrOffsetConcrete), ENTRY("line-offset", FunctionLineOffset), @@ -351,6 +352,7 @@ ENUM_TO_CSTR(FunctionName); ENUM_TO_CSTR(FunctionNameWithArgs); ENUM_TO_CSTR(FunctionNameNoArgs); + ENUM_TO_CSTR(FunctionMangledName); ENUM_TO_CSTR(FunctionAddrOffset); ENUM_TO_CSTR(FunctionAddrOffsetConcrete); ENUM_TO_CSTR(FunctionLineOffset); @@ -1745,6 +1747,37 @@ } return false; + case Entry::Type::FunctionMangledName: { + const char *name = nullptr; + if (sc->symbol) + name = sc->symbol->GetMangled() + .GetName(sc->symbol->GetLanguage(), Mangled::ePreferMangled) + .AsCString(); + else if (sc->function) + name = sc->function->GetMangled() + .GetName(sc->symbol->GetLanguage(), Mangled::ePreferMangled) + .AsCString(); + + if (!name) + return false; + else { + s.PutCString(name); + + if (sc->block) { + Block *inline_block = sc->block->GetContainingInlinedBlock(); + if (inline_block) { + const InlineFunctionInfo *inline_info = + sc->block->GetInlinedFunctionInfo(); + if (inline_info) { + s.PutCString(" [inlined] "); + inline_info->GetName(sc->function->GetLanguage()).Dump(&s); + } + } + } + return true; + } + } + case Entry::Type::FunctionAddrOffset: if (addr) { if (DumpAddressOffsetFromFunction(s, sc, exe_ctx, *addr, false, false, diff --git a/lldb/source/Plugins/Language/ObjC/NSException.cpp b/lldb/source/Plugins/Language/ObjC/NSException.cpp --- a/lldb/source/Plugins/Language/ObjC/NSException.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSException.cpp @@ -96,21 +96,19 @@ bool lldb_private::formatters::NSException_SummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { - lldb::ValueObjectSP name_sp; lldb::ValueObjectSP reason_sp; - if (!ExtractFields(valobj, &name_sp, &reason_sp, nullptr, nullptr)) + if (!ExtractFields(valobj, nullptr, &reason_sp, nullptr, nullptr)) return false; - if (!name_sp || !reason_sp) + if (!reason_sp) { + stream.Printf("No reason"); return false; + } - StreamString name_str_summary; StreamString reason_str_summary; - if (NSStringSummaryProvider(*name_sp, name_str_summary, options) && - NSStringSummaryProvider(*reason_sp, reason_str_summary, options) && - !name_str_summary.Empty() && !reason_str_summary.Empty()) { - stream.Printf("name: %s - reason: %s", name_str_summary.GetData(), - reason_str_summary.GetData()); + if (NSStringSummaryProvider(*reason_sp, reason_str_summary, options) && + !reason_str_summary.Empty()) { + stream.Printf("%s", reason_str_summary.GetData()); return true; } else return false; diff --git a/lldb/test/Shell/Settings/Inputs/main.cpp b/lldb/test/Shell/Settings/Inputs/main.cpp new file mode 100644 --- /dev/null +++ b/lldb/test/Shell/Settings/Inputs/main.cpp @@ -0,0 +1,29 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +class Increment { +public: + Increment(int value) { Increment::value += value; } + + static const int GetValue(); + +private: + static int value; +}; + +int Increment::value = 40; + +const int Increment::GetValue() { + return value; // Set break point at this line. +} + +int main() { + Increment i(2); + const int new_val = Increment::GetValue(); + return new_val; +} diff --git a/lldb/test/Shell/Settings/TestFrameFormatMangling.test b/lldb/test/Shell/Settings/TestFrameFormatMangling.test new file mode 100644 --- /dev/null +++ b/lldb/test/Shell/Settings/TestFrameFormatMangling.test @@ -0,0 +1,12 @@ +# UNSUPPORTED: system-windows +# RUN: %clangxx_host -g -O0 %S/Inputs/main.cpp -o %t.out +# RUN: %lldb -b -s %s %t.out | FileCheck %s +br set -p "Set break" +run +frame info +# CHECK: frame #0: {{.*}}Increment::GetValue() +set set frame-format "frame #${frame.index}: ${frame.pc}{ ${module.file.basename}{\`${function.mangled-name}}\n" +frame info +# CHECK: frame #0: {{.*}}_ZN9Increment8GetValueEv +c +q