github tinygo-org/tinygo v0.44.0
0.44.0

4 hours ago

Mere weeks after our previous release, this new version brings massive performance boosts, improvements in toolchain support, and lots of new hardware. TinyGo now builds against LLVM 23 and drops support for LLVM versions below 15. The interp package now runs more of your program's initialization at compile time so startup is smaller and faster. The compiler skips slice bounds checks that cannot fail and avoids more byte slice copies in string comparisons. On the hardware side, the cores scheduler now supports the ESP32-S3 and adds core affinity for both it and the RP2040/RP2350. The ESP32-S3 also gets USB-OTG device support and flash BlockDevice support, and ESP32-S3 and ESP32-C3 can now boot images with large flash segments. There are also many I2C, SPI, and USB fixes for ESP32, RP2, and SAMD. New boards include the Arduino Uno R4 Minima and WiFi, the NUCLEO-F401RE, and the M5Stack StampFly.

  • general
    • drop support for LLVM versions below 15 (#5925)
    • add LLVM 23 build support (#5782)
    • main: do not erase the entire flash when flashing esp32 (#5971)
    • main: update to espflasher 0.9.2 (#6000)
    • main: preserve Windows paths in linker flags (#6032)
    • main: make tinygo fix useful for TinyGo sources (#5992)
    • compileopts: add -panic-unwind=none (#5982)
    • compileopts: fix build tag order (#5782)
    • loader: split CGO_*FLAGS environment variables the same way as the go command (#6022)
    • loader: preserve the working directory in go list (#5914)
    • all: use newer Go library functions and language features, and remove Go version checks that are always true (#5906, #6038)
    • all: check out testdata with LF line endings on all platforms (#5872)
    • tools: migrate to Go tool directives (#5881)
    • lib: update macos-minimal-sdk to v0.1.2 (#5870, #5976)
  • compiler
    • compiler: support long struct tags (#5854)
    • compiler: prevent compile time functions leaking into run time (#5887)
    • compiler: report errors for misused pragmas (#5936, #5894)
    • compiler: avoid byte slice copies in mixed string comparisons, and when a load or string slice is compared (#5784, #5937)
    • compiler: compare range loop index unsigned (#5999)
    • compiler: skip slice bounds checks that cannot fail (#5997)
    • compiler: fix the element size check in make for 32-bit targets (#6004)
    • compiler: build programs that start goroutines from either branch of an if (#6016)
    • compiler: report only panicking binary operations as unwinding (#5986)
    • cgo: apply target-specific #cgo flags, preserve preprocessor and C++ build flags, and order CGo flags like the go command (#5976)
    • cgo: accept unsigned as an alias for uint (#5976)
    • cgo: emit one AST comment per pragma (#5895)
    • cgo: handle LLVM 23 predefined type sugar (#5782)
    • builder: add AEABI unaligned read/write helpers to compiler-rt (#5988)
    • builder: link package modules with a single Linker (#5979)
    • builder: free go/ssa and the program module before linking (#6020)
  • core
    • reflect: implement Value.SetPointer (#5875)
    • reflect: convert VisibleFields field types (#5890)
    • reflect: fix FieldByIndex for empty indexes and non-struct roots (#5893)
    • reflect: distinguish interface and slice cycle visits (#5868)
    • reflectlite: use less stack when reading struct fields (#5884)
    • testing: implement B.Loop, give benchmarks a context, and fix ReportMetric (#5831)
    • os, internal/poll: never return a negative count from Read, Write, ReadAt, WriteAt or a wasip1 FD (#5900)
    • os: avoid startup work for unused temporary files (#5973)
    • syscall: report unsupported WASI ownership changes (#5867)
    • syscall: split an environment entry at its first '=' on js (#5886)
    • interp: evaluate memset, private atomic operations, map lookups, interface hashing, and deferred initialization at compile time (#5903)
    • interp: handle llvm.ctlz (#5963)
    • interp: stop pointer-derived integers from becoming zero (#5965)
    • interp: keep partial loads independent of buffers owned by a caller's memory view (#5905)
    • interp: keep memcpy results out of the global state when an initializer is reverted (#5904)
    • interp: limit each value to its own bytes in toLLVMValue (#5826)
    • interp: say why a rollback happened, and only print instructions of errors that leave interp (#5989, #5935, #5985)
    • transform: keep allocations on the stack when they flow through a select (#5891)
  • runtime
    • add core affinity for the cores scheduler (#5873)
    • hand the clock to a waiting core before running a task (#5919)
    • deliver signals under the threads scheduler when blocked on I/O (#5530)
    • ignore blank fields when comparing structs in interfaces (#5880)
    • report allocation counts in MemStats with the boehm collector (#5939)
    • run finalizers with Boehm GC, including interior finalizers (#5791)
    • scan only the live part of asyncify stacks (#5930)
    • remove go:nobounds where it has no effect (#6007)
    • wasm: round sleepTicks up to a whole millisecond (#5818)
    • riscv-qemu: clear stale timer wakeups (#5873)
    • rp2: fix scheduler lock starvation in schedulerUnlockAndWait (#5940)
    • esp32c3, esp32c6, esp32h2: register the timer alarm handler (#6052)
  • machine
    • esp32s3: add support for the cores scheduler, and fix two context bugs in the interrupt handler (#5910)
    • esp32s3: add USB-OTG device support (#6000)
    • esp32s3: add flash BlockDevice support (#5934)
    • esp32s3: always route SPI pins through the GPIO matrix (#5920)
    • esp32xx: let machine.Flash write past 2 MB (#6003)
    • esp32xx: wait for the I2C bus to be free before a transaction (#5978)
    • esp32xx: add WASM simulator support for the StampFly and ESP32-C3 SuperMini (#5921, #5918)
    • esp32: do not allocate on each I2C transaction (#5922)
    • esp32c6: fix an ADC hang by initializing the APB_SARADC and Modem/ADC peripheral (#5668)
    • stm32: add STM32F401 support (#5597)
    • ra4m1: add SCI UART driver (#6015)
    • rp2: keep PLL calculations out of startup (#5837)
    • rp2: make random number reads safe across cores (#5964)
    • rp2: stop SPI1 transmit from restarting SPI0 DMA, and report SPI DMA bus errors (#6010, #6012)
    • atsamd21, atsamd51: handle USB TX complete together with RX complete (#6024)
    • usb/cdc: resume TX after the host configures the device again (#6000)
  • targets
    • add Arduino Uno R4 Minima and Arduino Uno R4 WiFi (#5734)
    • add NUCLEO-F401RE (#5597)
    • add M5Stack StampFly (#5921)
    • esp32s3, esp32c3: boot images with large flash segments (#6001, #6017)
    • esp32s3: map all code and keep flash data clear of the image footer (#5934)
    • use full 2MiB flash on Waveshare RP2040-Zero, and correct flash sizes for six RP2040 boards (#5970, #5977)
    • hold BOOT0 low when flashing arduino-uno-q (#6040)
    • arduino-uno-r4-wifi: document the bossac requirement (#6006)
    • tools: handle Renesas SVD quirks (#5734)
  • build/test
    • ci: build linux arm and arm64 releases on arm runners (#5995)
    • ci: build against Homebrew LLVM 23 on macOS, test LLVM 16, 20, 21, and 22 there, and link and run a program in the homebrew-install job (#5968, #5923, #6018)
    • ci: move macOS arm64 runners to macos-15, and run only the smoke tests on the intel macOS runner (#5899, #5924)
    • ci: run all test packages on Windows and macOS (#5879)
    • ci: reject coding tool attributions in PRs and commits (#5869)
    • build: link wasm-opt with mimalloc on Linux (#5980)
    • make: use per-package standard library test options, and test stack-heavy packages and ML-DSA (#5824, #5855, #5866)
    • builder: add size tests for startup work removed by interp, and match them to the CLI interpreter limit (#5983, #5975, #5915)
    • tests/wasm: stop at once when headless Chrome does not start (#6021)
    • tests: count string comparison allocations with any garbage collector (#5938)
    • loader, interp, transform: fix test setup for module context, absolute paths, and fixture discovery (#5853, #5871, #5913, #5916)

Don't miss a new tinygo release

NewReleases is sending notifications on new releases.