45#include "llvm/ADT/STLExtras.h"
46#include "llvm/Support/FileSystem.h"
47#include "llvm/Support/FormatVariadic.h"
48#include "llvm/Support/Path.h"
53#define MAP_ANON 0x1000
69#define LLDB_PROPERTIES_platform
70#include "TargetProperties.inc"
73#define LLDB_PROPERTIES_platform
74#include "TargetPropertiesEnum.inc"
80 static constexpr llvm::StringLiteral g_setting_name(
"platform");
81 return g_setting_name;
92 llvm::SmallString<64> user_home_dir;
96 module_cache_dir =
FileSpec(user_home_dir.c_str());
97 module_cache_dir.AppendPathComponent(
".lldb");
98 module_cache_dir.AppendPathComponent(
"module_cache");
104 const auto idx = ePropertyUseModuleCache;
106 idx, g_platform_properties[idx].default_uint_value != 0);
118 return m_collection_sp->SetPropertyAtIndex(ePropertyModuleCacheDirectory,
124 auto f_spec_opt =
m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec(
125 ePropertyModuleCacheDirectory);
127 f_spec_opt->SetDefaultValue(dir_spec);
158 local_file = platform_file;
172 .value_or(default_load_style);
175llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
181 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> file_specs;
196 for (
FileSpec path : llvm::reverse(paths)) {
214 orig_script_fspec, script_fspec);
219 file_specs.try_emplace(std::move(script_fspec), load_style);
230llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
233 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> empty;
237llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
239 Stream &feedback_stream) {
240 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> empty;
246 target, module, feedback_stream);
250 const FileSpec &module_spec =
module.GetFileSpec();
255 module_spec, *target);
275 resolved_spec = spec;
284 if (!
error.Success()) {
285 resolved_spec = spec;
290 if (
error.Success() && module_sp)
291 module_sp->SetPlatformFileSpec(resolved_spec.
GetFileSpec());
316 return create_callback(
true,
nullptr);
323 return HostInfo::GetAugmentedArchSpec(triple);
336 LLDB_LOGF(log,
"%p Platform::Platform()",
static_cast<void *
>(
this));
354 if (!os_version.empty()) {
355 strm.
Format(
"OS Version: {0}", os_version.getAsString());
358 strm.
Format(
" ({0})", *s);
369 strm.
Printf(
" Connected: %s\n", is_connected ?
"yes" :
"no");
373 strm.
Format(
" Sysroot: {0}\n", sdk_root);
383 if (!specific_info.empty())
384 strm.
Printf(
"Platform-specific connection: %s\n", specific_info.c_str());
387 strm.
Format(
" Kernel: {0}\n", *s);
391 std::lock_guard<std::mutex> guard(
m_mutex);
415 fetch = is_connected;
429 return llvm::VersionTuple();
434 return HostInfo::GetOSBuildString();
440 return HostInfo::GetOSKernelDescription();
445 Target *target, std::vector<std::string> &options) {
446 std::vector<std::string> default_compilation_options = {
447 "-x",
"c++",
"-Xclang",
"-nostdsysteminc",
"-Xclang",
"-nostdsysteminc"};
449 options.insert(options.end(), default_compilation_options.begin(),
450 default_compilation_options.end());
455 llvm::SmallString<64> cwd;
456 if (llvm::sys::fs::current_path(cwd))
478 llvm::StringRef path) {
481 namespace fs = llvm::sys::fs;
483 case fs::file_type::fifo_file:
484 case fs::file_type::socket_file:
489 case fs::file_type::directory_file: {
495 dst_dir, lldb::eFilePermissionsDirectoryDefault);
498 "unable to setup directory {0} on remote end", dst_dir.
GetPath());
503 std::string src_dir_path(src.
GetPath());
520 case fs::file_type::symlink_file: {
542 case fs::file_type::regular_file: {
557 "invalid file detected during copy: %s", src.
GetPath().c_str());
561 llvm_unreachable(
"Unhandled file_type!");
568 LLDB_LOGF(log,
"Platform::Install (src='%s', dst='%s')",
580 if (first_dst_dir_char ==
'/' || first_dst_dir_char ==
'\\') {
589 relative_spec = working_dir;
594 "platform working directory must be valid for relative path '%s'",
604 "platform working directory must be valid for relative path '%s'",
615 "when destination directory is empty");
620 LLDB_LOGF(log,
"Platform::Install (src='%s', dst='%s') fixed_dst='%s'",
627 namespace fs = llvm::sys::fs;
628 switch (fs::get_file_type(src.
GetPath(),
false)) {
629 case fs::file_type::directory_file: {
630 llvm::sys::fs::remove(fixed_dst.
GetPath());
632 if (permissions == 0)
633 permissions = eFilePermissionsDirectoryDefault;
635 if (
error.Success()) {
640 std::string src_dir_path(src.
GetPath());
644 return std::move(baton.
error);
648 case fs::file_type::regular_file:
649 llvm::sys::fs::remove(fixed_dst.
GetPath());
653 case fs::file_type::symlink_file: {
654 llvm::sys::fs::remove(fixed_dst.
GetPath());
660 case fs::file_type::fifo_file:
663 case fs::file_type::socket_file:
669 "platform install doesn't handle non file or directory items");
680 if (std::error_code ec = llvm::sys::fs::set_current_path(file_spec.
GetPath())) {
681 LLDB_LOG(log,
"error: {0}", ec.message());
692 uint32_t permissions) {
694 return llvm::sys::fs::create_directory(file_spec.
GetPath(), permissions);
699 LLVM_PRETTY_FUNCTION);
705 uint32_t &file_permissions) {
707 auto Value = llvm::sys::fs::getPermissions(file_spec.
GetPath());
709 file_permissions =
Value.get();
715 LLVM_PRETTY_FUNCTION);
721 uint32_t file_permissions) {
723 auto Perms =
static_cast<llvm::sys::fs::perms
>(file_permissions);
724 return llvm::sys::fs::setPermissions(file_spec.
GetPath(), Perms);
729 LLVM_PRETTY_FUNCTION);
753 if (llvm::sys::fs::file_size(file_spec.
GetPath(), Size))
763 "Platform::ReadFile() is not supported in the {0} platform",
769 const void *src, uint64_t src_len,
Status &
error) {
773 "Platform::WriteFile() is not supported in the {0} platform",
780 return HostInfo::GetUserIDResolver();
799 LLDB_LOGF(log,
"Platform::SetRemoteWorkingDirectory('%s')",
800 working_dir.
GetPath().c_str());
840 "'{0}' does not exist", resolved_module_spec.
GetFileSpec());
845 exe_module_sp,
nullptr,
nullptr);
847 if (exe_module_sp && exe_module_sp->GetObjectFile())
849 exe_module_sp.reset();
855 llvm::ListSeparator LS;
863 if (
error.Success()) {
864 if (exe_module_sp && exe_module_sp->GetObjectFile())
869 arch_names << LS << arch.GetArchitectureName();
872 if (exe_module_sp &&
error.Success())
877 "'{0}' is not readable", resolved_module_spec.
GetFileSpec());
881 "'{0}' is not a valid executable", resolved_module_spec.
GetFileSpec());
884 "'{0}' doesn't contain any '{1}' platform architectures: {2}",
901 resolved_platform_path = platform_path;
929 fetch = is_connected;
943 llvm::Triple normalized_triple(llvm::Triple::normalize(triple));
947 if (
auto kind = HostInfo::ParseArchitectureKind(triple))
948 return HostInfo::GetArchitecture(*kind);
956 if (!compatible_arch.
IsValid())
959 const llvm::Triple &compatible_triple = compatible_arch.
GetTriple();
960 if (normalized_triple.getVendorName().empty())
961 normalized_triple.setVendor(compatible_triple.getVendor());
962 if (normalized_triple.getOSName().empty())
963 normalized_triple.setOS(compatible_triple.getOS());
964 if (normalized_triple.getEnvironmentName().empty())
965 normalized_triple.setEnvironment(compatible_triple.getEnvironment());
973 "The currently selected platform ({0}) is "
974 "the host platform and is always connected.",
978 "Platform::ConnectRemote() is not supported by {0}",
GetPluginName());
986 "The currently selected platform ({0}) is "
987 "the host platform and is always connected.",
991 "Platform::DisconnectRemote() is not supported by {0}",
1009 uint32_t match_count = 0;
1026 LLDB_LOGF(log,
"Platform::%s()", __FUNCTION__);
1031 if (::getenv(
"LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY"))
1032 launch_info.
GetFlags().
Set(eLaunchFlagLaunchInTTY);
1034 if (launch_info.
GetFlags().
Test(eLaunchFlagLaunchInShell)) {
1035 const bool will_debug = launch_info.
GetFlags().
Test(eLaunchFlagDebug);
1036 const bool first_arg_is_full_shell_command =
false;
1040 std::string shell_str = (shell) ? shell.
GetPath() :
"<null>";
1042 "Platform::%s GetResumeCountForLaunchInfo() returned %" PRIu32
1044 __FUNCTION__, num_resumes, shell_str.c_str());
1048 error, will_debug, first_arg_is_full_shell_command, num_resumes))
1050 }
else if (launch_info.
GetFlags().
Test(eLaunchFlagShellExpandArguments)) {
1054 "shell expansion failed (reason: %s). "
1055 "consider launching with 'process "
1057 error.AsCString(
"unknown"));
1062 LLDB_LOGF(log,
"Platform::%s final launch_info resume count: %" PRIu32,
1068 "base lldb_private::Platform class can't launch remote processes");
1076 "base lldb_private::Platform class can't expand arguments");
1081 LLDB_LOGF(log,
"Platform::%s, pid %" PRIu64, __FUNCTION__, pid);
1085 "base lldb_private::Platform class can't kill remote processes");
1095 LLDB_LOG(log,
"target = {0}", &target);
1108 if (cbs.filter_callback) {
1110 error = (*cbs.filter_callback)(launch_info, &target);
1111 if (!
error.Success()) {
1113 "Platform::%s() StructuredDataPlugin launch "
1122 if (
error.Success()) {
1124 "Platform::%s LaunchProcess() call succeeded (pid=%" PRIu64
")",
1128 process_sp =
Attach(attach_info, debugger, &target,
error);
1130 LLDB_LOG(log,
"Attach() succeeded, Process plugin: {0}",
1131 process_sp->GetPluginName());
1138 process_sp->SetShouldDetach(
false);
1147 process_sp->SetSTDIOFileDescriptor(pty_fd);
1151 LLDB_LOGF(log,
"Platform::%s Attach() failed: %s", __FUNCTION__,
1156 "Platform::%s LaunchProcess() returned launch_info with "
1157 "invalid process id",
1161 LLDB_LOGF(log,
"Platform::%s LaunchProcess() failed: %s", __FUNCTION__,
1168std::vector<ArchSpec>
1170 llvm::Triple::OSType os) {
1171 std::vector<ArchSpec> list;
1172 for(
auto arch : archs) {
1173 llvm::Triple triple;
1174 triple.setArch(arch);
1190 for (
const ArchSpec &platform_arch :
1192 if (arch.
IsMatch(platform_arch, match)) {
1193 if (compatible_arch_ptr)
1194 *compatible_arch_ptr = platform_arch;
1199 if (compatible_arch_ptr)
1200 compatible_arch_ptr->
Clear();
1205 uint32_t uid, uint32_t gid) {
1207 LLDB_LOGF(log,
"[PutFile] Using block by block transfer....\n");
1209 auto source_open_options =
1211 namespace fs = llvm::sys::fs;
1212 if (fs::is_symlink_file(source.
GetPath()))
1216 lldb::eFilePermissionsUserRW);
1221 bool requires_upload =
true;
1222 llvm::ErrorOr<llvm::MD5::MD5Result> remote_md5 =
CalculateMD5(destination);
1223 if (std::error_code ec = remote_md5.getError()) {
1224 LLDB_LOG(log,
"[PutFile] couldn't get md5 sum of destination: {0}",
1227 llvm::ErrorOr<llvm::MD5::MD5Result> local_md5 =
1228 llvm::sys::fs::md5_contents(source.
GetPath());
1229 if (std::error_code ec = local_md5.getError()) {
1230 LLDB_LOG(log,
"[PutFile] couldn't get md5 sum of source: {0}",
1233 LLDB_LOGF(log,
"[PutFile] destination md5: %016" PRIx64
"%016" PRIx64,
1234 remote_md5->high(), remote_md5->low());
1235 LLDB_LOGF(log,
"[PutFile] local md5: %016" PRIx64
"%016" PRIx64,
1236 local_md5->high(), local_md5->low());
1237 requires_upload = *remote_md5 != *local_md5;
1241 if (!requires_upload) {
1242 LLDB_LOGF(log,
"[PutFile] skipping PutFile because md5sums match");
1246 uint32_t permissions = source_file.get()->GetPermissions(
error);
1247 if (permissions == 0)
1248 permissions = lldb::eFilePermissionsUserRWX;
1253 permissions,
error);
1254 LLDB_LOGF(log,
"dest_file = %" PRIu64
"\n", dest_file);
1261 uint64_t offset = 0;
1263 size_t bytes_read = buffer_sp->GetByteSize();
1264 error = source_file.get()->Read(buffer_sp->GetBytes(), bytes_read);
1265 if (
error.Fail() || bytes_read == 0)
1268 const uint64_t bytes_written =
1269 WriteFile(dest_file, offset, buffer_sp->GetBytes(), bytes_read,
error);
1273 offset += bytes_written;
1274 if (bytes_written != bytes_read) {
1277 source_file.get()->SeekFromStart(offset);
1311 return llvm::sys::fs::remove(path.
GetPath());
1316 addr_t length,
unsigned prot,
1317 unsigned flags,
addr_t fd,
1319 uint64_t flags_platform = 0;
1325 MmapArgList args({addr, length, prot, flags_platform, fd, offset});
1330 llvm::StringRef command,
1338 std::string *separated_error_output,
1341 return RunShellCommand(llvm::StringRef(), command, working_dir, status_ptr,
1342 signo_ptr, command_output, separated_error_output,
1347 llvm::StringRef shell,
1349 llvm::StringRef command,
1357 std::string *separated_error_output,
1362 signo_ptr, command_output,
1363 separated_error_output, timeout);
1365 "unable to run a remote command without a platform");
1368llvm::ErrorOr<llvm::MD5::MD5Result>
1371 return std::make_error_code(std::errc::not_supported);
1372 return llvm::sys::fs::md5_contents(file_spec.
GetPath());
1388 "Platform-specific options required for rsync to work."},
1391 "Platform-specific rsync prefix put before the remote path."},
1394 "Do not automatically fill in the remote hostname when composing the "
1403 "Platform-specific options required for SSH to work."},
1409 "Path in which to store local copies of files."},
1426 llvm::StringRef option_arg,
1429 char short_option = (char)
GetDefinitions()[option_idx].short_option;
1430 switch (short_option) {
1473 llvm::StringRef option_arg,
1476 char short_option = (char)
GetDefinitions()[option_idx].short_option;
1477 switch (short_option) {
1505 uint32_t option_idx, llvm::StringRef option_arg,
1508 char short_option = (char)
GetDefinitions()[option_idx].short_option;
1509 switch (short_option) {
1531 std::lock_guard<std::mutex> guard(
m_mutex);
1544 module_spec,
nullptr, module_sp,
1549 if (
error.Success()) {
1550 module_spec.
GetFileSpec() = module_sp->GetFileSpec();
1561 bool *did_create_ptr) {
1565 bool got_module_spec =
false;
1571 resolved_module_spec)) {
1574 got_module_spec =
true;
1590 if (
error.Success() && module_sp)
1594 resolved_module_spec = arch_module_spec;
1595 got_module_spec =
true;
1599 if (!got_module_spec) {
1602 resolved_module_spec)) {
1605 got_module_spec =
true;
1610 if (!got_module_spec) {
1613 return module_resolver(module_spec);
1632 symbol_file_spec, did_create_ptr);
1635 if (symbol_file_spec) {
1639 module_sp->SetSymbolFileFileSpec(symbol_file_spec);
1660 Status error = module_resolver(resolved_module_spec);
1661 if (
error.Success()) {
1662 if (module_sp && symbol_file_spec) {
1665 module_sp->SetSymbolFileFileSpec(symbol_file_spec);
1672 if (module_sp && symbol_file_spec) {
1675 module_sp->SetSymbolFileFileSpec(symbol_file_spec);
1681 "Failed to call GetCachedSharedModule");
1687 bool *did_create_ptr) {
1700 LLDB_LOGF(log,
"%s: locate module callback failed: %s",
1701 LLVM_PRETTY_FUNCTION,
error.AsCString());
1716 if (!module_file_spec && !symbol_file_spec) {
1720 "%s: locate module callback did not set both "
1721 "module_file_spec and symbol_file_spec",
1722 LLVM_PRETTY_FUNCTION);
1729 "%s: locate module callback set a non-existent file to "
1730 "module_file_spec: %s",
1731 LLVM_PRETTY_FUNCTION, module_file_spec.
GetPath().c_str());
1733 symbol_file_spec.
Clear();
1740 "%s: locate module callback set a non-existent file to "
1741 "symbol_file_spec: %s",
1742 LLVM_PRETTY_FUNCTION, symbol_file_spec.
GetPath().c_str());
1744 symbol_file_spec.
Clear();
1748 if (!module_file_spec && symbol_file_spec) {
1753 LLDB_LOGF(log,
"%s: locate module callback succeeded: symbol=%s",
1754 LLVM_PRETTY_FUNCTION, symbol_file_spec.
GetPath().c_str());
1764 auto cached_module_spec(module_spec);
1765 cached_module_spec.GetUUID().Clear();
1767 cached_module_spec.GetFileSpec() = module_file_spec;
1768 cached_module_spec.GetSymbolFileSpec() = symbol_file_spec;
1769 cached_module_spec.GetPlatformFileSpec() = module_spec.
GetFileSpec();
1770 cached_module_spec.SetObjectOffset(0);
1773 did_create_ptr,
false);
1774 if (
error.Success() && module_sp) {
1776 LLDB_LOGF(log,
"%s: locate module callback succeeded: module=%s symbol=%s",
1777 LLVM_PRETTY_FUNCTION, module_file_spec.
GetPath().c_str(),
1778 symbol_file_spec.
GetPath().c_str());
1781 "%s: locate module callback succeeded but failed to load: "
1782 "module=%s symbol=%s",
1783 LLVM_PRETTY_FUNCTION, module_file_spec.
GetPath().c_str(),
1784 symbol_file_spec.
GetPath().c_str());
1787 symbol_file_spec.
Clear();
1793 bool *did_create_ptr) {
1804 const FileSpec &tmp_download_file_spec) {
1811 const FileSpec &tmp_download_file_spec) {
1814 module_sp, did_create_ptr);
1815 if (
error.Success())
1818 LLDB_LOGF(log,
"Platform::%s - module %s not found in local cache: %s",
1825 const uint64_t src_offset,
1826 const uint64_t src_size,
1831 llvm::raw_fd_ostream dst(dst_file_spec.
GetPath(), EC, llvm::sys::fs::OF_None);
1834 "unable to open destination file: %s", dst_file_spec.
GetPath().c_str());
1839 lldb::eFilePermissionsFileDefault,
error);
1847 std::vector<char> buffer(512 * 1024);
1848 auto offset = src_offset;
1849 uint64_t total_bytes_read = 0;
1850 while (total_bytes_read < src_size) {
1851 const auto to_read = std::min(
static_cast<uint64_t
>(buffer.size()),
1852 src_size - total_bytes_read);
1853 const uint64_t n_read =
1862 total_bytes_read += n_read;
1863 dst.write(&buffer[0], n_read);
1875 "Symbol file downloading not supported by the default platform.");
1887 static const auto s_default_unix_signals_sp = std::make_shared<UnixSignals>();
1888 return s_default_unix_signals_sp;
1901 if (local_file && remote_file) {
1904 if (
IsRemote() || local_file != remote_file) {
1917 if (
IsRemote() || local_file != target_file) {
1937 const std::vector<std::string> *paths,
1941 "LoadImage is not supported on the current platform");
1947 const std::vector<std::string> &paths,
1957 file_to_use = remote_filename;
1963 uint32_t image_token) {
1965 "UnloadImage is not supported on the current platform");
1969 llvm::StringRef plugin_name,
1972 return DoConnectProcess(connect_url, plugin_name, debugger,
nullptr, target,
1977 llvm::StringRef connect_url, llvm::StringRef plugin_name,
1979 return DoConnectProcess(connect_url, plugin_name, debugger, &stream, target,
1984 llvm::StringRef plugin_name,
1992 const char *triple =
1999 target = new_target_sp.get();
2000 if (!target ||
error.Fail()) {
2012 const bool synchronous = stream !=
nullptr;
2017 process_sp->HijackProcessEvents(listener_sp);
2019 error = process_sp->ConnectRemote(connect_url);
2022 process_sp->RestoreProcessEvents();
2028 process_sp->WaitForProcessToStop(std::nullopt, &event_sp,
true, listener_sp,
2030 process_sp->RestoreProcessEvents();
2031 bool pop_process_io_handler =
false;
2050 const uint8_t *trap_opcode =
nullptr;
2051 size_t trap_opcode_size = 0;
2054 case llvm::Triple::aarch64_32:
2055 case llvm::Triple::aarch64: {
2056 static const uint8_t g_aarch64_opcode[] = {0x00, 0x00, 0x20, 0xd4};
2057 trap_opcode = g_aarch64_opcode;
2058 trap_opcode_size =
sizeof(g_aarch64_opcode);
2061 case llvm::Triple::arc: {
2062 static const uint8_t g_hex_opcode[] = { 0xff, 0x7f };
2063 trap_opcode = g_hex_opcode;
2064 trap_opcode_size =
sizeof(g_hex_opcode);
2068 case llvm::Triple::arm: {
2071 static const uint8_t g_arm_breakpoint_opcode[] = {0xf0, 0x01, 0xf0, 0xe7};
2072 static const uint8_t g_thumb_breakpoint_opcode[] = {0x01, 0xde};
2078 addr_class = bp_loc_sp->GetAddress().GetAddressClass();
2080 (bp_loc_sp->GetAddress().GetFileAddress() & 1))
2085 trap_opcode = g_thumb_breakpoint_opcode;
2086 trap_opcode_size =
sizeof(g_thumb_breakpoint_opcode);
2088 trap_opcode = g_arm_breakpoint_opcode;
2089 trap_opcode_size =
sizeof(g_arm_breakpoint_opcode);
2093 case llvm::Triple::avr: {
2094 static const uint8_t g_hex_opcode[] = {0x98, 0x95};
2095 trap_opcode = g_hex_opcode;
2096 trap_opcode_size =
sizeof(g_hex_opcode);
2099 case llvm::Triple::mips:
2100 case llvm::Triple::mips64: {
2101 static const uint8_t g_hex_opcode[] = {0x00, 0x00, 0x00, 0x0d};
2102 trap_opcode = g_hex_opcode;
2103 trap_opcode_size =
sizeof(g_hex_opcode);
2106 case llvm::Triple::mipsel:
2107 case llvm::Triple::mips64el: {
2108 static const uint8_t g_hex_opcode[] = {0x0d, 0x00, 0x00, 0x00};
2109 trap_opcode = g_hex_opcode;
2110 trap_opcode_size =
sizeof(g_hex_opcode);
2113 case llvm::Triple::msp430: {
2114 static const uint8_t g_msp430_opcode[] = {0x43, 0x43};
2115 trap_opcode = g_msp430_opcode;
2116 trap_opcode_size =
sizeof(g_msp430_opcode);
2119 case llvm::Triple::systemz: {
2120 static const uint8_t g_hex_opcode[] = {0x00, 0x01};
2121 trap_opcode = g_hex_opcode;
2122 trap_opcode_size =
sizeof(g_hex_opcode);
2125 case llvm::Triple::hexagon: {
2126 static const uint8_t g_hex_opcode[] = {0x0c, 0xdb, 0x00, 0x54};
2127 trap_opcode = g_hex_opcode;
2128 trap_opcode_size =
sizeof(g_hex_opcode);
2131 case llvm::Triple::ppc:
2132 case llvm::Triple::ppc64: {
2133 static const uint8_t g_ppc_opcode[] = {0x7f, 0xe0, 0x00, 0x08};
2134 trap_opcode = g_ppc_opcode;
2135 trap_opcode_size =
sizeof(g_ppc_opcode);
2138 case llvm::Triple::ppc64le: {
2139 static const uint8_t g_ppc64le_opcode[] = {0x08, 0x00, 0xe0, 0x7f};
2140 trap_opcode = g_ppc64le_opcode;
2141 trap_opcode_size =
sizeof(g_ppc64le_opcode);
2144 case llvm::Triple::x86:
2145 case llvm::Triple::x86_64: {
2146 static const uint8_t g_i386_opcode[] = {0xCC};
2147 trap_opcode = g_i386_opcode;
2148 trap_opcode_size =
sizeof(g_i386_opcode);
2151 case llvm::Triple::riscv32:
2152 case llvm::Triple::riscv64: {
2153 static const uint8_t g_riscv_opcode[] = {0x73, 0x00, 0x10, 0x00};
2154 static const uint8_t g_riscv_opcode_c[] = {0x02, 0x90};
2156 trap_opcode = g_riscv_opcode_c;
2157 trap_opcode_size =
sizeof(g_riscv_opcode_c);
2159 trap_opcode = g_riscv_opcode;
2160 trap_opcode_size =
sizeof(g_riscv_opcode);
2164 case llvm::Triple::loongarch32:
2165 case llvm::Triple::loongarch64: {
2166 static const uint8_t g_loongarch_opcode[] = {0x05, 0x00, 0x2a,
2168 trap_opcode = g_loongarch_opcode;
2169 trap_opcode_size =
sizeof(g_loongarch_opcode);
2172 case llvm::Triple::wasm32: {
2174 static const uint8_t g_wasm_opcode[] = {0x00};
2175 trap_opcode = g_wasm_opcode;
2176 trap_opcode_size =
sizeof(g_wasm_opcode);
2185 return trap_opcode_size;
2217 std::string reason_for_complaint =
2219 ? llvm::formatv(
"conflicts with the keyword '{0}'",
2222 :
"contains reserved characters";
2225 os.
Format(
"debug script '{0}' cannot be loaded because '{1}' {2}. "
2226 "Ignoring '{1}' and loading '{3}' instead.\n",
2228 std::move(reason_for_complaint), fspec.
GetFilename());
2230 os.
Format(
"debug script '{0}' cannot be loaded because '{1}' {2}. "
2231 "If you intend to have this script loaded, please rename it to "
2232 "'{3}' and retry.\n",
2234 std::move(reason_for_complaint), fspec.
GetFilename());
2238 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2240 if (platform_sp->GetName() == name)
2250 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2253 if (platform_sp->IsCompatibleArchitecture(
2260 if (platform_sp->IsCompatibleArchitecture(arch, process_host_arch,
2268 PlatformSP platform_sp = create_callback(
false, &arch);
2270 platform_sp->IsCompatibleArchitecture(
2278 PlatformSP platform_sp = create_callback(
false, &arch);
2279 if (platform_sp && platform_sp->IsCompatibleArchitecture(
2281 platform_arch_ptr)) {
2286 if (platform_arch_ptr)
2287 platform_arch_ptr->
Clear();
2302 std::vector<PlatformSP> &candidates) {
2304 candidates.reserve(archs.size());
2313 for (
const ArchSpec &arch : archs) {
2321 if (host_platform_sp) {
2322 for (
const ArchSpec &arch : archs) {
2323 if (host_platform_sp->IsCompatibleArchitecture(
2325 return host_platform_sp;
2330 for (
const ArchSpec &arch : archs) {
2332 candidates.push_back(platform);
2338 if (candidates.size() == archs.size()) {
2339 if (llvm::all_of(candidates, [&](
const PlatformSP &p) ->
bool {
2340 return p->GetName() == candidates.front()->GetName();
2342 return candidates.front();
2353 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2362 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2366 PlatformSP platform_sp = create_callback(
true, &arch);
2368 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.
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
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.
std::optional< LoadScriptFromSymFile > GetAutoLoadScriptsForModule(llvm::StringRef module_name) const
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)
FileSpecList GetSafeAutoLoadPaths() const
Get the list of paths that LLDB will consider automatically loading scripting resources from.
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