• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_DEBUG_WASM_GDB_SERVER_GDB_REMOTE_UTIL_H_
6 #define V8_DEBUG_WASM_GDB_SERVER_GDB_REMOTE_UTIL_H_
7 
8 #include <string>
9 #include <vector>
10 #include "src/flags/flags.h"
11 #include "src/utils/utils.h"
12 
13 namespace v8 {
14 namespace internal {
15 namespace wasm {
16 namespace gdb_server {
17 
18 #define TRACE_GDB_REMOTE(...)                                            \
19   do {                                                                   \
20     if (FLAG_trace_wasm_gdb_remote) PrintF("[gdb-remote] " __VA_ARGS__); \
21   } while (false)
22 
23 // Convert from 0-255 to a pair of ASCII chars (0-9,a-f).
24 void UInt8ToHex(uint8_t byte, char chars[2]);
25 
26 // Convert a pair of hex chars into a value 0-255 or return false if either
27 // input character is not a valid nibble.
28 bool HexToUInt8(const char chars[2], uint8_t* byte);
29 
30 // Convert from ASCII (0-9,a-f,A-F) to 4b unsigned or return false if the
31 // input char is unexpected.
32 bool NibbleToUInt8(char ch, uint8_t* byte);
33 
34 std::vector<std::string> V8_EXPORT_PRIVATE StringSplit(const std::string& instr,
35                                                        const char* delim);
36 
37 // Convert the memory pointed to by {mem} into a hex string in GDB-remote
38 // format.
39 std::string Mem2Hex(const uint8_t* mem, size_t count);
40 std::string Mem2Hex(const std::string& str);
41 
42 // For LLDB debugging, an address in a Wasm module code space is represented
43 // with 64 bits, where the first 32 bits identify the module id:
44 // +--------------------+--------------------+
45 // |     module_id      |       offset       |
46 // +--------------------+--------------------+
47 //  <----- 32 bit -----> <----- 32 bit ----->
48 class wasm_addr_t {
49  public:
wasm_addr_t(uint32_t module_id,uint32_t offset)50   wasm_addr_t(uint32_t module_id, uint32_t offset)
51       : module_id_(module_id), offset_(offset) {}
wasm_addr_t(uint64_t address)52   explicit wasm_addr_t(uint64_t address)
53       : module_id_(address >> 32), offset_(address & 0xffffffff) {}
54 
ModuleId()55   inline uint32_t ModuleId() const { return module_id_; }
Offset()56   inline uint32_t Offset() const { return offset_; }
57 
uint64_t()58   inline operator uint64_t() const {
59     return static_cast<uint64_t>(module_id_) << 32 | offset_;
60   }
61 
62  private:
63   uint32_t module_id_;
64   uint32_t offset_;
65 };
66 
67 }  // namespace gdb_server
68 }  // namespace wasm
69 }  // namespace internal
70 }  // namespace v8
71 
72 #endif  // V8_DEBUG_WASM_GDB_SERVER_GDB_REMOTE_UTIL_H_
73