aboutsummaryrefslogtreecommitdiffhomepage
path: root/loader
AgeCommit message (Collapse)Author
2024-11-20runtime: implement race-free signals using futexesAyke van Laethem
This requires an API introduced in MacOS 11. I think that's fine, since the version before that (MacOS 10.15) is EOL since 2022. Though if needed, we could certainly work around it by using an older and slightly less nice API.
2024-11-20cgo: support errno value as second return parameterAyke van Laethem
Making this work on all targets was interesting but there's now a test in place to make sure this works on all targets that have the CGo test enabled (which is almost all targets).
2024-11-15compiler, runtime: move constants into shared packageAyke van Laethem
Use a single package for certain constants that must be the same between the compiler and the runtime. While just using the same values in both places works, this is much more obvious and harder to mess up. It also avoids the need for comments pointing to the other location the constant is defined. And having it in code makes it possible for IDEs to analyze the source. In the future, more such constants and maybe algorithms can be added.
2024-10-24runtime: add gc layout info for some basic typesDamian Gryski
2024-10-18loader: make sure we always return an error even without type errorsAyke van Laethem
This issue was originally reported here: https://github.com/NixOS/nixpkgs/pull/341170#issuecomment-2359237471 The fix here isn't a great fix, it turns the error message from this: # runtime/interrupt into this: # runtime/interrupt package requires newer Go version go1.23 ...so not great, because it doesn't show the real error message (which is that TinyGo wasn't compiled with the right Go version). But at least it gives a hint in the right direction. It's difficult to test for this specific case, so I've left out testing in this case (boo!)
2024-10-18loader: don't panic when main package is not named 'main'Ayke van Laethem
This can in fact happen in practice, so return an actual error message instead.
2024-10-08crypto/x509/internal/macos: add package stub to build crypto/x509 on macOSElias Naur
2024-09-04darwin: replace custom syscall package with Go native syscall packageAyke van Laethem
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-08-17internal/abi: implement initial version of this packageAyke van Laethem
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-17unique: implement custom version of unique packageAyke van Laethem
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-15os/user: use stdlib version of this packageAyke van Laethem
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-15misspell.csv: add new misspellings; also check in result of 'make spellfix'.Dan Kegel
2024-07-17all: simplify wasm-tools-go dependencyRandy Reddig
- add internal/wasm-tools/go.mod file to depend on wasm-tools-go - copy package cm into src/internal/cm - remove wasm-tools-go "vendor" submodule internal/tools: fix typo go.{mod,sum}, internal/tools: add wit-bindgen-go to tools GNUmakefile: use go run for wit-bindgen-go GNUmakefile: add tools target to go:generate tools binaries in internal/tools GNUmakefile: add .PHONY for lint and spell GNUmakefile, internal/cm: vendor package cm into internal/cm go.{mod,sum}: update wasm-tools-go to v0.1.4 internal/wasi: use internal/cm package remove submodule src/vendor/github.com/ydnar/wasm-tools-go GNUmakefile: add comment documenting what wasi-cm target does go.{mod,sum}: remove toolchain; go mod tidy go.mod: revert to Go 1.19 go.mod: go 1.19 go.{mod,sum}, internal/{tools,wasm-tools}: revert root go.mod file to go1.19 Create a wasm-tools specific module that can require go1.22 for wasm-tools-go.
2024-07-13loader: handle `go list` errors inside TinyGoAyke van Laethem
Instead of exiting with an error, handle these errors internally. This will enable a few improvements in the future.
2024-07-02wasi preview 2 support (#4027)Damian Gryski
* all: wasip2 support Co-authored-by: Randy Reddig <[email protected]>
2024-06-24machine: use new internal/binary packageAyke van Laethem
The encoding/binary package in Go 1.23 imports the slices package, which results in circular import when imported from the machine package. Therefore, encoding/binary cannot be used in the machine package. This commit fixes that by introducing a new internal/binary package that is just plain Go code without dependencies. It can be safely used anywhere (including the runtime if needed).
2024-04-19Run Nick G's spellchecker github.com/client9/misspell, carefuly fix what it ↵dkegel-fastly
found (#4235)
2024-02-19compileopts: always enable CGoAyke van Laethem
CGo is needed for the rp2040 and for macOS (GOOS=darwin), without it these targets just won't work. And there really isn't a benefit from disabling CGo: we don't need any external linkers for example. This avoids a somewhat common issue of people having CGO_ENABLED=0 somewhere in their environment and not understanding why things don't work. See for example: https://github.com/tinygo-org/tinygo/issues/3450
2024-01-19loader: make sure Go version is plumbed throughAyke van Laethem
This fixes the new loop variable behavior in Go 1.22. Specifically: * The compiler (actually, the x/tools/go/ssa package) now correctly picks up the Go version. * If a module doesn't specify the Go version, the current Go version (from the `go` tool and standard library) is used. This fixes `go run`. * The tests in testdata/ that use a separate directory are now actually run in that directory. This makes it possible to use a go.mod file there. * There is a test to make sure old Go modules still work with the old Go behavior, even on a newer Go version.
2024-01-19loader: enforce Go language version in the type checkerAyke van Laethem
This means for example that ranging over integers will only work when setting the Go version to go1.22 or later in the go.mod file.
2024-01-18cgo: add file AST for fake C file locationsAyke van Laethem
This is needed for the type checker, otherwise it doesn't know which Go version it should use for type checking.
2023-12-30os/user: add bare-bones implementation of the os/user packageElias Naur
Signed-off-by: Elias Naur <[email protected]>
2023-12-06Add network device driver model, netdevScott Feldman
This PR adds a network device driver model called netdev. There will be a companion PR for TinyGo drivers to update the netdev drivers and network examples. This PR covers the core "net" package. An RFC for the work is here: #tinygo-org/drivers#487. Some things have changed from the RFC, but nothing major. The "net" package is a partial port of Go's "net" package, version 1.19.3. The src/net/README file has details on what is modified from Go's "net" package. Most "net" features are working as they would in normal Go. TCP/UDP/TLS protocol support is there. As well as HTTP client and server support. Standard Go network packages such as golang.org/x/net/websockets and Paho MQTT client work as-is. Other packages are likely to work as-is. Testing results are here (https://docs.google.com/spreadsheets/d/e/2PACX-1vT0cCjBvwXf9HJf6aJV2Sw198F2ief02gmbMV0sQocKT4y4RpfKv3dh6Jyew8lQW64FouZ8GwA2yjxI/pubhtml?gid=1013173032&single=true).
2023-10-15refactor: rm io/ioutil funcsginglis13
io/ioutil has been deprecated since Go 1.16 https://pkg.go.dev/io/ioutil Signed-off-by: ginglis13 <[email protected]>
2023-10-14builder: refactor clang include headersAyke van Laethem
Set -resource-dir in a central place instead of passing the header path around everywhere and adding it using the `-I` flag. I believe this is closer to how Clang is intended to be used. This change was inspired by my attempt to add a Nix flake file to TinyGo.
2023-08-13loader: merge go.env file which is now required starting in Go 1.21 to ↵deadprogram
correctly get required packages Signed-off-by: deadprogram <[email protected]>
2023-03-10Added missing TCPAddr and UDPAddr implementations to the net packageJustin A. Wilson
2022-09-16cgo: implement support for static functionsAyke van Laethem
2022-09-01loader,crypto: fix link error for crypto/internal/boring/sig.StandardCryptoDamian Gryski
2022-08-30all: drop support for Go 1.16 and Go 1.17Ayke van Laethem
2022-08-07all: move from os.IsFoo to errors.Is(err, ErrFoo)Damian Gryski
2022-08-07all: remove calls to deprecated ioutil packageDamian Gryski
Fixes produced via semgrep and https://github.com/dgryski/semgrep-go/blob/master/ioutil.yml
2022-06-11compiler: add support for type parameters (aka generics)Ayke van Laethem
...that was surprisingly easy.
2022-06-11fix: fixes tinygo test ./... syntax.José Carlos Chávez
2022-05-30all: add support for the embed packageAyke van Laethem
2022-04-09Add a shim for internal/fuzzElliott Sales de Andrade
This simply shadows the real code temporarily to see what else is broken. It only defines a single type to fix testing/internal/testdeps.
2022-02-28Revert "all: move stm32 files to separate repository"sago35
This reverts commit 644356c220ed88f110d01300f671a170cd36eb04.
2022-02-18all: move stm32 files to separate repositoryAyke van Laethem
2022-02-12loader: only add Clang header path for CGoAyke van Laethem
It should only be added at the point that it is needed, for example when using libclang or using the built-in Clang. It isn't needed when running an external tool.
2022-01-23main (test): integrate test corpus runnerNia Waldvogel
This allows us to test a large corpus of external packages against the compiler.
2022-01-19loader: respect $GOROOT when running `go list`Ayke van Laethem
This makes it possible to select the Go version using GOROOT, and works even if the `go` binary is not in $PATH.
2022-01-15pass more --dirs to wasmtime so it can read the entire module treeDamian Gryski
This allows compress/flate to pass on -target=wasi out of the box Fixes #2367
2022-01-09all: switch to LLVM 13Ayke van Laethem
This adds support for building with `-tags=llvm13` and switches to LLVM 13 for tinygo binaries that are statically linked against LLVM. Some notes on this commit: * Added `-mfloat-abi=soft` to all Cortex-M targets because otherwise nrfx would complain that floating point was enabled on Cortex-M0. That's not the case, but with `-mfloat-abi=soft` the `__SOFTFP__` macro is defined which silences this warning. See: https://reviews.llvm.org/D100372 * Changed from `--sysroot=<root>` to `-nostdlib -isystem <root>` for musl because with Clang 13, even with `--sysroot` some system libraries are used which we don't want. * Changed all `-Xclang -internal-isystem -Xclang` to simply `-isystem`, for consistency with the above change. It appears to have the same effect. * Moved WebAssembly function declarations to the top of the file in task_asyncify_wasm.S because (apparently) the assembler has become more strict.
2021-12-28loader: elminate goroot cache inconsistencyNia Waldvogel
This change breaks the merged goroot creation process into 2 steps: 1. List all overrides 2. Construct a goroot with the specified overrides Now step 2 is cached using a hash of the results from step 1. This eliminates cache inconsistency, but means that step 1 needs to be run on every build. This is relatively acceptable, as step 1 only takes about 3 ms (assuming the directory tree is in the OS filesystem cache).
2021-11-16net/ip, syscall/errno: Reduce code duplication by switching to internal/itoa.Dan Kegel
internal/itoa wasn't around back in go 1.12 days when tinygo's syscall/errno.go was written. It was only added as of go 1.17 ( https://github.com/golang/go/commit/061a6903a232cb868780b ) so we have to have an internal copy for now. The internal copy should be deleted when tinygo drops support for go 1.16. FWIW, the new version seems nicer. It uses no allocations when converting 0, and although the optimizer might make this moot, uses a multiplication x 10 instead of a mod operation.
2021-11-03builder: improve accuracy of the -size=full flagAyke van Laethem
This commit improves accuracy of the -size=full flag in a big way. Instead of relying on symbol names to figure out by which package symbols belong, it will instead mostly use DWARF debug information (specifically, debug line tables and debug information for global variables) relying on symbols only for some specific things. This is much more accurate: it also accounts for inlined functions. For example, here is how it looked previously when compiling a personal project: code rodata data bss | flash ram | package 1902 333 0 0 | 2235 0 | (bootstrap) 46 256 0 0 | 302 0 | github 0 454 0 0 | 454 0 | handleHardFault$string 154 24 4 4 | 182 8 | internal/task 2498 83 5 2054 | 2586 2059 | machine 0 16 24 130 | 40 154 | machine$alloc 1664 32 12 8 | 1708 20 | main 0 0 0 200 | 0 200 | main$alloc 2476 79 0 36 | 2555 36 | runtime 576 0 0 0 | 576 0 | tinygo 9316 1277 45 2432 | 10638 2477 | (sum) 11208 - 48 6548 | 11256 6596 | (all) And here is how it looks now: code rodata data bss | flash ram | package ------------------------------- | --------------- | ------- 1509 0 12 23 | 1521 35 | (unknown) 660 0 0 0 | 660 0 | C compiler-rt 58 0 0 0 | 58 0 | C picolibc 0 0 0 4096 | 0 4096 | C stack 174 0 0 0 | 174 0 | device/arm 6 0 0 0 | 6 0 | device/sam 598 256 0 0 | 854 0 | github.com/aykevl/ledsgo 320 24 0 4 | 344 4 | internal/task 1414 99 24 2181 | 1537 2205 | machine 726 352 12 208 | 1090 220 | main 3002 542 0 36 | 3544 36 | runtime 848 0 0 0 | 848 0 | runtime/volatile 70 0 0 0 | 70 0 | time 550 0 0 0 | 550 0 | tinygo.org/x/drivers/ws2812 ------------------------------- | --------------- | ------- 9935 1273 48 6548 | 11256 6596 | total There are some notable differences: * Odd packages like main$alloc and handleHardFault$string are gone, instead their code is put in the correct package. * C libraries and the stack are now included in the list, they were previously part of the (bootstrap) pseudo-package. * Unknown bytes are slightly reduced. It should be possible to reduce it significantly more in the future: most of it is now caused by interface invoke wrappers. * Inlined functions are now correctly attributed. For example, the runtime/volatile package is normally entirely inlined. * There is no difference between (sum) and (all) anymore. A better code size algorithm now counts the code/data sizes correctly. * And last (but not least) there is a stylistic change: the table now looks more like a table. Especially the summary should be clearer now. Future goals: * Improve debug information so that the (unknown) pseudo-package is reduced in size or even eliminated altogether. * Add support for other file formats, most importantly WebAssembly. * Perhaps provide a way to expand this report per file, or in a machine-readable format like JSON or CSV.
2021-10-31loader: fix true path detection on WindowsAyke van Laethem
This is necessary to display error messages on Windows. For example, this command invocation is not correct (esp32 doesn't define machine.LED, you need esp32-coreboard-v2 for example): tinygo run -target=esp32 examples/blinky1 It results in the following hard-to-read error message: # examples/blinky1 ..\..\..\..\..\AppData\Local\tinygo\goroot-go1.16-24cb853b66a5367bf6d65bc08b2cb665c75bd9971f0be8f8b73f69d1a33e04a1-syscall\src\examples\blinky1\blinky1.go:11:17: LED not declared by package machine With this commit, this error message becomes much easier to read: # examples/blinky1 C:\Users\Ayke\go\src\github.com\tinygo-org\tinygo\src\examples\blinky1\blinky1.go:11:17: LED not declared by package machine
2021-09-28builder, cgo: support function definitions in CGo headersAyke van Laethem
For example, the following did not work before but does work with this change: // int add(int a, int b) { // return a + b; // } import "C" func main() { println("add:", C.add(3, 5)) } Even better, the functions in the header are compiled together with the rest of the Go code and so they can be optimized together! Currently, inlining is not yet allowed but const-propagation across functions works. This should be improved in the future.
2021-09-15loader: fix panic in CGo files with syntax errorsAyke van Laethem
If all of the Go files presented to the compiler have syntax errors, cgo.Process gets an empty files slice and will panic: panic: runtime error: index out of range [0] with length 0 goroutine 1 [running]: github.com/tinygo-org/tinygo/cgo.Process({0x0, 0x4e8e36, 0x0}, {0xc000024104, 0x18}, 0xc000090fc0, {0xc000899780, 0x7, 0xc00018ce68}) /home/ayke/src/github.com/tinygo-org/tinygo/cgo/cgo.go:186 +0x22ee github.com/tinygo-org/tinygo/loader.(*Package).parseFiles(0xc0001ccf00) /home/ayke/src/github.com/tinygo-org/tinygo/loader/loader.go:400 +0x51e This is simple to work around: just don't try to run CGo when there are no files to process. It just means there are bugs to fix before CGo can properly run. (This is perhaps not the nicest solution but certainly the simplest).
2021-08-12baremetal,wasm: support command line params and environment variablesAyke van Laethem
This is mainly useful to be able to run `tinygo test`, for example: tinygo test -target=cortex-m-qemu -v math This is not currently supported, but will be in the future.