Skip to content

Commit b244b0d

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 03f8ecb commit b244b0d

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

3060-
if (symbol_name && symbol_name[0] == '_' &&
3061-
symbol_name[1] == 'O') {
3062-
llvm::StringRef symbol_name_ref(symbol_name);
3063-
if (symbol_name_ref.starts_with(
3064-
g_objc_v2_prefix_class)) {
3065-
symbol_name_non_abi_mangled = symbol_name + 1;
3066-
symbol_name =
3067-
symbol_name + g_objc_v2_prefix_class.size();
3068-
type = eSymbolTypeObjCClass;
3069-
demangled_is_synthesized = true;
3070-
3071-
} else if (symbol_name_ref.starts_with(
3072-
g_objc_v2_prefix_metaclass)) {
3073-
symbol_name_non_abi_mangled = symbol_name + 1;
3074-
symbol_name =
3075-
symbol_name + g_objc_v2_prefix_metaclass.size();
3076-
type = eSymbolTypeObjCMetaClass;
3077-
demangled_is_synthesized = true;
3078-
} else if (symbol_name_ref.starts_with(
3079-
g_objc_v2_prefix_ivar)) {
3080-
symbol_name_non_abi_mangled = symbol_name + 1;
3081-
symbol_name =
3082-
symbol_name + g_objc_v2_prefix_ivar.size();
3083-
type = eSymbolTypeObjCIVar;
3084-
demangled_is_synthesized = true;
3085-
}
3060+
llvm::StringRef symbol_name_ref(symbol_name);
3061+
if (symbol_name_ref.starts_with(
3062+
g_objc_v2_prefix_class)) {
3063+
symbol_name_non_abi_mangled = symbol_name + 1;
3064+
symbol_name =
3065+
symbol_name + g_objc_v2_prefix_class.size();
3066+
type = eSymbolTypeObjCClass;
3067+
demangled_is_synthesized = true;
3068+
3069+
} else if (symbol_name_ref.starts_with(
3070+
g_objc_v2_prefix_metaclass)) {
3071+
symbol_name_non_abi_mangled = symbol_name + 1;
3072+
symbol_name =
3073+
symbol_name + g_objc_v2_prefix_metaclass.size();
3074+
type = eSymbolTypeObjCMetaClass;
3075+
demangled_is_synthesized = true;
3076+
} else if (symbol_name_ref.starts_with(
3077+
g_objc_v2_prefix_ivar)) {
3078+
symbol_name_non_abi_mangled = symbol_name + 1;
3079+
symbol_name =
3080+
symbol_name + g_objc_v2_prefix_ivar.size();
3081+
type = eSymbolTypeObjCIVar;
3082+
demangled_is_synthesized = true;
30863083
} else {
30873084
if (nlist.n_value != 0)
30883085
symbol_section = section_info.GetSection(
@@ -3970,7 +3967,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39703967

39713968
if (is_debug) {
39723969
switch (nlist.n_type) {
3973-
case N_GSYM:
3970+
case N_GSYM: {
39743971
// global symbol: name,,NO_SECT,type,0
39753972
// Sometimes the N_GSYM value contains the address.
39763973

@@ -3986,33 +3983,30 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39863983
is_gsym = true;
39873984
sym[sym_idx].SetExternal(true);
39883985

3989-
if (symbol_name && symbol_name[0] == '_' && symbol_name[1] == 'O') {
3990-
llvm::StringRef symbol_name_ref(symbol_name);
3991-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
3992-
symbol_name_non_abi_mangled = symbol_name + 1;
3993-
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
3994-
type = eSymbolTypeObjCClass;
3995-
demangled_is_synthesized = true;
3996-
3997-
} else if (symbol_name_ref.starts_with(
3998-
g_objc_v2_prefix_metaclass)) {
3999-
symbol_name_non_abi_mangled = symbol_name + 1;
4000-
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
4001-
type = eSymbolTypeObjCMetaClass;
4002-
demangled_is_synthesized = true;
4003-
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
4004-
symbol_name_non_abi_mangled = symbol_name + 1;
4005-
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
4006-
type = eSymbolTypeObjCIVar;
4007-
demangled_is_synthesized = true;
4008-
}
3986+
llvm::StringRef symbol_name_ref(symbol_name);
3987+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
3988+
symbol_name_non_abi_mangled = symbol_name + 1;
3989+
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
3990+
type = eSymbolTypeObjCClass;
3991+
demangled_is_synthesized = true;
3992+
3993+
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) {
3994+
symbol_name_non_abi_mangled = symbol_name + 1;
3995+
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
3996+
type = eSymbolTypeObjCMetaClass;
3997+
demangled_is_synthesized = true;
3998+
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
3999+
symbol_name_non_abi_mangled = symbol_name + 1;
4000+
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
4001+
type = eSymbolTypeObjCIVar;
4002+
demangled_is_synthesized = true;
40094003
} else {
40104004
if (nlist.n_value != 0)
40114005
symbol_section =
40124006
section_info.GetSection(nlist.n_sect, nlist.n_value);
40134007
type = eSymbolTypeData;
40144008
}
4015-
break;
4009+
} break;
40164010

40174011
case N_FNAME:
40184012
// 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)