Skip to content

Commit bfff296

Browse files
Merge pull request #11542 from swiftlang/lldb/macho-objc-metadata-parsing-to-6.2.1
🍒 [lldb][MachO] Fix inspection of global variables that start with 'O'
2 parents 8f4508e + b24ddff commit bfff296

File tree

3 files changed

+91
-126
lines changed

3 files changed

+91
-126
lines changed

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

Lines changed: 55 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -2306,6 +2306,43 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
23062306
return true;
23072307
}
23082308

2309+
static bool
2310+
TryParseV2ObjCMetadataSymbol(const char *&symbol_name,
2311+
const char *&symbol_name_non_abi_mangled,
2312+
SymbolType &type) {
2313+
static constexpr llvm::StringLiteral g_objc_v2_prefix_class("_OBJC_CLASS_$_");
2314+
static constexpr llvm::StringLiteral g_objc_v2_prefix_metaclass(
2315+
"_OBJC_METACLASS_$_");
2316+
static constexpr llvm::StringLiteral g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
2317+
2318+
llvm::StringRef symbol_name_ref(symbol_name);
2319+
if (symbol_name_ref.empty())
2320+
return false;
2321+
2322+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
2323+
symbol_name_non_abi_mangled = symbol_name + 1;
2324+
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
2325+
type = eSymbolTypeObjCClass;
2326+
return true;
2327+
}
2328+
2329+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) {
2330+
symbol_name_non_abi_mangled = symbol_name + 1;
2331+
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
2332+
type = eSymbolTypeObjCMetaClass;
2333+
return true;
2334+
}
2335+
2336+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
2337+
symbol_name_non_abi_mangled = symbol_name + 1;
2338+
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
2339+
type = eSymbolTypeObjCIVar;
2340+
return true;
2341+
}
2342+
2343+
return false;
2344+
}
2345+
23092346
static SymbolType GetSymbolType(const char *&symbol_name,
23102347
bool &demangled_is_synthesized,
23112348
const SectionSP &text_section_sp,
@@ -2422,9 +2459,6 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
24222459
lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
24232460
uint32_t i;
24242461
FileSpecList dylib_files;
2425-
llvm::StringRef g_objc_v2_prefix_class("_OBJC_CLASS_$_");
2426-
llvm::StringRef g_objc_v2_prefix_metaclass("_OBJC_METACLASS_$_");
2427-
llvm::StringRef g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
24282462
UUID image_uuid;
24292463

24302464
for (i = 0; i < m_header.ncmds; ++i) {
@@ -3057,36 +3091,15 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
30573091
is_gsym = true;
30583092
sym[sym_idx].SetExternal(true);
30593093

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-
}
3094+
if (TryParseV2ObjCMetadataSymbol(
3095+
symbol_name, symbol_name_non_abi_mangled,
3096+
type)) {
3097+
demangled_is_synthesized = true;
30863098
} else {
30873099
if (nlist.n_value != 0)
30883100
symbol_section = section_info.GetSection(
30893101
nlist.n_sect, nlist.n_value);
3102+
30903103
type = eSymbolTypeData;
30913104
}
30923105
break;
@@ -3572,48 +3585,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
35723585
symbol_sect_name) {
35733586
type = eSymbolTypeRuntime;
35743587

3575-
if (symbol_name) {
3576-
llvm::StringRef symbol_name_ref(symbol_name);
3577-
if (symbol_name_ref.starts_with("_OBJC_")) {
3578-
llvm::StringRef
3579-
g_objc_v2_prefix_class(
3580-
"_OBJC_CLASS_$_");
3581-
llvm::StringRef
3582-
g_objc_v2_prefix_metaclass(
3583-
"_OBJC_METACLASS_$_");
3584-
llvm::StringRef
3585-
g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
3586-
if (symbol_name_ref.starts_with(
3587-
g_objc_v2_prefix_class)) {
3588-
symbol_name_non_abi_mangled =
3589-
symbol_name + 1;
3590-
symbol_name =
3591-
symbol_name +
3592-
g_objc_v2_prefix_class.size();
3593-
type = eSymbolTypeObjCClass;
3594-
demangled_is_synthesized = true;
3595-
} else if (
3596-
symbol_name_ref.starts_with(
3597-
g_objc_v2_prefix_metaclass)) {
3598-
symbol_name_non_abi_mangled =
3599-
symbol_name + 1;
3600-
symbol_name =
3601-
symbol_name +
3602-
g_objc_v2_prefix_metaclass.size();
3603-
type = eSymbolTypeObjCMetaClass;
3604-
demangled_is_synthesized = true;
3605-
} else if (symbol_name_ref.starts_with(
3606-
g_objc_v2_prefix_ivar)) {
3607-
symbol_name_non_abi_mangled =
3608-
symbol_name + 1;
3609-
symbol_name =
3610-
symbol_name +
3611-
g_objc_v2_prefix_ivar.size();
3612-
type = eSymbolTypeObjCIVar;
3613-
demangled_is_synthesized = true;
3614-
}
3615-
}
3616-
}
3588+
if (TryParseV2ObjCMetadataSymbol(
3589+
symbol_name,
3590+
symbol_name_non_abi_mangled, type))
3591+
demangled_is_synthesized = true;
36173592
} else if (symbol_sect_name &&
36183593
::strstr(symbol_sect_name,
36193594
"__gcc_except_tab") ==
@@ -3970,7 +3945,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39703945

39713946
if (is_debug) {
39723947
switch (nlist.n_type) {
3973-
case N_GSYM:
3948+
case N_GSYM: {
39743949
// global symbol: name,,NO_SECT,type,0
39753950
// Sometimes the N_GSYM value contains the address.
39763951

@@ -3986,33 +3961,17 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39863961
is_gsym = true;
39873962
sym[sym_idx].SetExternal(true);
39883963

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-
}
3964+
if (TryParseV2ObjCMetadataSymbol(symbol_name,
3965+
symbol_name_non_abi_mangled, type)) {
3966+
demangled_is_synthesized = true;
40093967
} else {
40103968
if (nlist.n_value != 0)
40113969
symbol_section =
40123970
section_info.GetSection(nlist.n_sect, nlist.n_value);
3971+
40133972
type = eSymbolTypeData;
40143973
}
4015-
break;
3974+
} break;
40163975

40173976
case N_FNAME:
40183977
// procedure name (f77 kludge): name,,NO_SECT,0,0
@@ -4453,38 +4412,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
44534412
::strstr(symbol_sect_name, "__objc") == symbol_sect_name) {
44544413
type = eSymbolTypeRuntime;
44554414

4456-
if (symbol_name) {
4457-
llvm::StringRef symbol_name_ref(symbol_name);
4458-
if (symbol_name_ref.starts_with("_OBJC_")) {
4459-
llvm::StringRef g_objc_v2_prefix_class(
4460-
"_OBJC_CLASS_$_");
4461-
llvm::StringRef g_objc_v2_prefix_metaclass(
4462-
"_OBJC_METACLASS_$_");
4463-
llvm::StringRef g_objc_v2_prefix_ivar(
4464-
"_OBJC_IVAR_$_");
4465-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
4466-
symbol_name_non_abi_mangled = symbol_name + 1;
4467-
symbol_name =
4468-
symbol_name + g_objc_v2_prefix_class.size();
4469-
type = eSymbolTypeObjCClass;
4470-
demangled_is_synthesized = true;
4471-
} else if (symbol_name_ref.starts_with(
4472-
g_objc_v2_prefix_metaclass)) {
4473-
symbol_name_non_abi_mangled = symbol_name + 1;
4474-
symbol_name =
4475-
symbol_name + g_objc_v2_prefix_metaclass.size();
4476-
type = eSymbolTypeObjCMetaClass;
4477-
demangled_is_synthesized = true;
4478-
} else if (symbol_name_ref.starts_with(
4479-
g_objc_v2_prefix_ivar)) {
4480-
symbol_name_non_abi_mangled = symbol_name + 1;
4481-
symbol_name =
4482-
symbol_name + g_objc_v2_prefix_ivar.size();
4483-
type = eSymbolTypeObjCIVar;
4484-
demangled_is_synthesized = true;
4485-
}
4486-
}
4487-
}
4415+
if (TryParseV2ObjCMetadataSymbol(
4416+
symbol_name, symbol_name_non_abi_mangled, type))
4417+
demangled_is_synthesized = true;
44884418
} else if (symbol_sect_name &&
44894419
::strstr(symbol_sect_name, "__gcc_except_tab") ==
44904420
symbol_sect_name) {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// XFAIL: target-windows
2+
3+
// Tests that LLDB correctly parses global symbols
4+
// starting with 'O'. On some platforms (e.g., Darwin)
5+
// C-symbols are prefixed with a '_'. The LLDB Macho-O
6+
// parses handles Objective-C metadata symbols starting
7+
// with '_OBJC' specially. This test ensures that we don't
8+
// lose track of regular global symbols with a '_O' prefix
9+
// in this.
10+
11+
// RUN: %clang_host -c -g -fno-common %s -o %t.o
12+
// RUN: %clang_host %t.o -o %t.out
13+
// RUN: %lldb -b -x %t.out \
14+
// RUN: -o "b 29" \
15+
// RUN: -o "run" \
16+
// RUN: -o "p OglobalVar" \
17+
// RUN: -o "p Oabc" | FileCheck %s
18+
19+
typedef struct {
20+
int a;
21+
} Oabc_t;
22+
23+
Oabc_t Oabc;
24+
int OglobalVar;
25+
26+
int main(int argc, const char *argv[]) {
27+
Oabc.a = 15;
28+
OglobalVar = 10;
29+
return OglobalVar + Oabc.a;
30+
}
31+
32+
// CHECK: (lldb) p OglobalVar
33+
// CHECK: (int) 10
34+
// CHECK: (lldb) p Oabc
35+
// CHECK: (Oabc_t) (a = 15)

lldb/test/Shell/lit.cfg.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
# suffixes: A list of file extensions to treat as test files. This is overriden
2727
# by individual lit.local.cfg files in the test subdirectories.
28-
config.suffixes = [".test", ".cpp", ".s", ".m"]
28+
config.suffixes = [".test", ".cpp", ".s", ".m", ".ll", ".c"]
2929

3030
# excludes: A list of directories to exclude from the testsuite. The 'Inputs'
3131
# subdirectories contain auxiliary inputs for various tests in their parent

0 commit comments

Comments
 (0)