Skip to content

Commit 9cda8da

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 24007ee commit 9cda8da

File tree

1 file changed

+57
-125
lines changed

1 file changed

+57
-125
lines changed

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

Lines changed: 57 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -2067,6 +2067,43 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
20672067
return true;
20682068
}
20692069

2070+
static bool
2071+
TryParseV2ObjCMetadataSymbol(const char *&symbol_name,
2072+
const char *&symbol_name_non_abi_mangled,
2073+
SymbolType &type) {
2074+
static constexpr llvm::StringLiteral g_objc_v2_prefix_class("_OBJC_CLASS_$_");
2075+
static constexpr llvm::StringLiteral g_objc_v2_prefix_metaclass(
2076+
"_OBJC_METACLASS_$_");
2077+
static constexpr llvm::StringLiteral g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
2078+
2079+
llvm::StringRef symbol_name_ref(symbol_name);
2080+
if (symbol_name_ref.empty())
2081+
return false;
2082+
2083+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
2084+
symbol_name_non_abi_mangled = symbol_name + 1;
2085+
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
2086+
type = eSymbolTypeObjCClass;
2087+
return true;
2088+
}
2089+
2090+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) {
2091+
symbol_name_non_abi_mangled = symbol_name + 1;
2092+
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
2093+
type = eSymbolTypeObjCMetaClass;
2094+
return true;
2095+
}
2096+
2097+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
2098+
symbol_name_non_abi_mangled = symbol_name + 1;
2099+
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
2100+
type = eSymbolTypeObjCIVar;
2101+
return true;
2102+
}
2103+
2104+
return false;
2105+
}
2106+
20702107
static SymbolType GetSymbolType(const char *&symbol_name,
20712108
bool &demangled_is_synthesized,
20722109
const SectionSP &text_section_sp,
@@ -2094,20 +2131,20 @@ static SymbolType GetSymbolType(const char *&symbol_name,
20942131
if (symbol_name) {
20952132
llvm::StringRef symbol_name_ref(symbol_name);
20962133
if (symbol_name_ref.starts_with("OBJC_")) {
2097-
static const llvm::StringRef g_objc_v2_prefix_class("OBJC_CLASS_$_");
2098-
static const llvm::StringRef g_objc_v2_prefix_metaclass(
2134+
static const llvm::StringRef s_objc_v2_prefix_class("OBJC_CLASS_$_");
2135+
static const llvm::StringRef s_objc_v2_prefix_metaclass(
20992136
"OBJC_METACLASS_$_");
2100-
static const llvm::StringRef g_objc_v2_prefix_ivar("OBJC_IVAR_$_");
2101-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
2102-
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
2137+
static const llvm::StringRef s_objc_v2_prefix_ivar("OBJC_IVAR_$_");
2138+
if (symbol_name_ref.starts_with(s_objc_v2_prefix_class)) {
2139+
symbol_name = symbol_name + s_objc_v2_prefix_class.size();
21032140
type = eSymbolTypeObjCClass;
21042141
demangled_is_synthesized = true;
2105-
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) {
2106-
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
2142+
} else if (symbol_name_ref.starts_with(s_objc_v2_prefix_metaclass)) {
2143+
symbol_name = symbol_name + s_objc_v2_prefix_metaclass.size();
21072144
type = eSymbolTypeObjCMetaClass;
21082145
demangled_is_synthesized = true;
2109-
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
2110-
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
2146+
} else if (symbol_name_ref.starts_with(s_objc_v2_prefix_ivar)) {
2147+
symbol_name = symbol_name + s_objc_v2_prefix_ivar.size();
21112148
type = eSymbolTypeObjCIVar;
21122149
demangled_is_synthesized = true;
21132150
}
@@ -2183,9 +2220,6 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
21832220
lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
21842221
uint32_t i;
21852222
FileSpecList dylib_files;
2186-
llvm::StringRef g_objc_v2_prefix_class("_OBJC_CLASS_$_");
2187-
llvm::StringRef g_objc_v2_prefix_metaclass("_OBJC_METACLASS_$_");
2188-
llvm::StringRef g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
21892223
UUID image_uuid;
21902224

21912225
for (i = 0; i < m_header.ncmds; ++i) {
@@ -2805,28 +2839,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
28052839
is_gsym = true;
28062840
sym[sym_idx].SetExternal(true);
28072841

2808-
llvm::StringRef symbol_name_ref(symbol_name);
2809-
if (symbol_name_ref.starts_with(
2810-
g_objc_v2_prefix_class)) {
2811-
symbol_name_non_abi_mangled = symbol_name + 1;
2812-
symbol_name =
2813-
symbol_name + g_objc_v2_prefix_class.size();
2814-
type = eSymbolTypeObjCClass;
2815-
demangled_is_synthesized = true;
2816-
2817-
} else if (symbol_name_ref.starts_with(
2818-
g_objc_v2_prefix_metaclass)) {
2819-
symbol_name_non_abi_mangled = symbol_name + 1;
2820-
symbol_name =
2821-
symbol_name + g_objc_v2_prefix_metaclass.size();
2822-
type = eSymbolTypeObjCMetaClass;
2823-
demangled_is_synthesized = true;
2824-
} else if (symbol_name_ref.starts_with(
2825-
g_objc_v2_prefix_ivar)) {
2826-
symbol_name_non_abi_mangled = symbol_name + 1;
2827-
symbol_name =
2828-
symbol_name + g_objc_v2_prefix_ivar.size();
2829-
type = eSymbolTypeObjCIVar;
2842+
if (TryParseV2ObjCMetadataSymbol(
2843+
symbol_name, symbol_name_non_abi_mangled,
2844+
type)) {
28302845
demangled_is_synthesized = true;
28312846
} else {
28322847
if (nlist.n_value != 0)
@@ -3316,49 +3331,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
33163331
::strstr(symbol_sect_name, "__objc") ==
33173332
symbol_sect_name) {
33183333
type = eSymbolTypeRuntime;
3319-
3320-
if (symbol_name) {
3321-
llvm::StringRef symbol_name_ref(symbol_name);
3322-
if (symbol_name_ref.starts_with("_OBJC_")) {
3323-
llvm::StringRef
3324-
g_objc_v2_prefix_class(
3325-
"_OBJC_CLASS_$_");
3326-
llvm::StringRef
3327-
g_objc_v2_prefix_metaclass(
3328-
"_OBJC_METACLASS_$_");
3329-
llvm::StringRef
3330-
g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
3331-
if (symbol_name_ref.starts_with(
3332-
g_objc_v2_prefix_class)) {
3333-
symbol_name_non_abi_mangled =
3334-
symbol_name + 1;
3335-
symbol_name =
3336-
symbol_name +
3337-
g_objc_v2_prefix_class.size();
3338-
type = eSymbolTypeObjCClass;
3339-
demangled_is_synthesized = true;
3340-
} else if (
3341-
symbol_name_ref.starts_with(
3342-
g_objc_v2_prefix_metaclass)) {
3343-
symbol_name_non_abi_mangled =
3344-
symbol_name + 1;
3345-
symbol_name =
3346-
symbol_name +
3347-
g_objc_v2_prefix_metaclass.size();
3348-
type = eSymbolTypeObjCMetaClass;
3349-
demangled_is_synthesized = true;
3350-
} else if (symbol_name_ref.starts_with(
3351-
g_objc_v2_prefix_ivar)) {
3352-
symbol_name_non_abi_mangled =
3353-
symbol_name + 1;
3354-
symbol_name =
3355-
symbol_name +
3356-
g_objc_v2_prefix_ivar.size();
3357-
type = eSymbolTypeObjCIVar;
3358-
demangled_is_synthesized = true;
3359-
}
3360-
}
3361-
}
3334+
demangled_is_synthesized =
3335+
TryParseV2ObjCMetadataSymbol(
3336+
symbol_name,
3337+
symbol_name_non_abi_mangled, type);
33623338
} else if (symbol_sect_name &&
33633339
::strstr(symbol_sect_name,
33643340
"__gcc_except_tab") ==
@@ -3665,22 +3641,8 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
36653641
is_gsym = true;
36663642
sym[sym_idx].SetExternal(true);
36673643

3668-
llvm::StringRef symbol_name_ref(symbol_name);
3669-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
3670-
symbol_name_non_abi_mangled = symbol_name + 1;
3671-
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
3672-
type = eSymbolTypeObjCClass;
3673-
demangled_is_synthesized = true;
3674-
3675-
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) {
3676-
symbol_name_non_abi_mangled = symbol_name + 1;
3677-
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
3678-
type = eSymbolTypeObjCMetaClass;
3679-
demangled_is_synthesized = true;
3680-
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
3681-
symbol_name_non_abi_mangled = symbol_name + 1;
3682-
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
3683-
type = eSymbolTypeObjCIVar;
3644+
if (TryParseV2ObjCMetadataSymbol(symbol_name,
3645+
symbol_name_non_abi_mangled, type)) {
36843646
demangled_is_synthesized = true;
36853647
} else {
36863648
if (nlist.n_value != 0)
@@ -4123,39 +4085,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
41234085
if (symbol_sect_name &&
41244086
::strstr(symbol_sect_name, "__objc") == symbol_sect_name) {
41254087
type = eSymbolTypeRuntime;
4088+
demangled_is_synthesized = TryParseV2ObjCMetadataSymbol(
4089+
symbol_name, symbol_name_non_abi_mangled, type);
41264090

4127-
if (symbol_name) {
4128-
llvm::StringRef symbol_name_ref(symbol_name);
4129-
if (symbol_name_ref.starts_with("_OBJC_")) {
4130-
llvm::StringRef g_objc_v2_prefix_class(
4131-
"_OBJC_CLASS_$_");
4132-
llvm::StringRef g_objc_v2_prefix_metaclass(
4133-
"_OBJC_METACLASS_$_");
4134-
llvm::StringRef g_objc_v2_prefix_ivar(
4135-
"_OBJC_IVAR_$_");
4136-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
4137-
symbol_name_non_abi_mangled = symbol_name + 1;
4138-
symbol_name =
4139-
symbol_name + g_objc_v2_prefix_class.size();
4140-
type = eSymbolTypeObjCClass;
4141-
demangled_is_synthesized = true;
4142-
} else if (symbol_name_ref.starts_with(
4143-
g_objc_v2_prefix_metaclass)) {
4144-
symbol_name_non_abi_mangled = symbol_name + 1;
4145-
symbol_name =
4146-
symbol_name + g_objc_v2_prefix_metaclass.size();
4147-
type = eSymbolTypeObjCMetaClass;
4148-
demangled_is_synthesized = true;
4149-
} else if (symbol_name_ref.starts_with(
4150-
g_objc_v2_prefix_ivar)) {
4151-
symbol_name_non_abi_mangled = symbol_name + 1;
4152-
symbol_name =
4153-
symbol_name + g_objc_v2_prefix_ivar.size();
4154-
type = eSymbolTypeObjCIVar;
4155-
demangled_is_synthesized = true;
4156-
}
4157-
}
4158-
}
41594091
} else if (symbol_sect_name &&
41604092
::strstr(symbol_sect_name, "__gcc_except_tab") ==
41614093
symbol_sect_name) {

0 commit comments

Comments
 (0)