diff options
author | Jason Molenda <jmolenda@apple.com> | 2016-07-29 00:18:39 +0000 |
---|---|---|
committer | Jason Molenda <jmolenda@apple.com> | 2016-07-29 00:18:39 +0000 |
commit | 13becd4f43226b7272625180ff497081f058a687 (patch) | |
tree | bed8f91e9be493fc04963fcf743676cf38f298cc /lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | |
parent | 9cbc30103598be2d45e3c93991f2d356835860f5 (diff) | |
download | bcm5719-llvm-13becd4f43226b7272625180ff497081f058a687.tar.gz bcm5719-llvm-13becd4f43226b7272625180ff497081f058a687.zip |
Move the code which knows how to get information about the shared
cache from ObjectFileMachO (very wrong place) to the DynamicLoader
plugins (better place). Not much change to the code itself, although
the old ObjectFileMachO method would try both the new dyld SPI and
reading the dyld_all_image_infos structure. In the new methods,
I've separated those into the appropriate DynamicLoader plugins.
llvm-svn: 277088
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 70 |
1 files changed, 7 insertions, 63 deletions
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index 2f2d34d252f..6c72ef8b1f5 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -32,6 +32,7 @@ #include "lldb/Host/FileSpec.h" #include "lldb/Symbol/DWARFCallFrameInfo.h" #include "lldb/Symbol/ObjectFile.h" +#include "lldb/Target/DynamicLoader.h" #include "lldb/Target/MemoryRegionInfo.h" #include "lldb/Target/Platform.h" #include "lldb/Target/Process.h" @@ -5449,70 +5450,13 @@ UUID ObjectFileMachO::GetProcessSharedCacheUUID (Process *process) { UUID uuid; - - // First see if we can get the shared cache details from debugserver - if (process) - { - StructuredData::ObjectSP info = process->GetSharedCacheInfo(); - StructuredData::Dictionary *info_dict = nullptr; - if (info.get() && info->GetAsDictionary()) - { - info_dict = info->GetAsDictionary(); - } - - // {"shared_cache_base_address":140735683125248,"shared_cache_uuid":"DDB8D70C-C9A2-3561-B2C8-BE48A4F33F96","no_shared_cache":false,"shared_cache_private_cache":false} - - if (info_dict - && info_dict->HasKey("shared_cache_uuid") - && info_dict->HasKey("no_shared_cache") - && info_dict->HasKey("shared_cache_base_address")) - { - bool process_using_shared_cache = info_dict->GetValueForKey("no_shared_cache")->GetBooleanValue() == false; - std::string uuid_str = info_dict->GetValueForKey("shared_cache_uuid")->GetStringValue(); - - if (process_using_shared_cache && !uuid_str.empty() && uuid.SetFromCString (uuid_str.c_str()) == 0) - return uuid; - } - } - - // Fall back to trying to read the shared cache info out of dyld's internal data structures - if (process) + if (process && process->GetDynamicLoader()) { - addr_t all_image_infos = process->GetImageInfoAddress(); - - // The address returned by GetImageInfoAddress may be the address of dyld (don't want) - // or it may be the address of the dyld_all_image_infos structure (want). The first four - // bytes will be either the version field (all_image_infos) or a Mach-O file magic constant. - // Version 13 and higher of dyld_all_image_infos is required to get the sharedCacheUUID field. - - Error err; - uint32_t version_or_magic = process->ReadUnsignedIntegerFromMemory (all_image_infos, 4, -1, err); - if (version_or_magic != static_cast<uint32_t>(-1) - && version_or_magic != MH_MAGIC - && version_or_magic != MH_CIGAM - && version_or_magic != MH_MAGIC_64 - && version_or_magic != MH_CIGAM_64 - && version_or_magic >= 13) - { - addr_t sharedCacheUUID_address = LLDB_INVALID_ADDRESS; - int wordsize = process->GetAddressByteSize(); - if (wordsize == 8) - { - sharedCacheUUID_address = all_image_infos + 160; // sharedCacheUUID <mach-o/dyld_images.h> - } - if (wordsize == 4) - { - sharedCacheUUID_address = all_image_infos + 84; // sharedCacheUUID <mach-o/dyld_images.h> - } - if (sharedCacheUUID_address != LLDB_INVALID_ADDRESS) - { - uuid_t shared_cache_uuid; - if (process->ReadMemory (sharedCacheUUID_address, shared_cache_uuid, sizeof (uuid_t), err) == sizeof (uuid_t)) - { - uuid.SetBytes (shared_cache_uuid); - } - } - } + DynamicLoader *dl = process->GetDynamicLoader(); + addr_t load_address; + LazyBool using_shared_cache; + LazyBool private_shared_cache; + dl->GetSharedCacheInformation (load_address, uuid, using_shared_cache, private_shared_cache); } return uuid; } |