Skip to content

Commit a561221

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 1aefbce commit a561221

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
@@ -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,13 @@ 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;
2849+
if (TryParseV2ObjCMetadataSymbol(
2850+
symbol_name, symbol_name_non_abi_mangled,
2851+
type)) {
28302852
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;
2837-
demangled_is_synthesized = true;
2838-
} else {
2839-
if (nlist.n_value != 0)
2840-
symbol_section = section_info.GetSection(
2841-
nlist.n_sect, nlist.n_value);
2853+
} else if (nlist.n_value != 0) {
2854+
symbol_section = section_info.GetSection(
2855+
nlist.n_sect, nlist.n_value);
28422856
type = eSymbolTypeData;
28432857
}
28442858
break;
@@ -3323,49 +3337,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
33233337
::strstr(symbol_sect_name, "__objc") ==
33243338
symbol_sect_name) {
33253339
type = eSymbolTypeRuntime;
3326-
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-
}
3340+
demangled_is_synthesized =
3341+
TryParseV2ObjCMetadataSymbol(
3342+
symbol_name,
3343+
symbol_name_non_abi_mangled, type);
33693344
} else if (symbol_sect_name &&
33703345
::strstr(symbol_sect_name,
33713346
"__gcc_except_tab") ==
@@ -3738,27 +3713,12 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37383713
is_gsym = true;
37393714
sym[sym_idx].SetExternal(true);
37403715

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;
3716+
if (TryParseV2ObjCMetadataSymbol(symbol_name,
3717+
symbol_name_non_abi_mangled, type)) {
37523718
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;
3757-
demangled_is_synthesized = true;
3758-
} else {
3759-
if (nlist.n_value != 0)
3760-
symbol_section =
3761-
section_info.GetSection(nlist.n_sect, nlist.n_value);
3719+
} else if (nlist.n_value != 0) {
3720+
symbol_section =
3721+
section_info.GetSection(nlist.n_sect, nlist.n_value);
37623722
type = eSymbolTypeData;
37633723
}
37643724
} break;
@@ -4201,39 +4161,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
42014161
if (symbol_sect_name &&
42024162
::strstr(symbol_sect_name, "__objc") == symbol_sect_name) {
42034163
type = eSymbolTypeRuntime;
4164+
demangled_is_synthesized = TryParseV2ObjCMetadataSymbol(
4165+
symbol_name, symbol_name_non_abi_mangled, type);
42044166

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-
}
42374167
} else if (symbol_sect_name &&
42384168
::strstr(symbol_sect_name, "__gcc_except_tab") ==
42394169
symbol_sect_name) {

0 commit comments

Comments
 (0)