From 6e4c68608d2838f306bceadc1805ada65f1d8ee9 Mon Sep 17 00:00:00 2001 From: Augusto Noronha Date: Wed, 1 Oct 2025 11:01:36 -0700 Subject: [PATCH] Revert "[lldb][MachO][NFC] Extract ObjC metadata symbol parsing into helper function (#161536)" This reverts commit a5612212a4fa413e4f5107bac13b17d9853981f0. --- .../ObjectFile/Mach-O/ObjectFileMachO.cpp | 178 ++++++++++++------ 1 file changed, 124 insertions(+), 54 deletions(-) diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index e9a81cc57f475..145e815086311 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -2072,43 +2072,6 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset, return true; } -static bool -TryParseV2ObjCMetadataSymbol(const char *&symbol_name, - const char *&symbol_name_non_abi_mangled, - SymbolType &type) { - static constexpr llvm::StringLiteral g_objc_v2_prefix_class("_OBJC_CLASS_$_"); - static constexpr llvm::StringLiteral g_objc_v2_prefix_metaclass( - "_OBJC_METACLASS_$_"); - static constexpr llvm::StringLiteral g_objc_v2_prefix_ivar("_OBJC_IVAR_$_"); - - llvm::StringRef symbol_name_ref(symbol_name); - if (symbol_name_ref.empty()) - return false; - - if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = symbol_name + g_objc_v2_prefix_class.size(); - type = eSymbolTypeObjCClass; - return true; - } - - if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size(); - type = eSymbolTypeObjCMetaClass; - return true; - } - - if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = symbol_name + g_objc_v2_prefix_ivar.size(); - type = eSymbolTypeObjCIVar; - return true; - } - - return false; -} - static SymbolType GetSymbolType(const char *&symbol_name, bool &demangled_is_synthesized, const SectionSP &text_section_sp, @@ -2225,6 +2188,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic); uint32_t i; FileSpecList dylib_files; + llvm::StringRef g_objc_v2_prefix_class("_OBJC_CLASS_$_"); + llvm::StringRef g_objc_v2_prefix_metaclass("_OBJC_METACLASS_$_"); + llvm::StringRef g_objc_v2_prefix_ivar("_OBJC_IVAR_$_"); UUID image_uuid; for (i = 0; i < m_header.ncmds; ++i) { @@ -2846,13 +2812,33 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { is_gsym = true; sym[sym_idx].SetExternal(true); - if (TryParseV2ObjCMetadataSymbol( - symbol_name, symbol_name_non_abi_mangled, - type)) { + llvm::StringRef symbol_name_ref(symbol_name); + if (symbol_name_ref.starts_with( + g_objc_v2_prefix_class)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = + symbol_name + g_objc_v2_prefix_class.size(); + type = eSymbolTypeObjCClass; demangled_is_synthesized = true; - } else if (nlist.n_value != 0) { - symbol_section = section_info.GetSection( - nlist.n_sect, nlist.n_value); + + } else if (symbol_name_ref.starts_with( + g_objc_v2_prefix_metaclass)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = + symbol_name + g_objc_v2_prefix_metaclass.size(); + type = eSymbolTypeObjCMetaClass; + demangled_is_synthesized = true; + } else if (symbol_name_ref.starts_with( + g_objc_v2_prefix_ivar)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = + symbol_name + g_objc_v2_prefix_ivar.size(); + type = eSymbolTypeObjCIVar; + demangled_is_synthesized = true; + } else { + if (nlist.n_value != 0) + symbol_section = section_info.GetSection( + nlist.n_sect, nlist.n_value); type = eSymbolTypeData; } break; @@ -3337,10 +3323,49 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { ::strstr(symbol_sect_name, "__objc") == symbol_sect_name) { type = eSymbolTypeRuntime; - demangled_is_synthesized = - TryParseV2ObjCMetadataSymbol( - symbol_name, - symbol_name_non_abi_mangled, type); + + if (symbol_name) { + llvm::StringRef symbol_name_ref(symbol_name); + if (symbol_name_ref.starts_with("_OBJC_")) { + llvm::StringRef + g_objc_v2_prefix_class( + "_OBJC_CLASS_$_"); + llvm::StringRef + g_objc_v2_prefix_metaclass( + "_OBJC_METACLASS_$_"); + llvm::StringRef + g_objc_v2_prefix_ivar("_OBJC_IVAR_$_"); + if (symbol_name_ref.starts_with( + g_objc_v2_prefix_class)) { + symbol_name_non_abi_mangled = + symbol_name + 1; + symbol_name = + symbol_name + + g_objc_v2_prefix_class.size(); + type = eSymbolTypeObjCClass; + demangled_is_synthesized = true; + } else if ( + symbol_name_ref.starts_with( + g_objc_v2_prefix_metaclass)) { + symbol_name_non_abi_mangled = + symbol_name + 1; + symbol_name = + symbol_name + + g_objc_v2_prefix_metaclass.size(); + type = eSymbolTypeObjCMetaClass; + demangled_is_synthesized = true; + } else if (symbol_name_ref.starts_with( + g_objc_v2_prefix_ivar)) { + symbol_name_non_abi_mangled = + symbol_name + 1; + symbol_name = + symbol_name + + g_objc_v2_prefix_ivar.size(); + type = eSymbolTypeObjCIVar; + demangled_is_synthesized = true; + } + } + } } else if (symbol_sect_name && ::strstr(symbol_sect_name, "__gcc_except_tab") == @@ -3713,12 +3738,27 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { is_gsym = true; sym[sym_idx].SetExternal(true); - if (TryParseV2ObjCMetadataSymbol(symbol_name, - symbol_name_non_abi_mangled, type)) { + llvm::StringRef symbol_name_ref(symbol_name); + if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = symbol_name + g_objc_v2_prefix_class.size(); + type = eSymbolTypeObjCClass; demangled_is_synthesized = true; - } else if (nlist.n_value != 0) { - symbol_section = - section_info.GetSection(nlist.n_sect, nlist.n_value); + + } else if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size(); + type = eSymbolTypeObjCMetaClass; + demangled_is_synthesized = true; + } else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = symbol_name + g_objc_v2_prefix_ivar.size(); + type = eSymbolTypeObjCIVar; + demangled_is_synthesized = true; + } else { + if (nlist.n_value != 0) + symbol_section = + section_info.GetSection(nlist.n_sect, nlist.n_value); type = eSymbolTypeData; } } break; @@ -4161,9 +4201,39 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { if (symbol_sect_name && ::strstr(symbol_sect_name, "__objc") == symbol_sect_name) { type = eSymbolTypeRuntime; - demangled_is_synthesized = TryParseV2ObjCMetadataSymbol( - symbol_name, symbol_name_non_abi_mangled, type); + if (symbol_name) { + llvm::StringRef symbol_name_ref(symbol_name); + if (symbol_name_ref.starts_with("_OBJC_")) { + llvm::StringRef g_objc_v2_prefix_class( + "_OBJC_CLASS_$_"); + llvm::StringRef g_objc_v2_prefix_metaclass( + "_OBJC_METACLASS_$_"); + llvm::StringRef g_objc_v2_prefix_ivar( + "_OBJC_IVAR_$_"); + if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = + symbol_name + g_objc_v2_prefix_class.size(); + type = eSymbolTypeObjCClass; + demangled_is_synthesized = true; + } else if (symbol_name_ref.starts_with( + g_objc_v2_prefix_metaclass)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = + symbol_name + g_objc_v2_prefix_metaclass.size(); + type = eSymbolTypeObjCMetaClass; + demangled_is_synthesized = true; + } else if (symbol_name_ref.starts_with( + g_objc_v2_prefix_ivar)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = + symbol_name + g_objc_v2_prefix_ivar.size(); + type = eSymbolTypeObjCIVar; + demangled_is_synthesized = true; + } + } + } } else if (symbol_sect_name && ::strstr(symbol_sect_name, "__gcc_except_tab") == symbol_sect_name) {