LLDB mainline
RegisterContextWasm.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
11#include "ProcessWasm.h"
12#include "ThreadWasm.h"
14#include "lldb/Utility/Log.h"
16#include "llvm/Support/Error.h"
17#include <memory>
18
19using namespace lldb;
20using namespace lldb_private;
22using namespace lldb_private::wasm;
23
25 wasm::ThreadWasm &thread, uint32_t concrete_frame_idx,
27 : GDBRemoteRegisterContext(thread, concrete_frame_idx, reg_info_sp, false,
28 false) {}
29
31
33 lldb::RegisterKind kind, uint32_t num) {
34 return num;
35}
36
38 // Wasm has no registers.
39 return 0;
40}
41
43 uint32_t tag = GetWasmVirtualRegisterTag(reg);
44 if (tag == eWasmTagNotAWasmLocation)
45 return m_reg_info_sp->GetRegisterInfoAtIndex(
47
48 auto it = m_register_map.find(reg);
49 if (it == m_register_map.end()) {
51 std::tie(it, std::ignore) = m_register_map.insert(
52 {reg, std::make_unique<WasmVirtualRegisterInfo>(
53 kind, GetWasmVirtualRegisterIndex(reg))});
54 }
55 return it->second.get();
56}
57
59
61 // Wasm has no registers.
62 return nullptr;
63}
64
66 RegisterValue &value) {
67 // The only real registers is the PC.
68 if (reg_info->name)
69 return GDBRemoteRegisterContext::ReadRegister(reg_info, value);
70
71 // Read the virtual registers.
72 ThreadWasm *thread = static_cast<ThreadWasm *>(&GetThread());
73 ProcessWasm *process = static_cast<ProcessWasm *>(thread->GetProcess().get());
74 if (!thread)
75 return false;
76
77 uint32_t frame_index = m_concrete_frame_idx;
78 WasmVirtualRegisterInfo *wasm_reg_info =
79 static_cast<WasmVirtualRegisterInfo *>(
80 const_cast<RegisterInfo *>(reg_info));
81
82 llvm::Expected<DataBufferSP> maybe_buffer = process->GetWasmVariable(
83 wasm_reg_info->kind, frame_index, wasm_reg_info->index);
84 if (!maybe_buffer) {
85 LLDB_LOG_ERROR(GetLog(LLDBLog::Process), maybe_buffer.takeError(),
86 "Failed to read Wasm local: {0}");
87 return false;
88 }
89
90 DataBufferSP buffer_sp = *maybe_buffer;
91 DataExtractor reg_data(buffer_sp, process->GetByteOrder(),
92 process->GetAddressByteSize());
93 wasm_reg_info->byte_size = buffer_sp->GetByteSize();
94 wasm_reg_info->encoding = lldb::eEncodingUint;
95
97 *reg_info, reg_data, reg_info->byte_offset, /*partial_data_ok=*/false);
98 return error.Success();
99}
100
102
104 const RegisterValue &value) {
105 // The only real registers is the PC.
106 if (reg_info->name)
107 return GDBRemoteRegisterContext::WriteRegister(reg_info, value);
108 return false;
109}
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG_ERROR(log, error,...)
Definition Log.h:392
An data extractor class.
lldb::ByteOrder GetByteOrder() const
Definition Process.cpp:3616
uint32_t GetAddressByteSize() const
Definition Process.cpp:3620
Status SetValueFromData(const RegisterInfo &reg_info, DataExtractor &data, lldb::offset_t offset, bool partial_data_ok)
An error handling class.
Definition Status.h:118
GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx, GDBRemoteDynamicRegisterInfoSP reg_info_sp, bool read_all_at_once, bool write_all_at_once)
bool ReadRegister(const RegisterInfo *reg_info, RegisterValue &value) override
bool WriteRegister(const RegisterInfo *reg_info, const RegisterValue &value) override
ProcessWasm provides the access to the Wasm program state retrieved from the Wasm engine.
Definition ProcessWasm.h:47
llvm::Expected< lldb::DataBufferSP > GetWasmVariable(WasmVirtualRegisterKinds kind, int frame_index, int index)
Query the value of a WebAssembly variable from the WebAssembly remote process.
const RegisterInfo * GetRegisterInfoAtIndex(size_t reg) override
const RegisterSet * GetRegisterSet(size_t reg_set) override
bool WriteRegister(const RegisterInfo *reg_info, const RegisterValue &value) override
RegisterContextWasm(wasm::ThreadWasm &thread, uint32_t concrete_frame_idx, process_gdb_remote::GDBRemoteDynamicRegisterInfoSP reg_info_sp)
uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, uint32_t num) override
Convert from a given register numbering scheme to the lldb register numbering scheme.
bool ReadRegister(const RegisterInfo *reg_info, RegisterValue &value) override
std::unordered_map< size_t, std::unique_ptr< WasmVirtualRegisterInfo > > m_register_map
ProcessWasm provides the access to the Wasm program state retrieved from the Wasm engine.
Definition ThreadWasm.h:19
std::shared_ptr< GDBRemoteDynamicRegisterInfo > GDBRemoteDynamicRegisterInfoSP
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.
Definition Log.h:332
uint32_t GetWasmVirtualRegisterTag(size_t reg)
uint32_t GetWasmVirtualRegisterIndex(size_t reg)
@ eEncodingUint
unsigned integer
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
RegisterKind
Register numbering types.
Every register is described in detail including its name, alternate name (optional),...
lldb::Encoding encoding
Encoding of the register bits.
uint32_t byte_offset
The byte offset in the register context data where this register's value is found.
uint32_t byte_size
Size in bytes of the register.
const char * name
Name of this register, can't be NULL.
Registers are grouped into register sets.