Skip to contentSkip to conversation

Fix target cflags for gcc cross builds

PATCH In review Peter Seebach 3 participants 5 messages Jan 14, 2016

lore
Share & tools
lore
#0 lore raw

cover Fix target cflags for gcc cross builds

In some cases, CFLAGS_FOR_TARGET may need to have tune-specific compiler flags, particularly if you're trying to build a multilib compiler which won't automatically pick the right ABI, bit size, etc. by default if invoked without them. After some experimentation and thought, I concluded that cross gcc should use these in CFLAGS_FOR_TARGET, but crosssdk shouldn't. This appears to work, at least for the reasonably obvious cases.

We did this back in November, and I thought I submitted it then, but apparently the email never made it out. Rebased against current master.

The following changes since commit 541315d6c56df6448f64c262f99d43d5c1e9400b:

update_font_cache: only scan system font directories (2016-01-11 23:23:18 +0000)

are available in the git repository at:

git://git.yoctoproject.org/poky-contrib seebs/gcc_target_args
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=seebs/gcc_target_args

Peter Seebach (1):
Use TUNE_CCARGS for target compilation

 meta/classes/crosssdk.bbclass                      | 4 ++++
 meta/recipes-devtools/gcc/gcc-configure-common.inc | 2 +-
 meta/recipes-devtools/gcc/gcc-cross.inc            | 2 +-
 3 files changed, 6 insertions(+), 2 deletions(-)
Signature · 1 line
2.3.1
#1 lore raw

PATCH 1/1 Use TUNE_CCARGS for target compilation

The initial gcc configuration is using TARGET_CFLAGS, but this is probably not what is intended, because TARGET_CFLAGS doesn't include any architecture-specific flags.

For PPC64, it's possible to end up with gcc configured to pass -a64 to the assembler, but be itself getting invoked without -m64, which can result in alignment problems in generated code. Solution: Instead of setting CFLAGS_FOR_TARGET to TARGET_CFLAGS, set it to TARGET_CFLAGS + TUNE_CCARGS.

However, for crosssdk cases, we need to prevent that from having any effect; this can be done by emptying out the TUNE_*ARGS flags in the crosssdk bbclass, because there is no "target tune" in crosssdk cases.

---
 meta/classes/crosssdk.bbclass                      | 4 ++++
 meta/recipes-devtools/gcc/gcc-configure-common.inc | 2 +-
 meta/recipes-devtools/gcc/gcc-cross.inc            | 2 +-
 3 files changed, 6 insertions(+), 2 deletions(-)
meta/classes/crosssdk.bbclass +4 -0
index 7315c38..ccff3ce 100644
@@ -6,6 +6,10 @@ PACKAGE_ARCH = "${SDK_ARCH}"
 python () {
 	# set TUNE_PKGARCH to SDK_ARCH
 	d.setVar('TUNE_PKGARCH', d.getVar('SDK_ARCH', True))
+	# We're not running a 'target', so clear these...
+	d.setVar('TUNE_CCARGS', '')
+	d.setVar('TUNE_LDARGS', '')
+	d.setVar('TUNE_ASARGS', '')
 }
 
 STAGING_DIR_TARGET = "${STAGING_DIR}/${SDK_ARCH}-${SDKPKGSUFFIX}${SDK_VENDOR}-${SDK_OS}"
meta/recipes-devtools/gcc/gcc-configure-common.inc +1 -1
index 45b3f15..4b4d91d 100644
@@ -120,7 +120,7 @@ do_configure () {
 	export CPPFLAGS_FOR_BUILD="${BUILD_CPPFLAGS}"
 	export CXXFLAGS_FOR_BUILD="${BUILD_CXXFLAGS}"
 	export LDFLAGS_FOR_BUILD="${BUILD_LDFLAGS}"
-	export CFLAGS_FOR_TARGET="${TARGET_CFLAGS}"
+	export CFLAGS_FOR_TARGET="${TARGET_CFLAGS} ${TUNE_CCARGS}"
 	export CPPFLAGS_FOR_TARGET="${TARGET_CPPFLAGS}"
 	export CXXFLAGS_FOR_TARGET="${TARGET_CXXFLAGS}"
 	export LDFLAGS_FOR_TARGET="${TARGET_LDFLAGS}"
meta/recipes-devtools/gcc/gcc-cross.inc +1 -1
index aa10633..b6020a4 100644
@@ -43,7 +43,7 @@ do_compile () {
 	export LD_FOR_TARGET="${TARGET_SYS}-ld"
 	export NM_FOR_TARGET="${TARGET_SYS}-nm"
 	export CC_FOR_TARGET="${CCACHE} ${TARGET_SYS}-gcc"
-	export CFLAGS_FOR_TARGET="${TARGET_CFLAGS}"
+	export CFLAGS_FOR_TARGET="${TARGET_CFLAGS} ${TUNE_CCARGS}"
 	export CPPFLAGS_FOR_TARGET="${TARGET_CPPFLAGS}"
 	export CXXFLAGS_FOR_TARGET="${TARGET_CXXFLAGS}"
 	export LDFLAGS_FOR_TARGET="${TARGET_LDFLAGS}"
Signature · 1 line
2.3.1
#2 lore raw

Re: [PATCH 1/1] Use TUNE_CCARGS for target compilation

Hi Peter,

Quoted 3 lines · Peter Seebach

The initial gcc configuration is using TARGET_CFLAGS, but this is probably not what is intended, because TARGET_CFLAGS doesn't include any architecture-specific flags.

I think the current behaviour is deliberate, in order to try to make it possible to reuse gcc binaries across builds for machines with different CPU tuning flags.

See the comments associated with this commit from 2014, which effectively makes all ARM toolchains default to soft float (instead of defaulting to fpu calling convention of the target machine).

http://git.openembedded.org/openembedded-core/commit/?id=ce1f3fd20d81545d6d5dfc68f86f9fddf8ac9bbf

Quoted 4 lines

For PPC64, it's possible to end up with gcc configured to pass -a64 to the assembler, but be itself getting invoked without -m64, which can result in alignment problems in generated code. Solution: Instead of setting CFLAGS_FOR_TARGET to TARGET_CFLAGS, set it to TARGET_CFLAGS + TUNE_CCARGS.

Could that PPC64 issue be solved in the same way that the default arch is set in gcc-configure-common.inc for the various MIPS targets?

EXTRA_OECONF_append_mips64 = " --with-abi=64 --with-arch-64=mips64
--with-tune-64=mips64"
EXTRA_OECONF_append_mips64el = " --with-abi=64 --with-arch-64=mips64
--with-tune-64=mips64"
EXTRA_OECONF_append_mips64n32 = " --with-abi=64
--with-arch-64=mips64 --with-tune-64=mips64"
EXTRA_OECONF_append_mips64eln32 = " --with-abi=64
--with-arch-64=mips64 --with-tune-64=mips64"

Quoted 60 lines

However, for crosssdk cases, we need to prevent that from having any effect; this can be done by emptying out the TUNE_*ARGS flags in the crosssdk bbclass, because there is no "target tune" in crosssdk cases.

---
 meta/classes/crosssdk.bbclass                      | 4 ++++
 meta/recipes-devtools/gcc/gcc-configure-common.inc | 2 +-
 meta/recipes-devtools/gcc/gcc-cross.inc            | 2 +-
 3 files changed, 6 insertions(+), 2 deletions(-)
meta/classes/crosssdk.bbclass +4 -0
index 7315c38..ccff3ce 100644
@@ -6,6 +6,10 @@ PACKAGE_ARCH = "${SDK_ARCH}"
 python () {
        # set TUNE_PKGARCH to SDK_ARCH
        d.setVar('TUNE_PKGARCH', d.getVar('SDK_ARCH', True))
+       # We're not running a 'target', so clear these...
+       d.setVar('TUNE_CCARGS', '')
+       d.setVar('TUNE_LDARGS', '')
+       d.setVar('TUNE_ASARGS', '')
 }
 
 STAGING_DIR_TARGET = "${STAGING_DIR}/${SDK_ARCH}-${SDKPKGSUFFIX}${SDK_VENDOR}-${SDK_OS}"
meta/recipes-devtools/gcc/gcc-configure-common.inc +1 -1
index 45b3f15..4b4d91d 100644
@@ -120,7 +120,7 @@ do_configure () {
        export CPPFLAGS_FOR_BUILD="${BUILD_CPPFLAGS}"
        export CXXFLAGS_FOR_BUILD="${BUILD_CXXFLAGS}"
        export LDFLAGS_FOR_BUILD="${BUILD_LDFLAGS}"
-       export CFLAGS_FOR_TARGET="${TARGET_CFLAGS}"
+       export CFLAGS_FOR_TARGET="${TARGET_CFLAGS} ${TUNE_CCARGS}"
        export CPPFLAGS_FOR_TARGET="${TARGET_CPPFLAGS}"
        export CXXFLAGS_FOR_TARGET="${TARGET_CXXFLAGS}"
        export LDFLAGS_FOR_TARGET="${TARGET_LDFLAGS}"
meta/recipes-devtools/gcc/gcc-cross.inc +1 -2
index aa10633..b6020a4 100644
@@ -43,7 +43,7 @@ do_compile () {
        export LD_FOR_TARGET="${TARGET_SYS}-ld"
        export NM_FOR_TARGET="${TARGET_SYS}-nm"
        export CC_FOR_TARGET="${CCACHE} ${TARGET_SYS}-gcc"
-       export CFLAGS_FOR_TARGET="${TARGET_CFLAGS}"
+       export CFLAGS_FOR_TARGET="${TARGET_CFLAGS} ${TUNE_CCARGS}"
        export CPPFLAGS_FOR_TARGET="${TARGET_CPPFLAGS}"
        export CXXFLAGS_FOR_TARGET="${TARGET_CXXFLAGS}"
        export LDFLAGS_FOR_TARGET="${TARGET_LDFLAGS}"
--

2.3.1

--
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core

#3 lore raw

Re: [PATCH 1/1] Use TUNE_CCARGS for target compilation

Quoted 2 lines · On Thu, 14 Jan 2016 13:24:22 -0800 Andre McCurdy <[email protected]> wrote:

Could that PPC64 issue be solved in the same way that the default arch is set in gcc-configure-common.inc for the various MIPS targets?

Huh. That might be a better choice. I hadn't noticed that default arch selection thing. It would make sense to use that. I'll give it a look and see whether it works.

-s

Signature · 1 line
Listen, get this.  Nobody with a good compiler needs to be justified.
#4 lore raw

Re: [PATCH 1/1] Use TUNE_CCARGS for target compilation

In reply to Andre McCurdy
Quoted 26 lines · Andre McCurdy

Hi Peter,

Quoted 3 lines · Peter Seebach

The initial gcc configuration is using TARGET_CFLAGS, but this is probably not what is intended, because TARGET_CFLAGS doesn't include any architecture-specific flags.

I think the current behaviour is deliberate, in order to try to make it possible to reuse gcc binaries across builds for machines with different CPU tuning flags.

See the comments associated with this commit from 2014, which effectively makes all ARM toolchains default to soft float (instead of defaulting to fpu calling convention of the target machine).

http://git.openembedded.org/openembedded-core/commit/?id=ce1f3fd20d81545d6d5dfc68f86f9fddf8ac9bbf

Quoted 4 lines

For PPC64, it's possible to end up with gcc configured to pass -a64 to the assembler, but be itself getting invoked without -m64, which can result in alignment problems in generated code. Solution: Instead of setting CFLAGS_FOR_TARGET to TARGET_CFLAGS, set it to TARGET_CFLAGS + TUNE_CCARGS.

Could that PPC64 issue be solved in the same way that the default arch is set in gcc-configure-common.inc for the various MIPS targets?

Quoted 8 lines

EXTRA_OECONF_append_mips64 = " --with-abi=64 --with-arch-64=mips64
--with-tune-64=mips64"
EXTRA_OECONF_append_mips64el = " --with-abi=64 --with-arch-64=mips64
--with-tune-64=mips64"
EXTRA_OECONF_append_mips64n32 = " --with-abi=64
--with-arch-64=mips64 --with-tune-64=mips64"
EXTRA_OECONF_append_mips64eln32 = " --with-abi=64
--with-arch-64=mips64 --with-tune-64=mips64"

The issue Peter was working on is specific to building something that runs on the host. (or the hostsdk machine).

The problem is, if you are building for a target that say needs -mpowerpc. That won't work when you pass it to the compiler building an x86_64 target binary.

So in the crosssdk case (host to -sdk- target) we clear the TUNE_*ARGS since they are not relevant.

Then int he main gcc setup, we manually setup the target CCFLAGS to include the tune elements so when NOT in the crosssdk, they will be properly included and build the -target- pieces with the correct options. (target pieces such as the .o files gcc needs to produce.)

--Mark

Quoted 61 lines
Quoted 61 lines

However, for crosssdk cases, we need to prevent that from having any effect; this can be done by emptying out the TUNE_*ARGS flags in the crosssdk bbclass, because there is no "target tune" in crosssdk cases.

---
 meta/classes/crosssdk.bbclass                      | 4 ++++
 meta/recipes-devtools/gcc/gcc-configure-common.inc | 2 +-
 meta/recipes-devtools/gcc/gcc-cross.inc            | 2 +-
 3 files changed, 6 insertions(+), 2 deletions(-)
meta/classes/crosssdk.bbclass +4 -0
index 7315c38..ccff3ce 100644
@@ -6,6 +6,10 @@ PACKAGE_ARCH = "${SDK_ARCH}"
 python () {
        # set TUNE_PKGARCH to SDK_ARCH
        d.setVar('TUNE_PKGARCH', d.getVar('SDK_ARCH', True))
+       # We're not running a 'target', so clear these...
+       d.setVar('TUNE_CCARGS', '')
+       d.setVar('TUNE_LDARGS', '')
+       d.setVar('TUNE_ASARGS', '')
 }
 
 STAGING_DIR_TARGET = "${STAGING_DIR}/${SDK_ARCH}-${SDKPKGSUFFIX}${SDK_VENDOR}-${SDK_OS}"
meta/recipes-devtools/gcc/gcc-configure-common.inc +1 -1
index 45b3f15..4b4d91d 100644
@@ -120,7 +120,7 @@ do_configure () {
        export CPPFLAGS_FOR_BUILD="${BUILD_CPPFLAGS}"
        export CXXFLAGS_FOR_BUILD="${BUILD_CXXFLAGS}"
        export LDFLAGS_FOR_BUILD="${BUILD_LDFLAGS}"
-       export CFLAGS_FOR_TARGET="${TARGET_CFLAGS}"
+       export CFLAGS_FOR_TARGET="${TARGET_CFLAGS} ${TUNE_CCARGS}"
        export CPPFLAGS_FOR_TARGET="${TARGET_CPPFLAGS}"
        export CXXFLAGS_FOR_TARGET="${TARGET_CXXFLAGS}"
        export LDFLAGS_FOR_TARGET="${TARGET_LDFLAGS}"
meta/recipes-devtools/gcc/gcc-cross.inc +1 -2
index aa10633..b6020a4 100644
@@ -43,7 +43,7 @@ do_compile () {
        export LD_FOR_TARGET="${TARGET_SYS}-ld"
        export NM_FOR_TARGET="${TARGET_SYS}-nm"
        export CC_FOR_TARGET="${CCACHE} ${TARGET_SYS}-gcc"
-       export CFLAGS_FOR_TARGET="${TARGET_CFLAGS}"
+       export CFLAGS_FOR_TARGET="${TARGET_CFLAGS} ${TUNE_CCARGS}"
        export CPPFLAGS_FOR_TARGET="${TARGET_CPPFLAGS}"
        export CXXFLAGS_FOR_TARGET="${TARGET_CXXFLAGS}"
        export LDFLAGS_FOR_TARGET="${TARGET_LDFLAGS}"
--

2.3.1

--
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core