blob: 319b765b718812dbb87ffd015a22591e9898afc7 [file] [log] [blame]
/* -*- Mode: C++; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#ifndef RR_GDB_EXPRESSION_H_
#define RR_GDB_EXPRESSION_H_
#include <stddef.h>
#include <stdint.h>
#include <vector>
namespace rr {
class Task;
/**
* gdb has a simple bytecode language for writing expressions to be evaluated
* in a remote target. This class implements evaluation of such expressions.
* See https://sourceware.org/gdb/current/onlinedocs/gdb/Agent-Expressions.html
*/
class GdbExpression {
public:
GdbExpression(const uint8_t* data, size_t size);
struct Value {
Value(int64_t i = 0) : i(i) {}
bool operator==(const Value& v) { return i == v.i; }
bool operator!=(const Value& v) { return !(*this == v); }
int64_t i;
};
/**
* If evaluation succeeds, store the final result in *result and return true.
* Otherwise return false.
*/
bool evaluate(Task* t, Value* result) const;
private:
/**
* To work around gdb bugs, we may generate and evaluate multiple versions of
* the same expression program.
*/
std::vector<std::vector<uint8_t>> bytecode_variants;
};
} // namespace rr
#endif // RR_GDB_EXPRESSION_H_