Compare commits

...

3 Commits

Author SHA1 Message Date
Ayke van Laethem ce0abac5a3 avr: use compiler-rt 2020-06-27 01:22:31 +02:00
Ayke van Laethem 43d7f48de4 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.
2020-06-27 01:22:31 +02:00
Ayke van Laethem f7f2082979 main: add initial support for (in-development) LLVM 11
This can be useful to test improvements in LLVM master and to make it
possible to support LLVM 11 for the most part already before the next
release. That also allows catching LLVM bugs early to fix them upstream.

Note that tests do not yet pass for this LLVM version, but the TinyGo
compiler can be built with the binaries from apt.llvm.org (at the time
of making this commit).
2020-06-27 01:19:21 +02:00
15 changed files with 93 additions and 23 deletions
+8 -2
View File
@@ -16,8 +16,10 @@ var genericBuiltins = []string{
"addvsi3.c",
"addvti3.c",
"apple_versioning.c",
"ashlsi3.c",
"ashldi3.c",
"ashlti3.c",
"ashrsi3.c",
"ashrdi3.c",
"ashrti3.c",
"bswapdi2.c",
@@ -72,7 +74,9 @@ var genericBuiltins = []string{
"floatunsisf.c",
"floatuntidf.c",
"floatuntisf.c",
//"int_util.c",
"fp_mode.c",
"int_util.c",
"lshrsi3.c",
"lshrdi3.c",
"lshrti3.c",
"moddi3.c",
@@ -86,6 +90,7 @@ var genericBuiltins = []string{
"muloti4.c",
"mulsc3.c",
"mulsf3.c",
"mulsi3.c",
"multi3.c",
"multf3.c",
"mulvdi3.c",
@@ -108,6 +113,7 @@ var genericBuiltins = []string{
"powidf2.c",
"powisf2.c",
"powitf2.c",
"powixf2.c",
"subdf3.c",
"subsf3.c",
"subvdi3.c",
@@ -159,7 +165,7 @@ var aeabiBuiltins = []string{
var CompilerRT = Library{
name: "compiler-rt",
cflags: func() []string { return []string{"-Werror", "-Wall", "-std=c11", "-nostdlibinc"} },
sourceDir: "lib/compiler-rt/lib/builtins",
sourceDir: "llvm-project.master/compiler-rt/lib/builtins",
sources: func(target string) []string {
builtins := append([]string{}, genericBuiltins...) // copy genericBuiltins
if strings.HasPrefix(target, "arm") || strings.HasPrefix(target, "thumb") {
+3
View File
@@ -74,6 +74,9 @@ func (l *Library) Load(target string) (path string, err error) {
if strings.HasPrefix(target, "riscv32-") {
args = append(args, "-march=rv32imac", "-mabi=ilp32", "-fforce-enable-int128")
}
if strings.HasPrefix(target, "avr-") {
args = append(args, "-mdouble=64", "-mmcu=atmega1284p")
}
// Compile all sources.
var objs []string
+1 -1
View File
@@ -1,5 +1,5 @@
// +build !byollvm
// +build !llvm9
// +build !llvm9,!llvm11
package cgo
+14
View File
@@ -0,0 +1,14 @@
// +build !byollvm
// +build llvm11
package cgo
/*
#cgo linux CFLAGS: -I/usr/lib/llvm-11/include
#cgo darwin CFLAGS: -I/usr/local/opt/llvm@11/include
#cgo freebsd CFLAGS: -I/usr/local/llvm11/include
#cgo linux LDFLAGS: -L/usr/lib/llvm-11/lib -lclang
#cgo darwin LDFLAGS: -L/usr/local/opt/llvm@11/lib -lclang -lffi
#cgo freebsd LDFLAGS: -L/usr/local/llvm11/lib -lclang
*/
import "C"
+1 -1
View File
@@ -10,5 +10,5 @@ require (
github.com/marcinbor85/gohex v0.0.0-20200531091804-343a4b548892
go.bug.st/serial v1.0.0
golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2
tinygo.org/x/go-llvm v0.0.0-20200503225853-345b2947b59d
tinygo.org/x/go-llvm v0.0.0-20200503224449-70c558526021
)
+2 -2
View File
@@ -46,5 +46,5 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbO
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
tinygo.org/x/go-llvm v0.0.0-20200503225853-345b2947b59d h1:hcX7vpB067GWM/EH4sGGOti0PMgIx+0bbZwUXctOIvE=
tinygo.org/x/go-llvm v0.0.0-20200503225853-345b2947b59d/go.mod h1:fv1F0BSNpxMfCL0zF3M4OPFbgYHnhtB6ST0HvUtu/LE=
tinygo.org/x/go-llvm v0.0.0-20200503224449-70c558526021 h1:d8T98WXGjrTgDmMXgxa6nb9EAYXGXwnzXygnJl6d+ac=
tinygo.org/x/go-llvm v0.0.0-20200503224449-70c558526021/go.mod h1:fv1F0BSNpxMfCL0zF3M4OPFbgYHnhtB6ST0HvUtu/LE=
+11 -1
View File
@@ -310,10 +310,12 @@ func FlashGDB(pkgName string, ocdOutput bool, options *compileopts.Options) erro
switch gdbInterface {
case "msd", "command", "":
if len(config.Target.Emulator) != 0 {
// Assume QEMU as an emulator.
if config.Target.Emulator[0] == "mgba" {
gdbInterface = "mgba"
} else if config.Target.Emulator[0] == "simavr" {
gdbInterface = "simavr"
} else {
// Assume QEMU as an emulator.
gdbInterface = "qemu"
}
} else if openocdInterface != "" && config.Target.OpenOCDTarget != "" {
@@ -379,6 +381,14 @@ func FlashGDB(pkgName string, ocdOutput bool, options *compileopts.Options) erro
daemon = exec.Command(config.Target.Emulator[0], args...)
daemon.Stdout = os.Stdout
daemon.Stderr = os.Stderr
case "simavr":
gdbCommands = append(gdbCommands, "target remote :1234")
// Run in an emulator.
args := append(config.Target.Emulator[1:], "-g", tmppath)
daemon = exec.Command(config.Target.Emulator[0], args...)
daemon.Stdout = os.Stdout
daemon.Stderr = os.Stderr
case "msd":
return errors.New("gdb is not supported for drag-and-drop programmable devices")
default:
+1 -1
View File
@@ -4,7 +4,7 @@ package task
import "unsafe"
const stackSize = 256
const stackSize = 1024
// calleeSavedRegs is the list of registers that must be saved and restored when
// switching between tasks. Also see scheduler_avr.S that relies on the
+2 -2
View File
@@ -2,8 +2,8 @@
"inherits": ["atmega328p"],
"build-tags": ["arduino"],
"ldflags": [
"-Wl,--defsym=_bootloader_size=512",
"-Wl,--defsym=_stack_size=512"
"--defsym=_bootloader_size=512",
"--defsym=_stack_size=512"
],
"flash-command": "avrdude -c arduino -p atmega328p -P {port} -U flash:w:{hex}:i"
}
+2 -3
View File
@@ -7,9 +7,8 @@
"-mmcu=atmega1284p"
],
"ldflags": [
"-mmcu=avr51",
"-Wl,--defsym=_bootloader_size=0",
"-Wl,--defsym=_stack_size=512"
"--defsym=_bootloader_size=0",
"--defsym=_stack_size=512"
],
"linkerscript": "src/device/avr/atmega1284p.ld",
"extra-files": [
+1 -1
View File
@@ -7,7 +7,7 @@
"-mmcu=atmega328p"
],
"ldflags": [
"-mmcu=avr5"
"-mavr5"
],
"linkerscript": "src/device/avr/atmega328p.ld",
"extra-files": [
+24
View File
@@ -2,6 +2,30 @@
; in Go.
; The reset vector is device-specific and is generated by tools/gen-device-avr.py.
#ifndef xl
#define xl r26
#endif
#ifndef xh
#define xh r27
#endif
#ifndef yl
#define yl r28
#endif
#ifndef yh
#define yh r29
#endif
#ifndef zl
#define zl r30
#endif
#ifndef zh
#define zh r31
#endif
; Startup code
.section .text.__vector_RESET
.global __vector_RESET
+13 -4
View File
@@ -2,15 +2,24 @@
"build-tags": ["avr", "baremetal", "linux", "arm"],
"goos": "linux",
"goarch": "arm",
"compiler": "avr-gcc",
"compiler": "clang",
"gc": "conservative",
"linker": "avr-gcc",
"linker": "llvm-build.master/bin/ld.lld",
"scheduler": "none",
"rtlib": "compiler-rt",
"libc": "picolibc",
"cflags": [
"--target=avr-atmel-none",
"-g",
"-Werror",
"-Qunused-arguments"
],
"ldflags": [
"-T", "targets/avr.ld",
"-Wl,--gc-sections"
"--gc-sections"
],
"extra-files": [
"src/runtime/scheduler_avr.S"
]
],
"gdb": "avr-gdb"
}
+9 -4
View File
@@ -5,17 +5,22 @@ MEMORY
RAM (xrw) : ORIGIN = 0x800000 + __ram_start, LENGTH = __ram_size
}
ENTRY(main)
SECTIONS
{
.text :
.text : ALIGN(2)
{
KEEP(*(.vectors))
KEEP(*(.text.__vector_RESET))
KEEP(*(.text.main)) /* main must follow the reset handler */
*(.text)
*(.text.*)
*(.rodata)
*(.rodata.*)
}
*(.progmem.data)
. = ALIGN(16); /* required because of lld (not sure why) */
} > FLASH_TEXT
.stack (NOLOAD) :
{
@@ -29,7 +34,7 @@ SECTIONS
{
_sdata = .; /* used by startup code */
*(.data)
*(.data*)
*(.data.*)
_edata = .; /* used by startup code */
} >RAM AT>FLASH_TEXT
@@ -37,7 +42,7 @@ SECTIONS
{
_sbss = .; /* used by startup code */
*(.bss)
*(.bss*)
*(.bss.*)
*(COMMON)
_ebss = .; /* used by startup code */
} >RAM
+1 -1
View File
@@ -407,7 +407,7 @@ __vector_default:
.endm
; The interrupt vector of this device. Must be placed at address 0 by the linker.
.section .vectors
.section .vectors, "a", %progbits
.global __vectors
`))
err = t.Execute(out, device.metadata)