main: support gdb debugging with AVR

Be able to run `tinygo gdb -target=arduino examples/serial` and debug a
program with the power of a real debugger.

Note that this only works on LLVM 11 because older versions have a bug
in the AVR backend that cause it to produce invalid debug information:
https://reviews.llvm.org/D74213.
Этот коммит содержится в:
Ayke van Laethem 2020-04-14 23:10:31 +02:00 коммит произвёл Ron Evans
родитель bb27bbcb41
коммит 4cc1cdf672
2 изменённых файлов: 13 добавлений и 2 удалений

12
main.go
Просмотреть файл

@ -348,12 +348,14 @@ func FlashGDB(pkgName string, ocdOutput bool, options *compileopts.Options) erro
switch gdbInterface { switch gdbInterface {
case "msd", "command", "": case "msd", "command", "":
if len(config.Target.Emulator) != 0 { if len(config.Target.Emulator) != 0 {
// Assume QEMU as an emulator.
if config.Target.Emulator[0] == "mgba" { if config.Target.Emulator[0] == "mgba" {
gdbInterface = "mgba" gdbInterface = "mgba"
} else if config.Target.Emulator[0] == "simavr" {
gdbInterface = "simavr"
} else if strings.HasPrefix(config.Target.Emulator[0], "qemu-system-") { } else if strings.HasPrefix(config.Target.Emulator[0], "qemu-system-") {
gdbInterface = "qemu" gdbInterface = "qemu"
} else { } else {
// Assume QEMU as an emulator.
gdbInterface = "qemu-user" gdbInterface = "qemu-user"
} }
} else if openocdInterface != "" && config.Target.OpenOCDTarget != "" { } else if openocdInterface != "" && config.Target.OpenOCDTarget != "" {
@ -429,6 +431,14 @@ func FlashGDB(pkgName string, ocdOutput bool, options *compileopts.Options) erro
daemon = exec.Command(config.Target.Emulator[0], args...) daemon = exec.Command(config.Target.Emulator[0], args...)
daemon.Stdout = os.Stdout daemon.Stdout = os.Stdout
daemon.Stderr = os.Stderr daemon.Stderr = os.Stderr
case "simavr":
gdbCommands = append(gdbCommands, "target remote :1234")
// Run in an emulator.
args := append(config.Target.Emulator[1:], "-g", result.Binary)
daemon = exec.Command(config.Target.Emulator[0], args...)
daemon.Stdout = os.Stdout
daemon.Stderr = os.Stderr
case "msd": case "msd":
return errors.New("gdb is not supported for drag-and-drop programmable devices") return errors.New("gdb is not supported for drag-and-drop programmable devices")
default: default:

Просмотреть файл

@ -15,5 +15,6 @@
"extra-files": [ "extra-files": [
"src/internal/task/task_stack_avr.S", "src/internal/task/task_stack_avr.S",
"src/runtime/gc_avr.S" "src/runtime/gc_avr.S"
] ],
"gdb": "avr-gdb"
} }