Skip to content

Commit 9f7e7f7

Browse files
authored
[lldb][MachO] Fix inspection of global variables that start with 'O' (#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 #161520 rdar://158159242
1 parent 825d82d commit 9f7e7f7

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
@@ -2805,32 +2805,29 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
28052805
is_gsym = true;
28062806
sym[sym_idx].SetExternal(true);
28072807

2808-
if (symbol_name && symbol_name[0] == '_' &&
2809-
symbol_name[1] == 'O') {
2810-
llvm::StringRef symbol_name_ref(symbol_name);
2811-
if (symbol_name_ref.starts_with(
2812-
g_objc_v2_prefix_class)) {
2813-
symbol_name_non_abi_mangled = symbol_name + 1;
2814-
symbol_name =
2815-
symbol_name + g_objc_v2_prefix_class.size();
2816-
type = eSymbolTypeObjCClass;
2817-
demangled_is_synthesized = true;
2818-
2819-
} else if (symbol_name_ref.starts_with(
2820-
g_objc_v2_prefix_metaclass)) {
2821-
symbol_name_non_abi_mangled = symbol_name + 1;
2822-
symbol_name =
2823-
symbol_name + g_objc_v2_prefix_metaclass.size();
2824-
type = eSymbolTypeObjCMetaClass;
2825-
demangled_is_synthesized = true;
2826-
} else if (symbol_name_ref.starts_with(
2827-
g_objc_v2_prefix_ivar)) {
2828-
symbol_name_non_abi_mangled = symbol_name + 1;
2829-
symbol_name =
2830-
symbol_name + g_objc_v2_prefix_ivar.size();
2831-
type = eSymbolTypeObjCIVar;
2832-
demangled_is_synthesized = true;
2833-
}
2808+
llvm::StringRef symbol_name_ref(symbol_name);
2809+
if (symbol_name_ref.starts_with(
2810+
g_objc_v2_prefix_class)) {
2811+
symbol_name_non_abi_mangled = symbol_name + 1;
2812+
symbol_name =
2813+
symbol_name + g_objc_v2_prefix_class.size();
2814+
type = eSymbolTypeObjCClass;
2815+
demangled_is_synthesized = true;
2816+
2817+
} else if (symbol_name_ref.starts_with(
2818+
g_objc_v2_prefix_metaclass)) {
2819+
symbol_name_non_abi_mangled = symbol_name + 1;
2820+
symbol_name =
2821+
symbol_name + g_objc_v2_prefix_metaclass.size();
2822+
type = eSymbolTypeObjCMetaClass;
2823+
demangled_is_synthesized = true;
2824+
} else if (symbol_name_ref.starts_with(
2825+
g_objc_v2_prefix_ivar)) {
2826+
symbol_name_non_abi_mangled = symbol_name + 1;
2827+
symbol_name =
2828+
symbol_name + g_objc_v2_prefix_ivar.size();
2829+
type = eSymbolTypeObjCIVar;
2830+
demangled_is_synthesized = true;
28342831
} else {
28352832
if (nlist.n_value != 0)
28362833
symbol_section = section_info.GetSection(
@@ -3652,7 +3649,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
36523649

36533650
if (is_debug) {
36543651
switch (nlist.n_type) {
3655-
case N_GSYM:
3652+
case N_GSYM: {
36563653
// global symbol: name,,NO_SECT,type,0
36573654
// Sometimes the N_GSYM value contains the address.
36583655

@@ -3668,33 +3665,30 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
36683665
is_gsym = true;
36693666
sym[sym_idx].SetExternal(true);
36703667

3671-
if (symbol_name && symbol_name[0] == '_' && symbol_name[1] == 'O') {
3672-
llvm::StringRef symbol_name_ref(symbol_name);
3673-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
3674-
symbol_name_non_abi_mangled = symbol_name + 1;
3675-
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
3676-
type = eSymbolTypeObjCClass;
3677-
demangled_is_synthesized = true;
3678-
3679-
} else if (symbol_name_ref.starts_with(
3680-
g_objc_v2_prefix_metaclass)) {
3681-
symbol_name_non_abi_mangled = symbol_name + 1;
3682-
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
3683-
type = eSymbolTypeObjCMetaClass;
3684-
demangled_is_synthesized = true;
3685-
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
3686-
symbol_name_non_abi_mangled = symbol_name + 1;
3687-
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
3688-
type = eSymbolTypeObjCIVar;
3689-
demangled_is_synthesized = true;
3690-
}
3668+
llvm::StringRef symbol_name_ref(symbol_name);
3669+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
3670+
symbol_name_non_abi_mangled = symbol_name + 1;
3671+
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
3672+
type = eSymbolTypeObjCClass;
3673+
demangled_is_synthesized = true;
3674+
3675+
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) {
3676+
symbol_name_non_abi_mangled = symbol_name + 1;
3677+
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
3678+
type = eSymbolTypeObjCMetaClass;
3679+
demangled_is_synthesized = true;
3680+
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
3681+
symbol_name_non_abi_mangled = symbol_name + 1;
3682+
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
3683+
type = eSymbolTypeObjCIVar;
3684+
demangled_is_synthesized = true;
36913685
} else {
36923686
if (nlist.n_value != 0)
36933687
symbol_section =
36943688
section_info.GetSection(nlist.n_sect, nlist.n_value);
36953689
type = eSymbolTypeData;
36963690
}
3697-
break;
3691+
} break;
36983692

36993693
case N_FNAME:
37003694
// 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)