diff --git a/src/debugger/CMakeLists.txt b/src/debugger/CMakeLists.txt index ae580125..a5bc4859 100644 --- a/src/debugger/CMakeLists.txt +++ b/src/debugger/CMakeLists.txt @@ -22,3 +22,9 @@ target_link_libraries(debugger PRIVATE set_property(GLOBAL PROPERTY VS_STARTUP_PROJECT debugger) momo_strip_target(debugger) + +add_custom_target(gen_fbs + COMMAND "$" --gen-mutable --gen-object-api --filename-ext hxx --cpp -o "${CMAKE_CURRENT_LIST_DIR}" "${CMAKE_CURRENT_LIST_DIR}/events.fbs" +) + +add_dependencies(gen_fbs flatc) \ No newline at end of file diff --git a/src/debugger/event_handler.cpp b/src/debugger/event_handler.cpp index 6655ec79..6c90fcc5 100644 --- a/src/debugger/event_handler.cpp +++ b/src/debugger/event_handler.cpp @@ -1,5 +1,5 @@ #include "event_handler.hpp" -#include "events.hpp" +#include "events_generated.hxx" #include "message_transmitter.hpp" diff --git a/src/debugger/events.fbs b/src/debugger/events.fbs index e69de29b..a0456ceb 100644 --- a/src/debugger/events.fbs +++ b/src/debugger/events.fbs @@ -0,0 +1,18 @@ +namespace Debugger; + +table PauseEvent {} + +table RunEvent { + singleStep: bool; +} + +union Event { + PauseEvent, + RunEvent, +} + +table DebugEvent { + event: Event; +} + +root_type DebugEvent; diff --git a/src/debugger/events.hpp b/src/debugger/events.hpp deleted file mode 100644 index da334375..00000000 --- a/src/debugger/events.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -namespace debugger -{ - enum class event_type - { - invalid = 0, - pause = 1, - run = 2, - register_request = 3, - register_response = 4, - write_memory_request = 5, - write_memory_response = 6, - read_memory_request = 7, - read_memory_response = 8, - }; - - struct event - { - event_type type{event_type::invalid}; - }; - - template - struct typed_event : event - { - typed_event() - : event{ - .type = Type, - } - { - } - }; - - using pause_event = typed_event; - using run_event = typed_event; - - NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(event, type); -} diff --git a/src/debugger/events_generated.hxx b/src/debugger/events_generated.hxx new file mode 100644 index 00000000..337dff47 --- /dev/null +++ b/src/debugger/events_generated.hxx @@ -0,0 +1,535 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +#ifndef FLATBUFFERS_GENERATED_EVENTS_DEBUGGER_H_ +#define FLATBUFFERS_GENERATED_EVENTS_DEBUGGER_H_ + +#include "flatbuffers/flatbuffers.h" + +// Ensure the included flatbuffers.h is the same version as when this file was +// generated, otherwise it may not be compatible. +static_assert(FLATBUFFERS_VERSION_MAJOR == 25 && + FLATBUFFERS_VERSION_MINOR == 2 && + FLATBUFFERS_VERSION_REVISION == 10, + "Non-compatible flatbuffers version included"); + +namespace Debugger { + +struct PauseEvent; +struct PauseEventBuilder; +struct PauseEventT; + +struct RunEvent; +struct RunEventBuilder; +struct RunEventT; + +struct DebugEvent; +struct DebugEventBuilder; +struct DebugEventT; + +enum Event : uint8_t { + Event_NONE = 0, + Event_PauseEvent = 1, + Event_RunEvent = 2, + Event_MIN = Event_NONE, + Event_MAX = Event_RunEvent +}; + +inline const Event (&EnumValuesEvent())[3] { + static const Event values[] = { + Event_NONE, + Event_PauseEvent, + Event_RunEvent + }; + return values; +} + +inline const char * const *EnumNamesEvent() { + static const char * const names[4] = { + "NONE", + "PauseEvent", + "RunEvent", + nullptr + }; + return names; +} + +inline const char *EnumNameEvent(Event e) { + if (::flatbuffers::IsOutRange(e, Event_NONE, Event_RunEvent)) return ""; + const size_t index = static_cast(e); + return EnumNamesEvent()[index]; +} + +template struct EventTraits { + static const Event enum_value = Event_NONE; +}; + +template<> struct EventTraits { + static const Event enum_value = Event_PauseEvent; +}; + +template<> struct EventTraits { + static const Event enum_value = Event_RunEvent; +}; + +template struct EventUnionTraits { + static const Event enum_value = Event_NONE; +}; + +template<> struct EventUnionTraits { + static const Event enum_value = Event_PauseEvent; +}; + +template<> struct EventUnionTraits { + static const Event enum_value = Event_RunEvent; +}; + +struct EventUnion { + Event type; + void *value; + + EventUnion() : type(Event_NONE), value(nullptr) {} + EventUnion(EventUnion&& u) FLATBUFFERS_NOEXCEPT : + type(Event_NONE), value(nullptr) + { std::swap(type, u.type); std::swap(value, u.value); } + EventUnion(const EventUnion &); + EventUnion &operator=(const EventUnion &u) + { EventUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; } + EventUnion &operator=(EventUnion &&u) FLATBUFFERS_NOEXCEPT + { std::swap(type, u.type); std::swap(value, u.value); return *this; } + ~EventUnion() { Reset(); } + + void Reset(); + + template + void Set(T&& val) { + typedef typename std::remove_reference::type RT; + Reset(); + type = EventUnionTraits::enum_value; + if (type != Event_NONE) { + value = new RT(std::forward(val)); + } + } + + static void *UnPack(const void *obj, Event type, const ::flatbuffers::resolver_function_t *resolver); + ::flatbuffers::Offset Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const; + + Debugger::PauseEventT *AsPauseEvent() { + return type == Event_PauseEvent ? + reinterpret_cast(value) : nullptr; + } + const Debugger::PauseEventT *AsPauseEvent() const { + return type == Event_PauseEvent ? + reinterpret_cast(value) : nullptr; + } + Debugger::RunEventT *AsRunEvent() { + return type == Event_RunEvent ? + reinterpret_cast(value) : nullptr; + } + const Debugger::RunEventT *AsRunEvent() const { + return type == Event_RunEvent ? + reinterpret_cast(value) : nullptr; + } +}; + +bool VerifyEvent(::flatbuffers::Verifier &verifier, const void *obj, Event type); +bool VerifyEventVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset> *values, const ::flatbuffers::Vector *types); + +struct PauseEventT : public ::flatbuffers::NativeTable { + typedef PauseEvent TableType; +}; + +struct PauseEvent FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef PauseEventT NativeTableType; + typedef PauseEventBuilder Builder; + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + PauseEventT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(PauseEventT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; + static ::flatbuffers::Offset Pack(::flatbuffers::FlatBufferBuilder &_fbb, const PauseEventT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct PauseEventBuilder { + typedef PauseEvent Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + explicit PauseEventBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreatePauseEvent( + ::flatbuffers::FlatBufferBuilder &_fbb) { + PauseEventBuilder builder_(_fbb); + return builder_.Finish(); +} + +::flatbuffers::Offset CreatePauseEvent(::flatbuffers::FlatBufferBuilder &_fbb, const PauseEventT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct RunEventT : public ::flatbuffers::NativeTable { + typedef RunEvent TableType; + bool singleStep = false; +}; + +struct RunEvent FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef RunEventT NativeTableType; + typedef RunEventBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_SINGLESTEP = 4 + }; + bool singleStep() const { + return GetField(VT_SINGLESTEP, 0) != 0; + } + bool mutate_singleStep(bool _singleStep = 0) { + return SetField(VT_SINGLESTEP, static_cast(_singleStep), 0); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_SINGLESTEP, 1) && + verifier.EndTable(); + } + RunEventT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(RunEventT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; + static ::flatbuffers::Offset Pack(::flatbuffers::FlatBufferBuilder &_fbb, const RunEventT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct RunEventBuilder { + typedef RunEvent Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_singleStep(bool singleStep) { + fbb_.AddElement(RunEvent::VT_SINGLESTEP, static_cast(singleStep), 0); + } + explicit RunEventBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateRunEvent( + ::flatbuffers::FlatBufferBuilder &_fbb, + bool singleStep = false) { + RunEventBuilder builder_(_fbb); + builder_.add_singleStep(singleStep); + return builder_.Finish(); +} + +::flatbuffers::Offset CreateRunEvent(::flatbuffers::FlatBufferBuilder &_fbb, const RunEventT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct DebugEventT : public ::flatbuffers::NativeTable { + typedef DebugEvent TableType; + Debugger::EventUnion event{}; +}; + +struct DebugEvent FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef DebugEventT NativeTableType; + typedef DebugEventBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_EVENT_TYPE = 4, + VT_EVENT = 6 + }; + Debugger::Event event_type() const { + return static_cast(GetField(VT_EVENT_TYPE, 0)); + } + const void *event() const { + return GetPointer(VT_EVENT); + } + template const T *event_as() const; + const Debugger::PauseEvent *event_as_PauseEvent() const { + return event_type() == Debugger::Event_PauseEvent ? static_cast(event()) : nullptr; + } + const Debugger::RunEvent *event_as_RunEvent() const { + return event_type() == Debugger::Event_RunEvent ? static_cast(event()) : nullptr; + } + void *mutable_event() { + return GetPointer(VT_EVENT); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_EVENT_TYPE, 1) && + VerifyOffset(verifier, VT_EVENT) && + VerifyEvent(verifier, event(), event_type()) && + verifier.EndTable(); + } + DebugEventT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(DebugEventT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; + static ::flatbuffers::Offset Pack(::flatbuffers::FlatBufferBuilder &_fbb, const DebugEventT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +template<> inline const Debugger::PauseEvent *DebugEvent::event_as() const { + return event_as_PauseEvent(); +} + +template<> inline const Debugger::RunEvent *DebugEvent::event_as() const { + return event_as_RunEvent(); +} + +struct DebugEventBuilder { + typedef DebugEvent Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_event_type(Debugger::Event event_type) { + fbb_.AddElement(DebugEvent::VT_EVENT_TYPE, static_cast(event_type), 0); + } + void add_event(::flatbuffers::Offset event) { + fbb_.AddOffset(DebugEvent::VT_EVENT, event); + } + explicit DebugEventBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateDebugEvent( + ::flatbuffers::FlatBufferBuilder &_fbb, + Debugger::Event event_type = Debugger::Event_NONE, + ::flatbuffers::Offset event = 0) { + DebugEventBuilder builder_(_fbb); + builder_.add_event(event); + builder_.add_event_type(event_type); + return builder_.Finish(); +} + +::flatbuffers::Offset CreateDebugEvent(::flatbuffers::FlatBufferBuilder &_fbb, const DebugEventT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); + +inline PauseEventT *PauseEvent::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const { + auto _o = std::unique_ptr(new PauseEventT()); + UnPackTo(_o.get(), _resolver); + return _o.release(); +} + +inline void PauseEvent::UnPackTo(PauseEventT *_o, const ::flatbuffers::resolver_function_t *_resolver) const { + (void)_o; + (void)_resolver; +} + +inline ::flatbuffers::Offset PauseEvent::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const PauseEventT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) { + return CreatePauseEvent(_fbb, _o, _rehasher); +} + +inline ::flatbuffers::Offset CreatePauseEvent(::flatbuffers::FlatBufferBuilder &_fbb, const PauseEventT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) { + (void)_rehasher; + (void)_o; + struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const PauseEventT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; + return Debugger::CreatePauseEvent( + _fbb); +} + +inline RunEventT *RunEvent::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const { + auto _o = std::unique_ptr(new RunEventT()); + UnPackTo(_o.get(), _resolver); + return _o.release(); +} + +inline void RunEvent::UnPackTo(RunEventT *_o, const ::flatbuffers::resolver_function_t *_resolver) const { + (void)_o; + (void)_resolver; + { auto _e = singleStep(); _o->singleStep = _e; } +} + +inline ::flatbuffers::Offset RunEvent::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const RunEventT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) { + return CreateRunEvent(_fbb, _o, _rehasher); +} + +inline ::flatbuffers::Offset CreateRunEvent(::flatbuffers::FlatBufferBuilder &_fbb, const RunEventT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) { + (void)_rehasher; + (void)_o; + struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const RunEventT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; + auto _singleStep = _o->singleStep; + return Debugger::CreateRunEvent( + _fbb, + _singleStep); +} + +inline DebugEventT *DebugEvent::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const { + auto _o = std::unique_ptr(new DebugEventT()); + UnPackTo(_o.get(), _resolver); + return _o.release(); +} + +inline void DebugEvent::UnPackTo(DebugEventT *_o, const ::flatbuffers::resolver_function_t *_resolver) const { + (void)_o; + (void)_resolver; + { auto _e = event_type(); _o->event.type = _e; } + { auto _e = event(); if (_e) _o->event.value = Debugger::EventUnion::UnPack(_e, event_type(), _resolver); } +} + +inline ::flatbuffers::Offset DebugEvent::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const DebugEventT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) { + return CreateDebugEvent(_fbb, _o, _rehasher); +} + +inline ::flatbuffers::Offset CreateDebugEvent(::flatbuffers::FlatBufferBuilder &_fbb, const DebugEventT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) { + (void)_rehasher; + (void)_o; + struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const DebugEventT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; + auto _event_type = _o->event.type; + auto _event = _o->event.Pack(_fbb); + return Debugger::CreateDebugEvent( + _fbb, + _event_type, + _event); +} + +inline bool VerifyEvent(::flatbuffers::Verifier &verifier, const void *obj, Event type) { + switch (type) { + case Event_NONE: { + return true; + } + case Event_PauseEvent: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case Event_RunEvent: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + default: return true; + } +} + +inline bool VerifyEventVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset> *values, const ::flatbuffers::Vector *types) { + if (!values || !types) return !values && !types; + if (values->size() != types->size()) return false; + for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { + if (!VerifyEvent( + verifier, values->Get(i), types->GetEnum(i))) { + return false; + } + } + return true; +} + +inline void *EventUnion::UnPack(const void *obj, Event type, const ::flatbuffers::resolver_function_t *resolver) { + (void)resolver; + switch (type) { + case Event_PauseEvent: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case Event_RunEvent: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + default: return nullptr; + } +} + +inline ::flatbuffers::Offset EventUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const { + (void)_rehasher; + switch (type) { + case Event_PauseEvent: { + auto ptr = reinterpret_cast(value); + return CreatePauseEvent(_fbb, ptr, _rehasher).Union(); + } + case Event_RunEvent: { + auto ptr = reinterpret_cast(value); + return CreateRunEvent(_fbb, ptr, _rehasher).Union(); + } + default: return 0; + } +} + +inline EventUnion::EventUnion(const EventUnion &u) : type(u.type), value(nullptr) { + switch (type) { + case Event_PauseEvent: { + value = new Debugger::PauseEventT(*reinterpret_cast(u.value)); + break; + } + case Event_RunEvent: { + value = new Debugger::RunEventT(*reinterpret_cast(u.value)); + break; + } + default: + break; + } +} + +inline void EventUnion::Reset() { + switch (type) { + case Event_PauseEvent: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case Event_RunEvent: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + default: break; + } + value = nullptr; + type = Event_NONE; +} + +inline const Debugger::DebugEvent *GetDebugEvent(const void *buf) { + return ::flatbuffers::GetRoot(buf); +} + +inline const Debugger::DebugEvent *GetSizePrefixedDebugEvent(const void *buf) { + return ::flatbuffers::GetSizePrefixedRoot(buf); +} + +inline DebugEvent *GetMutableDebugEvent(void *buf) { + return ::flatbuffers::GetMutableRoot(buf); +} + +inline Debugger::DebugEvent *GetMutableSizePrefixedDebugEvent(void *buf) { + return ::flatbuffers::GetMutableSizePrefixedRoot(buf); +} + +inline bool VerifyDebugEventBuffer( + ::flatbuffers::Verifier &verifier) { + return verifier.VerifyBuffer(nullptr); +} + +inline bool VerifySizePrefixedDebugEventBuffer( + ::flatbuffers::Verifier &verifier) { + return verifier.VerifySizePrefixedBuffer(nullptr); +} + +inline void FinishDebugEventBuffer( + ::flatbuffers::FlatBufferBuilder &fbb, + ::flatbuffers::Offset root) { + fbb.Finish(root); +} + +inline void FinishSizePrefixedDebugEventBuffer( + ::flatbuffers::FlatBufferBuilder &fbb, + ::flatbuffers::Offset root) { + fbb.FinishSizePrefixed(root); +} + +inline std::unique_ptr UnPackDebugEvent( + const void *buf, + const ::flatbuffers::resolver_function_t *res = nullptr) { + return std::unique_ptr(GetDebugEvent(buf)->UnPack(res)); +} + +inline std::unique_ptr UnPackSizePrefixedDebugEvent( + const void *buf, + const ::flatbuffers::resolver_function_t *res = nullptr) { + return std::unique_ptr(GetSizePrefixedDebugEvent(buf)->UnPack(res)); +} + +} // namespace Debugger + +#endif // FLATBUFFERS_GENERATED_EVENTS_DEBUGGER_H_