// Copyright 2020 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_DEBUG_WASM_GDB_SERVER_WASM_MODULE_DEBUG_H_ #define V8_DEBUG_WASM_GDB_SERVER_WASM_MODULE_DEBUG_H_ #include "src/debug/debug.h" #include "src/debug/wasm/gdb-server/gdb-remote-util.h" #include "src/execution/frames.h" namespace v8 { namespace internal { namespace wasm { class WasmValue; namespace gdb_server { // Represents the interface to access the Wasm engine state for a given module. // For the moment it only works with interpreted functions, in the future it // could be extended to also support Liftoff. class WasmModuleDebug { public: WasmModuleDebug(v8::Isolate* isolate, Local<debug::WasmScript> script); std::string GetModuleName() const; i::Isolate* GetIsolate() const { return reinterpret_cast<i::Isolate*>(isolate_); } // Gets the value of the {index}th global value. static bool GetWasmGlobal(Isolate* isolate, uint32_t frame_index, uint32_t index, uint8_t* buffer, uint32_t buffer_size, uint32_t* size); // Gets the value of the {index}th local value in the {frame_index}th stack // frame. static bool GetWasmLocal(Isolate* isolate, uint32_t frame_index, uint32_t index, uint8_t* buffer, uint32_t buffer_size, uint32_t* size); // Gets the value of the {index}th value in the operand stack. static bool GetWasmStackValue(Isolate* isolate, uint32_t frame_index, uint32_t index, uint8_t* buffer, uint32_t buffer_size, uint32_t* size); // Reads {size} bytes, starting from {offset}, from the Memory instance // associated to this module. // Returns the number of byte copied to {buffer}, or 0 is case of error. // Note: only one Memory for Module is currently supported. static uint32_t GetWasmMemory(Isolate* isolate, uint32_t frame_index, uint32_t offset, uint8_t* buffer, uint32_t size); // Gets {size} bytes, starting from {offset}, from the Code space of this // module. // Returns the number of byte copied to {buffer}, or 0 is case of error. uint32_t GetWasmModuleBytes(wasm_addr_t wasm_addr, uint8_t* buffer, uint32_t size); // Inserts a breakpoint at the offset {offset} of this module. // Returns {true} if the breakpoint was successfully added. bool AddBreakpoint(uint32_t offset, int* breakpoint_id); // Removes a breakpoint at the offset {offset} of the this module. void RemoveBreakpoint(uint32_t offset, int breakpoint_id); // Handle stepping in wasm functions via the wasm interpreter. void PrepareStep(); // Returns the current stack trace as a vector of instruction pointers. static std::vector<wasm_addr_t> GetCallStack(uint32_t debug_context_id, Isolate* isolate); private: // Returns the module WasmInstance associated to the {frame_index}th frame // in the call stack. static Handle<WasmInstanceObject> GetWasmInstance(Isolate* isolate, uint32_t frame_index); // Returns its first WasmInstance for this Wasm module. Handle<WasmInstanceObject> GetFirstWasmInstance(); // Iterates on current stack frames and return frame information for the // {frame_index} specified. // Returns an empty array if the frame specified does not correspond to a Wasm // stack frame. static std::vector<FrameSummary> FindWasmFrame( StackTraceFrameIterator* frame_it, uint32_t* frame_index); // Converts a WasmValue into an array of bytes. static bool GetWasmValue(const wasm::WasmValue& wasm_value, uint8_t* buffer, uint32_t buffer_size, uint32_t* size); v8::Isolate* isolate_; Global<debug::WasmScript> wasm_script_; }; } // namespace gdb_server } // namespace wasm } // namespace internal } // namespace v8 #endif // V8_DEBUG_WASM_GDB_SERVER_WASM_MODULE_DEBUG_H_