]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go/internal/work: reduce code duplication in buildModeInit by using sys.BuildMode...
authorBryan C. Mills <bcmills@google.com>
Fri, 22 Nov 2019 18:30:47 +0000 (13:30 -0500)
committerBryan C. Mills <bcmills@google.com>
Fri, 22 Nov 2019 21:09:43 +0000 (21:09 +0000)
Updates #34347

Change-Id: I6ea02d4737999bf24f5335508b5ed2352b498122
Reviewed-on: https://go-review.googlesource.com/c/go/+/208458
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
src/cmd/go/internal/work/init.go
src/cmd/internal/sys/supported.go

index 078c24822fc7a823c388b57be59887df90d7d7f2..9091f986368f4d62bfd576cdea18397d849f0b78 100644 (file)
@@ -86,7 +86,11 @@ func instrumentInit() {
 func buildModeInit() {
        gccgo := cfg.BuildToolchainName == "gccgo"
        var codegenArg string
-       platform := cfg.Goos + "/" + cfg.Goarch
+
+       // Configure the build mode first, then verify that it is supported.
+       // That way, if the flag is completely bogus we will prefer to error out with
+       // "-buildmode=%s not supported" instead of naming the specific platform.
+
        switch cfg.BuildBuildmode {
        case "archive":
                pkgsFilter = pkgsNotMain
@@ -95,20 +99,18 @@ func buildModeInit() {
                if gccgo {
                        codegenArg = "-fPIC"
                } else {
-                       switch platform {
-                       case "darwin/arm", "darwin/arm64":
-                               codegenArg = "-shared"
-                       default:
-                               switch cfg.Goos {
-                               case "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd", "solaris":
-                                       if platform == "linux/ppc64" {
-                                               base.Fatalf("-buildmode=c-archive not supported on %s\n", platform)
-                                       }
-                                       // Use -shared so that the result is
-                                       // suitable for inclusion in a PIE or
-                                       // shared library.
+                       switch cfg.Goos {
+                       case "darwin":
+                               switch cfg.Goarch {
+                               case "arm", "arm64":
                                        codegenArg = "-shared"
                                }
+
+                       case "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd", "solaris":
+                               // Use -shared so that the result is
+                               // suitable for inclusion in a PIE or
+                               // shared library.
+                               codegenArg = "-shared"
                        }
                }
                cfg.ExeSuffix = ".a"
@@ -118,27 +120,25 @@ func buildModeInit() {
                if gccgo {
                        codegenArg = "-fPIC"
                } else {
-                       switch platform {
-                       case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/ppc64le", "linux/s390x",
-                               "android/amd64", "android/arm", "android/arm64", "android/386",
-                               "freebsd/amd64":
+                       switch cfg.Goos {
+                       case "linux", "android", "freebsd":
                                codegenArg = "-shared"
-                       case "darwin/amd64", "darwin/386":
-                       case "windows/amd64", "windows/386":
+                       case "windows":
                                // Do not add usual .exe suffix to the .dll file.
                                cfg.ExeSuffix = ""
-                       default:
-                               base.Fatalf("-buildmode=c-shared not supported on %s\n", platform)
                        }
                }
                ldBuildmode = "c-shared"
        case "default":
-               switch platform {
-               case "android/arm", "android/arm64", "android/amd64", "android/386":
+               switch cfg.Goos {
+               case "android":
                        codegenArg = "-shared"
                        ldBuildmode = "pie"
-               case "darwin/arm", "darwin/arm64":
-                       codegenArg = "-shared"
+               case "darwin":
+                       switch cfg.Goarch {
+                       case "arm", "arm64":
+                               codegenArg = "-shared"
+                       }
                        fallthrough
                default:
                        ldBuildmode = "exe"
@@ -161,18 +161,8 @@ func buildModeInit() {
                }
                if gccgo {
                        codegenArg = "-fPIE"
-               } else {
-                       switch platform {
-                       case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/s390x",
-                               "android/amd64", "android/arm", "android/arm64", "android/386",
-                               "freebsd/amd64":
-                               codegenArg = "-shared"
-                       case "darwin/amd64":
-                               codegenArg = "-shared"
-                       case "aix/ppc64":
-                       default:
-                               base.Fatalf("-buildmode=pie not supported on %s\n", platform)
-                       }
+               } else if cfg.Goos != "aix" {
+                       codegenArg = "-shared"
                }
                ldBuildmode = "pie"
        case "shared":
@@ -180,11 +170,6 @@ func buildModeInit() {
                if gccgo {
                        codegenArg = "-fPIC"
                } else {
-                       switch platform {
-                       case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/s390x":
-                       default:
-                               base.Fatalf("-buildmode=shared not supported on %s\n", platform)
-                       }
                        codegenArg = "-dynlink"
                }
                if cfg.BuildO != "" {
@@ -196,14 +181,6 @@ func buildModeInit() {
                if gccgo {
                        codegenArg = "-fPIC"
                } else {
-                       switch platform {
-                       case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/s390x", "linux/ppc64le",
-                               "android/amd64", "android/arm", "android/arm64", "android/386":
-                       case "darwin/amd64":
-                       case "freebsd/amd64":
-                       default:
-                               base.Fatalf("-buildmode=plugin not supported on %s\n", platform)
-                       }
                        codegenArg = "-dynlink"
                }
                cfg.ExeSuffix = ".so"
@@ -211,16 +188,19 @@ func buildModeInit() {
        default:
                base.Fatalf("buildmode=%s not supported", cfg.BuildBuildmode)
        }
+
+       if !sys.BuildModeSupported(cfg.BuildToolchainName, cfg.BuildBuildmode, cfg.Goos, cfg.Goarch) {
+               base.Fatalf("-buildmode=%s not supported on %s/%s\n", cfg.BuildBuildmode, cfg.Goos, cfg.Goarch)
+       }
+
        if cfg.BuildLinkshared {
+               if !sys.BuildModeSupported(cfg.BuildToolchainName, "shared", cfg.Goos, cfg.Goarch) {
+                       base.Fatalf("-linkshared not supported on %s/%s\n", cfg.Goos, cfg.Goarch)
+               }
                if gccgo {
                        codegenArg = "-fPIC"
                } else {
-                       switch platform {
-                       case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/s390x":
-                               forcedAsmflags = append(forcedAsmflags, "-D=GOBUILDMODE_shared=1")
-                       default:
-                               base.Fatalf("-linkshared not supported on %s\n", platform)
-                       }
+                       forcedAsmflags = append(forcedAsmflags, "-D=GOBUILDMODE_shared=1")
                        codegenArg = "-dynlink"
                        forcedGcflags = append(forcedGcflags, "-linkshared")
                        // TODO(mwhudson): remove -w when that gets fixed in linker.
index 78aa825a7861957298a01b9ca57b16695df5d573..02f833e945e96e6acc3c05639489f2ffe1505d61 100644 (file)
@@ -47,11 +47,6 @@ func MustLinkExternal(goos, goarch string) bool {
 // BuildModeSupported reports whether goos/goarch supports the given build mode
 // using the given compiler.
 func BuildModeSupported(compiler, buildmode, goos, goarch string) bool {
-       // This function mirrors the logic in cmd/go/internal/work.buildModeInit.
-       //
-       // TODO(bcmills): Refactor buildModeInit to use this function so that the two
-       // don't get out of sync.
-
        if compiler == "gccgo" {
                return true
        }