45#include "llvm/ADT/STLExtras.h"
46#include "llvm/ADT/StringTable.h"
47#include "llvm/Support/Error.h"
48#include "llvm/Support/FileSystem.h"
49#include "llvm/Support/Threading.h"
50#include "llvm/Support/VersionTuple.h"
54#include <TargetConditionals.h>
60#define OPTTABLE_STR_TABLE_CODE
61#include "clang/Options/Options.inc"
62#undef OPTTABLE_STR_TABLE_CODE
66 llvm::StringRef str_ref(
string);
67 llvm::SmallVector<llvm::StringRef> candidates;
68 str_ref.split(candidates,
'|');
69 for (
auto candidate : candidates) {
70 if (!(candidate ==
"EXC_BAD_ACCESS"
71 || candidate ==
"EXC_BAD_INSTRUCTION"
72 || candidate ==
"EXC_ARITHMETIC"
73 || candidate ==
"EXC_RESOURCE"
74 || candidate ==
"EXC_GUARD"
75 || candidate ==
"EXC_SYSCALL")) {
77 candidate.str().c_str());
111 return "Darwin platform plug-in.";
119#define LLDB_PROPERTIES_platformdarwin
120#include "PlatformMacOSXProperties.inc"
122#define LLDB_PROPERTIES_platformdarwin
124#include "PlatformMacOSXPropertiesEnum.inc"
130 static constexpr llvm::StringLiteral g_setting_name(
"darwin");
131 return g_setting_name;
142 const uint32_t idx = ePropertyIgnoredExceptions;
145 assert(option_value);
150 const uint32_t idx = ePropertyIgnoredExceptions;
153 assert(option_value);
167 const bool is_global_setting =
false;
170 "Properties for the Darwin platform plug-in.", is_global_setting);
178 std::string ignored_exceptions
180 if (ignored_exceptions.empty())
183 std::string packet =
"QSetIgnoredExceptions:";
184 packet.append(ignored_exceptions);
200llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
206 "Trying to locate scripting resources but no ScriptInterpreter is "
209 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> file_specs;
210 const FileSpec original_module_spec = module_spec;
224 path_string.
Format(
"{0}/../Python/{1}.py",
227 original_path_string.
Format(
"{0}/../Python/{1}.py",
237 orig_script_fspec, script_fspec);
242 file_specs.try_emplace(std::move(script_fspec), load_style);
250 if (module_spec.
GetFilename() == filename_no_extension)
259llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
262 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> empty;
277 const FileSpec &module_spec =
module.GetFileSpec();
292 llvm::StringRef(symfile_spec.
GetPath())
293 .contains_insensitive(
".dSYM/Contents/Resources/DWARF") &&
296 feedback_stream, module_spec, *target, symfile_spec);
302#if defined(__APPLE__)
312 llvm::StringRef path_ref(symfile_path);
316 auto pos = path_ref.find(
".dSYM/");
317 if (pos == llvm::StringRef::npos)
320 FileSpec bundle_spec(path_ref.substr(0, pos + 5));
324 "dSYM bundle '{0}' has valid trusted code signature",
357 module_spec, process, module_sp, old_modules, did_create_ptr);
364 old_modules, did_create_ptr);
371 module_search_paths = target_sp->GetExecutableSearchPaths();
372 if (!module_sp && !module_search_paths.
IsEmpty() && platform_file) {
377 if (platform_file == bundle_directory) {
382 module_sp, old_modules,
391 platform_file.
GetPath(platform_path,
sizeof(platform_path));
392 const size_t bundle_directory_len =
393 bundle_directory.
GetPath(bundle_dir,
sizeof(bundle_dir));
395 size_t num_module_search_paths = module_search_paths.
GetSize();
396 for (
size_t i = 0; i < num_module_search_paths; ++i) {
397 const size_t search_path_len =
399 new_path,
sizeof(new_path));
400 if (search_path_len <
sizeof(new_path)) {
401 snprintf(new_path + search_path_len,
402 sizeof(new_path) - search_path_len,
"/%s",
403 platform_path + bundle_directory_len);
409 new_module_spec, process, module_sp, old_modules,
413 module_sp->SetPlatformFileSpec(new_file_spec);
424 module_sp->SetPlatformFileSpec(module_spec.
GetFileSpec());
440 std::optional<uint64_t> size;
442 sc_base_addr, sc_uuid, using_sc, private_sc, sc_path, size)) {
444 image_info = HostInfo::GetSharedCacheImageInfo(module_spec.
GetUUID(),
447 image_info = HostInfo::GetSharedCacheImageInfo(
453 image_info = HostInfo::GetSharedCacheImageInfo(
467 LLDB_LOGF(log,
"module %s was found in a shared cache",
477 const uint8_t *trap_opcode =
nullptr;
478 uint32_t trap_opcode_size = 0;
479 bool bp_is_thumb =
false;
483 case llvm::Triple::aarch64_32:
484 case llvm::Triple::aarch64: {
486 static const uint8_t g_arm64_breakpoint_opcode[] = {0x00, 0x00, 0x20, 0xD4};
487 trap_opcode = g_arm64_breakpoint_opcode;
488 trap_opcode_size =
sizeof(g_arm64_breakpoint_opcode);
491 case llvm::Triple::thumb:
494 case llvm::Triple::arm: {
495 static const uint8_t g_arm_breakpoint_opcode[] = {0xFE, 0xDE, 0xFF, 0xE7};
496 static const uint8_t g_thumb_breakpooint_opcode[] = {0xFE, 0xDE};
502 bp_is_thumb = bp_loc_sp->GetAddress().GetAddressClass() ==
506 trap_opcode = g_thumb_breakpooint_opcode;
507 trap_opcode_size =
sizeof(g_thumb_breakpooint_opcode);
510 trap_opcode = g_arm_breakpoint_opcode;
511 trap_opcode_size =
sizeof(g_arm_breakpoint_opcode);
514 case llvm::Triple::ppc:
515 case llvm::Triple::ppc64: {
516 static const uint8_t g_ppc_breakpoint_opcode[] = {0x7F, 0xC0, 0x00, 0x08};
517 trap_opcode = g_ppc_breakpoint_opcode;
518 trap_opcode_size =
sizeof(g_ppc_breakpoint_opcode);
525 if (trap_opcode && trap_opcode_size) {
527 return trap_opcode_size;
537 ObjectFile *obj_file = module_sp->GetObjectFile();
546 std::vector<ArchSpec> &archs) {
547 ArchSpec host_arch = HostInfo::GetArchitecture(HostInfo::eArchKindDefault);
548 archs.push_back(host_arch);
551 archs.push_back(
ArchSpec(
"x86_64-apple-macosx"));
552 archs.push_back(HostInfo::GetArchitecture(HostInfo::eArchKind32));
554 ArchSpec host_arch64 = HostInfo::GetArchitecture(HostInfo::eArchKind64);
556 archs.push_back(HostInfo::GetArchitecture(HostInfo::eArchKind32));
565 static const char *g_arm64e_compatible_archs[] = {
566 "arm64e",
"arm64",
"armv7",
"armv7f",
"armv7k",
"armv7s",
567 "armv7m",
"armv7em",
"armv6m",
"armv6",
"armv5",
"armv4",
568 "arm",
"thumbv7",
"thumbv7f",
"thumbv7k",
"thumbv7s",
"thumbv7m",
569 "thumbv7em",
"thumbv6m",
"thumbv6",
"thumbv5",
"thumbv4t",
"thumb",
571 return {g_arm64e_compatible_archs};
574 static const char *g_arm64_compatible_archs[] = {
575 "arm64",
"armv7",
"armv7f",
"armv7k",
"armv7s",
"armv7m",
576 "armv7em",
"armv6m",
"armv6",
"armv5",
"armv4",
"arm",
577 "thumbv7",
"thumbv7f",
"thumbv7k",
"thumbv7s",
"thumbv7m",
"thumbv7em",
578 "thumbv6m",
"thumbv6",
"thumbv5",
"thumbv4t",
"thumb",
580 return {g_arm64_compatible_archs};
583 static const char *g_armv7_compatible_archs[] = {
584 "armv7",
"armv6m",
"armv6",
"armv5",
"armv4",
"arm",
585 "thumbv7",
"thumbv6m",
"thumbv6",
"thumbv5",
"thumbv4t",
"thumb",
587 return {g_armv7_compatible_archs};
590 static const char *g_armv7f_compatible_archs[] = {
591 "armv7f",
"armv7",
"armv6m",
"armv6",
"armv5",
592 "armv4",
"arm",
"thumbv7f",
"thumbv7",
"thumbv6m",
593 "thumbv6",
"thumbv5",
"thumbv4t",
"thumb",
595 return {g_armv7f_compatible_archs};
598 static const char *g_armv7k_compatible_archs[] = {
599 "armv7k",
"armv7",
"armv6m",
"armv6",
"armv5",
600 "armv4",
"arm",
"thumbv7k",
"thumbv7",
"thumbv6m",
601 "thumbv6",
"thumbv5",
"thumbv4t",
"thumb",
603 return {g_armv7k_compatible_archs};
606 static const char *g_armv7s_compatible_archs[] = {
607 "armv7s",
"armv7",
"armv6m",
"armv6",
"armv5",
608 "armv4",
"arm",
"thumbv7s",
"thumbv7",
"thumbv6m",
609 "thumbv6",
"thumbv5",
"thumbv4t",
"thumb",
611 return {g_armv7s_compatible_archs};
614 static const char *g_armv7m_compatible_archs[] = {
615 "armv7m",
"armv7",
"armv6m",
"armv6",
"armv5",
616 "armv4",
"arm",
"thumbv7m",
"thumbv7",
"thumbv6m",
617 "thumbv6",
"thumbv5",
"thumbv4t",
"thumb",
619 return {g_armv7m_compatible_archs};
622 static const char *g_armv7em_compatible_archs[] = {
623 "armv7em",
"armv7",
"armv6m",
"armv6",
"armv5",
624 "armv4",
"arm",
"thumbv7em",
"thumbv7",
"thumbv6m",
625 "thumbv6",
"thumbv5",
"thumbv4t",
"thumb",
627 return {g_armv7em_compatible_archs};
630 static const char *g_armv6m_compatible_archs[] = {
631 "armv6m",
"armv6",
"armv5",
"armv4",
"arm",
632 "thumbv6m",
"thumbv6",
"thumbv5",
"thumbv4t",
"thumb",
634 return {g_armv6m_compatible_archs};
637 static const char *g_armv6_compatible_archs[] = {
638 "armv6",
"armv5",
"armv4",
"arm",
639 "thumbv6",
"thumbv5",
"thumbv4t",
"thumb",
641 return {g_armv6_compatible_archs};
644 static const char *g_armv5_compatible_archs[] = {
645 "armv5",
"armv4",
"arm",
"thumbv5",
"thumbv4t",
"thumb",
647 return {g_armv5_compatible_archs};
650 static const char *g_armv4_compatible_archs[] = {
656 return {g_armv4_compatible_archs};
666 std::vector<ArchSpec> &archs, std::optional<llvm::Triple::OSType> os) {
671 triple.setArchName(arch);
672 triple.setVendor(llvm::Triple::VendorType::Apple);
680 static FileSpec g_xcode_select_filespec;
682 if (!g_xcode_select_filespec) {
683 FileSpec xcode_select_cmd(
"/usr/bin/xcode-select");
685 int exit_status = -1;
687 std::string command_output;
691 &exit_status, &signo, &command_output,
nullptr,
692 std::chrono::seconds(2),
694 if (status.
Success() && exit_status == 0 && !command_output.empty()) {
695 size_t first_non_newline = command_output.find_last_not_of(
"\r\n");
696 if (first_non_newline != std::string::npos) {
697 command_output.erase(first_non_newline + 1);
699 g_xcode_select_filespec =
FileSpec(command_output);
704 return g_xcode_select_filespec;
709 static const char *g_bp_names[] = {
710 "start_wqthread",
"_pthread_wqthread",
"_pthread_start",
713 static const char *g_bp_modules[] = {
"libsystem_c.dylib",
"libSystem.B.dylib",
714 "libsystem_pthread.dylib"};
717 for (
size_t i = 0; i < std::size(g_bp_modules); i++) {
718 const char *bp_module = g_bp_modules[i];
722 bool internal =
true;
723 bool hardware =
false;
726 std::size(g_bp_names), eFunctionNameTypeFull,
729 bp_sp->SetBreakpointKind(
"thread-creation");
740 std::string shell_string = shell.
GetPath();
741 const char *shell_name = strrchr(shell_string.c_str(),
'/');
742 if (shell_name ==
nullptr)
743 shell_name = shell_string.c_str();
747 if (strcmp(shell_name,
"sh") == 0) {
751 if (launch_info.
GetEnvironment().lookup(
"COMMAND_MODE") ==
"legacy")
754 }
else if (strcmp(shell_name,
"csh") == 0 ||
755 strcmp(shell_name,
"tcsh") == 0 ||
756 strcmp(shell_name,
"zsh") == 0) {
792 static FileSpec g_command_line_tools_filespec;
794 if (!g_command_line_tools_filespec) {
798 g_command_line_tools_filespec = command_line_tools_path;
802 return g_command_line_tools_filespec;
806 void *baton, llvm::sys::fs::file_type file_type, llvm::StringRef path) {
826 const bool find_directories =
true;
827 const bool find_files =
false;
828 const bool find_other =
true;
832 enumerator_info.
sdk_type = sdk_type;
835 sdks_spec.
GetPath(), find_directories, find_files, find_other,
845 FileSpec sdks_spec = HostInfo::GetXcodeContentsDirectory();
869 llvm_unreachable(
"unsupported sdk");
876 llvm::VersionTuple version = HostInfo::GetOSVersion();
878 if (!version.empty()) {
890 FileSpec native_sdk_spec = sdks_spec;
892 native_sdk_name.
Printf(
"MacOSX%u.%u.sdk", version.getMajor(),
893 version.getMinor().value_or(0));
897 return native_sdk_spec;
915std::tuple<llvm::VersionTuple, llvm::StringRef>
917 llvm::StringRef build;
918 llvm::VersionTuple version;
920 llvm::SmallVector<llvm::StringRef> parts;
921 dir.split(parts,
' ');
922 for (llvm::StringRef part : parts) {
924 if (isdigit(part[0]))
925 version.tryParse(part);
927 if (part.consume_front(
"(")) {
928 size_t pos = part.find(
')');
929 build = part.slice(0, pos);
933 return std::make_tuple(version, build);
936llvm::Expected<StructuredData::DictionarySP>
938 static constexpr llvm::StringLiteral crash_info_key(
"Crash-Info Annotations");
939 static constexpr llvm::StringLiteral asi_info_key(
940 "Application Specific Information");
947 if (!process_dict_sp->GetValueForKeyAsArray(crash_info_key, annotations)) {
949 if (new_annotations_sp && new_annotations_sp->GetSize()) {
950 process_dict_sp->AddItem(crash_info_key, new_annotations_sp);
951 annotations = new_annotations_sp.get();
957 if (!process_dict_sp->GetValueForKeyAsDictionary(asi_info_key,
958 app_specific_info)) {
960 if (new_app_specific_info_sp && new_app_specific_info_sp->GetSize()) {
961 process_dict_sp->AddItem(asi_info_key, new_app_specific_info_sp);
962 app_specific_info = new_app_specific_info_sp.get();
968 return process_dict_sp->GetSize() ? process_dict_sp :
nullptr;
982 std::string module_name =
module->GetSpecificationDescription();
986 if (module_name ==
"/usr/lib/dyld")
990 LLDB_LOG(log,
"Module {0} doesn't have any section!", module_name);
996 LLDB_LOG(log,
"Module {0} doesn't have section {1}!", module_name,
1001 addr_t load_addr = crash_info->GetLoadBaseAddress(&target);
1004 LLDB_LOG(log,
"Module {0} has an invalid '{1}' section load address: {2}",
1005 module_name, section_name, load_addr);
1013 expected_size,
error);
1015 if (expected_size != bytes_read ||
error.Fail()) {
1016 LLDB_LOG(log,
"Failed to read {0} section from memory in module {1}: {2}",
1017 section_name, module_name,
error);
1022 if (annotations.
version < 5) {
1024 "Annotation version lower than 5 unsupported! Module {0} has "
1025 "version {1} instead.",
1026 module_name, annotations.
version);
1031 LLDB_LOG(log,
"No message available for module {0}.", module_name);
1035 std::string message;
1039 if (message.empty() || bytes_read != message.size() ||
error.Fail()) {
1040 LLDB_LOG(log,
"Failed to read the message from memory in module {0}: {1}",
1041 module_name,
error);
1046 if (message.back() ==
'\n')
1050 LLDB_LOG(log,
"No message2 available for module {0}.", module_name);
1052 std::string message2;
1056 if (!message2.empty() && bytes_read == message2.size() &&
error.Success())
1057 if (message2.back() ==
'\n')
1058 message2.pop_back();
1061 std::make_shared<StructuredData::Dictionary>();
1063 entry_sp->AddStringItem(
"image", module->GetFileSpec().GetPath(
false));
1064 entry_sp->AddStringItem(
"uuid", module->GetUUID().GetAsString());
1065 entry_sp->AddStringItem(
"message", message);
1066 entry_sp->AddStringItem(
"message2", message2);
1067 entry_sp->AddIntegerItem(
"abort-cause", annotations.
abort_cause);
1069 array_sp->AddItem(entry_sp);
1079 if (!metadata_sp || !metadata_sp->GetSize() || !metadata_sp->HasKey(
"asi"))
1083 if (!metadata_sp->GetValueForKeyAsDictionary(
"asi", asi))
1087 std::make_shared<StructuredData::Dictionary>();
1089 auto flatten_asi_dict = [&dict_sp](llvm::StringRef key,
1102 asi->
ForEach(flatten_asi_dict);
1107static llvm::Expected<lldb_private::FileSpec>
1112 return llvm::createStringError(
"failed to get module from target");
1114 SymbolFile *sym_file = exe_module_sp->GetSymbolFile();
1116 return llvm::createStringError(
"failed to get symbol file from executable");
1119 return llvm::createStringError(
1120 "Failed to resolve SDK for target: executable's symbol file has no "
1127 merged_sdk.
Merge(cu_sdk);
1137 auto path_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{merged_sdk});
1139 return llvm::createStringError(
1140 llvm::formatv(
"Failed to resolve SDK path: {0}",
1141 llvm::toString(path_or_err.takeError())));
1148 const std::vector<std::string> apple_arguments = {
1149 "-x",
"objective-c++",
"-fobjc-arc",
1150 "-fblocks",
"-D_ISO646_H",
"-D__ISO646_H",
1151 "-fgnuc-version=4.2.1"};
1153 options.insert(options.end(), apple_arguments.begin(), apple_arguments.end());
1156 bool use_current_os_version =
false;
1158 auto get_host_os = []() {
return HostInfo::GetTargetTriple().getOS(); };
1161 use_current_os_version = get_host_os() == llvm::Triple::MacOSX;
1164 use_current_os_version = get_host_os() == llvm::Triple::IOS;
1167 use_current_os_version = get_host_os() == llvm::Triple::TvOS;
1170 use_current_os_version = get_host_os() == llvm::Triple::WatchOS;
1173 use_current_os_version = get_host_os() == llvm::Triple::XROS;
1179 llvm::VersionTuple version;
1180 if (use_current_os_version)
1186 if (exe_module_sp) {
1187 ObjectFile *object_file = exe_module_sp->GetObjectFile();
1196#define OPTION(PREFIX_OFFSET, NAME_OFFSET, VAR, ...) \
1197 llvm::StringRef opt_##VAR = OptionStrTable[NAME_OFFSET]; \
1199#include "clang/Options/Options.inc"
1201 minimum_version_option <<
'-';
1204 minimum_version_option << opt_mmacos_version_min_EQ;
1207 minimum_version_option << opt_mios_simulator_version_min_EQ;
1210 minimum_version_option << opt_mios_version_min_EQ;
1213 minimum_version_option << opt_mtvos_simulator_version_min_EQ;
1216 minimum_version_option << opt_mtvos_version_min_EQ;
1219 minimum_version_option << opt_mwatchos_simulator_version_min_EQ;
1222 minimum_version_option << opt_mwatchos_version_min_EQ;
1232 info.
type = sdk_type;
1233 LLDB_LOGF(log,
"Clang modules on %s are not supported",
1238 minimum_version_option << version.getAsString();
1239 options.emplace_back(std::string(minimum_version_option.
GetString()));
1246 if (!sysroot_spec_or_err) {
1248 sysroot_spec_or_err.takeError(),
1249 "Failed to resolve sysroot: {0}");
1251 sysroot_spec = *sysroot_spec_or_err;
1256 std::lock_guard<std::mutex> guard(
m_mutex);
1261 options.push_back(
"-isysroot");
1262 options.push_back(sysroot_spec.
GetPath());
1281 llvm::VersionTuple result;
1282 if (!result.tryParse(env.lookup(
"SIMULATOR_RUNTIME_VERSION")))
1285 std::string dyld_root_path = env.lookup(
"DYLD_ROOT_PATH");
1286 if (!dyld_root_path.empty()) {
1287 dyld_root_path +=
"/System/Library/CoreServices/SystemVersion.plist";
1289 std::string product_version;
1292 if (!result.tryParse(product_version))
1300 return llvm::VersionTuple();
1309 static std::vector<FileSpec> g_executable_dirs;
1313 static llvm::once_flag g_once_flag;
1314 llvm::call_once(g_once_flag, []() {
1317 FileSpec xcode_contents_dir = HostInfo::GetXcodeContentsDirectory();
1318 if (xcode_contents_dir) {
1319 FileSpec xcode_lldb_resources = xcode_contents_dir;
1326 g_executable_dirs.push_back(dir);
1331 if (command_line_tools_dir) {
1332 FileSpec cmd_line_lldb_resources = command_line_tools_dir;
1339 g_executable_dirs.push_back(dir);
1346 for (
const auto &executable_dir : g_executable_dirs) {
1348 executable_file.
SetDirectory(executable_dir.GetDirectory());
1351 return executable_file;
1366 const char *disable_env_var =
"IDE_DISABLED_OS_ACTIVITY_DT_MODE";
1368 if (!env_vars.count(disable_env_var)) {
1371 env_vars.try_emplace(
"OS_ACTIVITY_DT_MODE",
"enable");
1385 module_search_paths = target_sp->GetExecutableSearchPaths();
1388 if (!module_sp && !module_search_paths.
IsEmpty() && platform_file) {
1397 std::vector<llvm::StringRef> path_parts = platform_file.
GetComponents();
1399 std::reverse(path_parts.begin(), path_parts.end());
1400 const size_t path_parts_size = path_parts.size();
1402 size_t num_module_search_paths = module_search_paths.
GetSize();
1403 for (
size_t i = 0; i < num_module_search_paths; ++i) {
1407 "PlatformRemoteDarwinDevice::GetSharedModule searching for binary in "
1415 for (
size_t j = 0; j < 4 && j < path_parts_size - 1; ++j) {
1429 for (
int k = j; k >= 0; --k) {
1437 module_sp, old_modules,
1441 module_sp->SetPlatformFileSpec(path_to_try);
1452#if !defined(__APPLE__)
1453 return llvm::Triple::MacOSX;
1456 return llvm::Triple::MacOSX;
1458 return llvm::Triple::IOS;
1459#elif TARGET_OS_WATCH
1460 return llvm::Triple::WatchOS;
1462 return llvm::Triple::TvOS;
1463#elif TARGET_OS_BRIDGE
1464 return llvm::Triple::BridgeOS;
1466 return llvm::Triple::XROS;
1468#error "LLDB being compiled for an unrecognized Darwin OS"
1473llvm::Expected<std::pair<XcodeSDK, bool>>
1475 SymbolFile *sym_file =
module.GetSymbolFile();
1477 return llvm::createStringError(
1478 llvm::inconvertibleErrorCode(),
1479 llvm::formatv(
"No symbol file available for module '{0}'",
1483 return llvm::createStringError(
1484 llvm::formatv(
"Could not resolve SDK for module '{0}'. Symbol file has "
1485 "no compile units.",
1488 bool found_public_sdk =
false;
1489 bool found_internal_sdk =
false;
1495 found_public_sdk |= !is_internal_sdk;
1496 found_internal_sdk |= is_internal_sdk;
1498 merged_sdk.
Merge(cu_sdk);
1502 const bool found_mismatch = found_internal_sdk && found_public_sdk;
1504 return std::pair{std::move(merged_sdk), found_mismatch};
1507llvm::Expected<std::string>
1511 return llvm::createStringError(
1512 llvm::inconvertibleErrorCode(),
1513 llvm::formatv(
"Failed to parse SDK path from debug-info: {0}",
1514 llvm::toString(sdk_or_err.takeError())));
1516 auto [sdk, _] = std::move(*sdk_or_err);
1519 return sdk.GetSysroot().GetPath();
1521 auto path_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk});
1523 return llvm::createStringError(
1524 llvm::inconvertibleErrorCode(),
1525 llvm::formatv(
"Error while searching for SDK (XcodeSDK '{0}'): {1}",
1527 llvm::toString(path_or_err.takeError())));
1529 return path_or_err->str();
1532llvm::Expected<XcodeSDK>
1536 return llvm::createStringError(
"compile unit has no module");
1537 SymbolFile *sym_file = module_sp->GetSymbolFile();
1539 return llvm::createStringError(
1540 llvm::formatv(
"No symbol file available for module '{0}'",
1541 module_sp->GetFileSpec().GetFilename()));
1546llvm::Expected<std::string>
1550 return llvm::createStringError(
1551 llvm::inconvertibleErrorCode(),
1552 llvm::formatv(
"Failed to parse SDK path from debug-info: {0}",
1553 llvm::toString(sdk_or_err.takeError())));
1555 auto sdk = std::move(*sdk_or_err);
1557 auto path_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk});
1559 return llvm::createStringError(
1560 llvm::inconvertibleErrorCode(),
1561 llvm::formatv(
"Error while searching for SDK (XcodeSDK '{0}'): {1}",
1563 llvm::toString(path_or_err.takeError())));
1565 return path_or_err->str();
1568llvm::Expected<FileSpecList>
1575 info.
type = sdk_type;
1578 auto sdk_root_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk});
1579 if (!sdk_root_or_err) {
1581 "Failed to resolve SDK root for triple '{1}': {0}",
1587 sdk_root_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk});
1590 if (!sdk_root_or_err)
1591 return sdk_root_or_err.takeError();
1594 llvm::SmallString<256> resolved(*sdk_root_or_err);
1595 llvm::sys::path::append(resolved,
"usr",
"share",
"lldb");
static llvm::raw_ostream & error(Stream &strm)
static DynamicLoaderDarwinKernelProperties & GetGlobalProperties()
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
bool GetValueAsString(const char *key, std::string &value) const
An architecture specification class.
llvm::Triple & GetTriple()
Architecture triple accessor.
bool IsExactMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, ExactMatch).
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
A command line argument class.
void AppendArgument(llvm::StringRef arg_str, char quote_char='\0')
Appends a new argument to the end of the list argument list.
Class that manages the actual breakpoint that will be inserted into the running program.
bool SetTrapOpcode(const uint8_t *trap_opcode, uint32_t trap_opcode_size)
Sets the trap opcode.
lldb::BreakpointLocationSP GetConstituentAtIndex(size_t idx)
This method returns the breakpoint location at index index located at this breakpoint site.
A class that describes a compilation unit.
lldb::ModuleSP CalculateSymbolContextModule() override
A uniqued constant string class.
bool IsEmpty() const
Test for empty string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
const char * GetCString() const
Get the string value as a C string.
const char * AsCString(const char *value_if_empty) const
Get the string value as a C string.
A class to manage flag bits.
lldb::ScriptLanguage GetScriptLanguage() const
ScriptInterpreter * GetScriptInterpreter(bool can_create=true, std::optional< lldb::ScriptLanguage > language={})
virtual bool GetSharedCacheInformation(lldb::addr_t &base_address, UUID &uuid, LazyBool &using_shared_cache, LazyBool &private_shared_cache, lldb_private::FileSpec &shared_cache_path, std::optional< uint64_t > &size)
Get information about the shared cache for a process, if possible.
const FileSpec & GetFileSpecAtIndex(size_t idx) const
Get file at index.
void EmplaceBack(Args &&...args)
Inserts a new FileSpec into the FileSpecList constructed in-place with the given arguments.
void Append(const FileSpec &file)
Append a FileSpec object to the list.
size_t GetSize() const
Get the number of files in the file list.
void AppendPathComponent(llvm::StringRef component)
void SetDirectory(ConstString directory)
Directory string set accessor.
const ConstString & GetFilename() const
Filename string const get accessor.
std::vector< llvm::StringRef > GetComponents() const
Gets the components of the FileSpec's path.
const ConstString & GetDirectory() const
Directory string const get accessor.
ConstString GetFileNameStrippingExtension() const
Return the filename without the extension part.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
ConstString GetPathAsConstString(bool denormalize=true) const
Get the full path as a ConstString.
void SetFilename(ConstString filename)
Filename string set accessor.
void EnumerateDirectory(llvm::Twine path, bool find_directories, bool find_files, bool find_other, EnumerateDirectoryCallbackType callback, void *callback_baton)
@ eEnumerateDirectoryResultNext
Enumerate next entry in the current directory.
static FileSystem & Instance()
void Resolve(llvm::SmallVectorImpl< char > &path, bool force_make_absolute=false)
Resolve path to make it canonical.
static bool IsBundleCodeSignTrusted(const FileSpec &bundle_path)
Check whether a bundle at the given path has a valid code signature that chains to a trusted anchor i...
static bool ResolveExecutableInBundle(FileSpec &file)
When executable files may live within a directory, where the directory represents an executable bundl...
static Status RunShellCommand(llvm::StringRef command, const FileSpec &working_dir, int *status_ptr, int *signo_ptr, std::string *command_output, std::string *error_output, const Timeout< std::micro > &timeout, bool run_in_shell=true)
Run a shell command.
static bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &proc_info)
static bool GetBundleDirectory(const FileSpec &file, FileSpec &bundle_directory)
If you have an executable that is in a bundle and want to get back to the bundle directory from the p...
lldb::SymbolSharedCacheUse GetSharedCacheBinaryLoading() const
static Status GetSharedModule(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl< lldb::ModuleSP > *old_modules, bool *did_create_ptr, bool invoke_locate_callback=true)
static ModuleListProperties & GetGlobalModuleListProperties()
ModuleIterable Modules() const
FileSpec & GetSymbolFileSpec()
ArchSpec * GetArchitecturePtr()
lldb::TargetSP GetTargetSP() const
A class that describes an executable image and its associated object and symbol files.
const FileSpec & GetFileSpec() const
Get const accessor for the module file specification.
A plug-in interface definition class for object file parsers.
@ eTypeDynamicLinker
The platform's dynamic linker executable.
virtual llvm::VersionTuple GetMinimumOSVersion()
Get the minimum OS version this object file can run on.
virtual FileSpec & GetFileSpec()
Get accessor to the object file specification.
void SetValidator(ValidatorCallback validator, void *baton=nullptr)
const char * GetCurrentValue() const
virtual llvm::StringRef GetPluginName()=0
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static lldb::OptionValuePropertiesSP GetSettingForPlatformPlugin(Debugger &debugger, llvm::StringRef setting_name)
static bool CreateSettingForPlatformPlugin(Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, llvm::StringRef description, bool is_global_property)
static bool UnregisterPlugin(ABICreateInstance create_callback)
static FileSpec FindSymbolFileInBundle(const FileSpec &dsym_bundle_fspec, const UUID *uuid, const ArchSpec *arch)
Environment & GetEnvironment()
const FileSpec & GetShell() const
static void NoOpMonitorCallback(lldb::pid_t pid, int signal, int status)
A Monitor callback which does not take any action on process events.
void SetMonitorProcessCallback(Host::MonitorChildProcessCallback callback)
A plug-in interface definition class for debugging a process.
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
size_t ReadMemoryFromInferior(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)
Read of memory from a process.
virtual StructuredData::DictionarySP GetMetadata()
Fetch process defined metadata.
size_t ReadCStringFromMemory(lldb::addr_t vm_addr, char *cstr, size_t cstr_max_len, Status &error)
Read a NULL terminated C string from memory.
StructuredData::DictionarySP GetExtendedCrashInfoDict()
Fetch extended crash information held by the process.
virtual DynamicLoader * GetDynamicLoader()
Get the dynamic loader plug-in for this process.
Target & GetTarget()
Get the target object pointer for this module.
lldb::OptionValuePropertiesSP m_collection_sp
Holds an lldb_private::Module name and a "sanitized" version of it for the purposes of loading a scri...
llvm::StringRef GetSanitizedName() const
llvm::StringRef GetOriginalName() const
virtual SanitizedScriptingModuleName GetSanitizedScriptingModuleName(llvm::StringRef name)
lldb::SectionSP FindSectionByName(ConstString section_dstr) const
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Success() const
Test for success condition.
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
void Format(const char *format, Args &&... args)
Forwards the arguments to llvm::formatv and writes to the stream.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
ObjectSP GetItemAtIndex(size_t idx) const
void ForEach(std::function< bool(llvm::StringRef key, Object *object)> const &callback) const
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< Array > ArraySP
Provides public interface for all SymbolFiles.
virtual XcodeSDK ParseXcodeSDK(CompileUnit &comp_unit)
Return the Xcode SDK comp_unit was compiled against.
virtual uint32_t GetNumCompileUnits()=0
virtual lldb::CompUnitSP GetCompileUnitAtIndex(uint32_t idx)=0
virtual ObjectFile * GetObjectFile()=0
Debugger & GetDebugger() const
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
lldb::BreakpointSP CreateBreakpoint(const FileSpecList *containingModules, const FileSpec &file, uint32_t line_no, uint32_t column, lldb::addr_t offset, LazyBool check_inlines, LazyBool skip_prologue, bool internal, bool request_hardware, LazyBool move_to_nearest_code)
const ModuleList & GetImages() const
Get accessor for the images for this process.
const ArchSpec & GetArchitecture() const
Represents UUID's of various sizes.
An abstraction for Xcode-style SDKs that works like ArchSpec.
Type
Different types of Xcode SDKs.
const FileSpec & GetSysroot() const
void Merge(const XcodeSDK &other)
The merge function follows a strict order to maintain monotonicity:
static XcodeSDK GetAnyMacOS()
llvm::StringRef GetString() const
static std::string GetCanonicalName(Info info)
Return the canonical SDK name, such as "macosx" for the macOS SDK.
static XcodeSDK::Type GetSDKTypeForTriple(const llvm::Triple &triple)
Return the best-matching SDK type for a specific triple.
bool IsAppleInternalSDK() const
static bool SDKSupportsModules(Type type, llvm::VersionTuple version)
Whether LLDB feels confident importing Clang modules from this SDK.
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< lldb_private::BreakpointLocation > BreakpointLocationSP
std::shared_ptr< lldb_private::Platform > PlatformSP
@ eLanguageTypeUnknown
Unknown or invalid language value.
std::shared_ptr< lldb_private::Breakpoint > BreakpointSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::Section > SectionSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::Module > ModuleSP
const UUID & GetUUID() const
lldb::DataExtractorSP GetExtractor()
A parsed SDK directory name.