@@ -2292,6 +2292,43 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
22922292 return true ;
22932293}
22942294
2295+ static bool
2296+ TryParseV2ObjCMetadataSymbol (const char *&symbol_name,
2297+ const char *&symbol_name_non_abi_mangled,
2298+ SymbolType &type) {
2299+ static constexpr llvm::StringLiteral g_objc_v2_prefix_class (" _OBJC_CLASS_$_" );
2300+ static constexpr llvm::StringLiteral g_objc_v2_prefix_metaclass (
2301+ " _OBJC_METACLASS_$_" );
2302+ static constexpr llvm::StringLiteral g_objc_v2_prefix_ivar (" _OBJC_IVAR_$_" );
2303+
2304+ llvm::StringRef symbol_name_ref (symbol_name);
2305+ if (symbol_name_ref.empty ())
2306+ return false ;
2307+
2308+ if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
2309+ symbol_name_non_abi_mangled = symbol_name + 1 ;
2310+ symbol_name = symbol_name + g_objc_v2_prefix_class.size ();
2311+ type = eSymbolTypeObjCClass;
2312+ return true ;
2313+ }
2314+
2315+ if (symbol_name_ref.starts_with (g_objc_v2_prefix_metaclass)) {
2316+ symbol_name_non_abi_mangled = symbol_name + 1 ;
2317+ symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size ();
2318+ type = eSymbolTypeObjCMetaClass;
2319+ return true ;
2320+ }
2321+
2322+ if (symbol_name_ref.starts_with (g_objc_v2_prefix_ivar)) {
2323+ symbol_name_non_abi_mangled = symbol_name + 1 ;
2324+ symbol_name = symbol_name + g_objc_v2_prefix_ivar.size ();
2325+ type = eSymbolTypeObjCIVar;
2326+ return true ;
2327+ }
2328+
2329+ return false ;
2330+ }
2331+
22952332static SymbolType GetSymbolType (const char *&symbol_name,
22962333 bool &demangled_is_synthesized,
22972334 const SectionSP &text_section_sp,
@@ -2408,9 +2445,6 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
24082445 lldb::offset_t offset = MachHeaderSizeFromMagic (m_header.magic );
24092446 uint32_t i;
24102447 FileSpecList dylib_files;
2411- llvm::StringRef g_objc_v2_prefix_class (" _OBJC_CLASS_$_" );
2412- llvm::StringRef g_objc_v2_prefix_metaclass (" _OBJC_METACLASS_$_" );
2413- llvm::StringRef g_objc_v2_prefix_ivar (" _OBJC_IVAR_$_" );
24142448 UUID image_uuid;
24152449
24162450 for (i = 0 ; i < m_header.ncmds ; ++i) {
@@ -3043,36 +3077,15 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
30433077 is_gsym = true ;
30443078 sym[sym_idx].SetExternal (true );
30453079
3046- if (symbol_name && symbol_name[0 ] == ' _' &&
3047- symbol_name[1 ] == ' O' ) {
3048- llvm::StringRef symbol_name_ref (symbol_name);
3049- if (symbol_name_ref.starts_with (
3050- g_objc_v2_prefix_class)) {
3051- symbol_name_non_abi_mangled = symbol_name + 1 ;
3052- symbol_name =
3053- symbol_name + g_objc_v2_prefix_class.size ();
3054- type = eSymbolTypeObjCClass;
3055- demangled_is_synthesized = true ;
3056-
3057- } else if (symbol_name_ref.starts_with (
3058- g_objc_v2_prefix_metaclass)) {
3059- symbol_name_non_abi_mangled = symbol_name + 1 ;
3060- symbol_name =
3061- symbol_name + g_objc_v2_prefix_metaclass.size ();
3062- type = eSymbolTypeObjCMetaClass;
3063- demangled_is_synthesized = true ;
3064- } else if (symbol_name_ref.starts_with (
3065- g_objc_v2_prefix_ivar)) {
3066- symbol_name_non_abi_mangled = symbol_name + 1 ;
3067- symbol_name =
3068- symbol_name + g_objc_v2_prefix_ivar.size ();
3069- type = eSymbolTypeObjCIVar;
3070- demangled_is_synthesized = true ;
3071- }
3080+ if (TryParseV2ObjCMetadataSymbol (
3081+ symbol_name, symbol_name_non_abi_mangled,
3082+ type)) {
3083+ demangled_is_synthesized = true ;
30723084 } else {
30733085 if (nlist.n_value != 0 )
30743086 symbol_section = section_info.GetSection (
30753087 nlist.n_sect , nlist.n_value );
3088+
30763089 type = eSymbolTypeData;
30773090 }
30783091 break ;
@@ -3558,48 +3571,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
35583571 symbol_sect_name) {
35593572 type = eSymbolTypeRuntime;
35603573
3561- if (symbol_name) {
3562- llvm::StringRef symbol_name_ref (symbol_name);
3563- if (symbol_name_ref.starts_with (" _OBJC_" )) {
3564- llvm::StringRef
3565- g_objc_v2_prefix_class (
3566- " _OBJC_CLASS_$_" );
3567- llvm::StringRef
3568- g_objc_v2_prefix_metaclass (
3569- " _OBJC_METACLASS_$_" );
3570- llvm::StringRef
3571- g_objc_v2_prefix_ivar (" _OBJC_IVAR_$_" );
3572- if (symbol_name_ref.starts_with (
3573- g_objc_v2_prefix_class)) {
3574- symbol_name_non_abi_mangled =
3575- symbol_name + 1 ;
3576- symbol_name =
3577- symbol_name +
3578- g_objc_v2_prefix_class.size ();
3579- type = eSymbolTypeObjCClass;
3580- demangled_is_synthesized = true ;
3581- } else if (
3582- symbol_name_ref.starts_with (
3583- g_objc_v2_prefix_metaclass)) {
3584- symbol_name_non_abi_mangled =
3585- symbol_name + 1 ;
3586- symbol_name =
3587- symbol_name +
3588- g_objc_v2_prefix_metaclass.size ();
3589- type = eSymbolTypeObjCMetaClass;
3590- demangled_is_synthesized = true ;
3591- } else if (symbol_name_ref.starts_with (
3592- g_objc_v2_prefix_ivar)) {
3593- symbol_name_non_abi_mangled =
3594- symbol_name + 1 ;
3595- symbol_name =
3596- symbol_name +
3597- g_objc_v2_prefix_ivar.size ();
3598- type = eSymbolTypeObjCIVar;
3599- demangled_is_synthesized = true ;
3600- }
3601- }
3602- }
3574+ if (TryParseV2ObjCMetadataSymbol (
3575+ symbol_name,
3576+ symbol_name_non_abi_mangled, type))
3577+ demangled_is_synthesized = true ;
36033578 } else if (symbol_sect_name &&
36043579 ::strstr (symbol_sect_name,
36053580 " __gcc_except_tab" ) ==
@@ -3956,7 +3931,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39563931
39573932 if (is_debug) {
39583933 switch (nlist.n_type ) {
3959- case N_GSYM:
3934+ case N_GSYM: {
39603935 // global symbol: name,,NO_SECT,type,0
39613936 // Sometimes the N_GSYM value contains the address.
39623937
@@ -3972,33 +3947,17 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39723947 is_gsym = true ;
39733948 sym[sym_idx].SetExternal (true );
39743949
3975- if (symbol_name && symbol_name[0 ] == ' _' && symbol_name[1 ] == ' O' ) {
3976- llvm::StringRef symbol_name_ref (symbol_name);
3977- if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
3978- symbol_name_non_abi_mangled = symbol_name + 1 ;
3979- symbol_name = symbol_name + g_objc_v2_prefix_class.size ();
3980- type = eSymbolTypeObjCClass;
3981- demangled_is_synthesized = true ;
3982-
3983- } else if (symbol_name_ref.starts_with (
3984- g_objc_v2_prefix_metaclass)) {
3985- symbol_name_non_abi_mangled = symbol_name + 1 ;
3986- symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size ();
3987- type = eSymbolTypeObjCMetaClass;
3988- demangled_is_synthesized = true ;
3989- } else if (symbol_name_ref.starts_with (g_objc_v2_prefix_ivar)) {
3990- symbol_name_non_abi_mangled = symbol_name + 1 ;
3991- symbol_name = symbol_name + g_objc_v2_prefix_ivar.size ();
3992- type = eSymbolTypeObjCIVar;
3993- demangled_is_synthesized = true ;
3994- }
3950+ if (TryParseV2ObjCMetadataSymbol (symbol_name,
3951+ symbol_name_non_abi_mangled, type)) {
3952+ demangled_is_synthesized = true ;
39953953 } else {
39963954 if (nlist.n_value != 0 )
39973955 symbol_section =
39983956 section_info.GetSection (nlist.n_sect , nlist.n_value );
3957+
39993958 type = eSymbolTypeData;
40003959 }
4001- break ;
3960+ } break ;
40023961
40033962 case N_FNAME:
40043963 // procedure name (f77 kludge): name,,NO_SECT,0,0
@@ -4439,38 +4398,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
44394398 ::strstr (symbol_sect_name, " __objc" ) == symbol_sect_name) {
44404399 type = eSymbolTypeRuntime;
44414400
4442- if (symbol_name) {
4443- llvm::StringRef symbol_name_ref (symbol_name);
4444- if (symbol_name_ref.starts_with (" _OBJC_" )) {
4445- llvm::StringRef g_objc_v2_prefix_class (
4446- " _OBJC_CLASS_$_" );
4447- llvm::StringRef g_objc_v2_prefix_metaclass (
4448- " _OBJC_METACLASS_$_" );
4449- llvm::StringRef g_objc_v2_prefix_ivar (
4450- " _OBJC_IVAR_$_" );
4451- if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
4452- symbol_name_non_abi_mangled = symbol_name + 1 ;
4453- symbol_name =
4454- symbol_name + g_objc_v2_prefix_class.size ();
4455- type = eSymbolTypeObjCClass;
4456- demangled_is_synthesized = true ;
4457- } else if (symbol_name_ref.starts_with (
4458- g_objc_v2_prefix_metaclass)) {
4459- symbol_name_non_abi_mangled = symbol_name + 1 ;
4460- symbol_name =
4461- symbol_name + g_objc_v2_prefix_metaclass.size ();
4462- type = eSymbolTypeObjCMetaClass;
4463- demangled_is_synthesized = true ;
4464- } else if (symbol_name_ref.starts_with (
4465- g_objc_v2_prefix_ivar)) {
4466- symbol_name_non_abi_mangled = symbol_name + 1 ;
4467- symbol_name =
4468- symbol_name + g_objc_v2_prefix_ivar.size ();
4469- type = eSymbolTypeObjCIVar;
4470- demangled_is_synthesized = true ;
4471- }
4472- }
4473- }
4401+ if (TryParseV2ObjCMetadataSymbol (
4402+ symbol_name, symbol_name_non_abi_mangled, type))
4403+ demangled_is_synthesized = true ;
44744404 } else if (symbol_sect_name &&
44754405 ::strstr (symbol_sect_name, " __gcc_except_tab" ) ==
44764406 symbol_sect_name) {
0 commit comments