mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-14 07:53:40 +00:00
feature: add buildmode=wasi-legacy to support existing base of users who expected the
older behavior for wasi modules to not return an exit code as if they were reactors. See #4726 for some details on what this is intended to address. Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
@@ -672,6 +672,16 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe
|
|||||||
ldflags = append(ldflags, "--no-entry")
|
ldflags = append(ldflags, "--no-entry")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if config.Options.BuildMode == "wasi-legacy" {
|
||||||
|
if !strings.HasPrefix(config.Triple(), "wasm32-") {
|
||||||
|
return result, fmt.Errorf("buildmode wasi-legacy is only supported on wasm")
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.Options.Scheduler != "none" {
|
||||||
|
return result, fmt.Errorf("buildmode wasi-legacy only supports scheduler=none")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add compiler-rt dependency if needed. Usually this is a simple load from
|
// Add compiler-rt dependency if needed. Usually this is a simple load from
|
||||||
// a cache.
|
// a cache.
|
||||||
if config.Target.RTLib == "compiler-rt" {
|
if config.Target.RTLib == "compiler-rt" {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
validBuildModeOptions = []string{"default", "c-shared"}
|
validBuildModeOptions = []string{"default", "c-shared", "wasi-legacy"}
|
||||||
validGCOptions = []string{"none", "leaking", "conservative", "custom", "precise"}
|
validGCOptions = []string{"none", "leaking", "conservative", "custom", "precise"}
|
||||||
validSchedulerOptions = []string{"none", "tasks", "asyncify"}
|
validSchedulerOptions = []string{"none", "tasks", "asyncify"}
|
||||||
validSerialOptions = []string{"none", "uart", "usb", "rtt"}
|
validSerialOptions = []string{"none", "uart", "usb", "rtt"}
|
||||||
|
|||||||
@@ -283,6 +283,11 @@ func (c *compilerContext) getFunctionInfo(f *ssa.Function) functionInfo {
|
|||||||
info.wasmName = "_start"
|
info.wasmName = "_start"
|
||||||
info.exported = true
|
info.exported = true
|
||||||
}
|
}
|
||||||
|
if info.linkName == "runtime.wasmEntryLegacy" && c.BuildMode == "wasi-legacy" {
|
||||||
|
info.linkName = "_start"
|
||||||
|
info.wasmName = "_start"
|
||||||
|
info.exported = true
|
||||||
|
}
|
||||||
|
|
||||||
// Check for //go: pragmas, which may change the link name (among others).
|
// Check for //go: pragmas, which may change the link name (among others).
|
||||||
c.parsePragmas(&info, f)
|
c.parsePragmas(&info, f)
|
||||||
|
|||||||
@@ -1501,7 +1501,7 @@ func main() {
|
|||||||
var tags buildutil.TagsFlag
|
var tags buildutil.TagsFlag
|
||||||
flag.Var(&tags, "tags", "a space-separated list of extra build tags")
|
flag.Var(&tags, "tags", "a space-separated list of extra build tags")
|
||||||
target := flag.String("target", "", "chip/board name or JSON target specification file")
|
target := flag.String("target", "", "chip/board name or JSON target specification file")
|
||||||
buildMode := flag.String("buildmode", "", "build mode to use (default, c-shared)")
|
buildMode := flag.String("buildmode", "", "build mode to use (default, c-shared, wasi-legacy)")
|
||||||
var stackSize uint64
|
var stackSize uint64
|
||||||
flag.Func("stack-size", "goroutine stack size (if unknown at compile time)", func(s string) error {
|
flag.Func("stack-size", "goroutine stack size (if unknown at compile time)", func(s string) error {
|
||||||
size, err := bytesize.Parse(s)
|
size, err := bytesize.Parse(s)
|
||||||
|
|||||||
@@ -594,6 +594,15 @@ func TestWasmExport(t *testing.T) {
|
|||||||
noOutput: true, // wasm-unknown cannot produce output
|
noOutput: true, // wasm-unknown cannot produce output
|
||||||
command: true,
|
command: true,
|
||||||
},
|
},
|
||||||
|
// Test buildmode=wasi-legacy with WASI.
|
||||||
|
{
|
||||||
|
name: "WASIp1-legacy",
|
||||||
|
target: "wasip1",
|
||||||
|
buildMode: "wasi-legacy",
|
||||||
|
scheduler: "none",
|
||||||
|
file: "wasmexport-noscheduler.go",
|
||||||
|
command: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range tests {
|
for _, tc := range tests {
|
||||||
|
|||||||
@@ -52,6 +52,15 @@ func wasmEntryReactor() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is the _start entry point, when using -buildmode=wasi-legacy.
|
||||||
|
func wasmEntryLegacy() {
|
||||||
|
// These need to be initialized early so that the heap can be initialized.
|
||||||
|
initializeCalled = true
|
||||||
|
heapStart = uintptr(unsafe.Pointer(&heapStartSymbol))
|
||||||
|
heapEnd = uintptr(wasm_memory_size(0) * wasmPageSize)
|
||||||
|
run()
|
||||||
|
}
|
||||||
|
|
||||||
// Whether the runtime was initialized by a call to _initialize or _start.
|
// Whether the runtime was initialized by a call to _initialize or _start.
|
||||||
var initializeCalled bool
|
var initializeCalled bool
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user