aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build-macos.yml4
-rw-r--r--.github/workflows/linux.yml4
-rw-r--r--.github/workflows/nix.yml2
-rw-r--r--.github/workflows/sizediff.yml2
-rw-r--r--.github/workflows/windows.yml54
-rw-r--r--GNUmakefile8
-rw-r--r--main_test.go85
-rw-r--r--src/runtime/runtime_unix.go2
-rw-r--r--src/runtime/runtime_windows.go12
9 files changed, 133 insertions, 40 deletions
diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml
index 4f26e1fb8..98cde07a2 100644
--- a/.github/workflows/build-macos.yml
+++ b/.github/workflows/build-macos.yml
@@ -26,6 +26,8 @@ jobs:
goarch: arm64
runs-on: ${{ matrix.os }}
steps:
+ - name: exit early
+ run: command-does-not-exist
- name: Install Dependencies
run: |
HOMEBREW_NO_AUTO_UPDATE=1 brew install qemu binaryen
@@ -128,6 +130,8 @@ jobs:
matrix:
version: [16, 17, 18]
steps:
+ - name: exit early
+ run: command-does-not-exist
- name: Set up Homebrew
uses: Homebrew/actions/setup-homebrew@master
- name: Fix Python symlinks
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index 206e6b767..93b48f4df 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -22,6 +22,8 @@ jobs:
outputs:
version: ${{ steps.version.outputs.version }}
steps:
+ - name: exit early
+ run: command-does-not-exist
- name: Install apk dependencies
# tar: needed for actions/cache@v4
# git+openssh: needed for checkout (I think?)
@@ -171,6 +173,8 @@ jobs:
# potential bugs.
runs-on: ubuntu-latest
steps:
+ - name: exit early
+ run: command-does-not-exist
- name: Checkout
uses: actions/checkout@v4
with:
diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml
index 7ad4911d6..70e03d9f3 100644
--- a/.github/workflows/nix.yml
+++ b/.github/workflows/nix.yml
@@ -15,6 +15,8 @@ jobs:
nix-test:
runs-on: ubuntu-latest
steps:
+ - name: exit early
+ run: command-does-not-exist
- name: Uninstall system LLVM
# Hack to work around issue where we still include system headers for
# some reason.
diff --git a/.github/workflows/sizediff.yml b/.github/workflows/sizediff.yml
index b9c40b1ea..ab13085b8 100644
--- a/.github/workflows/sizediff.yml
+++ b/.github/workflows/sizediff.yml
@@ -15,6 +15,8 @@ jobs:
permissions:
pull-requests: write
steps:
+ - name: exit early
+ run: command-does-not-exist
# Prepare, install tools
- name: Add GOBIN to $PATH
run: |
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index 0994d47a7..1ab17f9a7 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -23,26 +23,30 @@ jobs:
minimum-size: 8GB
maximum-size: 24GB
disk-root: "C:"
- - uses: brechtm/setup-scoop@v2
- with:
- scoop_update: 'false'
- - name: Install Dependencies
- shell: bash
- run: |
- scoop install ninja binaryen
+ #- uses: brechtm/setup-scoop@v2
+ # with:
+ # scoop_update: 'false'
+ #- name: Install Dependencies
+ # shell: bash
+ # run: |
+ # scoop install ninja binaryen
- name: Checkout
uses: actions/checkout@v4
- with:
- submodules: true
+ - name: submodules
+ shell: bash
+ run: git submodule update --init lib/mingw-w64
- name: Extract TinyGo version
id: version
shell: bash
run: ./.github/workflows/tinygo-extract-version.sh | tee -a "$GITHUB_OUTPUT"
- - name: Install Go
- uses: actions/setup-go@v5
- with:
- go-version: '1.23'
- cache: true
+ - name: command
+ shell: bash
+ run: go env
+ #- name: Install Go
+ # uses: actions/setup-go@v5
+ # with:
+ # go-version: '1.23'
+ # cache: true
- name: Restore cached LLVM source
uses: actions/cache/restore@v4
id: cache-llvm-source
@@ -91,6 +95,25 @@ jobs:
with:
key: ${{ steps.cache-llvm-build.outputs.cache-primary-key }}
path: llvm-build
+ - name: Restore Go cache
+ uses: actions/cache/restore@v4
+ with:
+ key: go-cache-v2
+ path: |
+ C:/Users/runneradmin/AppData/Local/go-build
+ C:/Users/runneradmin/go/pkg/mod
+ - name: Test TinyGo
+ shell: bash
+ run: make test GOTESTFLAGS="-short -run=TestBuild -v"
+ - name: Save Go cache
+ uses: actions/cache/save@v4
+ with:
+ key: go-cache-v2
+ path: |
+ C:/Users/runneradmin/AppData/Local/go-build
+ C:/Users/runneradmin/go/pkg/mod
+ - name: exit
+ run: command-does-not-exist
- name: Cache wasi-libc sysroot
uses: actions/cache@v4
id: cache-wasi-libc
@@ -105,9 +128,6 @@ jobs:
scoop install [email protected]
- name: make gen-device
run: make -j3 gen-device
- - name: Test TinyGo
- shell: bash
- run: make test GOTESTFLAGS="-short"
- name: Build TinyGo release tarball
shell: bash
run: make build/release -j4
diff --git a/GNUmakefile b/GNUmakefile
index 2bf023c62..2357177f2 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -191,7 +191,7 @@ gen-device: gen-device-stm32
endif
gen-device-avr:
- @if [ ! -e lib/avr/README.md ]; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init"; exit 1; fi
+ #@if [ ! -e lib/avr/README.md ]; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init"; exit 1; fi
$(GO) build -o ./build/gen-device-avr ./tools/gen-device-avr/
./build/gen-device-avr lib/avr/packs/atmega src/device/avr/
./build/gen-device-avr lib/avr/packs/tiny src/device/avr/
@@ -263,7 +263,7 @@ endif
.PHONY: wasi-libc
wasi-libc: lib/wasi-libc/sysroot/lib/wasm32-wasi/libc.a
lib/wasi-libc/sysroot/lib/wasm32-wasi/libc.a:
- @if [ ! -e lib/wasi-libc/Makefile ]; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init"; exit 1; fi
+ #@if [ ! -e lib/wasi-libc/Makefile ]; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init"; exit 1; fi
cd lib/wasi-libc && $(MAKE) -j4 EXTRA_CFLAGS="-O2 -g -DNDEBUG -mnontrapping-fptoint -msign-ext" MALLOC_IMPL=none CC="$(CLANG)" AR=$(LLVM_AR) NM=$(LLVM_NM)
# Generate WASI syscall bindings
@@ -292,8 +292,8 @@ endif
tinygo: ## Build the TinyGo compiler
@if [ ! -f "$(LLVM_BUILDDIR)/bin/llvm-config" ]; then echo "Fetch and build LLVM first by running:"; echo " $(MAKE) llvm-source"; echo " $(MAKE) $(LLVM_BUILDDIR)"; exit 1; fi
CGO_CPPFLAGS="$(CGO_CPPFLAGS)" CGO_CXXFLAGS="$(CGO_CXXFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GOENVFLAGS) $(GO) build -buildmode exe -o build/tinygo$(EXE) -tags "byollvm osusergo" .
-test: wasi-libc check-nodejs-version
- CGO_CPPFLAGS="$(CGO_CPPFLAGS)" CGO_CXXFLAGS="$(CGO_CXXFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) test $(GOTESTFLAGS) -timeout=1h -buildmode exe -tags "byollvm osusergo" $(GOTESTPKGS)
+test: #wasi-libc check-nodejs-version
+ CGO_CPPFLAGS="$(CGO_CPPFLAGS)" CGO_CXXFLAGS="$(CGO_CXXFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) test $(GOTESTFLAGS) -timeout=1h -race -buildmode exe -tags "byollvm osusergo" .
# Standard library packages that pass tests on darwin, linux, wasi, and windows, but take over a minute in wasi
TEST_PACKAGES_SLOW = \
diff --git a/main_test.go b/main_test.go
index 22ac549de..94522a4f3 100644
--- a/main_test.go
+++ b/main_test.go
@@ -7,6 +7,7 @@ import (
"bufio"
"bytes"
"context"
+ "crypto/sha256"
"errors"
"flag"
"io"
@@ -15,6 +16,7 @@ import (
"reflect"
"regexp"
"runtime"
+ "strconv"
"strings"
"sync"
"testing"
@@ -27,7 +29,6 @@ import (
"github.com/tetratelabs/wazero/sys"
"github.com/tinygo-org/tinygo/builder"
"github.com/tinygo-org/tinygo/compileopts"
- "github.com/tinygo-org/tinygo/diagnostics"
"github.com/tinygo-org/tinygo/goenv"
)
@@ -114,10 +115,15 @@ func TestBuild(t *testing.T) {
return
}
- t.Run("Host", func(t *testing.T) {
- t.Parallel()
- runPlatTests(optionsFromTarget("", sema), tests, t)
+ t.Run("Debugging", func(t *testing.T) {
+ for i := 0; i < 5; i++ {
+ t.Run(strconv.Itoa(i), func(t *testing.T) {
+ options := optionsFromTarget("", sema)
+ runTest("alias.go", options, t, nil, nil)
+ })
+ }
})
+ return
// Test a few build options.
t.Run("build-options", func(t *testing.T) {
@@ -420,21 +426,66 @@ func runTestWithConfig(name string, t *testing.T, options compileopts.Options, c
// Build the test binary.
stdout := &bytes.Buffer{}
- _, err = buildAndRun(pkgName, config, stdout, cmdArgs, environmentVars, time.Minute, func(cmd *exec.Cmd, result builder.BuildResult) error {
- return cmd.Run()
- })
+ _, fileExt := config.EmulatorFormat()
+ tmpdir := t.TempDir()
+ result, err := builder.Build(pkgName, fileExt, tmpdir, config)
if err != nil {
- w := &bytes.Buffer{}
- diagnostics.CreateDiagnostics(err).WriteTo(w, "")
- for _, line := range strings.Split(strings.TrimRight(w.String(), "\n"), "\n") {
- t.Log(line)
- }
- if stdout.Len() != 0 {
- t.Logf("output:\n%s", stdout.String())
- }
- t.Fail()
- return
+ t.Fatal("build failed:", err)
+ }
+
+ data, err := os.ReadFile(result.Executable)
+ if err != nil {
+ t.Fatal("failed to read executable:", err)
+ }
+ hash := sha256.Sum256(data)
+ t.Logf("executable hash and size: %d %x", len(data), hash)
+
+ for i := 0; i < 100; i++ {
+ i := i
+ t.Run(strconv.Itoa(i), func(t *testing.T) {
+ t.Parallel()
+ stdout := &bytes.Buffer{}
+ cmd := exec.Command(result.Executable)
+ cmd.Stdout = stdout
+ cmd.Stderr = stdout
+ err := cmd.Run()
+ if err != nil {
+ t.Log("run error:", err)
+ }
+ checkOutput(t, expectedOutputPath, stdout.Bytes())
+ })
}
+ return
+
+ //_, err = buildAndRun(pkgName, config, stdout, cmdArgs, environmentVars, time.Minute, func(cmd *exec.Cmd, result builder.BuildResult) error {
+ // data, err := os.ReadFile(result.Executable)
+ // if err != nil {
+ // t.Fatal("failed to read executable:", err)
+ // }
+ // hash := sha256.Sum256(data)
+ // t.Logf("executable hash and size: %d %x", len(data), hash)
+
+ // t.Log("command:", cmd)
+ // err = cmd.Run()
+ // if err == nil {
+ // t.Log(" error is nil!")
+ // } else {
+ // t.Log(" error:", err)
+ // }
+ // return err
+ //})
+ //if err != nil {
+ // w := &bytes.Buffer{}
+ // diagnostics.CreateDiagnostics(err).WriteTo(w, "")
+ // for _, line := range strings.Split(strings.TrimRight(w.String(), "\n"), "\n") {
+ // t.Log(line)
+ // }
+ // if stdout.Len() != 0 {
+ // t.Logf("output:\n%s", stdout.String())
+ // }
+ // t.Fail()
+ // return
+ //}
actual := stdout.Bytes()
if config.EmulatorName() == "simavr" {
diff --git a/src/runtime/runtime_unix.go b/src/runtime/runtime_unix.go
index 3b20330e2..51807b847 100644
--- a/src/runtime/runtime_unix.go
+++ b/src/runtime/runtime_unix.go
@@ -93,6 +93,8 @@ func main(argc int32, argv *unsafe.Pointer) int {
stackTop = getCurrentStackPointer()
runMain()
+ sleepTicks(nanosecondsToTicks(1e9))
+
// For libc compatibility.
return 0
}
diff --git a/src/runtime/runtime_windows.go b/src/runtime/runtime_windows.go
index 4b0b8f65b..e2a5c4e5a 100644
--- a/src/runtime/runtime_windows.go
+++ b/src/runtime/runtime_windows.go
@@ -52,7 +52,13 @@ func mainCRTStartup() int {
stackTop = getCurrentStackPointer()
runMain()
- // For libc compatibility.
+ // Exit via exit(0) instead of returning.
+ // This matches mingw-w64-crt/crt/crtexe.c, which exits using exit(0)
+ // instead of returning the return value.
+ libc_exit(0)
+
+ // Unreachable, since we're already exited. But we need to return something
+ // to make this valid Go code.
return 0
}
@@ -92,7 +98,9 @@ func os_runtime_args() []string {
}
func putchar(c byte) {
- libc_putchar(int(c))
+ if libc_putchar(int(c)) < 0 {
+ libc_exit(42)
+ }
}
var heapSize uintptr = 128 * 1024 // small amount to start