mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-12 06:53:40 +00:00
wasm: add Boehm GC support
This adds support for `-gc=boehm` on `-target=wasip1` and `-target=wasm` (in a browser or NodeJS). Notably it does *not* add Boehm GC support for `-target=wasip2`, since that target doesn't have a real libc.
This commit is contained in:
committed by
Ron Evans
parent
9c3b706533
commit
c08b2dfe06
+18
-3
@@ -22,7 +22,8 @@ import (
|
||||
// builder.Library struct but that's hard to do since we want to know the
|
||||
// library path in advance in several places).
|
||||
var libVersions = map[string]int{
|
||||
"musl": 3,
|
||||
"musl": 3,
|
||||
"bdwgc": 2,
|
||||
}
|
||||
|
||||
// Config keeps all configuration affecting the build in a single struct.
|
||||
@@ -138,7 +139,7 @@ func (c *Config) GC() string {
|
||||
// that can be traced by the garbage collector.
|
||||
func (c *Config) NeedsStackObjects() bool {
|
||||
switch c.GC() {
|
||||
case "conservative", "custom", "precise":
|
||||
case "conservative", "custom", "precise", "boehm":
|
||||
for _, tag := range c.BuildTags() {
|
||||
if tag == "tinygo.wasm" {
|
||||
return true
|
||||
@@ -263,6 +264,15 @@ func MuslArchitecture(triple string) string {
|
||||
return CanonicalArchName(triple)
|
||||
}
|
||||
|
||||
// Returns true if the libc needs to include malloc, for the libcs where this
|
||||
// matters.
|
||||
func (c *Config) LibcNeedsMalloc() bool {
|
||||
if c.GC() == "boehm" && c.Target.Libc == "wasi-libc" {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// LibraryPath returns the path to the library build directory. The path will be
|
||||
// a library path in the cache directory (which might not yet be built).
|
||||
func (c *Config) LibraryPath(name string) string {
|
||||
@@ -286,9 +296,14 @@ func (c *Config) LibraryPath(name string) string {
|
||||
archname += "-v" + strconv.Itoa(v)
|
||||
}
|
||||
|
||||
options := ""
|
||||
if c.LibcNeedsMalloc() {
|
||||
options += "+malloc"
|
||||
}
|
||||
|
||||
// No precompiled library found. Determine the path name that will be used
|
||||
// in the build cache.
|
||||
return filepath.Join(goenv.Get("GOCACHE"), name+"-"+archname)
|
||||
return filepath.Join(goenv.Get("GOCACHE"), name+options+"-"+archname)
|
||||
}
|
||||
|
||||
// DefaultBinaryExtension returns the default extension for binaries, such as
|
||||
|
||||
@@ -470,6 +470,12 @@ func defaultTarget(options *Options) (*TargetSpec, error) {
|
||||
return nil, fmt.Errorf("unknown GOOS=%s", options.GOOS)
|
||||
}
|
||||
|
||||
if spec.GC == "boehm" {
|
||||
// Add this file only when needed. This fixes a build failure on
|
||||
// Windows.
|
||||
spec.ExtraFiles = append(spec.ExtraFiles, "src/runtime/gc_boehm.c")
|
||||
}
|
||||
|
||||
// Target triples (which actually have four components, but are called
|
||||
// triples for historical reasons) have the form:
|
||||
// arch-vendor-os-environment
|
||||
|
||||
Reference in New Issue
Block a user