45#include "llvm/ADT/ArrayRef.h"
46#include "llvm/ADT/STLExtras.h"
47#include "llvm/Support/FileSystem.h"
48#include "llvm/Support/FormatVariadic.h"
49#include "llvm/Support/Path.h"
54#define MAP_ANON 0x1000
70#define LLDB_PROPERTIES_platform
71#include "TargetProperties.inc"
74#define LLDB_PROPERTIES_platform
75#include "TargetPropertiesEnum.inc"
81 static constexpr llvm::StringLiteral g_setting_name(
"platform");
82 return g_setting_name;
93 llvm::SmallString<64> user_home_dir;
97 module_cache_dir =
FileSpec(user_home_dir.c_str());
98 module_cache_dir.AppendPathComponent(
".lldb");
99 module_cache_dir.AppendPathComponent(
"module_cache");
105 const auto idx = ePropertyUseModuleCache;
107 idx, g_platform_properties[idx].default_uint_value != 0);
119 return m_collection_sp->SetPropertyAtIndex(ePropertyModuleCacheDirectory,
125 auto f_spec_opt =
m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec(
126 ePropertyModuleCacheDirectory);
128 f_spec_opt->SetDefaultValue(dir_spec);
159 local_file = platform_file;
173 .value_or(default_load_style);
176llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
182 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> file_specs;
197 for (
FileSpec path : llvm::reverse(paths)) {
215 orig_script_fspec, script_fspec);
220 file_specs.try_emplace(std::move(script_fspec), load_style);
231llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
234 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> empty;
238llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile>
240 Stream &feedback_stream) {
241 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> empty;
247 target, module, feedback_stream);
251 const FileSpec &module_spec =
module.GetFileSpec();
256 module_spec, *target);
276 resolved_spec = spec;
285 if (!
error.Success()) {
286 resolved_spec = spec;
291 if (
error.Success() && module_sp)
292 module_sp->SetPlatformFileSpec(resolved_spec.
GetFileSpec());
317 return create_callback(
true,
nullptr);
324 return HostInfo::GetAugmentedArchSpec(triple);
337 LLDB_LOGF(log,
"%p Platform::Platform()",
static_cast<void *
>(
this));
355 if (!os_version.empty()) {
356 strm.
Format(
"OS Version: {0}", os_version.getAsString());
359 strm.
Format(
" ({0})", *s);
370 strm.
Printf(
" Connected: %s\n", is_connected ?
"yes" :
"no");
374 strm.
Format(
" Sysroot: {0}\n", sdk_root);
384 if (!specific_info.empty())
385 strm.
Printf(
"Platform-specific connection: %s\n", specific_info.c_str());
388 strm.
Format(
" Kernel: {0}\n", *s);
392 std::lock_guard<std::mutex> guard(
m_mutex);
416 fetch = is_connected;
430 return llvm::VersionTuple();
435 return HostInfo::GetOSBuildString();
441 return HostInfo::GetOSKernelDescription();
446 Target *target, std::vector<std::string> &options) {
447 std::vector<std::string> default_compilation_options = {
448 "-x",
"c++",
"-Xclang",
"-nostdsysteminc",
"-Xclang",
"-nostdsysteminc"};
450 options.insert(options.end(), default_compilation_options.begin(),
451 default_compilation_options.end());
456 llvm::SmallString<64> cwd;
457 if (llvm::sys::fs::current_path(cwd))
479 llvm::StringRef path) {
482 namespace fs = llvm::sys::fs;
484 case fs::file_type::fifo_file:
485 case fs::file_type::socket_file:
490 case fs::file_type::directory_file: {
496 dst_dir, lldb::eFilePermissionsDirectoryDefault);
499 "unable to setup directory {0} on remote end", dst_dir.
GetPath());
504 std::string src_dir_path(src.
GetPath());
521 case fs::file_type::symlink_file: {
543 case fs::file_type::regular_file: {
558 "invalid file detected during copy: %s", src.
GetPath().c_str());
562 llvm_unreachable(
"Unhandled file_type!");
569 LLDB_LOGF(log,
"Platform::Install (src='%s', dst='%s')",
581 if (first_dst_dir_char ==
'/' || first_dst_dir_char ==
'\\') {
590 relative_spec = working_dir;
595 "platform working directory must be valid for relative path '%s'",
605 "platform working directory must be valid for relative path '%s'",
616 "when destination directory is empty");
621 LLDB_LOGF(log,
"Platform::Install (src='%s', dst='%s') fixed_dst='%s'",
628 namespace fs = llvm::sys::fs;
629 switch (fs::get_file_type(src.
GetPath(),
false)) {
630 case fs::file_type::directory_file: {
631 llvm::sys::fs::remove(fixed_dst.
GetPath());
633 if (permissions == 0)
634 permissions = eFilePermissionsDirectoryDefault;
636 if (
error.Success()) {
641 std::string src_dir_path(src.
GetPath());
645 return std::move(baton.
error);
649 case fs::file_type::regular_file:
650 llvm::sys::fs::remove(fixed_dst.
GetPath());
654 case fs::file_type::symlink_file: {
655 llvm::sys::fs::remove(fixed_dst.
GetPath());
661 case fs::file_type::fifo_file:
664 case fs::file_type::socket_file:
670 "platform install doesn't handle non file or directory items");
681 if (std::error_code ec = llvm::sys::fs::set_current_path(file_spec.
GetPath())) {
682 LLDB_LOG(log,
"error: {0}", ec.message());
693 uint32_t permissions) {
695 return llvm::sys::fs::create_directory(file_spec.
GetPath(), permissions);
700 LLVM_PRETTY_FUNCTION);
706 uint32_t &file_permissions) {
708 auto Value = llvm::sys::fs::getPermissions(file_spec.
GetPath());
710 file_permissions =
Value.get();
716 LLVM_PRETTY_FUNCTION);
722 uint32_t file_permissions) {
724 auto Perms =
static_cast<llvm::sys::fs::perms
>(file_permissions);
725 return llvm::sys::fs::setPermissions(file_spec.
GetPath(), Perms);
730 LLVM_PRETTY_FUNCTION);
754 if (llvm::sys::fs::file_size(file_spec.
GetPath(), Size))
764 "Platform::ReadFile() is not supported in the {0} platform",
770 const void *src, uint64_t src_len,
Status &
error) {
774 "Platform::WriteFile() is not supported in the {0} platform",
781 return HostInfo::GetUserIDResolver();
800 LLDB_LOGF(log,
"Platform::SetRemoteWorkingDirectory('%s')",
801 working_dir.
GetPath().c_str());
841 "'{0}' does not exist", resolved_module_spec.
GetFileSpec());
846 exe_module_sp,
nullptr,
nullptr);
848 if (exe_module_sp && exe_module_sp->GetObjectFile())
850 exe_module_sp.reset();
856 llvm::ListSeparator LS;
864 if (
error.Success()) {
865 if (exe_module_sp && exe_module_sp->GetObjectFile())
870 arch_names << LS << arch.GetArchitectureName();
873 if (exe_module_sp &&
error.Success())
878 "'{0}' is not readable", resolved_module_spec.
GetFileSpec());
882 "'{0}' is not a valid executable", resolved_module_spec.
GetFileSpec());
885 "'{0}' doesn't contain any '{1}' platform architectures: {2}",
902 resolved_platform_path = platform_path;
930 fetch = is_connected;
944 llvm::Triple normalized_triple(llvm::Triple::normalize(triple));
948 if (
auto kind = HostInfo::ParseArchitectureKind(triple))
949 return HostInfo::GetArchitecture(*kind);
957 if (!compatible_arch.
IsValid())
960 const llvm::Triple &compatible_triple = compatible_arch.
GetTriple();
961 if (normalized_triple.getVendorName().empty())
962 normalized_triple.setVendor(compatible_triple.getVendor());
963 if (normalized_triple.getOSName().empty())
964 normalized_triple.setOS(compatible_triple.getOS());
965 if (normalized_triple.getEnvironmentName().empty())
966 normalized_triple.setEnvironment(compatible_triple.getEnvironment());
974 "The currently selected platform ({0}) is "
975 "the host platform and is always connected.",
979 "Platform::ConnectRemote() is not supported by {0}",
GetPluginName());
987 "The currently selected platform ({0}) is "
988 "the host platform and is always connected.",
992 "Platform::DisconnectRemote() is not supported by {0}",
1010 uint32_t match_count = 0;
1027 LLDB_LOGF(log,
"Platform::%s()", __FUNCTION__);
1032 if (::getenv(
"LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY"))
1033 launch_info.
GetFlags().
Set(eLaunchFlagLaunchInTTY);
1035 if (launch_info.
GetFlags().
Test(eLaunchFlagLaunchInShell)) {
1036 const bool will_debug = launch_info.
GetFlags().
Test(eLaunchFlagDebug);
1037 const bool first_arg_is_full_shell_command =
false;
1041 std::string shell_str = (shell) ? shell.
GetPath() :
"<null>";
1043 "Platform::%s GetResumeCountForLaunchInfo() returned %" PRIu32
1045 __FUNCTION__, num_resumes, shell_str.c_str());
1049 error, will_debug, first_arg_is_full_shell_command, num_resumes))
1051 }
else if (launch_info.
GetFlags().
Test(eLaunchFlagShellExpandArguments)) {
1055 "shell expansion failed (reason: %s). "
1056 "consider launching with 'process "
1058 error.AsCString(
"unknown"));
1063 LLDB_LOGF(log,
"Platform::%s final launch_info resume count: %" PRIu32,
1069 "base lldb_private::Platform class can't launch remote processes");
1077 "base lldb_private::Platform class can't expand arguments");
1082 LLDB_LOGF(log,
"Platform::%s, pid %" PRIu64, __FUNCTION__, pid);
1086 "base lldb_private::Platform class can't kill remote processes");
1096 LLDB_LOG(log,
"target = {0}", &target);
1109 if (cbs.filter_callback) {
1111 error = (*cbs.filter_callback)(launch_info, &target);
1112 if (!
error.Success()) {
1114 "Platform::%s() StructuredDataPlugin launch "
1123 if (
error.Success()) {
1125 "Platform::%s LaunchProcess() call succeeded (pid=%" PRIu64
")",
1129 process_sp =
Attach(attach_info, debugger, &target,
error);
1131 LLDB_LOG(log,
"Attach() succeeded, Process plugin: {0}",
1132 process_sp->GetPluginName());
1139 process_sp->SetShouldDetach(
false);
1148 process_sp->SetSTDIOFileDescriptor(pty_fd);
1152 LLDB_LOGF(log,
"Platform::%s Attach() failed: %s", __FUNCTION__,
1157 "Platform::%s LaunchProcess() returned launch_info with "
1158 "invalid process id",
1162 LLDB_LOGF(log,
"Platform::%s LaunchProcess() failed: %s", __FUNCTION__,
1169std::vector<ArchSpec>
1171 llvm::Triple::OSType os) {
1172 std::vector<ArchSpec> list;
1173 for(
auto arch : archs) {
1174 llvm::Triple triple;
1175 triple.setArch(arch);
1191 for (
const ArchSpec &platform_arch :
1193 if (arch.
IsMatch(platform_arch, match)) {
1194 if (compatible_arch_ptr)
1195 *compatible_arch_ptr = platform_arch;
1200 if (compatible_arch_ptr)
1201 compatible_arch_ptr->
Clear();
1206 uint32_t uid, uint32_t gid) {
1208 LLDB_LOGF(log,
"[PutFile] Using block by block transfer....\n");
1210 auto source_open_options =
1212 namespace fs = llvm::sys::fs;
1213 if (fs::is_symlink_file(source.
GetPath()))
1217 lldb::eFilePermissionsUserRW);
1222 bool requires_upload =
true;
1223 llvm::ErrorOr<llvm::MD5::MD5Result> remote_md5 =
CalculateMD5(destination);
1224 if (std::error_code ec = remote_md5.getError()) {
1225 LLDB_LOG(log,
"[PutFile] couldn't get md5 sum of destination: {0}",
1228 llvm::ErrorOr<llvm::MD5::MD5Result> local_md5 =
1229 llvm::sys::fs::md5_contents(source.
GetPath());
1230 if (std::error_code ec = local_md5.getError()) {
1231 LLDB_LOG(log,
"[PutFile] couldn't get md5 sum of source: {0}",
1234 LLDB_LOGF(log,
"[PutFile] destination md5: %016" PRIx64
"%016" PRIx64,
1235 remote_md5->high(), remote_md5->low());
1236 LLDB_LOGF(log,
"[PutFile] local md5: %016" PRIx64
"%016" PRIx64,
1237 local_md5->high(), local_md5->low());
1238 requires_upload = *remote_md5 != *local_md5;
1242 if (!requires_upload) {
1243 LLDB_LOGF(log,
"[PutFile] skipping PutFile because md5sums match");
1247 uint32_t permissions = source_file.get()->GetPermissions(
error);
1248 if (permissions == 0)
1249 permissions = lldb::eFilePermissionsUserRWX;
1254 permissions,
error);
1255 LLDB_LOGF(log,
"dest_file = %" PRIu64
"\n", dest_file);
1262 uint64_t offset = 0;
1264 size_t bytes_read = buffer_sp->GetByteSize();
1265 error = source_file.get()->Read(buffer_sp->GetBytes(), bytes_read);
1266 if (
error.Fail() || bytes_read == 0)
1269 const uint64_t bytes_written =
1270 WriteFile(dest_file, offset, buffer_sp->GetBytes(), bytes_read,
error);
1274 offset += bytes_written;
1275 if (bytes_written != bytes_read) {
1278 source_file.get()->SeekFromStart(offset);
1312 return llvm::sys::fs::remove(path.
GetPath());
1317 addr_t length,
unsigned prot,
1318 unsigned flags,
addr_t fd,
1320 uint64_t flags_platform = 0;
1326 MmapArgList args({addr, length, prot, flags_platform, fd, offset});
1331 llvm::StringRef command,
1339 std::string *separated_error_output,
1342 return RunShellCommand(llvm::StringRef(), command, working_dir, status_ptr,
1343 signo_ptr, command_output, separated_error_output,
1348 llvm::StringRef shell,
1350 llvm::StringRef command,
1358 std::string *separated_error_output,
1363 signo_ptr, command_output,
1364 separated_error_output, timeout);
1366 "unable to run a remote command without a platform");
1369llvm::ErrorOr<llvm::MD5::MD5Result>
1372 return std::make_error_code(std::errc::not_supported);
1373 return llvm::sys::fs::md5_contents(file_spec.
GetPath());
1389 "Platform-specific options required for rsync to work."},
1392 "Platform-specific rsync prefix put before the remote path."},
1395 "Do not automatically fill in the remote hostname when composing the "
1404 "Platform-specific options required for SSH to work."},
1410 "Path in which to store local copies of files."},
1427 llvm::StringRef option_arg,
1430 char short_option = (char)
GetDefinitions()[option_idx].short_option;
1431 switch (short_option) {
1474 llvm::StringRef option_arg,
1477 char short_option = (char)
GetDefinitions()[option_idx].short_option;
1478 switch (short_option) {
1506 uint32_t option_idx, llvm::StringRef option_arg,
1509 char short_option = (char)
GetDefinitions()[option_idx].short_option;
1510 switch (short_option) {
1532 std::lock_guard<std::mutex> guard(
m_mutex);
1545 module_spec,
nullptr, module_sp,
1550 if (
error.Success()) {
1551 module_spec.
GetFileSpec() = module_sp->GetFileSpec();
1562 bool *did_create_ptr) {
1566 bool got_module_spec =
false;
1572 resolved_module_spec)) {
1575 got_module_spec =
true;
1591 if (
error.Success() && module_sp)
1595 resolved_module_spec = arch_module_spec;
1596 got_module_spec =
true;
1600 if (!got_module_spec) {
1603 resolved_module_spec)) {
1606 got_module_spec =
true;
1611 if (!got_module_spec) {
1614 return module_resolver(module_spec);
1633 symbol_file_spec, did_create_ptr);
1636 if (symbol_file_spec) {
1640 module_sp->SetSymbolFileFileSpec(symbol_file_spec);
1661 Status error = module_resolver(resolved_module_spec);
1662 if (
error.Success()) {
1663 if (module_sp && symbol_file_spec) {
1666 module_sp->SetSymbolFileFileSpec(symbol_file_spec);
1673 if (module_sp && symbol_file_spec) {
1676 module_sp->SetSymbolFileFileSpec(symbol_file_spec);
1682 "Failed to call GetCachedSharedModule");
1688 bool *did_create_ptr) {
1701 LLDB_LOGF(log,
"%s: locate module callback failed: %s",
1702 LLVM_PRETTY_FUNCTION,
error.AsCString());
1717 if (!module_file_spec && !symbol_file_spec) {
1721 "%s: locate module callback did not set both "
1722 "module_file_spec and symbol_file_spec",
1723 LLVM_PRETTY_FUNCTION);
1730 "%s: locate module callback set a non-existent file to "
1731 "module_file_spec: %s",
1732 LLVM_PRETTY_FUNCTION, module_file_spec.
GetPath().c_str());
1734 symbol_file_spec.
Clear();
1741 "%s: locate module callback set a non-existent file to "
1742 "symbol_file_spec: %s",
1743 LLVM_PRETTY_FUNCTION, symbol_file_spec.
GetPath().c_str());
1745 symbol_file_spec.
Clear();
1749 if (!module_file_spec && symbol_file_spec) {
1754 LLDB_LOGF(log,
"%s: locate module callback succeeded: symbol=%s",
1755 LLVM_PRETTY_FUNCTION, symbol_file_spec.
GetPath().c_str());
1765 auto cached_module_spec(module_spec);
1766 cached_module_spec.GetUUID().Clear();
1768 cached_module_spec.GetFileSpec() = module_file_spec;
1769 cached_module_spec.GetSymbolFileSpec() = symbol_file_spec;
1770 cached_module_spec.GetPlatformFileSpec() = module_spec.
GetFileSpec();
1771 cached_module_spec.SetObjectOffset(0);
1774 did_create_ptr,
false);
1775 if (
error.Success() && module_sp) {
1777 LLDB_LOGF(log,
"%s: locate module callback succeeded: module=%s symbol=%s",
1778 LLVM_PRETTY_FUNCTION, module_file_spec.
GetPath().c_str(),
1779 symbol_file_spec.
GetPath().c_str());
1782 "%s: locate module callback succeeded but failed to load: "
1783 "module=%s symbol=%s",
1784 LLVM_PRETTY_FUNCTION, module_file_spec.
GetPath().c_str(),
1785 symbol_file_spec.
GetPath().c_str());
1788 symbol_file_spec.
Clear();
1794 bool *did_create_ptr) {
1805 const FileSpec &tmp_download_file_spec) {
1812 const FileSpec &tmp_download_file_spec) {
1815 module_sp, did_create_ptr);
1816 if (
error.Success())
1819 LLDB_LOGF(log,
"Platform::%s - module %s not found in local cache: %s",
1826 const uint64_t src_offset,
1827 const uint64_t src_size,
1832 llvm::raw_fd_ostream dst(dst_file_spec.
GetPath(), EC, llvm::sys::fs::OF_None);
1835 "unable to open destination file: %s", dst_file_spec.
GetPath().c_str());
1840 lldb::eFilePermissionsFileDefault,
error);
1848 std::vector<char> buffer(512 * 1024);
1849 auto offset = src_offset;
1850 uint64_t total_bytes_read = 0;
1851 while (total_bytes_read < src_size) {
1852 const auto to_read = std::min(
static_cast<uint64_t
>(buffer.size()),
1853 src_size - total_bytes_read);
1854 const uint64_t n_read =
1863 total_bytes_read += n_read;
1864 dst.write(&buffer[0], n_read);
1876 "Symbol file downloading not supported by the default platform.");
1888 static const auto s_default_unix_signals_sp = std::make_shared<UnixSignals>();
1889 return s_default_unix_signals_sp;
1902 if (local_file && remote_file) {
1905 if (
IsRemote() || local_file != remote_file) {
1918 if (
IsRemote() || local_file != target_file) {
1938 const std::vector<std::string> *paths,
1942 "LoadImage is not supported on the current platform");
1948 const std::vector<std::string> &paths,
1958 file_to_use = remote_filename;
1964 uint32_t image_token) {
1966 "UnloadImage is not supported on the current platform");
1970 llvm::StringRef plugin_name,
1973 return DoConnectProcess(connect_url, plugin_name, debugger,
nullptr, target,
1978 llvm::StringRef connect_url, llvm::StringRef plugin_name,
1980 return DoConnectProcess(connect_url, plugin_name, debugger, &stream, target,
1985 llvm::StringRef plugin_name,
1993 const char *triple =
2000 target = new_target_sp.get();
2001 if (!target ||
error.Fail()) {
2013 const bool synchronous = stream !=
nullptr;
2018 process_sp->HijackProcessEvents(listener_sp);
2020 error = process_sp->ConnectRemote(connect_url);
2023 process_sp->RestoreProcessEvents();
2029 process_sp->WaitForProcessToStop(std::nullopt, &event_sp,
true, listener_sp,
2031 process_sp->RestoreProcessEvents();
2032 bool pop_process_io_handler =
false;
2049 llvm::ArrayRef<uint8_t> trap_opcode;
2052 case llvm::Triple::aarch64_32:
2053 case llvm::Triple::aarch64: {
2054 static const uint8_t g_aarch64_opcode[] = {0x00, 0x00, 0x20, 0xd4};
2056 llvm::ArrayRef<uint8_t>(g_aarch64_opcode,
sizeof(g_aarch64_opcode));
2059 case llvm::Triple::arc: {
2060 static const uint8_t g_hex_opcode[] = {0xff, 0x7f};
2061 trap_opcode = llvm::ArrayRef<uint8_t>(g_hex_opcode,
sizeof(g_hex_opcode));
2064 case llvm::Triple::arm: {
2068 static const uint8_t g_arm_breakpoint_opcode[] = {0xf0, 0x01, 0xf0, 0xe7};
2069 static const uint8_t g_thumb_breakpoint_opcode[] = {0x01, 0xde};
2071 if (size_hint == 2) {
2072 trap_opcode = llvm::ArrayRef<uint8_t>(g_thumb_breakpoint_opcode,
2073 sizeof(g_thumb_breakpoint_opcode));
2075 trap_opcode = llvm::ArrayRef<uint8_t>(g_arm_breakpoint_opcode,
2076 sizeof(g_arm_breakpoint_opcode));
2080 case llvm::Triple::avr: {
2081 static const uint8_t g_hex_opcode[] = {0x98, 0x95};
2082 trap_opcode = llvm::ArrayRef<uint8_t>(g_hex_opcode,
sizeof(g_hex_opcode));
2085 case llvm::Triple::mips:
2086 case llvm::Triple::mips64: {
2087 static const uint8_t g_hex_opcode[] = {0x00, 0x00, 0x00, 0x0d};
2088 trap_opcode = llvm::ArrayRef<uint8_t>(g_hex_opcode,
sizeof(g_hex_opcode));
2091 case llvm::Triple::mipsel:
2092 case llvm::Triple::mips64el: {
2093 static const uint8_t g_hex_opcode[] = {0x0d, 0x00, 0x00, 0x00};
2094 trap_opcode = llvm::ArrayRef<uint8_t>(g_hex_opcode,
sizeof(g_hex_opcode));
2097 case llvm::Triple::msp430: {
2098 static const uint8_t g_msp430_opcode[] = {0x43, 0x43};
2100 llvm::ArrayRef<uint8_t>(g_msp430_opcode,
sizeof(g_msp430_opcode));
2103 case llvm::Triple::systemz: {
2104 static const uint8_t g_hex_opcode[] = {0x00, 0x01};
2105 trap_opcode = llvm::ArrayRef<uint8_t>(g_hex_opcode,
sizeof(g_hex_opcode));
2108 case llvm::Triple::hexagon: {
2109 static const uint8_t g_hex_opcode[] = {0x0c, 0xdb, 0x00, 0x54};
2110 trap_opcode = llvm::ArrayRef<uint8_t>(g_hex_opcode,
sizeof(g_hex_opcode));
2113 case llvm::Triple::ppc:
2114 case llvm::Triple::ppc64: {
2115 static const uint8_t g_ppc_opcode[] = {0x7f, 0xe0, 0x00, 0x08};
2116 trap_opcode = llvm::ArrayRef<uint8_t>(g_ppc_opcode,
sizeof(g_ppc_opcode));
2119 case llvm::Triple::ppc64le: {
2120 static const uint8_t g_ppc64le_opcode[] = {0x08, 0x00, 0xe0, 0x7f};
2122 llvm::ArrayRef<uint8_t>(g_ppc64le_opcode,
sizeof(g_ppc64le_opcode));
2125 case llvm::Triple::x86:
2126 case llvm::Triple::x86_64: {
2127 static const uint8_t g_i386_opcode[] = {0xCC};
2128 trap_opcode = llvm::ArrayRef<uint8_t>(g_i386_opcode,
sizeof(g_i386_opcode));
2131 case llvm::Triple::riscv32:
2132 case llvm::Triple::riscv64: {
2133 static const uint8_t g_riscv_opcode[] = {0x73, 0x00, 0x10, 0x00};
2134 static const uint8_t g_riscv_opcode_c[] = {0x02, 0x90};
2135 if (size_hint == 2) {
2136 trap_opcode = g_riscv_opcode_c;
2139 llvm::ArrayRef<uint8_t>(g_riscv_opcode,
sizeof(g_riscv_opcode));
2143 case llvm::Triple::loongarch32:
2144 case llvm::Triple::loongarch64: {
2145 static const uint8_t g_loongarch_opcode[] = {0x05, 0x00, 0x2a,
2148 llvm::ArrayRef<uint8_t>(g_loongarch_opcode,
sizeof(g_loongarch_opcode));
2152 case llvm::Triple::wasm32: {
2153 static const uint8_t g_wasm_opcode[] = {0x00};
2154 trap_opcode = llvm::ArrayRef<uint8_t>(g_wasm_opcode,
sizeof(g_wasm_opcode));
2158 trap_opcode = llvm::ArrayRef<uint8_t>{};
2165 llvm::ArrayRef<uint8_t> bytes) {
2170 if (bytes.size() && triple.isRISCV()) {
2172 return (bytes[0] & 0b11) == 0b11 ? 4 : 2;
2175 if (triple.isARM()) {
2195 addr_class = bp_loc_sp->GetAddress().GetAddressClass();
2198 size_t size_hint = 0;
2206 bp_site->
SetTrapOpcode(trap_opcode.begin(), trap_opcode.size()))
2207 return trap_opcode.size();
2239 std::string reason_for_complaint =
2241 ? llvm::formatv(
"conflicts with the keyword '{0}'",
2244 :
"contains reserved characters";
2247 os.
Format(
"debug script '{0}' cannot be loaded because '{1}' {2}. "
2248 "Ignoring '{1}' and loading '{3}' instead.\n",
2250 std::move(reason_for_complaint), fspec.
GetFilename());
2252 os.
Format(
"debug script '{0}' cannot be loaded because '{1}' {2}. "
2253 "If you intend to have this script loaded, please rename it to "
2254 "'{3}' and retry.\n",
2256 std::move(reason_for_complaint), fspec.
GetFilename());
2260 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2262 if (platform_sp->GetName() == name)
2272 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2275 if (platform_sp->IsCompatibleArchitecture(
2282 if (platform_sp->IsCompatibleArchitecture(arch, process_host_arch,
2290 PlatformSP platform_sp = create_callback(
false, &arch);
2292 platform_sp->IsCompatibleArchitecture(
2300 PlatformSP platform_sp = create_callback(
false, &arch);
2301 if (platform_sp && platform_sp->IsCompatibleArchitecture(
2303 platform_arch_ptr)) {
2308 if (platform_arch_ptr)
2309 platform_arch_ptr->
Clear();
2324 std::vector<PlatformSP> &candidates) {
2326 candidates.reserve(archs.size());
2335 for (
const ArchSpec &arch : archs) {
2343 if (host_platform_sp) {
2344 for (
const ArchSpec &arch : archs) {
2345 if (host_platform_sp->IsCompatibleArchitecture(
2347 return host_platform_sp;
2352 for (
const ArchSpec &arch : archs) {
2354 candidates.push_back(platform);
2360 if (candidates.size() == archs.size()) {
2361 if (llvm::all_of(candidates, [&](
const PlatformSP &p) ->
bool {
2362 return p->GetName() == candidates.front()->GetName();
2364 return candidates.front();
2375 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2384 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
2388 PlatformSP platform_sp = create_callback(
true, &arch);
2390 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,...)
A section + offset based address class.
AddressClass GetAddressClass() const
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