From: Ian Lance Taylor Date: Sun, 29 Jan 2023 04:05:53 +0000 (-0800) Subject: cmd/link, cmd/dist, internal/platform: consolidate c-archive support X-Git-Tag: go1.21rc1~1713 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=43115ff094be30b7a3c45eaf82ee6d257f3aa6c6;p=gostls13.git 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 Reviewed-by: Bryan Mills Auto-Submit: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gopher Robot --- 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 {