43#include "llvm/ADT/STLExtras.h"
44#include "llvm/Support/FileSystem.h"
45#include "llvm/Support/FormatVariadic.h"
46#include "llvm/Support/Path.h"
51#define MAP_ANON 0x1000
67#define LLDB_PROPERTIES_platform
68#include "TargetProperties.inc"
71#define LLDB_PROPERTIES_platform
72#include "TargetPropertiesEnum.inc"
78 static constexpr llvm::StringLiteral g_setting_name(
"platform");
79 return g_setting_name;
90 llvm::SmallString<64> user_home_dir;
94 module_cache_dir =
FileSpec(user_home_dir.c_str());
95 module_cache_dir.AppendPathComponent(
".lldb");
96 module_cache_dir.AppendPathComponent(
"module_cache");
102 const auto idx = ePropertyUseModuleCache;
104 idx, g_platform_properties[idx].default_uint_value != 0);
116 return m_collection_sp->SetPropertyAtIndex(ePropertyModuleCacheDirectory,
122 auto f_spec_opt =
m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec(
123 ePropertyModuleCacheDirectory);
125 f_spec_opt->SetDefaultValue(dir_spec);
156 local_file = platform_file;
160llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
166 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> file_specs;
181 for (
FileSpec path : llvm::reverse(paths)) {
199 orig_script_fspec, script_fspec);
202 file_specs.try_emplace(std::move(script_fspec),
213llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
216 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> empty;
220llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
222 Stream &feedback_stream) {
223 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> empty;
229 target, module, feedback_stream);
233 const FileSpec &module_spec =
module.GetFileSpec();
238 module_spec, *target);
258 resolved_spec = spec;
267 if (!
error.Success()) {
268 resolved_spec = spec;
273 if (
error.Success() && module_sp)
274 module_sp->SetPlatformFileSpec(resolved_spec.
GetFileSpec());
299 return create_callback(
true,
nullptr);
306 return HostInfo::GetAugmentedArchSpec(triple);
319 LLDB_LOGF(log,
"%p Platform::Platform()",
static_cast<void *
>(
this));
337 if (!os_version.empty()) {
338 strm.
Format(
"OS Version: {0}", os_version.getAsString());
341 strm.
Format(
" ({0})", *s);
352 strm.
Printf(
" Connected: %s\n", is_connected ?
"yes" :
"no");
356 strm.
Format(
" Sysroot: {0}\n", sdk_root);
366 if (!specific_info.empty())
367 strm.
Printf(
"Platform-specific connection: %s\n", specific_info.c_str());
370 strm.
Format(
" Kernel: {0}\n", *s);
374 std::lock_guard<std::mutex> guard(
m_mutex);
398 fetch = is_connected;
412 return llvm::VersionTuple();
417 return HostInfo::GetOSBuildString();
423 return HostInfo::GetOSKernelDescription();
428 Target *target, std::vector<std::string> &options) {
429 std::vector<std::string> default_compilation_options = {
430 "-x",
"c++",
"-Xclang",
"-nostdsysteminc",
"-Xclang",
"-nostdsysteminc"};
432 options.insert(options.end(), default_compilation_options.begin(),
433 default_compilation_options.end());
438 llvm::SmallString<64> cwd;
439 if (llvm::sys::fs::current_path(cwd))
461 llvm::StringRef path) {
464 namespace fs = llvm::sys::fs;
466 case fs::file_type::fifo_file:
467 case fs::file_type::socket_file:
472 case fs::file_type::directory_file: {
478 dst_dir, lldb::eFilePermissionsDirectoryDefault);
481 "unable to setup directory {0} on remote end", dst_dir.
GetPath());
486 std::string src_dir_path(src.
GetPath());
503 case fs::file_type::symlink_file: {
525 case fs::file_type::regular_file: {
540 "invalid file detected during copy: %s", src.
GetPath().c_str());
544 llvm_unreachable(
"Unhandled file_type!");
551 LLDB_LOGF(log,
"Platform::Install (src='%s', dst='%s')",
563 if (first_dst_dir_char ==
'/' || first_dst_dir_char ==
'\\') {
572 relative_spec = working_dir;
577 "platform working directory must be valid for relative path '%s'",
587 "platform working directory must be valid for relative path '%s'",
598 "when destination directory is empty");
603 LLDB_LOGF(log,
"Platform::Install (src='%s', dst='%s') fixed_dst='%s'",
610 namespace fs = llvm::sys::fs;
611 switch (fs::get_file_type(src.
GetPath(),
false)) {
612 case fs::file_type::directory_file: {
613 llvm::sys::fs::remove(fixed_dst.
GetPath());
615 if (permissions == 0)
616 permissions = eFilePermissionsDirectoryDefault;
618 if (
error.Success()) {
623 std::string src_dir_path(src.
GetPath());
627 return std::move(baton.
error);
631 case fs::file_type::regular_file:
632 llvm::sys::fs::remove(fixed_dst.
GetPath());
636 case fs::file_type::symlink_file: {
637 llvm::sys::fs::remove(fixed_dst.
GetPath());
643 case fs::file_type::fifo_file:
646 case fs::file_type::socket_file:
652 "platform install doesn't handle non file or directory items");
663 if (std::error_code ec = llvm::sys::fs::set_current_path(file_spec.
GetPath())) {
664 LLDB_LOG(log,
"error: {0}", ec.message());
675 uint32_t permissions) {
677 return llvm::sys::fs::create_directory(file_spec.
GetPath(), permissions);
682 LLVM_PRETTY_FUNCTION);
688 uint32_t &file_permissions) {
690 auto Value = llvm::sys::fs::getPermissions(file_spec.
GetPath());
692 file_permissions =
Value.get();
698 LLVM_PRETTY_FUNCTION);
704 uint32_t file_permissions) {
706 auto Perms =
static_cast<llvm::sys::fs::perms
>(file_permissions);
707 return llvm::sys::fs::setPermissions(file_spec.
GetPath(), Perms);
712 LLVM_PRETTY_FUNCTION);
736 if (llvm::sys::fs::file_size(file_spec.
GetPath(), Size))
746 "Platform::ReadFile() is not supported in the {0} platform",
752 const void *src, uint64_t src_len,
Status &
error) {
756 "Platform::WriteFile() is not supported in the {0} platform",
763 return HostInfo::GetUserIDResolver();
782 LLDB_LOGF(log,
"Platform::SetRemoteWorkingDirectory('%s')",
783 working_dir.
GetPath().c_str());
823 "'{0}' does not exist", resolved_module_spec.
GetFileSpec());
828 exe_module_sp,
nullptr,
nullptr);
830 if (exe_module_sp && exe_module_sp->GetObjectFile())
832 exe_module_sp.reset();
838 llvm::ListSeparator LS;
846 if (
error.Success()) {
847 if (exe_module_sp && exe_module_sp->GetObjectFile())
852 arch_names << LS << arch.GetArchitectureName();
855 if (exe_module_sp &&
error.Success())
860 "'{0}' is not readable", resolved_module_spec.
GetFileSpec());
864 "'{0}' is not a valid executable", resolved_module_spec.
GetFileSpec());
867 "'{0}' doesn't contain any '{1}' platform architectures: {2}",
884 resolved_platform_path = platform_path;
912 fetch = is_connected;
926 llvm::Triple normalized_triple(llvm::Triple::normalize(triple));
930 if (
auto kind = HostInfo::ParseArchitectureKind(triple))
931 return HostInfo::GetArchitecture(*kind);
939 if (!compatible_arch.
IsValid())
942 const llvm::Triple &compatible_triple = compatible_arch.
GetTriple();
943 if (normalized_triple.getVendorName().empty())
944 normalized_triple.setVendor(compatible_triple.getVendor());
945 if (normalized_triple.getOSName().empty())
946 normalized_triple.setOS(compatible_triple.getOS());
947 if (normalized_triple.getEnvironmentName().empty())
948 normalized_triple.setEnvironment(compatible_triple.getEnvironment());
956 "The currently selected platform ({0}) is "
957 "the host platform and is always connected.",
961 "Platform::ConnectRemote() is not supported by {0}",
GetPluginName());
969 "The currently selected platform ({0}) is "
970 "the host platform and is always connected.",
974 "Platform::DisconnectRemote() is not supported by {0}",
992 uint32_t match_count = 0;
1009 LLDB_LOGF(log,
"Platform::%s()", __FUNCTION__);
1014 if (::getenv(
"LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY"))
1015 launch_info.
GetFlags().
Set(eLaunchFlagLaunchInTTY);
1017 if (launch_info.
GetFlags().
Test(eLaunchFlagLaunchInShell)) {
1018 const bool will_debug = launch_info.
GetFlags().
Test(eLaunchFlagDebug);
1019 const bool first_arg_is_full_shell_command =
false;
1023 std::string shell_str = (shell) ? shell.
GetPath() :
"<null>";
1025 "Platform::%s GetResumeCountForLaunchInfo() returned %" PRIu32
1027 __FUNCTION__, num_resumes, shell_str.c_str());
1031 error, will_debug, first_arg_is_full_shell_command, num_resumes))
1033 }
else if (launch_info.
GetFlags().
Test(eLaunchFlagShellExpandArguments)) {
1037 "shell expansion failed (reason: %s). "
1038 "consider launching with 'process "
1040 error.AsCString(
"unknown"));
1045 LLDB_LOGF(log,
"Platform::%s final launch_info resume count: %" PRIu32,
1051 "base lldb_private::Platform class can't launch remote processes");
1059 "base lldb_private::Platform class can't expand arguments");
1064 LLDB_LOGF(log,
"Platform::%s, pid %" PRIu64, __FUNCTION__, pid);
1068 "base lldb_private::Platform class can't kill remote processes");
1078 LLDB_LOG(log,
"target = {0}", &target);
1091 if (cbs.filter_callback) {
1093 error = (*cbs.filter_callback)(launch_info, &target);
1094 if (!
error.Success()) {
1096 "Platform::%s() StructuredDataPlugin launch "
1105 if (
error.Success()) {
1107 "Platform::%s LaunchProcess() call succeeded (pid=%" PRIu64
")",
1111 process_sp =
Attach(attach_info, debugger, &target,
error);
1113 LLDB_LOG(log,
"Attach() succeeded, Process plugin: {0}",
1114 process_sp->GetPluginName());
1121 process_sp->SetShouldDetach(
false);
1130 process_sp->SetSTDIOFileDescriptor(pty_fd);
1134 LLDB_LOGF(log,
"Platform::%s Attach() failed: %s", __FUNCTION__,
1139 "Platform::%s LaunchProcess() returned launch_info with "
1140 "invalid process id",
1144 LLDB_LOGF(log,
"Platform::%s LaunchProcess() failed: %s", __FUNCTION__,
1151std::vector<ArchSpec>
1153 llvm::Triple::OSType os) {
1154 std::vector<ArchSpec> list;
1155 for(
auto arch : archs) {
1156 llvm::Triple triple;
1157 triple.setArch(arch);
1173 for (
const ArchSpec &platform_arch :
1175 if (arch.
IsMatch(platform_arch, match)) {
1176 if (compatible_arch_ptr)
1177 *compatible_arch_ptr = platform_arch;
1182 if (compatible_arch_ptr)
1183 compatible_arch_ptr->
Clear();
1188 uint32_t uid, uint32_t gid) {
1190 LLDB_LOGF(log,
"[PutFile] Using block by block transfer....\n");
1192 auto source_open_options =
1194 namespace fs = llvm::sys::fs;
1195 if (fs::is_symlink_file(source.
GetPath()))
1199 lldb::eFilePermissionsUserRW);
1204 bool requires_upload =
true;
1205 llvm::ErrorOr<llvm::MD5::MD5Result> remote_md5 =
CalculateMD5(destination);
1206 if (std::error_code ec = remote_md5.getError()) {
1207 LLDB_LOG(log,
"[PutFile] couldn't get md5 sum of destination: {0}",
1210 llvm::ErrorOr<llvm::MD5::MD5Result> local_md5 =
1211 llvm::sys::fs::md5_contents(source.
GetPath());
1212 if (std::error_code ec = local_md5.getError()) {
1213 LLDB_LOG(log,
"[PutFile] couldn't get md5 sum of source: {0}",
1216 LLDB_LOGF(log,
"[PutFile] destination md5: %016" PRIx64
"%016" PRIx64,
1217 remote_md5->high(), remote_md5->low());
1218 LLDB_LOGF(log,
"[PutFile] local md5: %016" PRIx64
"%016" PRIx64,
1219 local_md5->high(), local_md5->low());
1220 requires_upload = *remote_md5 != *local_md5;
1224 if (!requires_upload) {
1225 LLDB_LOGF(log,
"[PutFile] skipping PutFile because md5sums match");
1229 uint32_t permissions = source_file.get()->GetPermissions(
error);
1230 if (permissions == 0)
1231 permissions = lldb::eFilePermissionsUserRWX;
1236 permissions,
error);
1237 LLDB_LOGF(log,
"dest_file = %" PRIu64
"\n", dest_file);
1244 uint64_t offset = 0;
1246 size_t bytes_read = buffer_sp->GetByteSize();
1247 error = source_file.get()->Read(buffer_sp->GetBytes(), bytes_read);
1248 if (
error.Fail() || bytes_read == 0)
1251 const uint64_t bytes_written =
1252 WriteFile(dest_file, offset, buffer_sp->GetBytes(), bytes_read,
error);
1256 offset += bytes_written;
1257 if (bytes_written != bytes_read) {
1260 source_file.get()->SeekFromStart(offset);
1294 return llvm::sys::fs::remove(path.
GetPath());
1299 addr_t length,
unsigned prot,
1300 unsigned flags,
addr_t fd,
1302 uint64_t flags_platform = 0;
1308 MmapArgList args({addr, length, prot, flags_platform, fd, offset});
1313 llvm::StringRef command,
1321 std::string *separated_error_output,
1324 return RunShellCommand(llvm::StringRef(), command, working_dir, status_ptr,
1325 signo_ptr, command_output, separated_error_output,
1330 llvm::StringRef shell,
1332 llvm::StringRef command,
1340 std::string *separated_error_output,
1345 signo_ptr, command_output,
1346 separated_error_output, timeout);
1348 "unable to run a remote command without a platform");
1351llvm::ErrorOr<llvm::MD5::MD5Result>
1354 return std::make_error_code(std::errc::not_supported);
1355 return llvm::sys::fs::md5_contents(file_spec.
GetPath());
1371 "Platform-specific options required for rsync to work."},
1374 "Platform-specific rsync prefix put before the remote path."},
1377 "Do not automatically fill in the remote hostname when composing the "
1386 "Platform-specific options required for SSH to work."},
1392 "Path in which to store local copies of files."},
1409 llvm::StringRef option_arg,
1412 char short_option = (char)
GetDefinitions()[option_idx].short_option;
1413 switch (short_option) {
1456 llvm::StringRef option_arg,
1459 char short_option = (char)
GetDefinitions()[option_idx].short_option;
1460 switch (short_option) {
1488 uint32_t option_idx, llvm::StringRef option_arg,
1491 char short_option = (char)
GetDefinitions()[option_idx].short_option;
1492 switch (short_option) {
1514 std::lock_guard<std::mutex> guard(
m_mutex);
1527 module_spec,
nullptr, module_sp,
1532 if (
error.Success()) {
1533 module_spec.
GetFileSpec() = module_sp->GetFileSpec();
1544 bool *did_create_ptr) {
1548 bool got_module_spec =
false;
1554 resolved_module_spec)) {
1557 got_module_spec =
true;
1573 if (
error.Success() && module_sp)
1577 resolved_module_spec = arch_module_spec;
1578 got_module_spec =
true;
1582 if (!got_module_spec) {
1585 resolved_module_spec)) {
1588 got_module_spec =
true;
1593 if (!got_module_spec) {
1596 return module_resolver(module_spec);
1615 symbol_file_spec, did_create_ptr);
1618 if (symbol_file_spec) {
1622 module_sp->SetSymbolFileFileSpec(symbol_file_spec);
1643 Status error = module_resolver(resolved_module_spec);
1644 if (
error.Success()) {
1645 if (module_sp && symbol_file_spec) {
1648 module_sp->SetSymbolFileFileSpec(symbol_file_spec);
1655 if (module_sp && symbol_file_spec) {
1658 module_sp->SetSymbolFileFileSpec(symbol_file_spec);
1664 "Failed to call GetCachedSharedModule");
1670 bool *did_create_ptr) {
1683 LLDB_LOGF(log,
"%s: locate module callback failed: %s",
1684 LLVM_PRETTY_FUNCTION,
error.AsCString());
1699 if (!module_file_spec && !symbol_file_spec) {
1703 "%s: locate module callback did not set both "
1704 "module_file_spec and symbol_file_spec",
1705 LLVM_PRETTY_FUNCTION);
1712 "%s: locate module callback set a non-existent file to "
1713 "module_file_spec: %s",
1714 LLVM_PRETTY_FUNCTION, module_file_spec.
GetPath().c_str());
1716 symbol_file_spec.
Clear();
1723 "%s: locate module callback set a non-existent file to "
1724 "symbol_file_spec: %s",
1725 LLVM_PRETTY_FUNCTION, symbol_file_spec.
GetPath().c_str());
1727 symbol_file_spec.
Clear();
1731 if (!module_file_spec && symbol_file_spec) {
1736 LLDB_LOGF(log,
"%s: locate module callback succeeded: symbol=%s",
1737 LLVM_PRETTY_FUNCTION, symbol_file_spec.
GetPath().c_str());
1747 auto cached_module_spec(module_spec);
1748 cached_module_spec.GetUUID().Clear();
1750 cached_module_spec.GetFileSpec() = module_file_spec;
1751 cached_module_spec.GetSymbolFileSpec() = symbol_file_spec;
1752 cached_module_spec.GetPlatformFileSpec() = module_spec.
GetFileSpec();
1753 cached_module_spec.SetObjectOffset(0);
1756 did_create_ptr,
false);
1757 if (
error.Success() && module_sp) {
1759 LLDB_LOGF(log,
"%s: locate module callback succeeded: module=%s symbol=%s",
1760 LLVM_PRETTY_FUNCTION, module_file_spec.
GetPath().c_str(),
1761 symbol_file_spec.
GetPath().c_str());
1764 "%s: locate module callback succeeded but failed to load: "
1765 "module=%s symbol=%s",
1766 LLVM_PRETTY_FUNCTION, module_file_spec.
GetPath().c_str(),
1767 symbol_file_spec.
GetPath().c_str());
1770 symbol_file_spec.
Clear();
1776 bool *did_create_ptr) {
1787 const FileSpec &tmp_download_file_spec) {
1794 const FileSpec &tmp_download_file_spec) {
1797 module_sp, did_create_ptr);
1798 if (
error.Success())
1801 LLDB_LOGF(log,
"Platform::%s - module %s not found in local cache: %s",
1808 const uint64_t src_offset,
1809 const uint64_t src_size,
1814 llvm::raw_fd_ostream dst(dst_file_spec.
GetPath(), EC, llvm::sys::fs::OF_None);
1817 "unable to open destination file: %s", dst_file_spec.
GetPath().c_str());
1822 lldb::eFilePermissionsFileDefault,
error);
1830 std::vector<char> buffer(512 * 1024);
1831 auto offset = src_offset;
1832 uint64_t total_bytes_read = 0;
1833 while (total_bytes_read < src_size) {
1834 const auto to_read = std::min(
static_cast<uint64_t
>(buffer.size()),
1835 src_size - total_bytes_read);
1836 const uint64_t n_read =
1845 total_bytes_read += n_read;
1846 dst.write(&buffer[0], n_read);
1858 "Symbol file downloading not supported by the default platform.");
1870 static const auto s_default_unix_signals_sp = std::make_shared<UnixSignals>();
1871 return s_default_unix_signals_sp;
1884 if (local_file && remote_file) {
1887 if (
IsRemote() || local_file != remote_file) {
1900 if (
IsRemote() || local_file != target_file) {
1920 const std::vector<std::string> *paths,
1924 "LoadImage is not supported on the current platform");
1930 const std::vector<std::string> &paths,
1940 file_to_use = remote_filename;
1946 uint32_t image_token) {
1948 "UnloadImage is not supported on the current platform");
1952 llvm::StringRef plugin_name,
1955 return DoConnectProcess(connect_url, plugin_name, debugger,
nullptr, target,
1960 llvm::StringRef connect_url, llvm::StringRef plugin_name,
1962 return DoConnectProcess(connect_url, plugin_name, debugger, &stream, target,
1967 llvm::StringRef plugin_name,
1975 const char *triple =
1982 target = new_target_sp.get();
1983 if (!target ||
error.Fail()) {
1995 const bool synchronous = stream !=
nullptr;
2000 process_sp->HijackProcessEvents(listener_sp);
2002 error = process_sp->ConnectRemote(connect_url);
2005 process_sp->RestoreProcessEvents();
2011 process_sp->WaitForProcessToStop(std::nullopt, &event_sp,
true, listener_sp,
2013 process_sp->RestoreProcessEvents();
2014 bool pop_process_io_handler =
false;
2033 const uint8_t *trap_opcode =
nullptr;
2034 size_t trap_opcode_size = 0;
2037 case llvm::Triple::aarch64_32:
2038 case llvm::Triple::aarch64: {
2039 static const uint8_t g_aarch64_opcode[] = {0x00, 0x00, 0x20, 0xd4};
2040 trap_opcode = g_aarch64_opcode;
2041 trap_opcode_size =
sizeof(g_aarch64_opcode);
2044 case llvm::Triple::arc: {
2045 static const uint8_t g_hex_opcode[] = { 0xff, 0x7f };
2046 trap_opcode = g_hex_opcode;
2047 trap_opcode_size =
sizeof(g_hex_opcode);
2051 case llvm::Triple::arm: {
2054 static const uint8_t g_arm_breakpoint_opcode[] = {0xf0, 0x01, 0xf0, 0xe7};
2055 static const uint8_t g_thumb_breakpoint_opcode[] = {0x01, 0xde};
2061 addr_class = bp_loc_sp->GetAddress().GetAddressClass();
2063 (bp_loc_sp->GetAddress().GetFileAddress() & 1))
2068 trap_opcode = g_thumb_breakpoint_opcode;
2069 trap_opcode_size =
sizeof(g_thumb_breakpoint_opcode);
2071 trap_opcode = g_arm_breakpoint_opcode;
2072 trap_opcode_size =
sizeof(g_arm_breakpoint_opcode);
2076 case llvm::Triple::avr: {
2077 static const uint8_t g_hex_opcode[] = {0x98, 0x95};
2078 trap_opcode = g_hex_opcode;
2079 trap_opcode_size =
sizeof(g_hex_opcode);
2082 case llvm::Triple::mips:
2083 case llvm::Triple::mips64: {
2084 static const uint8_t g_hex_opcode[] = {0x00, 0x00, 0x00, 0x0d};
2085 trap_opcode = g_hex_opcode;
2086 trap_opcode_size =
sizeof(g_hex_opcode);
2089 case llvm::Triple::mipsel:
2090 case llvm::Triple::mips64el: {
2091 static const uint8_t g_hex_opcode[] = {0x0d, 0x00, 0x00, 0x00};
2092 trap_opcode = g_hex_opcode;
2093 trap_opcode_size =
sizeof(g_hex_opcode);
2096 case llvm::Triple::msp430: {
2097 static const uint8_t g_msp430_opcode[] = {0x43, 0x43};
2098 trap_opcode = g_msp430_opcode;
2099 trap_opcode_size =
sizeof(g_msp430_opcode);
2102 case llvm::Triple::systemz: {
2103 static const uint8_t g_hex_opcode[] = {0x00, 0x01};
2104 trap_opcode = g_hex_opcode;
2105 trap_opcode_size =
sizeof(g_hex_opcode);
2108 case llvm::Triple::hexagon: {
2109 static const uint8_t g_hex_opcode[] = {0x0c, 0xdb, 0x00, 0x54};
2110 trap_opcode = g_hex_opcode;
2111 trap_opcode_size =
sizeof(g_hex_opcode);
2114 case llvm::Triple::ppc:
2115 case llvm::Triple::ppc64: {
2116 static const uint8_t g_ppc_opcode[] = {0x7f, 0xe0, 0x00, 0x08};
2117 trap_opcode = g_ppc_opcode;
2118 trap_opcode_size =
sizeof(g_ppc_opcode);
2121 case llvm::Triple::ppc64le: {
2122 static const uint8_t g_ppc64le_opcode[] = {0x08, 0x00, 0xe0, 0x7f};
2123 trap_opcode = g_ppc64le_opcode;
2124 trap_opcode_size =
sizeof(g_ppc64le_opcode);
2127 case llvm::Triple::x86:
2128 case llvm::Triple::x86_64: {
2129 static const uint8_t g_i386_opcode[] = {0xCC};
2130 trap_opcode = g_i386_opcode;
2131 trap_opcode_size =
sizeof(g_i386_opcode);
2134 case llvm::Triple::riscv32:
2135 case llvm::Triple::riscv64: {
2136 static const uint8_t g_riscv_opcode[] = {0x73, 0x00, 0x10, 0x00};
2137 static const uint8_t g_riscv_opcode_c[] = {0x02, 0x90};
2139 trap_opcode = g_riscv_opcode_c;
2140 trap_opcode_size =
sizeof(g_riscv_opcode_c);
2142 trap_opcode = g_riscv_opcode;
2143 trap_opcode_size =
sizeof(g_riscv_opcode);
2147 case llvm::Triple::loongarch32:
2148 case llvm::Triple::loongarch64: {
2149 static const uint8_t g_loongarch_opcode[] = {0x05, 0x00, 0x2a,
2151 trap_opcode = g_loongarch_opcode;
2152 trap_opcode_size =
sizeof(g_loongarch_opcode);
2155 case llvm::Triple::wasm32: {
2157 static const uint8_t g_wasm_opcode[] = {0x00};
2158 trap_opcode = g_wasm_opcode;
2159 trap_opcode_size =
sizeof(g_wasm_opcode);
2168 return trap_opcode_size;
2200 std::string reason_for_complaint =
2202 ? llvm::formatv(
"conflicts with the keyword '{0}'",
2205 :
"contains reserved characters";
2208 os.
Format(
"debug script '{0}' cannot be loaded because '{1}' {2}. "
2209 "Ignoring '{1}' and loading '{3}' instead.\n",
2211 std::move(reason_for_complaint), fspec.
GetFilename());
2213 os.
Format(
"debug script '{0}' cannot be loaded because '{1}' {2}. "
2214 "If you intend to have this script loaded, please rename it to "
2215 "'{3}' and retry.\n",
2217 std::move(reason_for_complaint), fspec.
GetFilename());
2221 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2223 if (platform_sp->GetName() == name)
2233 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2236 if (platform_sp->IsCompatibleArchitecture(
2243 if (platform_sp->IsCompatibleArchitecture(arch, process_host_arch,
2251 PlatformSP platform_sp = create_callback(
false, &arch);
2253 platform_sp->IsCompatibleArchitecture(
2261 PlatformSP platform_sp = create_callback(
false, &arch);
2262 if (platform_sp && platform_sp->IsCompatibleArchitecture(
2264 platform_arch_ptr)) {
2269 if (platform_arch_ptr)
2270 platform_arch_ptr->
Clear();
2285 std::vector<PlatformSP> &candidates) {
2287 candidates.reserve(archs.size());
2296 for (
const ArchSpec &arch : archs) {
2304 if (host_platform_sp) {
2305 for (
const ArchSpec &arch : archs) {
2306 if (host_platform_sp->IsCompatibleArchitecture(
2308 return host_platform_sp;
2313 for (
const ArchSpec &arch : archs) {
2315 candidates.push_back(platform);
2321 if (candidates.size() == archs.size()) {
2322 if (llvm::all_of(candidates, [&](
const PlatformSP &p) ->
bool {
2323 return p->GetName() == candidates.front()->GetName();
2325 return candidates.front();
2336 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2345 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2349 PlatformSP platform_sp = create_callback(
true, &arch);
2351 if (platform_sp->LoadPlatformBinaryAndSetup(process, addr, notify))
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
An architecture specification class.
bool IsValid() const
Tests if this ArchSpec is valid.
void Clear()
Clears the object state.
llvm::Triple & GetTriple()
Architecture triple accessor.
bool IsMatch(const ArchSpec &rhs, MatchType match) const
Compare this ArchSpec to another ArchSpec.
void DumpTriple(llvm::raw_ostream &s) const
uint32_t GetFlags() const
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
static bool ContainsOnlyArch(const llvm::Triple &normalized_triple)
Returns true if the OS, vendor and environment fields of the triple are unset.
A command line argument class.
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.
Generic representation of a type in a programming language.
A uniqued constant string class.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C 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.
A subclass of DataBuffer that stores a data buffer on the heap.
A class to manage flag bits.
TargetList & GetTargetList()
Get accessor for the target list.
lldb::ScriptLanguage GetScriptLanguage() const
static FileSpecList GetSafeAutoLoadPaths()
Get the list of paths that LLDB will consider automatically loading scripting resources from.
lldb::ListenerSP GetListener()
ScriptInterpreter * GetScriptInterpreter(bool can_create=true, std::optional< lldb::ScriptLanguage > language={})
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
bool CloseFile(lldb::user_id_t fd, Status &error)
uint64_t ReadFile(lldb::user_id_t fd, uint64_t offset, void *dst, uint64_t dst_len, Status &error)
lldb::user_id_t OpenFile(const FileSpec &file_spec, File::OpenOptions flags, uint32_t mode, Status &error)
uint64_t WriteFile(lldb::user_id_t fd, uint64_t offset, const void *src, uint64_t src_len, Status &error)
static FileCache & GetInstance()
void AppendPathComponent(llvm::StringRef component)
void SetDirectory(ConstString directory)
Directory string set accessor.
const ConstString & GetFilename() const
Filename string const get accessor.
const ConstString & GetDirectory() const
Directory string const get accessor.
bool IsAbsolute() const
Returns true if the filespec represents an absolute path.
Style GetPathStyle() const
ConstString GetFileNameStrippingExtension() const
Return the filename without the extension part.
void PrependPathComponent(llvm::StringRef component)
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
void Clear()
Clears the object state.
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.
@ eEnumerateDirectoryResultQuit
Stop directory enumerations at any level.
Status Symlink(const FileSpec &src, const FileSpec &dst)
bool Exists(const FileSpec &file_spec) const
Returns whether the given file exists.
int Open(const char *path, int flags, int mode=0600)
Wraps open in a platform-independent way.
Status Readlink(const FileSpec &src, FileSpec &dst)
uint32_t GetPermissions(const FileSpec &file_spec) const
Return the current permissions of the given file.
static FileSystem & Instance()
void Resolve(llvm::SmallVectorImpl< char > &path, bool force_make_absolute=false)
Resolve path to make it canonical.
@ eOpenOptionDontFollowSymlinks
bool Test(ValueType bit) const
Test a single flag bit.
ValueType Set(ValueType mask)
Set one or more flags by logical OR'ing mask with the current flags.
static Status LaunchProcess(ProcessLaunchInfo &launch_info)
Launch the process specified in launch_info.
static bool ResolveExecutableInBundle(FileSpec &file)
When executable files may live within a directory, where the directory represents an executable bundl...
static Status ShellExpandArguments(ProcessLaunchInfo &launch_info)
Perform expansion of the command-line for this launch info This can potentially involve wildcard expa...
static Environment GetEnvironment()
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 uint32_t FindProcesses(const ProcessInstanceInfoMatch &match_info, ProcessInstanceInfoList &proc_infos)
static void Kill(lldb::pid_t pid, int signo)
static lldb::ListenerSP MakeListener(const char *name)
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)
bool FindMatchingModuleSpec(const ModuleSpec &module_spec, ModuleSpec &match_module_spec) const
uint64_t GetObjectOffset() const
FileSpec & GetPlatformFileSpec()
ArchSpec & GetArchitecture()
FileSpec & GetSymbolFileSpec()
void SetTarget(lldb::TargetSP target)
Set the target to be used when resolving a module.
uint64_t GetObjectSize() const
lldb::TargetSP GetTargetSP() const
A class that describes an executable image and its associated object and symbol files.
static bool IsObjectFile(lldb_private::FileSpec file_spec)
static ModuleSpecList GetModuleSpecifications(const FileSpec &file, lldb::offset_t file_offset, lldb::offset_t file_size, lldb::DataExtractorSP=lldb::DataExtractorSP())
virtual llvm::StringRef GetPluginName()=0
static PlatformCreateInstance GetPlatformCreateCallbackForPluginName(llvm::StringRef name)
static llvm::SmallVector< StructuredDataPluginCallbacks > GetStructuredDataPluginCallbacks()
static llvm::SmallVector< PlatformCreateInstance > GetPlatformCreateCallbacks()
void SetHijackListener(const lldb::ListenerSP &listener_sp)
lldb::ListenerSP GetHijackListener() const
lldb::pid_t GetProcessID() const
bool MatchAllProcesses() const
const FileSpec & GetShell() const
uint32_t GetResumeCount() const
bool ConvertArgumentsForLaunchingInShell(Status &error, bool will_debug, bool first_arg_is_full_shell_command, uint32_t num_resumes)
void SetLaunchInSeparateProcessGroup(bool separate)
A plug-in interface definition class for debugging a process.
static bool HandleProcessStateChangedEvent(const lldb::EventSP &event_sp, Stream *stream, SelectMostRelevant select_most_relevant, bool &pop_process_io_handler)
Centralize the code that handles and prints descriptions for process state changes.
virtual bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch, ModuleSpec &module_spec)
Try to fetch the module specification for a module with the given file name and architecture.
virtual llvm::VersionTuple GetHostOSVersion()
Sometimes the connection to a process can detect the host OS version that the process is running on.
virtual ArchSpec GetSystemArchitecture()
Get the system architecture for this process.
lldb::OptionValuePropertiesSP m_collection_sp
T GetPropertyAtIndexAs(uint32_t idx, T default_value, const ExecutionContext *exe_ctx=nullptr) const
bool SetPropertyAtIndex(uint32_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
@ invalid_fd
Invalid file descriptor value.
int ReleasePrimaryFileDescriptor()
Release the primary file descriptor.
Holds an lldb_private::Module name and a "sanitized" version of it for the purposes of loading a scri...
bool RequiredSanitization() const
Returns true if the original name has been sanitized (i.e., required changes).
llvm::StringRef GetSanitizedName() const
llvm::StringRef GetConflictingKeyword() const
llvm::StringRef GetOriginalName() const
bool IsKeyword() const
Returns true if this name is a keyword in the associated scripting language.
virtual SanitizedScriptingModuleName GetSanitizedScriptingModuleName(llvm::StringRef name)
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
const char * GetData() 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.
llvm::raw_ostream & AsRawOstream()
Returns a raw_ostream that forwards the data to this Stream object.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t EOL()
Output and End of Line character to the stream.
Status CreateTarget(Debugger &debugger, llvm::StringRef user_exe_path, llvm::StringRef triple_str, LoadDependentFiles get_dependent_modules, const OptionGroupPlatform *platform_options, lldb::TargetSP &target_sp)
Create a new Target.
LoadScriptFromSymFile GetLoadScriptFromSymbolFile() const
Debugger & GetDebugger() const
const lldb::ProcessSP & CreateProcess(lldb::ListenerSP listener_sp, llvm::StringRef plugin_name, const FileSpec *crash_file, bool can_connect)
static ArchSpec GetDefaultArchitecture()
const ArchSpec & GetArchitecture() const
Represents UUID's of various sizes.
std::string GetAsString(llvm::StringRef separator="-") const
static lldb::UnixSignalsSP CreateForHost()
An abstract interface for things that know how to map numeric user/group IDs into names.
static UserIDResolver & GetNoopResolver()
Returns a resolver which returns a failure value for each query.
#define LLDB_INVALID_IMAGE_TOKEN
#define LLDB_INVALID_PROCESS_ID
@ SelectMostRelevantFrame
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.
llvm::SmallVector< lldb::addr_t, 6 > MmapArgList
lldb::PlatformSP(* PlatformCreateInstance)(bool force, const ArchSpec *arch)
std::vector< ProcessInstanceInfo > ProcessInstanceInfoList
std::shared_ptr< lldb_private::BreakpointLocation > BreakpointLocationSP
std::shared_ptr< lldb_private::UnixSignals > UnixSignalsSP
std::shared_ptr< lldb_private::Platform > PlatformSP
@ eErrorTypeGeneric
Generic errors that can be any value.
std::shared_ptr< lldb_private::Breakpoint > BreakpointSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::Event > EventSP
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::Module > ModuleSP