diff options
| -rw-r--r-- | lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp | 231 | ||||
| -rw-r--r-- | lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h | 33 |
2 files changed, 196 insertions, 68 deletions
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp index 61caafceccd..ef3e627abf2 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp @@ -28,6 +28,25 @@ using namespace lldb; using namespace lldb_private; +PlatformRemoteiOS::SDKDirectoryInfo::SDKDirectoryInfo (const lldb_private::ConstString &dirname) : + directory(dirname), + build() +{ + const char *dirname_cstr = dirname.GetCString(); + const char *pos = Args::StringToVersion (dirname_cstr, + version_major, + version_minor, + version_update); + + if (pos && pos[0] == ' ' && pos[1] == '(') + { + const char *build_start = pos + 2; + const char *end_paren = strchr (build_start, ')'); + if (end_paren && build_start < end_paren) + build.SetCStringWithLength(build_start, end_paren - build_start); + } +} + //------------------------------------------------------------------ // Static Variables //------------------------------------------------------------------ @@ -223,93 +242,171 @@ PlatformRemoteiOS::ResolveExecutable (const FileSpec &exe_file, return error; } -const char * -PlatformRemoteiOS::GetDeviceSupportDirectoryForOSVersion() +FileSpec::EnumerateDirectoryResult +PlatformRemoteiOS::GetContainedFilesIntoVectorOfStringsCallback (void *baton, + FileSpec::FileType file_type, + const FileSpec &file_spec) { - if (m_sdk_sysroot) - return m_sdk_sysroot.GetCString(); + ((PlatformRemoteiOS::SDKDirectoryInfoCollection *)baton)->push_back(PlatformRemoteiOS::SDKDirectoryInfo(file_spec.GetFilename())); + return FileSpec::eEnumerateDirectoryResultNext; +} - if (m_device_support_directory_for_os_version.empty()) +bool +PlatformRemoteiOS::UpdateSDKDirectoryInfosInNeeded() +{ + if (m_sdk_directory_infos.empty()) { - const char *device_support_dir = GetDeveloperDirectory(); - const bool resolve_path = true; + const char *device_support_dir = GetDeviceSupportDirectory(); if (device_support_dir) { - m_device_support_directory_for_os_version.assign (device_support_dir); - m_device_support_directory_for_os_version.append ("/Platforms/iPhoneOS.platform/DeviceSupport"); - - uint32_t major = 0; - uint32_t minor = 0; - uint32_t update = 0; - FileSpec file_spec; - char resolved_path[PATH_MAX]; - if (GetOSVersion(major, minor, update)) + const bool find_directories = true; + const bool find_files = false; + const bool find_other = false; + FileSpec::EnumerateDirectory (m_device_support_directory.c_str(), + find_directories, + find_files, + find_other, + GetContainedFilesIntoVectorOfStringsCallback, + &m_sdk_directory_infos); + } + } + return !m_sdk_directory_infos.empty(); +} + +const PlatformRemoteiOS::SDKDirectoryInfo * +PlatformRemoteiOS::GetSDKDirectoryForCurrentOSVersion () +{ + uint32_t major, minor, update; + if (GetOSVersion(major, minor, update)) + { + if (UpdateSDKDirectoryInfosInNeeded()) + { + uint32_t i; + const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); + // First try for an exact match of major, minor and update + for (i=0; i<num_sdk_infos; ++i) { - if (major != UINT32_MAX && minor != UINT32_MAX && update != UINT32_MAX) + const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[i]; + if (sdk_dir_info.version_major == major && + sdk_dir_info.version_minor == minor && + sdk_dir_info.version_update == update) { - ::snprintf (resolved_path, - sizeof(resolved_path), - "%s/%i.%i.%i", - m_device_support_directory_for_os_version.c_str(), - major, - minor, - update); - - file_spec.SetFile(resolved_path, resolve_path); - if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path))) - { - m_device_support_directory_for_os_version.assign (resolved_path); - return m_device_support_directory_for_os_version.c_str(); - } + return &sdk_dir_info; } - - if (major != UINT32_MAX && minor != UINT32_MAX) + } + // First try for an exact match of major and minor + for (i=0; i<num_sdk_infos; ++i) + { + const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[i]; + if (sdk_dir_info.version_major == major && + sdk_dir_info.version_minor == minor) { - ::snprintf (resolved_path, - sizeof(resolved_path), - "%s/%i.%i", - m_device_support_directory_for_os_version.c_str(), - major, - minor); - - file_spec.SetFile(resolved_path, resolve_path); - if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path))) - { - m_device_support_directory_for_os_version.assign (resolved_path); - return m_device_support_directory_for_os_version.c_str(); - } + return &sdk_dir_info; } } - else + // Lastly try to match of major version only.. + for (i=0; i<num_sdk_infos; ++i) { - // Use the default as we have no OS version selected - m_device_support_directory_for_os_version.append ("/Latest"); - file_spec.SetFile(m_device_support_directory_for_os_version.c_str(), resolve_path); - - if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path))) + const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[i]; + if (sdk_dir_info.version_major == major) { - if (m_major_os_version == UINT32_MAX) - { - const char *resolved_latest_dirname = file_spec.GetFilename().GetCString(); - const char *pos = Args::StringToVersion (resolved_latest_dirname, - m_major_os_version, - m_minor_os_version, - m_update_os_version); + return &sdk_dir_info; + } + } + } + } + return NULL; +} - if (m_build_update.empty() && pos[0] == ' ' && pos[1] == '(') +const PlatformRemoteiOS::SDKDirectoryInfo * +PlatformRemoteiOS::GetSDKDirectoryForLatestOSVersion () +{ + const PlatformRemoteiOS::SDKDirectoryInfo *result = NULL; + if (UpdateSDKDirectoryInfosInNeeded()) + { + const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); + // First try for an exact match of major, minor and update + for (uint32_t i=0; i<num_sdk_infos; ++i) + { + const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[i]; + if (sdk_dir_info.version_major != UINT32_MAX) + { + if (result == NULL || sdk_dir_info.version_major > result->version_major) + { + result = &sdk_dir_info; + } + else if (sdk_dir_info.version_major == result->version_major) + { + if (sdk_dir_info.version_minor > result->version_minor) + { + result = &sdk_dir_info; + } + else if (sdk_dir_info.version_minor == result->version_minor) + { + if (sdk_dir_info.version_update > result->version_update) { - const char *end_paren = strchr (pos + 2, ')'); - m_build_update.assign (pos + 2, end_paren); + result = &sdk_dir_info; } } - m_device_support_directory_for_os_version.assign (resolved_path); - return m_device_support_directory_for_os_version.c_str(); } } } - // Assign a single NULL character so we know we tried to find the device - // support directory and we don't keep trying to find it over and over. - m_device_support_directory_for_os_version.assign (1, '\0'); + } + return result; +} + + + +const char * +PlatformRemoteiOS::GetDeviceSupportDirectory() +{ + if (m_device_support_directory.empty()) + { + const char *device_support_dir = GetDeveloperDirectory(); + if (device_support_dir) + { + m_device_support_directory.assign (device_support_dir); + m_device_support_directory.append ("/Platforms/iPhoneOS.platform/DeviceSupport"); + } + else + { + // Assign a single NULL character so we know we tried to find the device + // support directory and we don't keep trying to find it over and over. + m_device_support_directory.assign (1, '\0'); + } + } + // We should have put a single NULL character into m_device_support_directory + // or it should have a valid path if the code gets here + assert (m_device_support_directory.empty() == false); + if (m_device_support_directory[0]) + return m_device_support_directory.c_str(); + return NULL; +} + + +const char * +PlatformRemoteiOS::GetDeviceSupportDirectoryForOSVersion() +{ + if (m_sdk_sysroot) + return m_sdk_sysroot.GetCString(); + + if (m_device_support_directory_for_os_version.empty()) + { + const PlatformRemoteiOS::SDKDirectoryInfo *sdk_dir_info = GetSDKDirectoryForCurrentOSVersion (); + if (sdk_dir_info == NULL) + sdk_dir_info = GetSDKDirectoryForLatestOSVersion (); + if (sdk_dir_info) + { + m_device_support_directory_for_os_version = GetDeviceSupportDirectory(); + m_device_support_directory_for_os_version.append(1, '/'); + m_device_support_directory_for_os_version.append(sdk_dir_info->directory.GetCString()); + } + else + { + // Assign a single NULL character so we know we tried to find the device + // support directory and we don't keep trying to find it over and over. + m_device_support_directory_for_os_version.assign (1, '\0'); + } } // We should have put a single NULL character into m_device_support_directory_for_os_version // or it should have a valid path if the code gets here diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h index 051b5846dc8..4991016c0cc 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h @@ -13,6 +13,8 @@ // C Includes // C++ Includes // Other libraries and framework includes +#include "lldb/Host/FileSpec.h" + // Project includes #include "PlatformDarwin.h" @@ -113,13 +115,42 @@ public: lldb_private::ArchSpec &arch); protected: + struct SDKDirectoryInfo + { + SDKDirectoryInfo (const lldb_private::ConstString &dirname); + lldb_private::ConstString directory; + lldb_private::ConstString build; + uint32_t version_major; + uint32_t version_minor; + uint32_t version_update; + }; + typedef std::vector<SDKDirectoryInfo> SDKDirectoryInfoCollection; + std::string m_device_support_directory; + SDKDirectoryInfoCollection m_sdk_directory_infos; std::string m_device_support_directory_for_os_version; std::string m_build_update; //std::vector<FileSpec> m_device_support_os_dirs; - + + bool + UpdateSDKDirectoryInfosInNeeded(); + + const char * + GetDeviceSupportDirectory(); + const char * GetDeviceSupportDirectoryForOSVersion(); + const SDKDirectoryInfo * + GetSDKDirectoryForLatestOSVersion (); + + const SDKDirectoryInfo * + GetSDKDirectoryForCurrentOSVersion (); + + static lldb_private::FileSpec::EnumerateDirectoryResult + GetContainedFilesIntoVectorOfStringsCallback (void *baton, + lldb_private::FileSpec::FileType file_type, + const lldb_private::FileSpec &file_spec); + private: DISALLOW_COPY_AND_ASSIGN (PlatformRemoteiOS); |

