--- Begin Message ---
Hello Jeffery,
Thank you for the wonderful work on maintaining the Go packages!
I got a little irritated at CGo's restriction of arch flags (in the
immutable GOGCCFLAGS variable) and put together a patch set for v19.07
to override them with an environment variable and then (optionally) feed
the machine flags in the Golang build. In the OpenWRT repo, I did this
by splitting out how DEFAULT_CFLAGS are put together in order to
populate a DEFAULT_MACHINE_FLAGS, but it could probably be done with
just a $(filter -m%,$(DEFAULT_CFLAGS)) instead.
If you or others have any interest in this, I can clean them up for the
master branch. I'm probably going to submit the Golang patch upstream,
since I don't see any good reason for such a restriction. I see you've
made a lot of changes on the HEAD.
Daniel
>From f1c770216e4eadaa641fb4f9894576358df5cf74 Mon Sep 17 00:00:00 2001
From: Daniel Santos <daniel.san...@pobox.com>
Date: Sun, 13 Sep 2020 20:49:06 -0500
Subject: Goloang: Add customizable ARCH flags via CGO_MACHINE_FLAGS
Adds the option to override Golang's choice of architecture-specific
machine flags with arbitrary values via the environment variable
CGO_MACHINE_FLAGS. Then we supply those via the MACHINE_FLAGS make
variable fed from CONFIG_MACHINE_FLAGS from .config.
Signed-off-by: Daniel Santos <daniel.san...@pobox.com>
---
lang/golang/golang-package.mk | 1 +
lang/golang/golang-values.mk | 2 +-
...GS-to-override-hard-coded-arch-flags.patch | 28 +++++++++++++++++++
3 files changed, 30 insertions(+), 1 deletion(-)
create mode 100644 lang/golang/golang/patches/400-Add-CGO_MACHINE_FLAGS-to-override-hard-coded-arch-flags.patch
diff --git a/lang/golang/golang-package.mk b/lang/golang/golang-package.mk
index 73c6572a9..e3bbab6bc 100644
--- a/lang/golang/golang-package.mk
+++ b/lang/golang/golang-package.mk
@@ -154,6 +154,7 @@ define GoPackage/Environment/Default
GOMIPS=$(GO_MIPS) \
GOMIPS64=$(GO_MIPS64) \
CGO_ENABLED=1 \
+ CGO_MACHINE_FLAGS="$(MACHINE_FLAGS)" \
CGO_CFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CFLAGS))" \
CGO_CPPFLAGS="$(TARGET_CPPFLAGS)" \
CGO_CXXFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CXXFLAGS))"
diff --git a/lang/golang/golang-values.mk b/lang/golang/golang-values.mk
index 8989a1af4..a5a8c9502 100644
--- a/lang/golang/golang-values.mk
+++ b/lang/golang/golang-values.mk
@@ -16,7 +16,7 @@ unexport \
GOARCH GOBIN GOCACHE GOFLAGS GOHOSTARCH GOOS GOPATH GORACE GOROOT GOTMPDIR GCCGO \
GOGC GODEBUG GOMAXPROCS GOTRACEBACK \
CGO_ENABLED \
- CGO_CFLAGS CGO_CFLAGS_ALLOW CGO_CFLAGS_DISALLOW \
+ CGO_CFLAGS CGO_CFLAGS_ALLOW CGO_CFLAGS_DISALLOW CGO_MACHINE_FLAGS \
CGO_CPPFLAGS CGO_CPPFLAGS_ALLOW CGO_CPPFLAGS_DISALLOW \
CGO_CXXFLAGS CGO_CXXFLAGS_ALLOW CGO_CXXFLAGS_DISALLOW \
CGO_FFLAGS CGO_FFLAGS_ALLOW CGO_FFLAGS_DISALLOW \
diff --git a/lang/golang/golang/patches/400-Add-CGO_MACHINE_FLAGS-to-override-hard-coded-arch-flags.patch b/lang/golang/golang/patches/400-Add-CGO_MACHINE_FLAGS-to-override-hard-coded-arch-flags.patch
new file mode 100644
index 000000000..377c0a447
--- /dev/null
+++ b/lang/golang/golang/patches/400-Add-CGO_MACHINE_FLAGS-to-override-hard-coded-arch-flags.patch
@@ -0,0 +1,28 @@
+From 6a5ab9c65b1930377d42b9ffeea93684586685ef Mon Sep 17 00:00:00 2001
+From: Daniel Santos <daniel.san...@pobox.com>
+Date: Sun, 13 Sep 2020 20:45:55 -0500
+Subject: Add CGO_MACHINE_FLAGS to override hard-coded flags
+
+Adds CGO_MACHINE_FLAGS to add a mechanism to correct machine flags when
+the hard-coded ones chosen by Google are wrong or sub-optimal.
+---
+ src/cmd/go/internal/work/exec.go | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go
+index 892e3cb500..6fa050fd38 100644
+--- a/src/cmd/go/internal/work/exec.go
++++ b/src/cmd/go/internal/work/exec.go
+@@ -2400,6 +2400,9 @@ func (b *Builder) gccSupportsFlag(compiler []string, flag string) bool {
+
+ // gccArchArgs returns arguments to pass to gcc based on the architecture.
+ func (b *Builder) gccArchArgs() []string {
++ if af := os.Getenv("CGO_MACHINE_FLAGS"); af != "" {
++ return strings.Fields(af)
++ }
+ switch cfg.Goarch {
+ case "386":
+ return []string{"-m32"}
+--
+2.24.1
+
--
2.24.1
>From 985f3a6cc0c9fe69e441f17dfb6fcc77fbef68a9 Mon Sep 17 00:00:00 2001
From: Daniel Santos <daniel.san...@pobox.com>
Date: Sun, 13 Sep 2020 22:31:14 -0500
Subject: Add MACHINE_FLAGS for use by Golang
This splits up the DEFAULT_CFLAGS --> TARGET_OPTIMIZATIONS flag
generation process, separating out the machine-specific flags. This is
currently only used in a Golang patch to better control how CGo
generates code.
Signed-off-by: Daniel Santos <daniel.san...@pobox.com>
---
include/target.mk | 5 +++--
rules.mk | 1 +
scripts/metadata.pm | 1 +
scripts/target-metadata.pl | 10 ++++++++++
toolchain/Config.in | 7 +++++++
5 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/include/target.mk b/include/target.mk
index 48c664d72d..3189822c96 100644
--- a/include/target.mk
+++ b/include/target.mk
@@ -162,7 +162,6 @@ LINUX_RECONF_DIFF = $(call __linux_confcmd,$(filter-out $(LINUX_RECONFIG_TARGET)
ifeq ($(DUMP),1)
BuildTarget=$(BuildTargets/DumpCurrent)
- CPU_CFLAGS = -Os -pipe
ifneq ($(findstring mips,$(ARCH)),)
ifneq ($(findstring mips64,$(ARCH)),)
CPU_TYPE ?= mips64
@@ -215,7 +214,8 @@ ifeq ($(DUMP),1)
$(warning CPU_TYPE "$(CPU_TYPE)" doesn't correspond to a known type)
endif
endif
- DEFAULT_CFLAGS=$(strip $(CPU_CFLAGS) $(CPU_CFLAGS_$(CPU_TYPE)) $(CPU_CFLAGS_$(CPU_SUBTYPE)))
+ DEFAULT_MACHINE_FLAGS=$(strip $(CPU_CFLAGS) $(CPU_CFLAGS_$(CPU_TYPE)) $(CPU_CFLAGS_$(CPU_SUBTYPE)))
+ DEFAULT_CFLAGS=$(strip -Os -pipe $(DEFAULT_MACHINE_FLAGS))
ifneq ($(BOARD),)
TMP_CONFIG:=$(TMP_DIR)/.kconfig-$(call target_conf,$(TARGETID))
@@ -284,6 +284,7 @@ define BuildTargets/DumpCurrent
echo 'Target-Features: $(FEATURES)'; \
echo 'Target-Depends: $(DEPENDS)'; \
echo 'Target-Optimization: $(if $(CFLAGS),$(CFLAGS),$(DEFAULT_CFLAGS))'; \
+ echo 'Target-Machine-Flags: $(if $(MACHINE_FLAGS),$(MACHINE_FLAGS),$(DEFAULT_MACHINE_FLAGS))'; \
echo 'CPU-Type: $(CPU_TYPE)$(if $(CPU_SUBTYPE),+$(CPU_SUBTYPE))'; \
echo 'Linux-Version: $(LINUX_VERSION)'; \
$(if $(LINUX_TESTING_VERSION),echo 'Linux-Testing-Version: $(LINUX_TESTING_VERSION)';) \
diff --git a/rules.mk b/rules.mk
index 80cb3d63f4..ae005b055e 100644
--- a/rules.mk
+++ b/rules.mk
@@ -65,6 +65,7 @@ ARCH_PACKAGES:=$(call qstrip,$(CONFIG_TARGET_ARCH_PACKAGES))
BOARD:=$(call qstrip,$(CONFIG_TARGET_BOARD))
SUBTARGET:=$(call qstrip,$(CONFIG_TARGET_SUBTARGET))
TARGET_OPTIMIZATION:=$(call qstrip,$(CONFIG_TARGET_OPTIMIZATION))
+MACHINE_FLAGS:=$(call qstrip,$(CONFIG_MACHINE_FLAGS))
export EXTRA_OPTIMIZATION:=$(filter-out -fno-plt,$(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION)))
TARGET_SUFFIX=$(call qstrip,$(CONFIG_TARGET_SUFFIX))
BUILD_SUFFIX:=$(call qstrip,$(CONFIG_BUILD_SUFFIX))
diff --git a/scripts/metadata.pm b/scripts/metadata.pm
index 1826a040a1..0d5eb73f3c 100644
--- a/scripts/metadata.pm
+++ b/scripts/metadata.pm
@@ -129,6 +129,7 @@ sub parse_target_metadata($) {
/^Target-Depends:\s*(.+)\s*$/ and $target->{depends} = [ split(/\s+/, $1) ];
/^Target-Description:/ and $target->{desc} = get_multiline(*FILE);
/^Target-Optimization:\s*(.+)\s*$/ and $target->{cflags} = $1;
+ /^Target-Machine-Flags:\s*(.+)\s*$/ and $target->{machine_flags} = $1;
/^CPU-Type:\s*(.+)\s*$/ and $target->{cputype} = $1;
/^Linux-Version:\s*(.+)\s*$/ and $target->{version} = $1;
/^Linux-Testing-Version:\s*(.+)\s*$/ and $target->{testing_version} = $1;
diff --git a/scripts/target-metadata.pl b/scripts/target-metadata.pl
index ee0ab5a718..c5fb1825b9 100755
--- a/scripts/target-metadata.pl
+++ b/scripts/target-metadata.pl
@@ -380,6 +380,16 @@ EOF
print "\tdefault \"-Os -pipe -funit-at-a-time\"\n";
print <<EOF;
+config DEFAULT_MACHINE_FLAGS
+ string
+EOF
+ foreach my $target (@target) {
+ next if @{$target->{subtargets}} > 0;
+ print "\tdefault \"".$target->{machine_flags}."\" if TARGET_".$target->{conf}."\n";
+ }
+ print "\tdefault \"\"\n";
+ print <<EOF;
+
config CPU_TYPE
string
EOF
diff --git a/toolchain/Config.in b/toolchain/Config.in
index 3fac05a01a..b1c2772aac 100644
--- a/toolchain/Config.in
+++ b/toolchain/Config.in
@@ -37,6 +37,13 @@ menuconfig TARGET_OPTIONS
Most people will answer N.
+ config MACHINE_FLAGS
+ string "Target machine flags (TODO: improve)" if TARGET_OPTIONS
+ default DEFAULT_MACHINE_FLAGS
+ help
+ (TODO: improve) Machine-specific GCC flags for target. This
+ is currently only used by Golang via the CGO_MACHINE_FLAGS
+ environment variable.
menuconfig EXTERNAL_TOOLCHAIN
bool
--
2.24.1
--- End Message ---