Commit Graph

3951 Commits

Author SHA1 Message Date
Ayke van Laethem ee5bc65c97 compiler: move some code around to make the next bugfix easier
This just makes the next fix easier to read.
2024-09-05 10:53:33 +02:00
Ayke van Laethem 4f1b69827d reflect: support big-endian systems
The reflect package needs to know the endianness of the system in a few
places. Before this patch, it assumed little-endian systems. But with
GOARCH=mips we now have a big-endian system which also needs to be
supported. So this patch fixes the reflect package to work on big-endian
systems.

Also, I've updated the tests for MIPS: instead of running the
little-endian tests, I've changed it to run the big-endian tests
instead. The two are very similar except for endianness so this should
be fine. To be sure we won't accidentally break little-endian support,
I've kept a single MIPS little-endian test (the CGo test, which doesn't
yet work on big-endian systems anyway).
2024-09-05 10:06:30 +02:00
Ayke van Laethem 73f519b589 interp: support big-endian targets
The interp package was assuming that all targets were little-endian. But
that's not true: we now have a big-endian target (GOARCH=mips).

This fixes the interp package to use the appropriate byte order for a
given target.
2024-09-05 10:06:30 +02:00
Ayke van Laethem 25abfff632 mips: use MIPS32 (instead of MIPS32R2) as the instruction set
This should widen compatibility a bit, so that older CPUs can also
execute programs built by TinyGo. The performance may be lower, if
that's an issue we can look into implementing the proposal here:
https://github.com/golang/go/issues/60072

This still wouldn't make programs usable on MIPS II CPUs, I suppose we
can lower compatiblity down to that CPU if needed.

I tried setting the -cpu flag in the QEMU command line to be able to
test this, but it looks like there are no QEMU CPU models that are
mips32r1 and have a FPU. So it's difficult to test this.
2024-09-05 08:00:03 +02:00
Roger Standridge e39358d0ee stub runtime_{Before,After}Exec for linkage 2024-09-04 23:18:11 +02:00
Ayke van Laethem 105fe9b25d darwin: replace custom syscall package with Go native syscall package
This required a few compiler and runtime tricks to work, but I ran a
bunch of tests and it seems fine. (CI will of course do more exhaustive
testing).

The main benefit here is that we don't need to maintain the darwin
version of the syscall package, and reduce extra risks for bugs (because
we reuse the well-tested syscall package). For example, Go 1.23 needed a
bunch of new constants in the syscall package. That would have been
avoided if we had used the native syscall package on MacOS.
2024-09-04 20:04:25 +02:00
sago35 753f4b38b4 version: update to 0.34.0-dev 2024-09-04 18:04:49 +02:00
deadprogram d144b11611 fix: add missing Truncate() function stub to os/file for bare-metal systems
Signed-off-by: deadprogram <ron@hybridgroup.com>
2024-08-26 15:24:51 +02:00
Ayke van Laethem 1ef1aa7862 mips: fix big-endian (GOARCH=mips) support
I made an awkward mistake, mixing up GOOS and GOARCH. So here is a fix,
with an associated test.
2024-08-22 16:36:40 +02:00
Ayke van Laethem 83c98a23ce mips: fix crash with GOMIPS=softfloat
`defer` and `GOMIPS=softfloat` together would result in a crash. This
patch fixes this issue.
2024-08-22 07:59:37 +02:00
Randy Reddig 336b9b33ab tinygo: detect GOOS=wasip1 for relative WASI paths via config instead of target name (#4423) 2024-08-20 17:03:02 -07:00
Ayke van Laethem ef4f46f1d1 all: version 0.33.0 v0.33.0 2024-08-20 09:21:48 +02:00
Ayke van Laethem 16cd500000 ci: update apt repo for sizediff toolchain
This was still at jammy (22.04), while the CI container was noble
(24.04). Somehow this didn't break, but it certainly isn't ideal to
install packages across Ubuntu versions!
2024-08-20 08:33:49 +02:00
deadprogram 16950780d3 targets: remove import-memory flag from wasm-unknown target to fix #4319
Signed-off-by: deadprogram <ron@hybridgroup.com>
2024-08-17 18:16:39 +02:00
Ayke van Laethem 7e284a37fc ci: use Go 1.23 2024-08-17 11:49:14 +02:00
Ayke van Laethem b6c53a6f0e darwin: work around a linker error for the mime/quotedprintable tests
This is needed for Go 1.23 support.

These functions should ideally get implemented. Until that's done, just
panic here. Apparently panicking in internal/abi.FuncPCABI0 is enough to
fix all linker errors for mime/quotedprintable.
2024-08-17 11:49:14 +02:00
Ayke van Laethem 8b626e6ea7 compiler: add support for Go 1.23 range-over-func 2024-08-17 11:49:14 +02:00
Ayke van Laethem 1d1f4fc401 syscall: add all MacOS errno values
ELOOP is used starting with Go 1.23. But I figured I could just add the
whole set.
2024-08-17 11:49:14 +02:00
Ayke van Laethem 250426c1e5 sync: add Map.Clear()
This was added in Go 1.23 and is needed for the net/mail package.
2024-08-17 11:49:14 +02:00
Ayke van Laethem e300e90a63 reflect: implement Type.Overflow* functions
They're already implemented for the Value equivalents. But since Go
1.23, such methods also exist for reflect.Type.
2024-08-17 11:49:14 +02:00
Ayke van Laethem e865db232b runtime: implement timers for Go 1.23
There were a number of changes in time.Timer/time.Ticker that need a
separate implementation for Go 1.22 and Go 1.23.
2024-08-17 11:49:14 +02:00
Ayke van Laethem db2a06a9bb internal/abi: implement initial version of this package
This package can never be a full version as seen in upstream Go, because
TinyGo is very different. But it is necessary to define so that no code
can accidentally use this package (now or in the future).

It currently defines:

  - NoEscape which is needed by strings.Builder since Go 1.23.
  - FuncPCABI* which is needed by internal/syscall/unix on MacOS.
2024-08-17 11:49:14 +02:00
Ayke van Laethem 560fd0a558 unique: implement custom version of unique package
This version probably isn't as fast as the upstream version, but it is
good enough for now. It also doesn't free unreferenced handles like the
upstream version.
2024-08-17 11:49:14 +02:00
Ayke van Laethem b8048112df internal/bytealg: add CompareString
This function was added to Go many years ago, but is starting to be used
in packages in Go 1.23.
2024-08-17 11:49:14 +02:00
Ayke van Laethem b51cda9721 sync/atomic: add And* and Or* compiler intrinsics needed for Go 1.23 2024-08-17 11:49:14 +02:00
Damian Gryski 4d60d679d3 compiler: fixup Sprintf uses 2024-08-15 13:57:02 +02:00
Damian Gryski 9932f2e126 builder: os.SEEK_CUR -> io.SeekCurrent 2024-08-15 13:57:02 +02:00
Ayke van Laethem bf8d6460da os/user: use stdlib version of this package
I tried implementing enough CGo support to get the native os/user
package to work. But I hit a few bugs, probably in CGo itself. Then I
realized I could just as well set the osusergo build tag to disable CGo
for this specific case.

This actually gets the os/user package to work correctly on Linux (I
confirmed it returns my name/uid/homedir etc). On other systems, it
probably just returns an error if it can't determine these kinds of
things. But that's no worse than the current behavior which just doesn't
do anything at all.
2024-08-15 12:15:45 +02:00
Dan Kegel d3e67cf18c make spellfix: fix top level files, too.
Do manual fix in GNUmakefile, since spellchecking that is just too meta.
2024-08-15 10:34:35 +02:00
Dan Kegel 5d82a7eee6 misspell.csv: add another misspelling. Fix by hand, since spellfix is too timid to fix in non-whitespace context? 2024-08-15 10:34:35 +02:00
Dan Kegel c82ff057f5 Fix 'numer of', since 'NUMER' by itself is valid abbrev for numerator.
Oddly, misspell was not able to detect this one, even though in
theory it allows detecting multiword typos, so the fix was done by
hand.
2024-08-15 10:34:35 +02:00
Dan Kegel 5368dd22c5 misspell.csv: add new misspellings; also check in result of 'make spellfix'. 2024-08-15 10:34:35 +02:00
Ayke van Laethem 194396d715 unix: print a message when a fatal signal happens
Print a message for SIGBUS, SIGSEGV, and SIGILL when they happen.
These signals are always fatal, but it's very useful to know which of
them happened.

Also, it prints the location in the binary which can then be parsed by
`tinygo run` (see https://github.com/tinygo-org/tinygo/pull/4383).

While this does add some extra binary size, it's for Linux and MacOS
(systems that typically have plenty of RAM/storage) and could be very
useful when debugging some low-level crash such as a runtime bug.
2024-08-15 02:00:28 +02:00
Unrud 815784bd96 machine/usb/descriptor: Reset joystick physical 2024-08-14 18:43:27 +02:00
Unrud 7fc64a27b4 machine/usb/descriptor: Drop second joystick hat 2024-08-14 18:43:27 +02:00
Unrud c38bf27091 machine/usb/hid/joystick: Allow more hat switches 2024-08-14 18:43:27 +02:00
Unrud 9a2fab8874 machine/usb/descriptor: Add more HID... functions 2024-08-14 18:43:27 +02:00
Unrud f1516ad3ee machine/usb/descriptor: Fix encoding of values
The limit for positive values is incorrect and leads to an overflow (e.g. 0xFF and 0xFFFF become -1)
2024-08-14 18:43:27 +02:00
Ayke van Laethem 4dc07d6cc3 arm: support softfloat in GOARM environment variable
This adds softfloat support to GOARM, as proposed here:
https://github.com/golang/go/issues/61588

This is similar to https://github.com/tinygo-org/tinygo/pull/4189 but
with a few differences:

  * It is based on the work to support MIPS softfloat.
  * It fixes the issue that the default changed to softfloat everywhere.
    This PR defaults to softfloat on ARMv5 and hardfloat on ARMv6 and
    ARMv7.
  * It also compiles the C libraries (compiler-rt, musl) using the same
    soft/hard floating point support. This is important because
    otherwise a GOARM=7,softfloat binary could still contain hardware
    floating point instructions.
2024-08-14 16:25:42 +02:00
Ayke van Laethem a35b983a5d linux: use -musleabi* instead of -gnueabi* (or nothing)
This more accurately describes the libc we are using.
This also adds the environment to _all_ Linux systems, not just ARM. And
selects the correct ABI (soft/hardfloat) that's in use.

I don't know whether it has any practical implications, but LLVM appears
to be using this information so it seems wise to use the correct values.
2024-08-14 16:25:42 +02:00
Dan Kegel a47ff02c82 make spell: add a few missing misspellings, fix format of .csv file, also fix *.md 2024-08-14 12:00:55 +02:00
Dan Kegel e27b2c4ad6 circleci: our version of misspell is no longer supported with go < 1.21, so disable lint in go 1.19 ci job
I jumped through quite a few hoops to get test-llvm15-go119 to work, but this last hoop seems not worth jumping through:

  cd internal/tools && go generate -tags tools ./
  /go/pkg/mod/github.com/golangci/misspell@v0.6.0/mime.go:10:2: package slices is not in GOROOT (/usr/local/go/src/slices)
  tools.go:12: running "go": exit status 1
  make: *** [GNUmakefile:952: tools] Error 1

I mean, we could patch misspell to not use slices, or to use the prerelease slices, but...
2024-08-13 10:46:29 +02:00
dkegel-fastly 8135be4e90 GNUmakefile: add spellfix target, use it. (#4387)
TODO: Remove the go.mod/go.sum in internal/tools once doing so doesn't break CI (e.g. once we drop support for go 1.19)

* builder/cc1as.h: fix typo found by 'make spell'
* GNUmakefile: remove exception for inbetween, fix instance now found by 'make spell'
* GNUmakefile: remove exception for programmmer, fix instance now found by 'make spell'
* go.mod: use updated misspell. GNUmakefile: add spellfix target, use it.
* ignore directories properly when invoking spellchecker.
* make spell: give internal/tools its own go.mod, as misspell requires newer go
* make lint: depend on tools and run the installed revive
(which was perhaps implied by the change that added revive to internal/tools,
but not required in GNUmakefile until we gave internal/tools its own temporary go.mod)
* .github: now that 'make spell' works well, run it from CI
* GNUmakefile: make spell now aborts if it finds misspelt words, so what it finds doesn't get lost in CI logs
* GNUmakefile: tools: avoid -C option on go generate to make test-llvm15-go119 circleci job happy, see
https://cs.opensource.google/go/go/+/2af48cbb7d85e5fdc635e75b99f949010c607786
* internal/tools/go.mod: fix format of go version to leave out patchlevel, else go complains.
2024-08-12 14:24:38 -07:00
dkegel-fastly 835e73237e GNUmakefile: add "help" target (#4390)
Example output:

$ make help
clean                           Remove build directory
fmt                             Reformat source
fmt-check                       Warn if any source needs reformatting
gen-device                      Generate microcontroller-specific sources
llvm-source                     Get LLVM sources
llvm-build                      Build LLVM
lint                            Lint source tree
spell                           Spellcheck source tree

Might even work on windows, since git for windows comes with awk.
2024-08-12 10:19:16 -07:00
Ayke van Laethem eab1a5d7ec reflect, runtime: remove *UnsafePointer wrappers for functions
This was needed in the past because LLVM used typed pointers and there
was a mismatch between pointer types. But we've dropped support for
typed pointers a while ago so now we can remove these wrappers.

This is just a cleanup, it shouldn't have any practical effect.
2024-08-12 15:26:18 +02:00
Ayke van Laethem f188eaf5f9 mips: add GOMIPS=softfloat support
Previously, the compiler would default to hardfloat. This is not
supported by some MIPS CPUs.

This took me much longer than it should have because of a quirk in the
LLVM Mips backend: if the target-features string is not set (like during
LTO), the Mips backend picks the first function in the module and uses
that. Unfortunately, in the case of TinyGo this first function is
`llvm.dbg.value`, which is an LLVM intrinsic and doesn't have the
target-features string. I fixed it by adding a `-mllvm -mattr=` flag to
the linker.
2024-08-12 13:23:32 +02:00
Ayke van Laethem 6efc6d2bb6 compileopts: refactor defaultTarget function
Move triple calculation into defaultTarget. It was separate for historic
reasons that no longer apply. Merging the code makes future changes
easier (in particular, softfloat support).

The new code is actually shorter than the old code even though it has
more comments.
2024-08-12 13:23:32 +02:00
Roger Standridge d6e73b4c68 add os.Truncate(name, size) (see #4209)
See https://pkg.go.dev/os#Truncate
2024-08-11 02:42:30 -07:00
Ayke van Laethem 2e76cd3687 builder: interpret linker error messages
This shows nicely formatted error messages for missing symbol names and
for out-of-flash, out-of-RAM conditions (on microcontrollers with
limited flash/RAM).

Unfortunately the missing symbol name errors aren't available on Windows
and WebAssembly because the linker doesn't report source locations yet.
This is something that I could perhaps improve in LLD.
2024-08-11 01:48:11 -07:00
Ayke van Laethem 2eb39785fe cgo: add support for printf
The C printf function is sometimes needed for C files included using
CGo. This commit makes sure they're available on all systems where CGo
is fully supported (that is, everywhere except on AVR).

For baremetal systems using picolibc, I've picked the integer-only
version of printf to save on flash size. We might want to consider
providing a way to pick the floating point version instead, if needed.
2024-08-10 23:46:58 -07:00