Author: jmolenda Date: Wed Jul 6 22:12:01 2016 New Revision: 274725 URL: http://llvm.org/viewvc/llvm-project?rev=274725&view=rev Log: debugserver will now report the minimum version load command os name and version # from the mach-o binary as it scans the header/load commands from memory and sends the details back in the jGetLoadedDynamicLibrariesInfos response. lldb isn't using these fields yet but I have a suspicion I'm going to need them soon.
<rdar://problem/25251243> Modified: lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.h lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.mm Modified: lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.h?rev=274725&r1=274724&r2=274725&view=diff ============================================================================== --- lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.h (original) +++ lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.h Wed Jul 6 22:12:01 2016 @@ -69,6 +69,8 @@ public: struct mach_header_64 mach_header; std::vector<struct mach_o_segment> segments; uuid_t uuid; + std::string min_version_os_name; + std::string min_version_os_version; }; struct binary_image_information Modified: lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.mm URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.mm?rev=274725&r1=274724&r2=274725&view=diff ============================================================================== --- lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.mm (original) +++ lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.mm Wed Jul 6 22:12:01 2016 @@ -631,6 +631,44 @@ MachProcess::GetMachOInformationFromMemo if (ReadMemory (load_cmds_p, sizeof (struct uuid_command), &uuidcmd) == sizeof (struct uuid_command)) uuid_copy (inf.uuid, uuidcmd.uuid); } + if (lc.cmd == LC_VERSION_MIN_IPHONEOS || lc.cmd == LC_VERSION_MIN_MACOSX + || lc.cmd == LC_VERSION_MIN_WATCHOS || lc.cmd == LC_VERSION_MIN_TVOS) + { + struct version_min_command vers_cmd; + if (ReadMemory (load_cmds_p, sizeof (struct version_min_command), &vers_cmd) != sizeof (struct version_min_command)) + { + return false; + } + switch (lc.cmd) + { + case LC_VERSION_MIN_IPHONEOS: + inf.min_version_os_name = "iphoneos"; + break; + case LC_VERSION_MIN_MACOSX: + inf.min_version_os_name = "macosx"; + break; + case LC_VERSION_MIN_TVOS: + inf.min_version_os_name = "tvos"; + break; + case LC_VERSION_MIN_WATCHOS: + inf.min_version_os_name = "watchos"; + break; + default: + return false; + } + uint32_t xxxx = vers_cmd.sdk >> 16; + uint32_t yy = (vers_cmd.sdk >> 8) & 0xffu; + uint32_t zz = vers_cmd.sdk & 0xffu; + inf.min_version_os_version = ""; + inf.min_version_os_version += std::to_string(xxxx); + inf.min_version_os_version += "."; + inf.min_version_os_version += std::to_string(yy); + if (zz != 0) + { + inf.min_version_os_version += "."; + inf.min_version_os_version += std::to_string(zz); + } + } load_cmds_p += lc.cmdsize; } return true; @@ -657,6 +695,13 @@ MachProcess::FormatDynamicLibrariesIntoJ uuid_unparse_upper (image_infos[i].macho_info.uuid, uuidstr); image_info_dict_sp->AddStringItem ("uuid", uuidstr); + if (image_infos[i].macho_info.min_version_os_name.empty() == false + && image_infos[i].macho_info.min_version_os_version.empty() == false) + { + image_info_dict_sp->AddStringItem ("min_version_os_name", image_infos[i].macho_info.min_version_os_name); + image_info_dict_sp->AddStringItem ("min_version_os_sdk", image_infos[i].macho_info.min_version_os_version); + } + JSONGenerator::DictionarySP mach_header_dict_sp (new JSONGenerator::Dictionary()); mach_header_dict_sp->AddIntegerItem ("magic", image_infos[i].macho_info.mach_header.magic); mach_header_dict_sp->AddIntegerItem ("cputype", (uint32_t) image_infos[i].macho_info.mach_header.cputype); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits