#include "FormatterBytecode.h"
#include "lldb/Utility/LLDBLog.h"
#include "lldb/ValueObject/ValueObject.h"
#include "lldb/ValueObject/ValueObjectConstResult.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/DataExtractor.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/FormatProviders.h"
#include "llvm/Support/FormatVariadicDetails.h"
#include "FormatterBytecode.def"
Go to the source code of this file.
|
#define | DEFINE_OPCODE(OP, MNEMONIC, NAME) |
#define | DEFINE_SELECTOR(ID, NAME) |
#define | DEFINE_SIGNATURE(ID, NAME) |
#define | DEFINE_SELECTOR(ID, NAME) |
#define | DEFINE_OPCODE(OP, MNEMONIC, NAME) |
#define | DEFINE_SIGNATURE(ID, NAME) |
#define | DEFINE_SIGNATURE(ID, NAME) |
#define | DEFINE_OPCODE(OP, MNEMONIC, NAME) |
#define | DEFINE_SELECTOR(ID, NAME) |
#define | TYPE_CHECK(...) |
#define | BINOP_IMPL(OP, CHECK_ZERO) |
#define | BINOP(OP) |
#define | BINOP_CHECKZERO(OP) |
#define | SHIFTOP(OP, LEFT) |
#define | POP_VALOBJ(VALOBJ) |
◆ BINOP
◆ BINOP_CHECKZERO
#define BINOP_CHECKZERO |
( |
| OP | ) |
|
◆ BINOP_IMPL
#define BINOP_IMPL |
( |
| OP, |
|
|
| CHECK_ZERO ) |
Value: { \
TYPE_CHECK(Any, Any); \
auto y = data.PopAny(); \
if (std::holds_alternative<uint64_t>(y)) { \
if (CHECK_ZERO && !std::get<uint64_t>(y)) \
return error(#OP
" by zero"); \
data.Push((uint64_t)(data.Pop<uint64_t>() OP std::get<uint64_t>(y))); \
} else if (std::holds_alternative<int64_t>(y)) { \
if (CHECK_ZERO && !std::get<int64_t>(y)) \
return error(#OP
" by zero"); \
TYPE_CHECK(Int); \
data.Push((int64_t)(data.Pop<int64_t>() OP std::get<int64_t>(y))); \
} else \
return
error(
"unsupported data types"); \
}
static llvm::raw_ostream & error(Stream &strm)
◆ DEFINE_OPCODE [1/3]
#define DEFINE_OPCODE |
( |
| OP, |
|
|
| MNEMONIC, |
|
|
| NAME ) |
Value: case OP: { \
const char *s = MNEMONIC; \
return s ? s : #NAME; \
}
◆ DEFINE_OPCODE [2/3]
#define DEFINE_OPCODE |
( |
| OP, |
|
|
| MNEMONIC, |
|
|
| NAME ) |
◆ DEFINE_OPCODE [3/3]
#define DEFINE_OPCODE |
( |
| OP, |
|
|
| MNEMONIC, |
|
|
| NAME ) |
◆ DEFINE_SELECTOR [1/3]
#define DEFINE_SELECTOR |
( |
| ID, |
|
|
| NAME ) |
◆ DEFINE_SELECTOR [2/3]
#define DEFINE_SELECTOR |
( |
| ID, |
|
|
| NAME ) |
◆ DEFINE_SELECTOR [3/3]
#define DEFINE_SELECTOR |
( |
| ID, |
|
|
| NAME ) |
◆ DEFINE_SIGNATURE [1/3]
#define DEFINE_SIGNATURE |
( |
| ID, |
|
|
| NAME ) |
◆ DEFINE_SIGNATURE [2/3]
#define DEFINE_SIGNATURE |
( |
| ID, |
|
|
| NAME ) |
◆ DEFINE_SIGNATURE [3/3]
#define DEFINE_SIGNATURE |
( |
| ID, |
|
|
| NAME ) |
◆ POP_VALOBJ
#define POP_VALOBJ |
( |
| VALOBJ | ) |
|
◆ SHIFTOP
#define SHIFTOP |
( |
| OP, |
|
|
| LEFT ) |
Value: { \
uint64_t y = data.Pop<uint64_t>(); \
if (y > 64) \
return error(
"shift out of bounds"); \
if (std::holds_alternative<uint64_t>(data.back())) { \
uint64_t x = data.Pop<uint64_t>(); \
data.Push(x OP y); \
} else if (std::holds_alternative<int64_t>(data.back())) { \
int64_t x = data.Pop<int64_t>(); \
if (x < 0 && LEFT) \
return error(
"left shift of negative value"); \
if (y > 64) \
return error(
"shift out of bounds"); \
data.Push(x OP y); \
} else \
return
error(
"unsupported data types"); \
}
Referenced by lldb_private::FormatterBytecode::Interpret().
◆ TYPE_CHECK
#define TYPE_CHECK |
( |
| ... | ) |
|