Skip to content

Commit 9bb1905

Browse files
authored
Merge pull request #11555 from swiftlang/lldb/reland-macho-objc-metadata-parsing-to-21.x
Reland "[lldb][MachO] Fix inspection of global variables that start with 'O'"
2 parents 20931d2 + b290498 commit 9bb1905

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
@@ -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,15 @@ 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-
}
2849+
if (TryParseV2ObjCMetadataSymbol(
2850+
symbol_name, symbol_name_non_abi_mangled,
2851+
type)) {
2852+
demangled_is_synthesized = true;
28412853
} else {
28422854
if (nlist.n_value != 0)
28432855
symbol_section = section_info.GetSection(
28442856
nlist.n_sect, nlist.n_value);
2857+
28452858
type = eSymbolTypeData;
28462859
}
28472860
break;
@@ -3327,48 +3340,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
33273340
symbol_sect_name) {
33283341
type = eSymbolTypeRuntime;
33293342

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-
}
3343+
if (TryParseV2ObjCMetadataSymbol(
3344+
symbol_name,
3345+
symbol_name_non_abi_mangled, type))
3346+
demangled_is_synthesized = true;
33723347
} else if (symbol_sect_name &&
33733348
::strstr(symbol_sect_name,
33743349
"__gcc_except_tab") ==
@@ -3725,7 +3700,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37253700

37263701
if (is_debug) {
37273702
switch (nlist.n_type) {
3728-
case N_GSYM:
3703+
case N_GSYM: {
37293704
// global symbol: name,,NO_SECT,type,0
37303705
// Sometimes the N_GSYM value contains the address.
37313706

@@ -3741,33 +3716,17 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37413716
is_gsym = true;
37423717
sym[sym_idx].SetExternal(true);
37433718

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-
}
3719+
if (TryParseV2ObjCMetadataSymbol(symbol_name,
3720+
symbol_name_non_abi_mangled, type)) {
3721+
demangled_is_synthesized = true;
37643722
} else {
37653723
if (nlist.n_value != 0)
37663724
symbol_section =
37673725
section_info.GetSection(nlist.n_sect, nlist.n_value);
3726+
37683727
type = eSymbolTypeData;
37693728
}
3770-
break;
3729+
} break;
37713730

37723731
case N_FNAME:
37733732
// procedure name (f77 kludge): name,,NO_SECT,0,0
@@ -4208,38 +4167,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
42084167
::strstr(symbol_sect_name, "__objc") == symbol_sect_name) {
42094168
type = eSymbolTypeRuntime;
42104169

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-
}
4170+
if (TryParseV2ObjCMetadataSymbol(
4171+
symbol_name, symbol_name_non_abi_mangled, type))
4172+
demangled_is_synthesized = true;
42434173
} else if (symbol_sect_name &&
42444174
::strstr(symbol_sect_name, "__gcc_except_tab") ==
42454175
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)