diff options
author | Ayke van Laethem <[email protected]> | 2023-09-23 14:57:25 +0200 |
---|---|---|
committer | Ron Evans <[email protected]> | 2023-10-06 09:05:07 +0200 |
commit | 499fce9cee745159c78adf1df5527f3c003972e5 (patch) | |
tree | 5723f14587b38929d9ea6b15cbf2549b06cfe82d /builder/picolibc.go | |
parent | 88b29589d67526320ea400c0abf2110db7a626eb (diff) | |
download | tinygo-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.go | 172 |
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", |