diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-04-14 21:41:27 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-06-22 18:20:56 +0000 |
commit | bdd1243df58e60e85101c09001d9812a789b6bc4 (patch) | |
tree | a1ce621c7301dd47ba2ddc3b8eaa63b441389481 /contrib/llvm-project/lldb/source/Host/common/NativeProcessProtocol.cpp | |
parent | 781624ca2d054430052c828ba8d2c2eaf2d733e7 (diff) | |
parent | e3b557809604d036af6e00c60f012c2025b59a5e (diff) |
Diffstat (limited to 'contrib/llvm-project/lldb/source/Host/common/NativeProcessProtocol.cpp')
-rw-r--r-- | contrib/llvm-project/lldb/source/Host/common/NativeProcessProtocol.cpp | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/contrib/llvm-project/lldb/source/Host/common/NativeProcessProtocol.cpp b/contrib/llvm-project/lldb/source/Host/common/NativeProcessProtocol.cpp index be521a31cb37..975b3d0f7d53 100644 --- a/contrib/llvm-project/lldb/source/Host/common/NativeProcessProtocol.cpp +++ b/contrib/llvm-project/lldb/source/Host/common/NativeProcessProtocol.cpp @@ -18,6 +18,7 @@ #include "lldb/lldb-enumerations.h" #include "llvm/Support/Process.h" +#include <optional> using namespace lldb; using namespace lldb_private; @@ -66,11 +67,11 @@ NativeProcessProtocol::WriteMemoryTags(int32_t type, lldb::addr_t addr, return Status("not implemented"); } -llvm::Optional<WaitStatus> NativeProcessProtocol::GetExitStatus() { +std::optional<WaitStatus> NativeProcessProtocol::GetExitStatus() { if (m_state == lldb::eStateExited) return m_exit_status; - return llvm::None; + return std::nullopt; } bool NativeProcessProtocol::SetExitStatus(WaitStatus status, @@ -127,7 +128,7 @@ NativeProcessProtocol::GetWatchpointMap() const { return m_watchpoint_list.GetWatchpointMap(); } -llvm::Optional<std::pair<uint32_t, uint32_t>> +std::optional<std::pair<uint32_t, uint32_t>> NativeProcessProtocol::GetHardwareDebugSupportInfo() const { Log *log = GetLog(LLDBLog::Process); @@ -136,7 +137,7 @@ NativeProcessProtocol::GetHardwareDebugSupportInfo() const { const_cast<NativeProcessProtocol *>(this)->GetThreadAtIndex(0)); if (!thread) { LLDB_LOG(log, "failed to find a thread to grab a NativeRegisterContext!"); - return llvm::None; + return std::nullopt; } NativeRegisterContext ®_ctx = thread->GetRegisterContext(); @@ -245,7 +246,7 @@ Status NativeProcessProtocol::SetHardwareBreakpoint(lldb::addr_t addr, // Exit here if target does not have required hardware breakpoint capability. auto hw_debug_cap = GetHardwareDebugSupportInfo(); - if (hw_debug_cap == llvm::None || hw_debug_cap->first == 0 || + if (hw_debug_cap == std::nullopt || hw_debug_cap->first == 0 || hw_debug_cap->first <= m_hw_breakpoints_map.size()) return Status("Target does not have required no of hardware breakpoints"); @@ -382,7 +383,7 @@ Status NativeProcessProtocol::RemoveSoftwareBreakpoint(lldb::addr_t addr) { } const auto &saved = it->second.saved_opcodes; // Make sure the breakpoint opcode exists at this address - if (makeArrayRef(curr_break_op) != it->second.breakpoint_opcodes) { + if (llvm::ArrayRef(curr_break_op) != it->second.breakpoint_opcodes) { if (curr_break_op != it->second.saved_opcodes) return Status("Original breakpoint trap is no longer in memory."); LLDB_LOG(log, @@ -482,7 +483,7 @@ NativeProcessProtocol::EnableSoftwareBreakpoint(lldb::addr_t addr, verify_bp_opcode_bytes.size(), verify_bytes_read); } - if (llvm::makeArrayRef(verify_bp_opcode_bytes.data(), verify_bytes_read) != + if (llvm::ArrayRef(verify_bp_opcode_bytes.data(), verify_bytes_read) != *expected_trap) { return llvm::createStringError( llvm::inconvertibleErrorCode(), @@ -503,35 +504,49 @@ NativeProcessProtocol::GetSoftwareBreakpointTrapOpcode(size_t size_hint) { static const uint8_t g_mips64_opcode[] = {0x00, 0x00, 0x00, 0x0d}; static const uint8_t g_mips64el_opcode[] = {0x0d, 0x00, 0x00, 0x00}; static const uint8_t g_s390x_opcode[] = {0x00, 0x01}; - static const uint8_t g_ppc_opcode[] = {0x7f, 0xe0, 0x00, 0x08}; // trap + static const uint8_t g_ppc_opcode[] = {0x7f, 0xe0, 0x00, 0x08}; // trap static const uint8_t g_ppcle_opcode[] = {0x08, 0x00, 0xe0, 0x7f}; // trap + static const uint8_t g_riscv_opcode[] = {0x73, 0x00, 0x10, 0x00}; // ebreak + static const uint8_t g_riscv_opcode_c[] = {0x02, 0x90}; // c.ebreak + static const uint8_t g_loongarch_opcode[] = {0x05, 0x00, 0x2a, + 0x00}; // break 0x5 switch (GetArchitecture().GetMachine()) { case llvm::Triple::aarch64: case llvm::Triple::aarch64_32: - return llvm::makeArrayRef(g_aarch64_opcode); + return llvm::ArrayRef(g_aarch64_opcode); case llvm::Triple::x86: case llvm::Triple::x86_64: - return llvm::makeArrayRef(g_i386_opcode); + return llvm::ArrayRef(g_i386_opcode); case llvm::Triple::mips: case llvm::Triple::mips64: - return llvm::makeArrayRef(g_mips64_opcode); + return llvm::ArrayRef(g_mips64_opcode); case llvm::Triple::mipsel: case llvm::Triple::mips64el: - return llvm::makeArrayRef(g_mips64el_opcode); + return llvm::ArrayRef(g_mips64el_opcode); case llvm::Triple::systemz: - return llvm::makeArrayRef(g_s390x_opcode); + return llvm::ArrayRef(g_s390x_opcode); case llvm::Triple::ppc: case llvm::Triple::ppc64: - return llvm::makeArrayRef(g_ppc_opcode); + return llvm::ArrayRef(g_ppc_opcode); case llvm::Triple::ppc64le: - return llvm::makeArrayRef(g_ppcle_opcode); + return llvm::ArrayRef(g_ppcle_opcode); + + case llvm::Triple::riscv32: + case llvm::Triple::riscv64: { + return size_hint == 2 ? llvm::ArrayRef(g_riscv_opcode_c) + : llvm::ArrayRef(g_riscv_opcode); + } + + case llvm::Triple::loongarch32: + case llvm::Triple::loongarch64: + return llvm::ArrayRef(g_loongarch_opcode); default: return llvm::createStringError(llvm::inconvertibleErrorCode(), @@ -557,6 +572,10 @@ size_t NativeProcessProtocol::GetSoftwareBreakpointPCOffset() { case llvm::Triple::ppc: case llvm::Triple::ppc64: case llvm::Triple::ppc64le: + case llvm::Triple::riscv32: + case llvm::Triple::riscv64: + case llvm::Triple::loongarch32: + case llvm::Triple::loongarch64: // On these architectures the PC doesn't get updated for breakpoint hits. return 0; @@ -630,11 +649,10 @@ Status NativeProcessProtocol::ReadMemoryWithoutTrap(lldb::addr_t addr, if (error.Fail()) return error; - auto data = - llvm::makeMutableArrayRef(static_cast<uint8_t *>(buf), bytes_read); + llvm::MutableArrayRef data(static_cast<uint8_t *>(buf), bytes_read); for (const auto &pair : m_software_breakpoints) { lldb::addr_t bp_addr = pair.first; - auto saved_opcodes = makeArrayRef(pair.second.saved_opcodes); + auto saved_opcodes = llvm::ArrayRef(pair.second.saved_opcodes); if (bp_addr + saved_opcodes.size() < addr || addr + bytes_read <= bp_addr) continue; // Breakpoint not in range, ignore |