Skip to content

Commit 86fac95

Browse files
authored
Merge pull request #11541 from swiftlang/lldb/macho-objc-metadata-parsing-to-21.x
🍒 [lldb][MachO] Fix inspection of global variables that start with 'O'
2 parents 35450ce + a561221 commit 86fac95

File tree

3 files changed

+92
-135
lines changed

3 files changed

+92
-135
lines changed

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

Lines changed: 58 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -2072,6 +2072,43 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
20722072
return true;
20732073
}
20742074

2075+
static bool
2076+
TryParseV2ObjCMetadataSymbol(const char *&symbol_name,
2077+
const char *&symbol_name_non_abi_mangled,
2078+
SymbolType &type) {
2079+
static constexpr llvm::StringLiteral g_objc_v2_prefix_class("_OBJC_CLASS_$_");
2080+
static constexpr llvm::StringLiteral g_objc_v2_prefix_metaclass(
2081+
"_OBJC_METACLASS_$_");
2082+
static constexpr llvm::StringLiteral g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
2083+
2084+
llvm::StringRef symbol_name_ref(symbol_name);
2085+
if (symbol_name_ref.empty())
2086+
return false;
2087+
2088+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
2089+
symbol_name_non_abi_mangled = symbol_name + 1;
2090+
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
2091+
type = eSymbolTypeObjCClass;
2092+
return true;
2093+
}
2094+
2095+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) {
2096+
symbol_name_non_abi_mangled = symbol_name + 1;
2097+
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
2098+
type = eSymbolTypeObjCMetaClass;
2099+
return true;
2100+
}
2101+
2102+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
2103+
symbol_name_non_abi_mangled = symbol_name + 1;
2104+
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
2105+
type = eSymbolTypeObjCIVar;
2106+
return true;
2107+
}
2108+
2109+
return false;
2110+
}
2111+
20752112
static SymbolType GetSymbolType(const char *&symbol_name,
20762113
bool &demangled_is_synthesized,
20772114
const SectionSP &text_section_sp,
@@ -2188,9 +2225,6 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
21882225
lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
21892226
uint32_t i;
21902227
FileSpecList dylib_files;
2191-
llvm::StringRef g_objc_v2_prefix_class("_OBJC_CLASS_$_");
2192-
llvm::StringRef g_objc_v2_prefix_metaclass("_OBJC_METACLASS_$_");
2193-
llvm::StringRef g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
21942228
UUID image_uuid;
21952229

21962230
for (i = 0; i < m_header.ncmds; ++i) {
@@ -2812,36 +2846,13 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
28122846
is_gsym = true;
28132847
sym[sym_idx].SetExternal(true);
28142848

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-
}
2841-
} else {
2842-
if (nlist.n_value != 0)
2843-
symbol_section = section_info.GetSection(
2844-
nlist.n_sect, nlist.n_value);
2849+
if (TryParseV2ObjCMetadataSymbol(
2850+
symbol_name, symbol_name_non_abi_mangled,
2851+
type)) {
2852+
demangled_is_synthesized = true;
2853+
} else if (nlist.n_value != 0) {
2854+
symbol_section = section_info.GetSection(
2855+
nlist.n_sect, nlist.n_value);
28452856
type = eSymbolTypeData;
28462857
}
28472858
break;
@@ -3326,49 +3337,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
33263337
::strstr(symbol_sect_name, "__objc") ==
33273338
symbol_sect_name) {
33283339
type = eSymbolTypeRuntime;
3329-
3330-
if (symbol_name) {
3331-
llvm::StringRef symbol_name_ref(symbol_name);
3332-
if (symbol_name_ref.starts_with("_OBJC_")) {
3333-
llvm::StringRef
3334-
g_objc_v2_prefix_class(
3335-
"_OBJC_CLASS_$_");
3336-
llvm::StringRef
3337-
g_objc_v2_prefix_metaclass(
3338-
"_OBJC_METACLASS_$_");
3339-
llvm::StringRef
3340-
g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
3341-
if (symbol_name_ref.starts_with(
3342-
g_objc_v2_prefix_class)) {
3343-
symbol_name_non_abi_mangled =
3344-
symbol_name + 1;
3345-
symbol_name =
3346-
symbol_name +
3347-
g_objc_v2_prefix_class.size();
3348-
type = eSymbolTypeObjCClass;
3349-
demangled_is_synthesized = true;
3350-
} else if (
3351-
symbol_name_ref.starts_with(
3352-
g_objc_v2_prefix_metaclass)) {
3353-
symbol_name_non_abi_mangled =
3354-
symbol_name + 1;
3355-
symbol_name =
3356-
symbol_name +
3357-
g_objc_v2_prefix_metaclass.size();
3358-
type = eSymbolTypeObjCMetaClass;
3359-
demangled_is_synthesized = true;
3360-
} else if (symbol_name_ref.starts_with(
3361-
g_objc_v2_prefix_ivar)) {
3362-
symbol_name_non_abi_mangled =
3363-
symbol_name + 1;
3364-
symbol_name =
3365-
symbol_name +
3366-
g_objc_v2_prefix_ivar.size();
3367-
type = eSymbolTypeObjCIVar;
3368-
demangled_is_synthesized = true;
3369-
}
3370-
}
3371-
}
3340+
demangled_is_synthesized =
3341+
TryParseV2ObjCMetadataSymbol(
3342+
symbol_name,
3343+
symbol_name_non_abi_mangled, type);
33723344
} else if (symbol_sect_name &&
33733345
::strstr(symbol_sect_name,
33743346
"__gcc_except_tab") ==
@@ -3725,7 +3697,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37253697

37263698
if (is_debug) {
37273699
switch (nlist.n_type) {
3728-
case N_GSYM:
3700+
case N_GSYM: {
37293701
// global symbol: name,,NO_SECT,type,0
37303702
// Sometimes the N_GSYM value contains the address.
37313703

@@ -3741,33 +3713,15 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37413713
is_gsym = true;
37423714
sym[sym_idx].SetExternal(true);
37433715

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-
}
3764-
} else {
3765-
if (nlist.n_value != 0)
3766-
symbol_section =
3767-
section_info.GetSection(nlist.n_sect, nlist.n_value);
3716+
if (TryParseV2ObjCMetadataSymbol(symbol_name,
3717+
symbol_name_non_abi_mangled, type)) {
3718+
demangled_is_synthesized = true;
3719+
} else if (nlist.n_value != 0) {
3720+
symbol_section =
3721+
section_info.GetSection(nlist.n_sect, nlist.n_value);
37683722
type = eSymbolTypeData;
37693723
}
3770-
break;
3724+
} break;
37713725

37723726
case N_FNAME:
37733727
// procedure name (f77 kludge): name,,NO_SECT,0,0
@@ -4207,39 +4161,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
42074161
if (symbol_sect_name &&
42084162
::strstr(symbol_sect_name, "__objc") == symbol_sect_name) {
42094163
type = eSymbolTypeRuntime;
4164+
demangled_is_synthesized = TryParseV2ObjCMetadataSymbol(
4165+
symbol_name, symbol_name_non_abi_mangled, type);
42104166

4211-
if (symbol_name) {
4212-
llvm::StringRef symbol_name_ref(symbol_name);
4213-
if (symbol_name_ref.starts_with("_OBJC_")) {
4214-
llvm::StringRef g_objc_v2_prefix_class(
4215-
"_OBJC_CLASS_$_");
4216-
llvm::StringRef g_objc_v2_prefix_metaclass(
4217-
"_OBJC_METACLASS_$_");
4218-
llvm::StringRef g_objc_v2_prefix_ivar(
4219-
"_OBJC_IVAR_$_");
4220-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
4221-
symbol_name_non_abi_mangled = symbol_name + 1;
4222-
symbol_name =
4223-
symbol_name + g_objc_v2_prefix_class.size();
4224-
type = eSymbolTypeObjCClass;
4225-
demangled_is_synthesized = true;
4226-
} else if (symbol_name_ref.starts_with(
4227-
g_objc_v2_prefix_metaclass)) {
4228-
symbol_name_non_abi_mangled = symbol_name + 1;
4229-
symbol_name =
4230-
symbol_name + g_objc_v2_prefix_metaclass.size();
4231-
type = eSymbolTypeObjCMetaClass;
4232-
demangled_is_synthesized = true;
4233-
} else if (symbol_name_ref.starts_with(
4234-
g_objc_v2_prefix_ivar)) {
4235-
symbol_name_non_abi_mangled = symbol_name + 1;
4236-
symbol_name =
4237-
symbol_name + g_objc_v2_prefix_ivar.size();
4238-
type = eSymbolTypeObjCIVar;
4239-
demangled_is_synthesized = true;
4240-
}
4241-
}
4242-
}
42434167
} else if (symbol_sect_name &&
42444168
::strstr(symbol_sect_name, "__gcc_except_tab") ==
42454169
symbol_sect_name) {
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)

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)