blob: 404a5ae35dc91acb33f1cfd089c9480d7b8c486d [file] [log] [blame] [edit]
//===----------------------------------------------------------------------===//
//
// 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