Adding modules/functions to the debugger.

This commit is contained in:
Ben Vanik
2015-06-08 21:12:40 -07:00
parent 9d7d6df476
commit 573f190a43
47 changed files with 1427 additions and 128 deletions

View File

@@ -22,6 +22,9 @@
#include "xenia/cpu/function.h"
#include "xenia/cpu/processor.h"
#include "xenia/emulator.h"
#include "xenia/kernel/objects/xkernel_module.h"
#include "xenia/kernel/objects/xmodule.h"
#include "xenia/kernel/objects/xuser_module.h"
// Autogenerated Flatbuffers files:
#include "xenia/debug/proto/breakpoints_generated.h"
@@ -39,6 +42,8 @@ DEFINE_bool(exit_with_debugger, true, "Exit whe the debugger disconnects.");
namespace xe {
namespace debug {
using namespace xe::kernel;
using xe::cpu::ThreadState;
Breakpoint::Breakpoint(Type type, uint32_t address)
@@ -69,7 +74,7 @@ bool Debugger::StartSession() {
functions_trace_path_ = xe::join_paths(session_path, L"functions.trace");
functions_trace_file_ = ChunkedMappedMemoryWriter::Open(
functions_trace_path_, 32 * 1024 * 1024, true);
functions_trace_path_, 32 * 1024 * 1024, true);
listen_socket_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listen_socket_ < 1) {
@@ -235,14 +240,149 @@ void Debugger::OnMessage(std::vector<uint8_t> buffer) {
case proto::RequestData_ListModulesRequest: {
response_data_type = proto::ResponseData_ListModulesResponse;
auto modules =
emulator()->kernel_state()->object_table()->GetObjectsByType<XModule>(
XObject::kTypeModule);
std::vector<proto::ListModuleEntry> module_entries;
for (size_t i = 0; i < modules.size(); ++i) {
auto& module = modules[i];
auto processor_module = module->processor_module();
module_entries.emplace_back(
module->handle(),
processor_module ? uint32_t(processor_module->QuerySymbolCount())
: 0);
}
auto module_entries_offset =
fbb.CreateVectorOfStructs<proto::ListModuleEntry>(module_entries);
auto response_data = proto::ListModulesResponseBuilder(fbb);
//
response_data.add_entry(module_entries_offset);
response_data_offset = response_data.Finish().Union();
} break;
case proto::RequestData_GetModuleRequest: {
auto request_data = reinterpret_cast<const proto::GetModuleRequest*>(
request->request_data());
auto module =
emulator()->kernel_state()->object_table()->LookupObject<XModule>(
request_data->module_id());
flatbuffers::Offset<proto::Module> module_offset;
if (module) {
proto::XObject xobject_data(module->handle());
auto module_name_offset = fbb.CreateString(module->name());
auto module_path_offset = fbb.CreateString(module->path());
proto::ModuleBuilder module_builder(fbb);
module_builder.add_object(&xobject_data);
module_builder.add_type(
static_cast<proto::ModuleType>(module->module_type()));
module_builder.add_name(module_name_offset);
module_builder.add_path(module_path_offset);
switch (module->module_type()) {
case XModule::ModuleType::kKernelModule: {
auto kernel_module = reinterpret_cast<XKernelModule*>(module.get());
break;
}
case XModule::ModuleType::kUserModule: {
auto user_module = reinterpret_cast<XUserModule*>(module.get());
// user_module->xex?
break;
}
default:
assert_unhandled_case(module->module_type());
break;
}
module_offset = module_builder.Finish();
}
response_data_type = proto::ResponseData_GetModuleResponse;
auto response_data = proto::GetModuleResponseBuilder(fbb);
//
response_data.add_module(module_offset);
response_data_offset = response_data.Finish().Union();
} break;
case proto::RequestData_ListFunctionsRequest: {
auto request_data = reinterpret_cast<const proto::ListFunctionsRequest*>(
request->request_data());
auto module =
emulator()->kernel_state()->object_table()->LookupObject<XModule>(
request_data->module_id());
if (!module || !module->processor_module()) {
response_data_type = proto::ResponseData_ListFunctionsResponse;
auto response_data = proto::ListFunctionsResponseBuilder(fbb);
response_data_offset = response_data.Finish().Union();
break;
}
auto processor_module = module->processor_module();
size_t max_function_count = request_data->function_index_end() -
request_data->function_index_start() + 1;
std::vector<flatbuffers::Offset<proto::FunctionEntry>> function_list;
function_list.reserve(max_function_count);
processor_module->ForEachSymbol(request_data->function_index_start(),
request_data->function_index_end(),
[&](xe::cpu::SymbolInfo* symbol_info) {
if (symbol_info->type() != xe::cpu::SymbolType::kFunction) {
return;
}
auto function_info =
reinterpret_cast<xe::cpu::FunctionInfo*>(symbol_info);
flatbuffers::Offset<flatbuffers::String> name_offset;
if (!function_info->name().empty()) {
name_offset = fbb.CreateString(function_info->name());
}
auto function_entry = proto::FunctionEntryBuilder(fbb);
function_entry.add_identifier(
reinterpret_cast<uintptr_t>(function_info));
function_entry.add_address_start(function_info->address());
function_entry.add_address_end(function_info->end_address());
function_entry.add_name(name_offset);
function_list.push_back(function_entry.Finish());
});
auto function_list_data = fbb.CreateVector(function_list);
response_data_type = proto::ResponseData_ListFunctionsResponse;
auto response_data = proto::ListFunctionsResponseBuilder(fbb);
response_data.add_entry(function_list_data);
response_data_offset = response_data.Finish().Union();
} break;
case proto::RequestData_GetFunctionRequest: {
auto request_data = reinterpret_cast<const proto::GetFunctionRequest*>(
request->request_data());
auto function_info =
reinterpret_cast<xe::cpu::FunctionInfo*>(request_data->identifier());
auto function = function_info->function();
flatbuffers::Offset<flatbuffers::String> name_offset;
if (!function_info->name().empty()) {
name_offset = fbb.CreateString(function_info->name());
}
flatbuffers::Offset<flatbuffers::String> disasm_ppc_offset;
flatbuffers::Offset<flatbuffers::String> disasm_hir_raw_offset;
flatbuffers::Offset<flatbuffers::String> disasm_hir_opt_offset;
flatbuffers::Offset<flatbuffers::String> disasm_machine_code_offset;
if (function && function->debug_info()) {
auto debug_info = function->debug_info();
if (debug_info->source_disasm()) {
disasm_ppc_offset = fbb.CreateString(debug_info->source_disasm());
}
if (debug_info->raw_hir_disasm()) {
disasm_hir_raw_offset =
fbb.CreateString(debug_info->raw_hir_disasm());
}
if (debug_info->hir_disasm()) {
disasm_hir_opt_offset = fbb.CreateString(debug_info->hir_disasm());
}
if (debug_info->machine_code_disasm()) {
disasm_machine_code_offset =
fbb.CreateString(debug_info->machine_code_disasm());
}
}
auto function_data = proto::FunctionBuilder(fbb);
function_data.add_identifier(request_data->identifier());
function_data.add_address_start(function_info->address());
function_data.add_address_end(function_info->end_address());
function_data.add_name(name_offset);
function_data.add_disasm_ppc(disasm_ppc_offset);
function_data.add_disasm_hir_raw(disasm_hir_raw_offset);
function_data.add_disasm_hir_opt(disasm_hir_opt_offset);
function_data.add_disasm_machine_code(disasm_machine_code_offset);
auto function_offset = function_data.Finish();
response_data_type = proto::ResponseData_GetFunctionResponse;
auto response_data = proto::GetFunctionResponseBuilder(fbb);
response_data.add_function(function_offset);
response_data_offset = response_data.Finish().Union();
} break;

View File

@@ -25,6 +25,8 @@ union RequestData {
ListModulesRequest,
GetModuleRequest,
ListFunctionsRequest,
GetFunctionRequest,
StopRequest,
BreakRequest,
@@ -47,6 +49,8 @@ union ResponseData {
ListModulesResponse,
GetModuleResponse,
ListFunctionsResponse,
GetFunctionResponse,
StopResponse,
BreakResponse,

View File

@@ -48,9 +48,16 @@ namespace debug {
namespace proto {
struct Module;
struct ListModulesRequest;
struct ListModuleEntry;
struct ListModulesResponse;
struct GetModuleRequest;
struct GetModuleResponse;
struct FunctionEntry;
struct Function;
struct ListFunctionsRequest;
struct ListFunctionsResponse;
struct GetFunctionRequest;
struct GetFunctionResponse;
} // namespace proto
} // namespace debug
} // namespace xe
@@ -82,14 +89,24 @@ enum RequestData {
RequestData_RemoveBreakpointsRequest = 5,
RequestData_ListModulesRequest = 6,
RequestData_GetModuleRequest = 7,
RequestData_StopRequest = 8,
RequestData_BreakRequest = 9,
RequestData_ContinueRequest = 10,
RequestData_StepRequest = 11
RequestData_ListFunctionsRequest = 8,
RequestData_GetFunctionRequest = 9,
RequestData_StopRequest = 10,
RequestData_BreakRequest = 11,
RequestData_ContinueRequest = 12,
RequestData_StepRequest = 13
};
inline const char **EnumNamesRequestData() {
static const char *names[] = { "NONE", "AttachRequest", "ListBreakpointsRequest", "AddBreakpointsRequest", "UpdateBreakpointsRequest", "RemoveBreakpointsRequest", "ListModulesRequest", "GetModuleRequest", "StopRequest", "BreakRequest", "ContinueRequest", "StepRequest", nullptr };
static const char *names[] = {
"NONE", "AttachRequest",
"ListBreakpointsRequest", "AddBreakpointsRequest",
"UpdateBreakpointsRequest", "RemoveBreakpointsRequest",
"ListModulesRequest", "GetModuleRequest",
"ListFunctionsRequest", "GetFunctionRequest",
"StopRequest", "BreakRequest",
"ContinueRequest", "StepRequest",
nullptr};
return names;
}
@@ -106,16 +123,27 @@ enum ResponseData {
ResponseData_RemoveBreakpointsResponse = 5,
ResponseData_ListModulesResponse = 6,
ResponseData_GetModuleResponse = 7,
ResponseData_StopResponse = 8,
ResponseData_BreakResponse = 9,
ResponseData_ContinueResponse = 10,
ResponseData_StepResponse = 11,
ResponseData_BreakpointEvent = 12,
ResponseData_AccessViolationEvent = 13
ResponseData_ListFunctionsResponse = 8,
ResponseData_GetFunctionResponse = 9,
ResponseData_StopResponse = 10,
ResponseData_BreakResponse = 11,
ResponseData_ContinueResponse = 12,
ResponseData_StepResponse = 13,
ResponseData_BreakpointEvent = 14,
ResponseData_AccessViolationEvent = 15
};
inline const char **EnumNamesResponseData() {
static const char *names[] = { "NONE", "AttachResponse", "ListBreakpointsResponse", "AddBreakpointsResponse", "UpdateBreakpointsResponse", "RemoveBreakpointsResponse", "ListModulesResponse", "GetModuleResponse", "StopResponse", "BreakResponse", "ContinueResponse", "StepResponse", "BreakpointEvent", "AccessViolationEvent", nullptr };
static const char *names[] = {
"NONE", "AttachResponse",
"ListBreakpointsResponse", "AddBreakpointsResponse",
"UpdateBreakpointsResponse", "RemoveBreakpointsResponse",
"ListModulesResponse", "GetModuleResponse",
"ListFunctionsResponse", "GetFunctionResponse",
"StopResponse", "BreakResponse",
"ContinueResponse", "StepResponse",
"BreakpointEvent", "AccessViolationEvent",
nullptr};
return names;
}
@@ -275,6 +303,14 @@ inline bool VerifyRequestData(flatbuffers::Verifier &verifier, const void *union
case RequestData_RemoveBreakpointsRequest: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::RemoveBreakpointsRequest *>(union_obj));
case RequestData_ListModulesRequest: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::ListModulesRequest *>(union_obj));
case RequestData_GetModuleRequest: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::GetModuleRequest *>(union_obj));
case RequestData_ListFunctionsRequest:
return verifier.VerifyTable(
reinterpret_cast<const xe::debug::proto::ListFunctionsRequest *>(
union_obj));
case RequestData_GetFunctionRequest:
return verifier.VerifyTable(
reinterpret_cast<const xe::debug::proto::GetFunctionRequest *>(
union_obj));
case RequestData_StopRequest: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::StopRequest *>(union_obj));
case RequestData_BreakRequest: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::BreakRequest *>(union_obj));
case RequestData_ContinueRequest: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::ContinueRequest *>(union_obj));
@@ -293,6 +329,14 @@ inline bool VerifyResponseData(flatbuffers::Verifier &verifier, const void *unio
case ResponseData_RemoveBreakpointsResponse: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::RemoveBreakpointsResponse *>(union_obj));
case ResponseData_ListModulesResponse: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::ListModulesResponse *>(union_obj));
case ResponseData_GetModuleResponse: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::GetModuleResponse *>(union_obj));
case ResponseData_ListFunctionsResponse:
return verifier.VerifyTable(
reinterpret_cast<const xe::debug::proto::ListFunctionsResponse *>(
union_obj));
case ResponseData_GetFunctionResponse:
return verifier.VerifyTable(
reinterpret_cast<const xe::debug::proto::GetFunctionResponse *>(
union_obj));
case ResponseData_StopResponse: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::StopResponse *>(union_obj));
case ResponseData_BreakResponse: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::BreakResponse *>(union_obj));
case ResponseData_ContinueResponse: return verifier.VerifyTable(reinterpret_cast<const xe::debug::proto::ContinueResponse *>(union_obj));

View File

@@ -3,8 +3,8 @@ include "common.fbs";
namespace xe.debug.proto;
enum ModuleType:byte {
Kernel,
User,
Kernel = 0,
User = 1,
}
table Module {
@@ -18,8 +18,12 @@ table Module {
table ListModulesRequest {
}
struct ListModuleEntry {
handle:uint;
function_count:uint;
}
table ListModulesResponse {
module_ids:[uint];
entry:[ListModuleEntry];
}
table GetModuleRequest {
@@ -29,3 +33,36 @@ table GetModuleResponse {
module:Module;
}
table FunctionEntry {
identifier:ulong;
address_start:uint;
address_end:uint;
name:string;
}
table Function {
identifier:ulong;
address_start:uint;
address_end:uint;
name:string;
disasm_ppc:string;
disasm_hir_raw:string;
disasm_hir_opt:string;
disasm_machine_code:string;
}
table ListFunctionsRequest {
module_id:uint;
function_index_start:uint;
function_index_end:uint;
}
table ListFunctionsResponse {
entry:[FunctionEntry];
}
table GetFunctionRequest {
identifier:ulong;
}
table GetFunctionResponse {
function:Function;
}

View File

@@ -19,9 +19,16 @@ namespace proto {
struct Module;
struct ListModulesRequest;
struct ListModuleEntry;
struct ListModulesResponse;
struct GetModuleRequest;
struct GetModuleResponse;
struct FunctionEntry;
struct Function;
struct ListFunctionsRequest;
struct ListFunctionsResponse;
struct GetFunctionRequest;
struct GetFunctionResponse;
enum ModuleType {
ModuleType_Kernel = 0,
@@ -35,6 +42,23 @@ inline const char **EnumNamesModuleType() {
inline const char *EnumNameModuleType(ModuleType e) { return EnumNamesModuleType()[e]; }
MANUALLY_ALIGNED_STRUCT(4) ListModuleEntry FLATBUFFERS_FINAL_CLASS {
private:
uint32_t handle_;
uint32_t function_count_;
public:
ListModuleEntry(uint32_t handle, uint32_t function_count)
: handle_(flatbuffers::EndianScalar(handle)),
function_count_(flatbuffers::EndianScalar(function_count)) {}
uint32_t handle() const { return flatbuffers::EndianScalar(handle_); }
uint32_t function_count() const {
return flatbuffers::EndianScalar(function_count_);
}
};
STRUCT_END(ListModuleEntry, 8);
struct Module FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
const xe::debug::proto::XObject *object() const { return GetStruct<const xe::debug::proto::XObject *>(4); }
ModuleType type() const { return static_cast<ModuleType>(GetField<int8_t>(6, 0)); }
@@ -104,19 +128,23 @@ inline flatbuffers::Offset<ListModulesRequest> CreateListModulesRequest(flatbuff
}
struct ListModulesResponse FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
const flatbuffers::Vector<uint32_t> *module_ids() const { return GetPointer<const flatbuffers::Vector<uint32_t> *>(4); }
const flatbuffers::Vector<const ListModuleEntry *> *entry() const {
return GetPointer<const flatbuffers::Vector<const ListModuleEntry *> *>(4);
}
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<flatbuffers::uoffset_t>(verifier, 4 /* module_ids */) &&
verifier.Verify(module_ids()) &&
verifier.EndTable();
VerifyField<flatbuffers::uoffset_t>(verifier, 4 /* entry */) &&
verifier.Verify(entry()) && verifier.EndTable();
}
};
struct ListModulesResponseBuilder {
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_module_ids(flatbuffers::Offset<flatbuffers::Vector<uint32_t>> module_ids) { fbb_.AddOffset(4, module_ids); }
void add_entry(
flatbuffers::Offset<flatbuffers::Vector<const ListModuleEntry *>> entry) {
fbb_.AddOffset(4, entry);
}
ListModulesResponseBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
ListModulesResponseBuilder &operator=(const ListModulesResponseBuilder &);
flatbuffers::Offset<ListModulesResponse> Finish() {
@@ -125,10 +153,12 @@ struct ListModulesResponseBuilder {
}
};
inline flatbuffers::Offset<ListModulesResponse> CreateListModulesResponse(flatbuffers::FlatBufferBuilder &_fbb,
flatbuffers::Offset<flatbuffers::Vector<uint32_t>> module_ids = 0) {
inline flatbuffers::Offset<ListModulesResponse> CreateListModulesResponse(
flatbuffers::FlatBufferBuilder &_fbb,
flatbuffers::Offset<flatbuffers::Vector<const ListModuleEntry *>> entry =
0) {
ListModulesResponseBuilder builder_(_fbb);
builder_.add_module_ids(module_ids);
builder_.add_entry(entry);
return builder_.Finish();
}
@@ -189,6 +219,317 @@ inline flatbuffers::Offset<GetModuleResponse> CreateGetModuleResponse(flatbuffer
return builder_.Finish();
}
struct FunctionEntry FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
uint64_t identifier() const { return GetField<uint64_t>(4, 0); }
uint32_t address_start() const { return GetField<uint32_t>(6, 0); }
uint32_t address_end() const { return GetField<uint32_t>(8, 0); }
const flatbuffers::String *name() const {
return GetPointer<const flatbuffers::String *>(10);
}
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<uint64_t>(verifier, 4 /* identifier */) &&
VerifyField<uint32_t>(verifier, 6 /* address_start */) &&
VerifyField<uint32_t>(verifier, 8 /* address_end */) &&
VerifyField<flatbuffers::uoffset_t>(verifier, 10 /* name */) &&
verifier.Verify(name()) && verifier.EndTable();
}
};
struct FunctionEntryBuilder {
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_identifier(uint64_t identifier) {
fbb_.AddElement<uint64_t>(4, identifier, 0);
}
void add_address_start(uint32_t address_start) {
fbb_.AddElement<uint32_t>(6, address_start, 0);
}
void add_address_end(uint32_t address_end) {
fbb_.AddElement<uint32_t>(8, address_end, 0);
}
void add_name(flatbuffers::Offset<flatbuffers::String> name) {
fbb_.AddOffset(10, name);
}
FunctionEntryBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) {
start_ = fbb_.StartTable();
}
FunctionEntryBuilder &operator=(const FunctionEntryBuilder &);
flatbuffers::Offset<FunctionEntry> Finish() {
auto o = flatbuffers::Offset<FunctionEntry>(fbb_.EndTable(start_, 4));
return o;
}
};
inline flatbuffers::Offset<FunctionEntry> CreateFunctionEntry(
flatbuffers::FlatBufferBuilder &_fbb, uint64_t identifier = 0,
uint32_t address_start = 0, uint32_t address_end = 0,
flatbuffers::Offset<flatbuffers::String> name = 0) {
FunctionEntryBuilder builder_(_fbb);
builder_.add_identifier(identifier);
builder_.add_name(name);
builder_.add_address_end(address_end);
builder_.add_address_start(address_start);
return builder_.Finish();
}
struct Function FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
uint64_t identifier() const { return GetField<uint64_t>(4, 0); }
uint32_t address_start() const { return GetField<uint32_t>(6, 0); }
uint32_t address_end() const { return GetField<uint32_t>(8, 0); }
const flatbuffers::String *name() const {
return GetPointer<const flatbuffers::String *>(10);
}
const flatbuffers::String *disasm_ppc() const {
return GetPointer<const flatbuffers::String *>(12);
}
const flatbuffers::String *disasm_hir_raw() const {
return GetPointer<const flatbuffers::String *>(14);
}
const flatbuffers::String *disasm_hir_opt() const {
return GetPointer<const flatbuffers::String *>(16);
}
const flatbuffers::String *disasm_machine_code() const {
return GetPointer<const flatbuffers::String *>(18);
}
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<uint64_t>(verifier, 4 /* identifier */) &&
VerifyField<uint32_t>(verifier, 6 /* address_start */) &&
VerifyField<uint32_t>(verifier, 8 /* address_end */) &&
VerifyField<flatbuffers::uoffset_t>(verifier, 10 /* name */) &&
verifier.Verify(name()) &&
VerifyField<flatbuffers::uoffset_t>(verifier, 12 /* disasm_ppc */) &&
verifier.Verify(disasm_ppc()) &&
VerifyField<flatbuffers::uoffset_t>(verifier,
14 /* disasm_hir_raw */) &&
verifier.Verify(disasm_hir_raw()) &&
VerifyField<flatbuffers::uoffset_t>(verifier,
16 /* disasm_hir_opt */) &&
verifier.Verify(disasm_hir_opt()) &&
VerifyField<flatbuffers::uoffset_t>(verifier,
18 /* disasm_machine_code */) &&
verifier.Verify(disasm_machine_code()) && verifier.EndTable();
}
};
struct FunctionBuilder {
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_identifier(uint64_t identifier) {
fbb_.AddElement<uint64_t>(4, identifier, 0);
}
void add_address_start(uint32_t address_start) {
fbb_.AddElement<uint32_t>(6, address_start, 0);
}
void add_address_end(uint32_t address_end) {
fbb_.AddElement<uint32_t>(8, address_end, 0);
}
void add_name(flatbuffers::Offset<flatbuffers::String> name) {
fbb_.AddOffset(10, name);
}
void add_disasm_ppc(flatbuffers::Offset<flatbuffers::String> disasm_ppc) {
fbb_.AddOffset(12, disasm_ppc);
}
void add_disasm_hir_raw(
flatbuffers::Offset<flatbuffers::String> disasm_hir_raw) {
fbb_.AddOffset(14, disasm_hir_raw);
}
void add_disasm_hir_opt(
flatbuffers::Offset<flatbuffers::String> disasm_hir_opt) {
fbb_.AddOffset(16, disasm_hir_opt);
}
void add_disasm_machine_code(
flatbuffers::Offset<flatbuffers::String> disasm_machine_code) {
fbb_.AddOffset(18, disasm_machine_code);
}
FunctionBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) {
start_ = fbb_.StartTable();
}
FunctionBuilder &operator=(const FunctionBuilder &);
flatbuffers::Offset<Function> Finish() {
auto o = flatbuffers::Offset<Function>(fbb_.EndTable(start_, 8));
return o;
}
};
inline flatbuffers::Offset<Function> CreateFunction(
flatbuffers::FlatBufferBuilder &_fbb, uint64_t identifier = 0,
uint32_t address_start = 0, uint32_t address_end = 0,
flatbuffers::Offset<flatbuffers::String> name = 0,
flatbuffers::Offset<flatbuffers::String> disasm_ppc = 0,
flatbuffers::Offset<flatbuffers::String> disasm_hir_raw = 0,
flatbuffers::Offset<flatbuffers::String> disasm_hir_opt = 0,
flatbuffers::Offset<flatbuffers::String> disasm_machine_code = 0) {
FunctionBuilder builder_(_fbb);
builder_.add_identifier(identifier);
builder_.add_disasm_machine_code(disasm_machine_code);
builder_.add_disasm_hir_opt(disasm_hir_opt);
builder_.add_disasm_hir_raw(disasm_hir_raw);
builder_.add_disasm_ppc(disasm_ppc);
builder_.add_name(name);
builder_.add_address_end(address_end);
builder_.add_address_start(address_start);
return builder_.Finish();
}
struct ListFunctionsRequest FLATBUFFERS_FINAL_CLASS
: private flatbuffers::Table {
uint32_t module_id() const { return GetField<uint32_t>(4, 0); }
uint32_t function_index_start() const { return GetField<uint32_t>(6, 0); }
uint32_t function_index_end() const { return GetField<uint32_t>(8, 0); }
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<uint32_t>(verifier, 4 /* module_id */) &&
VerifyField<uint32_t>(verifier, 6 /* function_index_start */) &&
VerifyField<uint32_t>(verifier, 8 /* function_index_end */) &&
verifier.EndTable();
}
};
struct ListFunctionsRequestBuilder {
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_module_id(uint32_t module_id) {
fbb_.AddElement<uint32_t>(4, module_id, 0);
}
void add_function_index_start(uint32_t function_index_start) {
fbb_.AddElement<uint32_t>(6, function_index_start, 0);
}
void add_function_index_end(uint32_t function_index_end) {
fbb_.AddElement<uint32_t>(8, function_index_end, 0);
}
ListFunctionsRequestBuilder(flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
ListFunctionsRequestBuilder &operator=(const ListFunctionsRequestBuilder &);
flatbuffers::Offset<ListFunctionsRequest> Finish() {
auto o =
flatbuffers::Offset<ListFunctionsRequest>(fbb_.EndTable(start_, 3));
return o;
}
};
inline flatbuffers::Offset<ListFunctionsRequest> CreateListFunctionsRequest(
flatbuffers::FlatBufferBuilder &_fbb, uint32_t module_id = 0,
uint32_t function_index_start = 0, uint32_t function_index_end = 0) {
ListFunctionsRequestBuilder builder_(_fbb);
builder_.add_function_index_end(function_index_end);
builder_.add_function_index_start(function_index_start);
builder_.add_module_id(module_id);
return builder_.Finish();
}
struct ListFunctionsResponse FLATBUFFERS_FINAL_CLASS
: private flatbuffers::Table {
const flatbuffers::Vector<flatbuffers::Offset<FunctionEntry>> *entry() const {
return GetPointer<
const flatbuffers::Vector<flatbuffers::Offset<FunctionEntry>> *>(4);
}
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<flatbuffers::uoffset_t>(verifier, 4 /* entry */) &&
verifier.Verify(entry()) && verifier.VerifyVectorOfTables(entry()) &&
verifier.EndTable();
}
};
struct ListFunctionsResponseBuilder {
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_entry(flatbuffers::Offset<
flatbuffers::Vector<flatbuffers::Offset<FunctionEntry>>> entry) {
fbb_.AddOffset(4, entry);
}
ListFunctionsResponseBuilder(flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
ListFunctionsResponseBuilder &operator=(const ListFunctionsResponseBuilder &);
flatbuffers::Offset<ListFunctionsResponse> Finish() {
auto o =
flatbuffers::Offset<ListFunctionsResponse>(fbb_.EndTable(start_, 1));
return o;
}
};
inline flatbuffers::Offset<ListFunctionsResponse> CreateListFunctionsResponse(
flatbuffers::FlatBufferBuilder &_fbb,
flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<FunctionEntry>>>
entry = 0) {
ListFunctionsResponseBuilder builder_(_fbb);
builder_.add_entry(entry);
return builder_.Finish();
}
struct GetFunctionRequest FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
uint64_t identifier() const { return GetField<uint64_t>(4, 0); }
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<uint64_t>(verifier, 4 /* identifier */) &&
verifier.EndTable();
}
};
struct GetFunctionRequestBuilder {
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_identifier(uint64_t identifier) {
fbb_.AddElement<uint64_t>(4, identifier, 0);
}
GetFunctionRequestBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) {
start_ = fbb_.StartTable();
}
GetFunctionRequestBuilder &operator=(const GetFunctionRequestBuilder &);
flatbuffers::Offset<GetFunctionRequest> Finish() {
auto o = flatbuffers::Offset<GetFunctionRequest>(fbb_.EndTable(start_, 1));
return o;
}
};
inline flatbuffers::Offset<GetFunctionRequest> CreateGetFunctionRequest(
flatbuffers::FlatBufferBuilder &_fbb, uint64_t identifier = 0) {
GetFunctionRequestBuilder builder_(_fbb);
builder_.add_identifier(identifier);
return builder_.Finish();
}
struct GetFunctionResponse FLATBUFFERS_FINAL_CLASS
: private flatbuffers::Table {
const Function *function() const { return GetPointer<const Function *>(4); }
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<flatbuffers::uoffset_t>(verifier, 4 /* function */) &&
verifier.VerifyTable(function()) && verifier.EndTable();
}
};
struct GetFunctionResponseBuilder {
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_function(flatbuffers::Offset<Function> function) {
fbb_.AddOffset(4, function);
}
GetFunctionResponseBuilder(flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
GetFunctionResponseBuilder &operator=(const GetFunctionResponseBuilder &);
flatbuffers::Offset<GetFunctionResponse> Finish() {
auto o = flatbuffers::Offset<GetFunctionResponse>(fbb_.EndTable(start_, 1));
return o;
}
};
inline flatbuffers::Offset<GetFunctionResponse> CreateGetFunctionResponse(
flatbuffers::FlatBufferBuilder &_fbb,
flatbuffers::Offset<Function> function = 0) {
GetFunctionResponseBuilder builder_(_fbb);
builder_.add_function(function);
return builder_.Finish();
}
} // namespace proto
} // namespace debug
} // namespace xe