diff options
-rw-r--r-- | lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 35 |
1 files changed, 14 insertions, 21 deletions
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index 508a7325353..81b7397a876 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -2038,6 +2038,18 @@ UUID ObjectFileMachO::GetSharedCacheUUID(FileSpec dyld_shared_cache, return dsc_uuid; } +bool ParseNList(DataExtractor &nlist_data, lldb::offset_t &nlist_data_offset, + size_t nlist_byte_size, struct nlist_64 &nlist) { + if (!nlist_data.ValidOffsetForDataOfSize(nlist_data_offset, nlist_byte_size)) + return false; + nlist.n_strx = nlist_data.GetU32_unchecked(&nlist_data_offset); + nlist.n_type = nlist_data.GetU8_unchecked(&nlist_data_offset); + nlist.n_sect = nlist_data.GetU8_unchecked(&nlist_data_offset); + nlist.n_desc = nlist_data.GetU16_unchecked(&nlist_data_offset); + nlist.n_value = nlist_data.GetAddress_unchecked(&nlist_data_offset); + return true; +} + size_t ObjectFileMachO::ParseSymtab() { static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); Timer scoped_timer(func_cat, "ObjectFileMachO::ParseSymtab () module = %s", @@ -2734,21 +2746,9 @@ size_t ObjectFileMachO::ParseSymtab() { ///////////////////////////// { struct nlist_64 nlist; - if (!dsc_local_symbols_data.ValidOffsetForDataOfSize( - nlist_data_offset, nlist_byte_size)) + if (!ParseNList(dsc_local_symbols_data, nlist_data_offset, nlist_byte_size, nlist) break; - nlist.n_strx = dsc_local_symbols_data.GetU32_unchecked( - &nlist_data_offset); - nlist.n_type = dsc_local_symbols_data.GetU8_unchecked( - &nlist_data_offset); - nlist.n_sect = dsc_local_symbols_data.GetU8_unchecked( - &nlist_data_offset); - nlist.n_desc = dsc_local_symbols_data.GetU16_unchecked( - &nlist_data_offset); - nlist.n_value = dsc_local_symbols_data.GetAddress_unchecked( - &nlist_data_offset); - SymbolType type = eSymbolTypeInvalid; const char *symbol_name = dsc_local_symbols_data.PeekCStr( string_table_offset + nlist.n_strx); @@ -3681,16 +3681,9 @@ size_t ObjectFileMachO::ParseSymtab() { SymbolIndexToName reexport_shlib_needs_fixup; for (; nlist_idx < symtab_load_command.nsyms; ++nlist_idx) { struct nlist_64 nlist; - if (!nlist_data.ValidOffsetForDataOfSize(nlist_data_offset, - nlist_byte_size)) + if (!ParseNList(nlist_data, nlist_data_offset, nlist_byte_size, nlist)) break; - nlist.n_strx = nlist_data.GetU32_unchecked(&nlist_data_offset); - nlist.n_type = nlist_data.GetU8_unchecked(&nlist_data_offset); - nlist.n_sect = nlist_data.GetU8_unchecked(&nlist_data_offset); - nlist.n_desc = nlist_data.GetU16_unchecked(&nlist_data_offset); - nlist.n_value = nlist_data.GetAddress_unchecked(&nlist_data_offset); - SymbolType type = eSymbolTypeInvalid; const char *symbol_name = nullptr; |