Skip to content

Commit 1aefbce

Browse files
committed
[lldb][MachO] Fix inspection of global variables that start with 'O' (llvm#161521)
On Darwin C-symbols are prefixed with a '_'. The LLDB Macho-O parses handles Objective-C metadata symbols starting with '_OBJC' specially. Previously global symbols starting with a '_O' prefix were lost because of incorrectly scoped if-guards. This patch removes those checks. There is more cleanup that can be done in this file because there's a bunch of duplicated checks for these ObjC symbols. I decided to leave that for an NFC follow-up. Depends on llvm#161520 rdar://158159242 (cherry picked from commit 9f7e7f7)
1 parent e6fd6d9 commit 1aefbce

File tree

2 files changed

+75
-48
lines changed

2 files changed

+75
-48
lines changed

lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp

Lines changed: 42 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2812,32 +2812,29 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
28122812
is_gsym = true;
28132813
sym[sym_idx].SetExternal(true);
28142814

2815-
if (symbol_name && symbol_name[0] == '_' &&
2816-
symbol_name[1] == 'O') {
2817-
llvm::StringRef symbol_name_ref(symbol_name);
2818-
if (symbol_name_ref.starts_with(
2819-
g_objc_v2_prefix_class)) {
2820-
symbol_name_non_abi_mangled = symbol_name + 1;
2821-
symbol_name =
2822-
symbol_name + g_objc_v2_prefix_class.size();
2823-
type = eSymbolTypeObjCClass;
2824-
demangled_is_synthesized = true;
2825-
2826-
} else if (symbol_name_ref.starts_with(
2827-
g_objc_v2_prefix_metaclass)) {
2828-
symbol_name_non_abi_mangled = symbol_name + 1;
2829-
symbol_name =
2830-
symbol_name + g_objc_v2_prefix_metaclass.size();
2831-
type = eSymbolTypeObjCMetaClass;
2832-
demangled_is_synthesized = true;
2833-
} else if (symbol_name_ref.starts_with(
2834-
g_objc_v2_prefix_ivar)) {
2835-
symbol_name_non_abi_mangled = symbol_name + 1;
2836-
symbol_name =
2837-
symbol_name + g_objc_v2_prefix_ivar.size();
2838-
type = eSymbolTypeObjCIVar;
2839-
demangled_is_synthesized = true;
2840-
}
2815+
llvm::StringRef symbol_name_ref(symbol_name);
2816+
if (symbol_name_ref.starts_with(
2817+
g_objc_v2_prefix_class)) {
2818+
symbol_name_non_abi_mangled = symbol_name + 1;
2819+
symbol_name =
2820+
symbol_name + g_objc_v2_prefix_class.size();
2821+
type = eSymbolTypeObjCClass;
2822+
demangled_is_synthesized = true;
2823+
2824+
} else if (symbol_name_ref.starts_with(
2825+
g_objc_v2_prefix_metaclass)) {
2826+
symbol_name_non_abi_mangled = symbol_name + 1;
2827+
symbol_name =
2828+
symbol_name + g_objc_v2_prefix_metaclass.size();
2829+
type = eSymbolTypeObjCMetaClass;
2830+
demangled_is_synthesized = true;
2831+
} else if (symbol_name_ref.starts_with(
2832+
g_objc_v2_prefix_ivar)) {
2833+
symbol_name_non_abi_mangled = symbol_name + 1;
2834+
symbol_name =
2835+
symbol_name + g_objc_v2_prefix_ivar.size();
2836+
type = eSymbolTypeObjCIVar;
2837+
demangled_is_synthesized = true;
28412838
} else {
28422839
if (nlist.n_value != 0)
28432840
symbol_section = section_info.GetSection(
@@ -3725,7 +3722,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37253722

37263723
if (is_debug) {
37273724
switch (nlist.n_type) {
3728-
case N_GSYM:
3725+
case N_GSYM: {
37293726
// global symbol: name,,NO_SECT,type,0
37303727
// Sometimes the N_GSYM value contains the address.
37313728

@@ -3741,33 +3738,30 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37413738
is_gsym = true;
37423739
sym[sym_idx].SetExternal(true);
37433740

3744-
if (symbol_name && symbol_name[0] == '_' && symbol_name[1] == 'O') {
3745-
llvm::StringRef symbol_name_ref(symbol_name);
3746-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
3747-
symbol_name_non_abi_mangled = symbol_name + 1;
3748-
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
3749-
type = eSymbolTypeObjCClass;
3750-
demangled_is_synthesized = true;
3751-
3752-
} else if (symbol_name_ref.starts_with(
3753-
g_objc_v2_prefix_metaclass)) {
3754-
symbol_name_non_abi_mangled = symbol_name + 1;
3755-
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
3756-
type = eSymbolTypeObjCMetaClass;
3757-
demangled_is_synthesized = true;
3758-
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
3759-
symbol_name_non_abi_mangled = symbol_name + 1;
3760-
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
3761-
type = eSymbolTypeObjCIVar;
3762-
demangled_is_synthesized = true;
3763-
}
3741+
llvm::StringRef symbol_name_ref(symbol_name);
3742+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
3743+
symbol_name_non_abi_mangled = symbol_name + 1;
3744+
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
3745+
type = eSymbolTypeObjCClass;
3746+
demangled_is_synthesized = true;
3747+
3748+
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) {
3749+
symbol_name_non_abi_mangled = symbol_name + 1;
3750+
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
3751+
type = eSymbolTypeObjCMetaClass;
3752+
demangled_is_synthesized = true;
3753+
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
3754+
symbol_name_non_abi_mangled = symbol_name + 1;
3755+
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
3756+
type = eSymbolTypeObjCIVar;
3757+
demangled_is_synthesized = true;
37643758
} else {
37653759
if (nlist.n_value != 0)
37663760
symbol_section =
37673761
section_info.GetSection(nlist.n_sect, nlist.n_value);
37683762
type = eSymbolTypeData;
37693763
}
3770-
break;
3764+
} break;
37713765

37723766
case N_FNAME:
37733767
// procedure name (f77 kludge): name,,NO_SECT,0,0
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Tests that LLDB correctly parses global symbols
2+
// starting with 'O'. On some platforms (e.g., Darwin)
3+
// C-symbols are prefixed with a '_'. The LLDB Macho-O
4+
// parses handles Objective-C metadata symbols starting
5+
// with '_OBJC' specially. This test ensures that we don't
6+
// lose track of regular global symbols with a '_O' prefix
7+
// in this.
8+
9+
// RUN: %clang_host -c -g -fno-common %s -o %t.o
10+
// RUN: %clang_host %t.o -o %t.out
11+
// RUN: %lldb -b -x %t.out \
12+
// RUN: -o "b 27" \
13+
// RUN: -o "run" \
14+
// RUN: -o "p OglobalVar" \
15+
// RUN: -o "p Oabc" | FileCheck %s
16+
17+
typedef struct {
18+
int a;
19+
} Oabc_t;
20+
21+
Oabc_t Oabc;
22+
int OglobalVar;
23+
24+
int main(int argc, const char *argv[]) {
25+
Oabc.a = 15;
26+
OglobalVar = 10;
27+
return OglobalVar + Oabc.a;
28+
}
29+
30+
// CHECK: (lldb) p OglobalVar
31+
// CHECK: (int) 10
32+
// CHECK: (lldb) p Oabc
33+
// CHECK: (Oabc_t) (a = 15)

0 commit comments

Comments
 (0)