| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLDB_SOURCE_UTILITY_WASMVIRTUALREGISTERS_H | |
| #define LLDB_SOURCE_UTILITY_WASMVIRTUALREGISTERS_H | |
| #include "lldb/lldb-private.h" | |
| namespace lldb_private { | |
| // LLDB doesn't have an address space to represents WebAssembly locals, | |
| // globals and operand stacks. We encode these elements into virtual | |
| // registers: | |
| // | |
| // | tag: 2 bits | index: 30 bits | | |
| // | |
| // Where tag is: | |
| // 0: Not a Wasm location | |
| // 1: Local | |
| // 2: Global | |
| // 3: Operand stack value | |
| enum WasmVirtualRegisterKinds { | |
| eWasmTagNotAWasmLocation = 0, | |
| eWasmTagLocal = 1, | |
| eWasmTagGlobal = 2, | |
| eWasmTagOperandStack = 3, | |
| }; | |
| static const uint32_t kWasmVirtualRegisterTagMask = 0x03; | |
| static const uint32_t kWasmVirtualRegisterIndexMask = 0x3fffffff; | |
| static const uint32_t kWasmVirtualRegisterTagShift = 30; | |
| inline uint32_t GetWasmVirtualRegisterTag(size_t reg) { | |
| return (reg >> kWasmVirtualRegisterTagShift) & kWasmVirtualRegisterTagMask; | |
| } | |
| inline uint32_t GetWasmVirtualRegisterIndex(size_t reg) { | |
| return reg & kWasmVirtualRegisterIndexMask; | |
| } | |
| inline uint32_t GetWasmRegister(uint8_t tag, uint32_t index) { | |
| return ((tag & kWasmVirtualRegisterTagMask) << kWasmVirtualRegisterTagShift) | | |
| (index & kWasmVirtualRegisterIndexMask); | |
| } | |
| } // namespace lldb_private | |
| #endif |