Skip to content

Commit 5c31819

Browse files
committed
Reland "[lldb][MachO][NFC] Extract ObjC metadata symbol parsing into helper function" (llvm#161655)
This reverts `5a80fb9177e3c831c9c574400a13d77393397f2a`. The original change got reverted because of failing tests on macOS. The issue was that I changed the scope of setting `type = eSymbolTypeData` during the cleanup. This patch relands the original patch but doesn't change the `else` branch to an `else if` branch. Tested that macOS test-suite passes. (cherry picked from commit 07974fe)
1 parent 3db956f commit 5c31819

File tree

1 file changed

+51
-115
lines changed

1 file changed

+51
-115
lines changed

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

Lines changed: 51 additions & 115 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,33 +2846,15 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
28122846
is_gsym = true;
28132847
sym[sym_idx].SetExternal(true);
28142848

2815-
llvm::StringRef symbol_name_ref(symbol_name);
2816-
if (symbol_name_ref.starts_with(
2817-
g_objc_v2_prefix_class)) {
2818-
symbol_name_non_abi_mangled = symbol_name + 1;
2819-
symbol_name =
2820-
symbol_name + g_objc_v2_prefix_class.size();
2821-
type = eSymbolTypeObjCClass;
2822-
demangled_is_synthesized = true;
2823-
2824-
} else if (symbol_name_ref.starts_with(
2825-
g_objc_v2_prefix_metaclass)) {
2826-
symbol_name_non_abi_mangled = symbol_name + 1;
2827-
symbol_name =
2828-
symbol_name + g_objc_v2_prefix_metaclass.size();
2829-
type = eSymbolTypeObjCMetaClass;
2830-
demangled_is_synthesized = true;
2831-
} else if (symbol_name_ref.starts_with(
2832-
g_objc_v2_prefix_ivar)) {
2833-
symbol_name_non_abi_mangled = symbol_name + 1;
2834-
symbol_name =
2835-
symbol_name + g_objc_v2_prefix_ivar.size();
2836-
type = eSymbolTypeObjCIVar;
2849+
if (TryParseV2ObjCMetadataSymbol(
2850+
symbol_name, symbol_name_non_abi_mangled,
2851+
type)) {
28372852
demangled_is_synthesized = true;
28382853
} else {
28392854
if (nlist.n_value != 0)
28402855
symbol_section = section_info.GetSection(
28412856
nlist.n_sect, nlist.n_value);
2857+
28422858
type = eSymbolTypeData;
28432859
}
28442860
break;
@@ -3324,48 +3340,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
33243340
symbol_sect_name) {
33253341
type = eSymbolTypeRuntime;
33263342

3327-
if (symbol_name) {
3328-
llvm::StringRef symbol_name_ref(symbol_name);
3329-
if (symbol_name_ref.starts_with("_OBJC_")) {
3330-
llvm::StringRef
3331-
g_objc_v2_prefix_class(
3332-
"_OBJC_CLASS_$_");
3333-
llvm::StringRef
3334-
g_objc_v2_prefix_metaclass(
3335-
"_OBJC_METACLASS_$_");
3336-
llvm::StringRef
3337-
g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
3338-
if (symbol_name_ref.starts_with(
3339-
g_objc_v2_prefix_class)) {
3340-
symbol_name_non_abi_mangled =
3341-
symbol_name + 1;
3342-
symbol_name =
3343-
symbol_name +
3344-
g_objc_v2_prefix_class.size();
3345-
type = eSymbolTypeObjCClass;
3346-
demangled_is_synthesized = true;
3347-
} else if (
3348-
symbol_name_ref.starts_with(
3349-
g_objc_v2_prefix_metaclass)) {
3350-
symbol_name_non_abi_mangled =
3351-
symbol_name + 1;
3352-
symbol_name =
3353-
symbol_name +
3354-
g_objc_v2_prefix_metaclass.size();
3355-
type = eSymbolTypeObjCMetaClass;
3356-
demangled_is_synthesized = true;
3357-
} else if (symbol_name_ref.starts_with(
3358-
g_objc_v2_prefix_ivar)) {
3359-
symbol_name_non_abi_mangled =
3360-
symbol_name + 1;
3361-
symbol_name =
3362-
symbol_name +
3363-
g_objc_v2_prefix_ivar.size();
3364-
type = eSymbolTypeObjCIVar;
3365-
demangled_is_synthesized = true;
3366-
}
3367-
}
3368-
}
3343+
if (TryParseV2ObjCMetadataSymbol(
3344+
symbol_name,
3345+
symbol_name_non_abi_mangled, type))
3346+
demangled_is_synthesized = true;
33693347
} else if (symbol_sect_name &&
33703348
::strstr(symbol_sect_name,
33713349
"__gcc_except_tab") ==
@@ -3738,27 +3716,14 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37383716
is_gsym = true;
37393717
sym[sym_idx].SetExternal(true);
37403718

3741-
llvm::StringRef symbol_name_ref(symbol_name);
3742-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
3743-
symbol_name_non_abi_mangled = symbol_name + 1;
3744-
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
3745-
type = eSymbolTypeObjCClass;
3746-
demangled_is_synthesized = true;
3747-
3748-
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) {
3749-
symbol_name_non_abi_mangled = symbol_name + 1;
3750-
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
3751-
type = eSymbolTypeObjCMetaClass;
3752-
demangled_is_synthesized = true;
3753-
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
3754-
symbol_name_non_abi_mangled = symbol_name + 1;
3755-
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
3756-
type = eSymbolTypeObjCIVar;
3719+
if (TryParseV2ObjCMetadataSymbol(symbol_name,
3720+
symbol_name_non_abi_mangled, type)) {
37573721
demangled_is_synthesized = true;
37583722
} else {
37593723
if (nlist.n_value != 0)
37603724
symbol_section =
37613725
section_info.GetSection(nlist.n_sect, nlist.n_value);
3726+
37623727
type = eSymbolTypeData;
37633728
}
37643729
} break;
@@ -4202,38 +4167,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
42024167
::strstr(symbol_sect_name, "__objc") == symbol_sect_name) {
42034168
type = eSymbolTypeRuntime;
42044169

4205-
if (symbol_name) {
4206-
llvm::StringRef symbol_name_ref(symbol_name);
4207-
if (symbol_name_ref.starts_with("_OBJC_")) {
4208-
llvm::StringRef g_objc_v2_prefix_class(
4209-
"_OBJC_CLASS_$_");
4210-
llvm::StringRef g_objc_v2_prefix_metaclass(
4211-
"_OBJC_METACLASS_$_");
4212-
llvm::StringRef g_objc_v2_prefix_ivar(
4213-
"_OBJC_IVAR_$_");
4214-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
4215-
symbol_name_non_abi_mangled = symbol_name + 1;
4216-
symbol_name =
4217-
symbol_name + g_objc_v2_prefix_class.size();
4218-
type = eSymbolTypeObjCClass;
4219-
demangled_is_synthesized = true;
4220-
} else if (symbol_name_ref.starts_with(
4221-
g_objc_v2_prefix_metaclass)) {
4222-
symbol_name_non_abi_mangled = symbol_name + 1;
4223-
symbol_name =
4224-
symbol_name + g_objc_v2_prefix_metaclass.size();
4225-
type = eSymbolTypeObjCMetaClass;
4226-
demangled_is_synthesized = true;
4227-
} else if (symbol_name_ref.starts_with(
4228-
g_objc_v2_prefix_ivar)) {
4229-
symbol_name_non_abi_mangled = symbol_name + 1;
4230-
symbol_name =
4231-
symbol_name + g_objc_v2_prefix_ivar.size();
4232-
type = eSymbolTypeObjCIVar;
4233-
demangled_is_synthesized = true;
4234-
}
4235-
}
4236-
}
4170+
if (TryParseV2ObjCMetadataSymbol(
4171+
symbol_name, symbol_name_non_abi_mangled, type))
4172+
demangled_is_synthesized = true;
42374173
} else if (symbol_sect_name &&
42384174
::strstr(symbol_sect_name, "__gcc_except_tab") ==
42394175
symbol_sect_name) {

0 commit comments

Comments
 (0)