Adrian Prantl 87659a17d0 Reland: [lldb] Implement a formatter bytecode interpreter in C++
Compared to the python version, this also does type checking and error
handling, so it's slightly longer, however, it's still comfortably
under 500 lines.

Relanding with more explicit type conversions.
2024-12-10 16:37:53 -08:00

65 lines
1.9 KiB
C++

//===-- FormatterBytecode.h -------------------------------------*- C++ -*-===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "lldb/DataFormatters/TypeSummary.h"
#include "lldb/Symbol/CompilerType.h"
namespace lldb_private {
namespace FormatterBytecode {
enum DataType : uint8_t { Any, String, Int, UInt, Object, Type, Selector };
enum OpCodes : uint8_t {
#define DEFINE_OPCODE(OP, MNEMONIC, NAME) op_##NAME = OP,
#include "FormatterBytecode.def"
#undef DEFINE_OPCODE
};
enum Selectors : uint8_t {
#define DEFINE_SELECTOR(ID, NAME) sel_##NAME = ID,
#include "FormatterBytecode.def"
#undef DEFINE_SELECTOR
};
enum Signatures : uint8_t {
#define DEFINE_SIGNATURE(ID, NAME) sig_##NAME = ID,
#include "FormatterBytecode.def"
#undef DEFINE_SIGNATURE
};
using ControlStackElement = llvm::StringRef;
using DataStackElement =
std::variant<std::string, uint64_t, int64_t, lldb::ValueObjectSP,
CompilerType, Selectors>;
struct DataStack : public std::vector<DataStackElement> {
DataStack() = default;
DataStack(lldb::ValueObjectSP initial_value)
: std::vector<DataStackElement>({initial_value}) {}
void Push(DataStackElement el) { push_back(el); }
template <typename T> T Pop() {
T el = std::get<T>(back());
pop_back();
return el;
}
DataStackElement PopAny() {
DataStackElement el = back();
pop_back();
return el;
}
};
llvm::Error Interpret(std::vector<ControlStackElement> &control,
DataStack &data, Selectors sel);
} // namespace FormatterBytecode
std::string toString(FormatterBytecode::OpCodes op);
std::string toString(FormatterBytecode::Selectors sel);
std::string toString(FormatterBytecode::Signatures sig);
} // namespace lldb_private