Skip to content

Commit edcd511

Browse files
committed
[lldb][MachO][NFC] Extract ObjC metadata symbol parsing into helper function (llvm#161536)
Just a simple de-duplication of the same code. We saw a bug here recently (llvm#161521). Might as well isolate this all in one place. rdar://158159242 (cherry picked from commit 23e0815)
1 parent b244b0d commit edcd511

File tree

1 file changed

+54
-124
lines changed

1 file changed

+54
-124
lines changed

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

Lines changed: 54 additions & 124 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,33 +3091,13 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
30573091
is_gsym = true;
30583092
sym[sym_idx].SetExternal(true);
30593093

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;
3094+
if (TryParseV2ObjCMetadataSymbol(
3095+
symbol_name, symbol_name_non_abi_mangled,
3096+
type)) {
30753097
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;
3083-
} else {
3084-
if (nlist.n_value != 0)
3085-
symbol_section = section_info.GetSection(
3086-
nlist.n_sect, nlist.n_value);
3098+
} else if (nlist.n_value != 0) {
3099+
symbol_section = section_info.GetSection(
3100+
nlist.n_sect, nlist.n_value);
30873101
type = eSymbolTypeData;
30883102
}
30893103
break;
@@ -3568,49 +3582,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
35683582
::strstr(symbol_sect_name, "__objc") ==
35693583
symbol_sect_name) {
35703584
type = eSymbolTypeRuntime;
3571-
3572-
if (symbol_name) {
3573-
llvm::StringRef symbol_name_ref(symbol_name);
3574-
if (symbol_name_ref.starts_with("_OBJC_")) {
3575-
llvm::StringRef
3576-
g_objc_v2_prefix_class(
3577-
"_OBJC_CLASS_$_");
3578-
llvm::StringRef
3579-
g_objc_v2_prefix_metaclass(
3580-
"_OBJC_METACLASS_$_");
3581-
llvm::StringRef
3582-
g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
3583-
if (symbol_name_ref.starts_with(
3584-
g_objc_v2_prefix_class)) {
3585-
symbol_name_non_abi_mangled =
3586-
symbol_name + 1;
3587-
symbol_name =
3588-
symbol_name +
3589-
g_objc_v2_prefix_class.size();
3590-
type = eSymbolTypeObjCClass;
3591-
demangled_is_synthesized = true;
3592-
} else if (
3593-
symbol_name_ref.starts_with(
3594-
g_objc_v2_prefix_metaclass)) {
3595-
symbol_name_non_abi_mangled =
3596-
symbol_name + 1;
3597-
symbol_name =
3598-
symbol_name +
3599-
g_objc_v2_prefix_metaclass.size();
3600-
type = eSymbolTypeObjCMetaClass;
3601-
demangled_is_synthesized = true;
3602-
} else if (symbol_name_ref.starts_with(
3603-
g_objc_v2_prefix_ivar)) {
3604-
symbol_name_non_abi_mangled =
3605-
symbol_name + 1;
3606-
symbol_name =
3607-
symbol_name +
3608-
g_objc_v2_prefix_ivar.size();
3609-
type = eSymbolTypeObjCIVar;
3610-
demangled_is_synthesized = true;
3611-
}
3612-
}
3613-
}
3585+
demangled_is_synthesized =
3586+
TryParseV2ObjCMetadataSymbol(
3587+
symbol_name,
3588+
symbol_name_non_abi_mangled, type);
36143589
} else if (symbol_sect_name &&
36153590
::strstr(symbol_sect_name,
36163591
"__gcc_except_tab") ==
@@ -3983,27 +3958,12 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39833958
is_gsym = true;
39843959
sym[sym_idx].SetExternal(true);
39853960

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;
3961+
if (TryParseV2ObjCMetadataSymbol(symbol_name,
3962+
symbol_name_non_abi_mangled, type)) {
39973963
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;
4003-
} else {
4004-
if (nlist.n_value != 0)
4005-
symbol_section =
4006-
section_info.GetSection(nlist.n_sect, nlist.n_value);
3964+
} else if (nlist.n_value != 0) {
3965+
symbol_section =
3966+
section_info.GetSection(nlist.n_sect, nlist.n_value);
40073967
type = eSymbolTypeData;
40083968
}
40093969
} break;
@@ -4446,39 +4406,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
44464406
if (symbol_sect_name &&
44474407
::strstr(symbol_sect_name, "__objc") == symbol_sect_name) {
44484408
type = eSymbolTypeRuntime;
4409+
demangled_is_synthesized = TryParseV2ObjCMetadataSymbol(
4410+
symbol_name, symbol_name_non_abi_mangled, type);
44494411

4450-
if (symbol_name) {
4451-
llvm::StringRef symbol_name_ref(symbol_name);
4452-
if (symbol_name_ref.starts_with("_OBJC_")) {
4453-
llvm::StringRef g_objc_v2_prefix_class(
4454-
"_OBJC_CLASS_$_");
4455-
llvm::StringRef g_objc_v2_prefix_metaclass(
4456-
"_OBJC_METACLASS_$_");
4457-
llvm::StringRef g_objc_v2_prefix_ivar(
4458-
"_OBJC_IVAR_$_");
4459-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
4460-
symbol_name_non_abi_mangled = symbol_name + 1;
4461-
symbol_name =
4462-
symbol_name + g_objc_v2_prefix_class.size();
4463-
type = eSymbolTypeObjCClass;
4464-
demangled_is_synthesized = true;
4465-
} else if (symbol_name_ref.starts_with(
4466-
g_objc_v2_prefix_metaclass)) {
4467-
symbol_name_non_abi_mangled = symbol_name + 1;
4468-
symbol_name =
4469-
symbol_name + g_objc_v2_prefix_metaclass.size();
4470-
type = eSymbolTypeObjCMetaClass;
4471-
demangled_is_synthesized = true;
4472-
} else if (symbol_name_ref.starts_with(
4473-
g_objc_v2_prefix_ivar)) {
4474-
symbol_name_non_abi_mangled = symbol_name + 1;
4475-
symbol_name =
4476-
symbol_name + g_objc_v2_prefix_ivar.size();
4477-
type = eSymbolTypeObjCIVar;
4478-
demangled_is_synthesized = true;
4479-
}
4480-
}
4481-
}
44824412
} else if (symbol_sect_name &&
44834413
::strstr(symbol_sect_name, "__gcc_except_tab") ==
44844414
symbol_sect_name) {

0 commit comments

Comments
 (0)