Skip to content

Commit 356a101

Browse files
committed
🍒 [lldb][MachO][NFC] Extract ObjC metadata symbol parsing into helper function
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
1 parent 05831e0 commit 356a101

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
@@ -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,15 @@ 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;
3075-
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;
3094+
if (TryParseV2ObjCMetadataSymbol(
3095+
symbol_name, symbol_name_non_abi_mangled,
3096+
type)) {
30823097
demangled_is_synthesized = true;
30833098
} else {
30843099
if (nlist.n_value != 0)
30853100
symbol_section = section_info.GetSection(
30863101
nlist.n_sect, nlist.n_value);
3102+
30873103
type = eSymbolTypeData;
30883104
}
30893105
break;
@@ -3569,48 +3585,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
35693585
symbol_sect_name) {
35703586
type = eSymbolTypeRuntime;
35713587

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-
}
3588+
if (TryParseV2ObjCMetadataSymbol(
3589+
symbol_name,
3590+
symbol_name_non_abi_mangled, type))
3591+
demangled_is_synthesized = true;
36143592
} else if (symbol_sect_name &&
36153593
::strstr(symbol_sect_name,
36163594
"__gcc_except_tab") ==
@@ -3983,27 +3961,14 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39833961
is_gsym = true;
39843962
sym[sym_idx].SetExternal(true);
39853963

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;
3997-
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;
3964+
if (TryParseV2ObjCMetadataSymbol(symbol_name,
3965+
symbol_name_non_abi_mangled, type)) {
40023966
demangled_is_synthesized = true;
40033967
} else {
40043968
if (nlist.n_value != 0)
40053969
symbol_section =
40063970
section_info.GetSection(nlist.n_sect, nlist.n_value);
3971+
40073972
type = eSymbolTypeData;
40083973
}
40093974
} break;
@@ -4447,38 +4412,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
44474412
::strstr(symbol_sect_name, "__objc") == symbol_sect_name) {
44484413
type = eSymbolTypeRuntime;
44494414

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-
}
4415+
if (TryParseV2ObjCMetadataSymbol(
4416+
symbol_name, symbol_name_non_abi_mangled, type))
4417+
demangled_is_synthesized = true;
44824418
} else if (symbol_sect_name &&
44834419
::strstr(symbol_sect_name, "__gcc_except_tab") ==
44844420
symbol_sect_name) {

0 commit comments

Comments
 (0)