diff options
| author | Ian Lance Taylor <iant@golang.org> | 2023-01-28 20:05:53 -0800 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-01-31 16:53:53 +0000 |
| commit | 43115ff094be30b7a3c45eaf82ee6d257f3aa6c6 (patch) | |
| tree | 9465ee671ee41ef4f6fe5dacacf3884b30cbde7b /src | |
| parent | 5c6d7322004330b58ea40ca9335dd9fb81f51f50 (diff) | |
| download | go-43115ff094be30b7a3c45eaf82ee6d257f3aa6c6.tar.xz | |
cmd/link, cmd/dist, internal/platform: consolidate c-archive support
Make all the tests for whether -buildmode=c-archive is supported consistent.
Base this on the historical code, on whether cmd/compile supports -shared,
and whether cmd/link permits the mode.
Change-Id: Ib996546906f698ade4c32b8e6c705838e4ad4b90
Reviewed-on: https://go-review.googlesource.com/c/go/+/463984
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/dist/test.go | 24 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/config.go | 2 | ||||
| -rw-r--r-- | src/internal/platform/supported.go | 25 |
3 files changed, 42 insertions, 9 deletions
diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 10bca33c68..d8c5983127 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -1141,6 +1141,7 @@ func (t *tester) internalLinkPIE() bool { return false } +// supportedBuildMode reports whether the given build mode is supported. func (t *tester) supportedBuildmode(mode string) bool { pair := goos + "-" + goarch switch mode { @@ -1148,13 +1149,24 @@ func (t *tester) supportedBuildmode(mode string) bool { if !t.extLink() { return false } - switch pair { - case "aix-ppc64", - "darwin-amd64", "darwin-arm64", "ios-arm64", - "linux-amd64", "linux-386", "linux-ppc64le", "linux-riscv64", "linux-s390x", - "freebsd-amd64", - "windows-amd64", "windows-386": + switch goos { + case "aix", "darwin", "ios", "windows": return true + case "linux": + switch goarch { + case "386", "amd64", "arm", "armbe", "arm64", "arm64be", "ppc64", "ppc64le", "riscv64", "s390x": + return true + default: + // Other targets do not support -shared, + // per ParseFlags in + // cmd/compile/internal/base/flag.go. + // For c-archive the Go tool passes -shared, + // so that the result is suitable for inclusion + // in a PIE or shared library. + return false + } + case "freebsd": + return goarch == "amd64" } return false case "c-shared": diff --git a/src/cmd/link/internal/ld/config.go b/src/cmd/link/internal/ld/config.go index 336cb33e3b..b1774f8fd2 100644 --- a/src/cmd/link/internal/ld/config.go +++ b/src/cmd/link/internal/ld/config.go @@ -27,6 +27,8 @@ const ( BuildModePlugin ) +// Set implements flag.Value to set the build mode based on the argument +// to the -buildmode flag. func (mode *BuildMode) Set(s string) error { badmode := func() error { return fmt.Errorf("buildmode %s not supported on %s/%s", s, buildcfg.GOOS, buildcfg.GOARCH) diff --git a/src/internal/platform/supported.go b/src/internal/platform/supported.go index 86c9f07ade..d8c5b7ee89 100644 --- a/src/internal/platform/supported.go +++ b/src/internal/platform/supported.go @@ -100,9 +100,28 @@ func BuildModeSupported(compiler, buildmode, goos, goarch string) bool { return true case "c-archive": - // TODO(bcmills): This seems dubious. - // Do we really support c-archive mode on js/wasm‽ - return platform != "linux/ppc64" + switch goos { + case "aix", "darwin", "ios", "windows": + return true + case "linux": + switch goarch { + case "386", "amd64", "arm", "armbe", "arm64", "arm64be", "ppc64le", "riscv64", "s390x": + // linux/ppc64 not supported because it does + // not support external linking mode yet. + return true + default: + // Other targets do not support -shared, + // per ParseFlags in + // cmd/compile/internal/base/flag.go. + // For c-archive the Go tool passes -shared, + // so that the result is suitable for inclusion + // in a PIE or shared library. + return false + } + case "freebsd": + return goarch == "amd64" + } + return false case "c-shared": switch platform { |
