//===----------------------------------------------------------------------===// // // 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_WASM_VIRTUAL_REGISTERS_H #define LLDB_SOURCE_UTILITY_WASM_VIRTUAL_REGISTERS_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