mirror of https://github.com/mgba-emu/mgba.git
Move debugger creation off the stack
This commit is contained in:
parent
89ccb41b03
commit
7c356ffd07
|
@ -1,5 +1,13 @@
|
||||||
#include "commandline.h"
|
#include "commandline.h"
|
||||||
|
|
||||||
|
#ifdef USE_CLI_DEBUGGER
|
||||||
|
#include "debugger/cli-debugger.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_GDB_STUB
|
||||||
|
#include "debugger/gdb-stub.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
|
||||||
|
@ -51,6 +59,40 @@ int parseCommandArgs(struct StartupOptions* opts, int argc, char* const* argv) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ARMDebugger* createDebugger(struct StartupOptions* opts) {
|
||||||
|
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);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef USE_GDB_STUB
|
||||||
|
case DEBUGGER_GDB:
|
||||||
|
GDBStubCreate(&debugger->gdb);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case DEBUGGER_NONE:
|
||||||
|
case DEBUGGER_MAX:
|
||||||
|
free(debugger);
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &debugger->d;
|
||||||
|
}
|
||||||
|
|
||||||
void usage(const char* arg0) {
|
void usage(const char* arg0) {
|
||||||
printf("%s: bad arguments\n", arg0);
|
printf("%s: bad arguments\n", arg0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ struct StartupOptions {
|
||||||
};
|
};
|
||||||
|
|
||||||
int parseCommandArgs(struct StartupOptions* opts, int argc, char* const* argv);
|
int parseCommandArgs(struct StartupOptions* opts, int argc, char* const* argv);
|
||||||
|
struct ARMDebugger* createDebugger(struct StartupOptions* opts);
|
||||||
void usage(const char* arg0);
|
void usage(const char* arg0);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -77,18 +77,7 @@ int main(int argc, char** argv) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
union {
|
|
||||||
struct ARMDebugger d;
|
|
||||||
#ifdef USE_CLI_DEBUGGER
|
|
||||||
struct CLIDebugger cli;
|
|
||||||
#endif
|
|
||||||
#ifdef USE_GDB_STUB
|
|
||||||
struct GDBStub gdb;
|
|
||||||
#endif
|
|
||||||
} debugger;
|
|
||||||
|
|
||||||
struct GBAThread context = {
|
struct GBAThread context = {
|
||||||
.debugger = &debugger.d,
|
|
||||||
.renderer = &renderer.d.d,
|
.renderer = &renderer.d.d,
|
||||||
.startCallback = _GBASDLStart,
|
.startCallback = _GBASDLStart,
|
||||||
.cleanCallback = _GBASDLClean,
|
.cleanCallback = _GBASDLClean,
|
||||||
|
@ -97,22 +86,7 @@ int main(int argc, char** argv) {
|
||||||
.userData = &renderer
|
.userData = &renderer
|
||||||
};
|
};
|
||||||
|
|
||||||
switch (opts.debuggerType) {
|
context.debugger = createDebugger(&opts);
|
||||||
#ifdef USE_CLI_DEBUGGER
|
|
||||||
case DEBUGGER_CLI:
|
|
||||||
CLIDebuggerCreate(&debugger.cli);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef USE_GDB_STUB
|
|
||||||
case DEBUGGER_GDB:
|
|
||||||
GDBStubCreate(&debugger.gdb);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case DEBUGGER_NONE:
|
|
||||||
case DEBUGGER_MAX:
|
|
||||||
context.debugger = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
GBAMapOptionsToContext(&opts, &context);
|
GBAMapOptionsToContext(&opts, &context);
|
||||||
|
|
||||||
|
@ -125,6 +99,7 @@ int main(int argc, char** argv) {
|
||||||
if (opts.biosFd >= 0) {
|
if (opts.biosFd >= 0) {
|
||||||
close(opts.biosFd);
|
close(opts.biosFd);
|
||||||
}
|
}
|
||||||
|
free(context.debugger);
|
||||||
|
|
||||||
_GBASDLDeinit(&renderer);
|
_GBASDLDeinit(&renderer);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue