struct ARMDebugger* createDebugger(struct GBAArguments* opts, struct GBAThread* context) { #ifndef USE_CLI_DEBUGGER UNUSED(context); #endif union DebugUnion { struct ARMDebugger d; #ifdef USE_CLI_DEBUGGER struct CLIDebugger cli; #endif #ifdef USE_GDB_STUB struct GDBStub gdb; #endif }; union DebugUnion* debugger = malloc(sizeof(union DebugUnion)); switch (opts->debuggerType) { #ifdef USE_CLI_DEBUGGER case DEBUGGER_CLI: CLIDebuggerCreate(&debugger->cli); struct GBACLIDebugger* gbaDebugger = GBACLIDebuggerCreate(context); CLIDebuggerAttachSystem(&debugger->cli, &gbaDebugger->d); break; #endif #ifdef USE_GDB_STUB case DEBUGGER_GDB: GDBStubCreate(&debugger->gdb); GDBStubListen(&debugger->gdb, 2345, 0); break; #endif case DEBUGGER_NONE: case DEBUGGER_MAX: free(debugger); return 0; break; } return &debugger->d; }
struct mDebugger* mDebuggerCreate(enum mDebuggerType type, struct mCore* core) { if (!core->supportsDebuggerType(core, type)) { return NULL; } union DebugUnion { struct mDebugger d; struct CLIDebugger cli; #ifdef USE_GDB_STUB struct GDBStub gdb; #endif }; union DebugUnion* debugger = malloc(sizeof(union DebugUnion)); memset(debugger, 0, sizeof(*debugger)); switch (type) { case DEBUGGER_CLI: CLIDebuggerCreate(&debugger->cli); struct CLIDebuggerSystem* sys = core->cliDebuggerSystem(core); CLIDebuggerAttachSystem(&debugger->cli, sys); break; #ifdef USE_GDB_STUB case DEBUGGER_GDB: GDBStubCreate(&debugger->gdb); GDBStubListen(&debugger->gdb, 2345, 0); break; #endif case DEBUGGER_NONE: case DEBUGGER_MAX: free(debugger); return 0; break; } return &debugger->d; }