aboutsummaryrefslogtreecommitdiffhomepage
path: root/builder/picolibc.go
diff options
context:
space:
mode:
authorAyke van Laethem <[email protected]>2023-09-23 14:57:25 +0200
committerRon Evans <[email protected]>2023-10-06 09:05:07 +0200
commit499fce9cee745159c78adf1df5527f3c003972e5 (patch)
tree5723f14587b38929d9ea6b15cbf2549b06cfe82d /builder/picolibc.go
parent88b29589d67526320ea400c0abf2110db7a626eb (diff)
downloadtinygo-499fce9cee745159c78adf1df5527f3c003972e5.tar.gz
tinygo-499fce9cee745159c78adf1df5527f3c003972e5.zip
avr: don't compile large parts of picolibc (math, stdio)
These parts aren't critical and lead to crashes on small chips without long jumps (like the attiny85) with LLVM 17. (Older LLVM versions would emit long jumps regardless, even if the chip didn't support those). For more information, see: https://github.com/llvm/llvm-project/issues/67042
Diffstat (limited to 'builder/picolibc.go')
-rw-r--r--builder/picolibc.go172
1 files changed, 93 insertions, 79 deletions
diff --git a/builder/picolibc.go b/builder/picolibc.go
index 1b7c748be..91ad27be6 100644
--- a/builder/picolibc.go
+++ b/builder/picolibc.go
@@ -3,6 +3,7 @@ package builder
import (
"os"
"path/filepath"
+ "strings"
"github.com/tinygo-org/tinygo/goenv"
)
@@ -41,91 +42,23 @@ var Picolibc = Library{
},
sourceDir: func() string { return filepath.Join(goenv.Get("TINYGOROOT"), "lib/picolibc/newlib") },
librarySources: func(target string) ([]string, error) {
- return picolibcSources, nil
+ sources := append([]string(nil), picolibcSources...)
+ if !strings.HasPrefix(target, "avr") {
+ // Small chips without long jumps can't compile many files (printf,
+ // pow, etc). Therefore exclude those source files for those chips.
+ // Unfortunately it's difficult to exclude only some chips, so this
+ // excludes those files on all AVR chips for now.
+ // More information:
+ // https://github.com/llvm/llvm-project/issues/67042
+ sources = append(sources, picolibcSourcesLarge...)
+ }
+ return sources, nil
},
}
var picolibcSources = []string{
"../../picolibc-stdio.c",
- // srcs_tinystdio
- "libc/tinystdio/asprintf.c",
- "libc/tinystdio/bufio.c",
- "libc/tinystdio/clearerr.c",
- "libc/tinystdio/ecvt_r.c",
- "libc/tinystdio/ecvt.c",
- "libc/tinystdio/ecvtf_r.c",
- "libc/tinystdio/ecvtf.c",
- "libc/tinystdio/fcvt.c",
- "libc/tinystdio/fcvt_r.c",
- "libc/tinystdio/fcvtf.c",
- "libc/tinystdio/fcvtf_r.c",
- "libc/tinystdio/gcvt.c",
- "libc/tinystdio/gcvtf.c",
- "libc/tinystdio/fclose.c",
- "libc/tinystdio/fdevopen.c",
- "libc/tinystdio/feof.c",
- "libc/tinystdio/ferror.c",
- "libc/tinystdio/fflush.c",
- "libc/tinystdio/fgetc.c",
- "libc/tinystdio/fgets.c",
- "libc/tinystdio/fileno.c",
- "libc/tinystdio/filestrget.c",
- "libc/tinystdio/filestrput.c",
- "libc/tinystdio/filestrputalloc.c",
- "libc/tinystdio/fmemopen.c",
- "libc/tinystdio/fprintf.c",
- "libc/tinystdio/fputc.c",
- "libc/tinystdio/fputs.c",
- "libc/tinystdio/fread.c",
- //"libc/tinystdio/freopen.c", // crashes with AVR, see: https://github.com/picolibc/picolibc/pull/369
- "libc/tinystdio/fscanf.c",
- "libc/tinystdio/fseek.c",
- "libc/tinystdio/fseeko.c",
- "libc/tinystdio/ftell.c",
- "libc/tinystdio/ftello.c",
- "libc/tinystdio/fwrite.c",
- "libc/tinystdio/getchar.c",
- "libc/tinystdio/gets.c",
- "libc/tinystdio/matchcaseprefix.c",
- "libc/tinystdio/mktemp.c",
- "libc/tinystdio/perror.c",
- "libc/tinystdio/printf.c",
- "libc/tinystdio/putchar.c",
- "libc/tinystdio/puts.c",
- "libc/tinystdio/rewind.c",
- "libc/tinystdio/scanf.c",
- "libc/tinystdio/setbuf.c",
- "libc/tinystdio/setbuffer.c",
- "libc/tinystdio/setlinebuf.c",
- "libc/tinystdio/setvbuf.c",
- "libc/tinystdio/snprintf.c",
- "libc/tinystdio/sprintf.c",
- "libc/tinystdio/snprintfd.c",
- "libc/tinystdio/snprintff.c",
- "libc/tinystdio/sprintff.c",
- "libc/tinystdio/sprintfd.c",
- "libc/tinystdio/sscanf.c",
- "libc/tinystdio/strfromf.c",
- "libc/tinystdio/strfromd.c",
- "libc/tinystdio/strtof.c",
- "libc/tinystdio/strtof_l.c",
- "libc/tinystdio/strtod.c",
- "libc/tinystdio/strtod_l.c",
- "libc/tinystdio/ungetc.c",
- "libc/tinystdio/vasprintf.c",
- "libc/tinystdio/vfiprintf.c",
- "libc/tinystdio/vfprintf.c",
- "libc/tinystdio/vfprintff.c",
- "libc/tinystdio/vfscanf.c",
- "libc/tinystdio/vfiscanf.c",
- "libc/tinystdio/vfscanff.c",
- "libc/tinystdio/vprintf.c",
- "libc/tinystdio/vscanf.c",
- "libc/tinystdio/vsscanf.c",
- "libc/tinystdio/vsnprintf.c",
- "libc/tinystdio/vsprintf.c",
-
"libc/string/bcmp.c",
"libc/string/bcopy.c",
"libc/string/bzero.c",
@@ -229,6 +162,87 @@ var picolibcSources = []string{
"libc/string/wmempcpy.c",
"libc/string/wmemset.c",
"libc/string/xpg_strerror_r.c",
+}
+
+// Parts of picolibc that are too large for small AVRs.
+var picolibcSourcesLarge = []string{
+ // srcs_tinystdio
+ "libc/tinystdio/asprintf.c",
+ "libc/tinystdio/bufio.c",
+ "libc/tinystdio/clearerr.c",
+ "libc/tinystdio/ecvt_r.c",
+ "libc/tinystdio/ecvt.c",
+ "libc/tinystdio/ecvtf_r.c",
+ "libc/tinystdio/ecvtf.c",
+ "libc/tinystdio/fcvt.c",
+ "libc/tinystdio/fcvt_r.c",
+ "libc/tinystdio/fcvtf.c",
+ "libc/tinystdio/fcvtf_r.c",
+ "libc/tinystdio/gcvt.c",
+ "libc/tinystdio/gcvtf.c",
+ "libc/tinystdio/fclose.c",
+ "libc/tinystdio/fdevopen.c",
+ "libc/tinystdio/feof.c",
+ "libc/tinystdio/ferror.c",
+ "libc/tinystdio/fflush.c",
+ "libc/tinystdio/fgetc.c",
+ "libc/tinystdio/fgets.c",
+ "libc/tinystdio/fileno.c",
+ "libc/tinystdio/filestrget.c",
+ "libc/tinystdio/filestrput.c",
+ "libc/tinystdio/filestrputalloc.c",
+ "libc/tinystdio/fmemopen.c",
+ "libc/tinystdio/fprintf.c",
+ "libc/tinystdio/fputc.c",
+ "libc/tinystdio/fputs.c",
+ "libc/tinystdio/fread.c",
+ //"libc/tinystdio/freopen.c", // crashes with AVR, see: https://github.com/picolibc/picolibc/pull/369
+ "libc/tinystdio/fscanf.c",
+ "libc/tinystdio/fseek.c",
+ "libc/tinystdio/fseeko.c",
+ "libc/tinystdio/ftell.c",
+ "libc/tinystdio/ftello.c",
+ "libc/tinystdio/fwrite.c",
+ "libc/tinystdio/getchar.c",
+ "libc/tinystdio/gets.c",
+ "libc/tinystdio/matchcaseprefix.c",
+ "libc/tinystdio/mktemp.c",
+ "libc/tinystdio/perror.c",
+ "libc/tinystdio/printf.c",
+ "libc/tinystdio/putchar.c",
+ "libc/tinystdio/puts.c",
+ "libc/tinystdio/rewind.c",
+ "libc/tinystdio/scanf.c",
+ "libc/tinystdio/setbuf.c",
+ "libc/tinystdio/setbuffer.c",
+ "libc/tinystdio/setlinebuf.c",
+ "libc/tinystdio/setvbuf.c",
+ "libc/tinystdio/snprintf.c",
+ "libc/tinystdio/sprintf.c",
+ "libc/tinystdio/snprintfd.c",
+ "libc/tinystdio/snprintff.c",
+ "libc/tinystdio/sprintff.c",
+ "libc/tinystdio/sprintfd.c",
+ "libc/tinystdio/sscanf.c",
+ "libc/tinystdio/strfromf.c",
+ "libc/tinystdio/strfromd.c",
+ "libc/tinystdio/strtof.c",
+ "libc/tinystdio/strtof_l.c",
+ "libc/tinystdio/strtod.c",
+ "libc/tinystdio/strtod_l.c",
+ "libc/tinystdio/ungetc.c",
+ "libc/tinystdio/vasprintf.c",
+ "libc/tinystdio/vfiprintf.c",
+ "libc/tinystdio/vfprintf.c",
+ "libc/tinystdio/vfprintff.c",
+ "libc/tinystdio/vfscanf.c",
+ "libc/tinystdio/vfiscanf.c",
+ "libc/tinystdio/vfscanff.c",
+ "libc/tinystdio/vprintf.c",
+ "libc/tinystdio/vscanf.c",
+ "libc/tinystdio/vsscanf.c",
+ "libc/tinystdio/vsnprintf.c",
+ "libc/tinystdio/vsprintf.c",
"libm/common/sf_finite.c",
"libm/common/sf_copysign.c",