diff mbox series

[RFC,v2,2/2] package/qt5webengine: fix chromium arm compile flags

Message ID 20200302091926.19308-2-ps.report@gmx.net
State Superseded
Headers show
Series None | expand

Commit Message

Peter Seiderer March 2, 2020, 9:19 a.m. UTC
The qt5webengine configure simple takes QT_ARCH ('arm') to determine the
chromium compiler flags and uses some hard coded ARMv7 default values
for the compiler command line: '... -march=armv7-a -mfloat-abi=hard
-mtune=generic-armv7-a -mfpu=vfpv3-d16 ...'.

This results e.g. in an illegal instruction failure for rpi zero
(reported on the mailing list, see [1]).

Custom values could be set in the file src/3rdparty/chromium/build/config/arm.gni
(as tested by an proof-of-concept patch [2]).

[1] http://lists.busybox.net/pipermail/buildroot/2020-February/274587.html
[2] http://lists.busybox.net/pipermail/buildroot/2020-February/274586.html

Signed-off-by: Peter Seiderer <ps.report@gmx.net>
---
Changes v1 -> v2:
  - use new introduced BR2_GCC_TARGET_ARCH for arm_arch as the
    previous simple approach did not work (alternative would
    be to extract the arch at runtime via gcc invocation)

package/qt5/qt5webengine: fix chromium arm compile flags (change to BR2_GCC_TARGET_ARCH)

Signed-off-by: Peter Seiderer <ps.report@gmx.net>
---
 package/qt5/qt5webengine/qt5webengine.mk | 69 ++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

Comments

Thomas Petazzoni March 2, 2020, 1:30 p.m. UTC | #1
On Mon,  2 Mar 2020 10:19:26 +0100
Peter Seiderer <ps.report@gmx.net> wrote:

> The qt5webengine configure simple takes QT_ARCH ('arm') to determine the
> chromium compiler flags and uses some hard coded ARMv7 default values
> for the compiler command line: '... -march=armv7-a -mfloat-abi=hard
> -mtune=generic-armv7-a -mfpu=vfpv3-d16 ...'.
> 
> This results e.g. in an illegal instruction failure for rpi zero
> (reported on the mailing list, see [1]).
> 
> Custom values could be set in the file src/3rdparty/chromium/build/config/arm.gni
> (as tested by an proof-of-concept patch [2]).
> 
> [1] http://lists.busybox.net/pipermail/buildroot/2020-February/274587.html
> [2] http://lists.busybox.net/pipermail/buildroot/2020-February/274586.html
> 
> Signed-off-by: Peter Seiderer <ps.report@gmx.net>

Could we instead ask this thing to not do all this sorcery, and instead
just use the compiler as-is, without passing crazy
architecture-specific compiler flags ?

Thomas
Peter Seiderer March 2, 2020, 10:01 p.m. UTC | #2
Hello Thomas,

On Mon, 2 Mar 2020 14:30:07 +0100, Thomas Petazzoni <thomas.petazzoni@bootlin.com> wrote:

> On Mon,  2 Mar 2020 10:19:26 +0100
> Peter Seiderer <ps.report@gmx.net> wrote:
>
> > The qt5webengine configure simple takes QT_ARCH ('arm') to determine the
> > chromium compiler flags and uses some hard coded ARMv7 default values
> > for the compiler command line: '... -march=armv7-a -mfloat-abi=hard
> > -mtune=generic-armv7-a -mfpu=vfpv3-d16 ...'.
> >
> > This results e.g. in an illegal instruction failure for rpi zero
> > (reported on the mailing list, see [1]).
> >
> > Custom values could be set in the file src/3rdparty/chromium/build/config/arm.gni
> > (as tested by an proof-of-concept patch [2]).
> >
> > [1] http://lists.busybox.net/pipermail/buildroot/2020-February/274587.html
> > [2] http://lists.busybox.net/pipermail/buildroot/2020-February/274586.html
> >
> > Signed-off-by: Peter Seiderer <ps.report@gmx.net>
>
> Could we instead ask this thing to not do all this sorcery, and instead
> just use the compiler as-is, without passing crazy
> architecture-specific compiler flags ?

Disabled all march/mfloat-abi/mtune/mfpu flags with the following patch:

--- a/src/3rdparty/chromium/build/config/compiler/BUILD.gn
+++ b/src/3rdparty/chromium/build/config/compiler/BUILD.gn
@@ -672,7 +672,7 @@ config("compiler") {
     # TODO(pcc): The contents of .ARM.attributes should be based on the
     # -march flag passed at compile time (see llvm.org/pr36291).
     if (current_cpu == "arm") {
-      ldflags += [ "-march=$arm_arch" ]
+#      ldflags += [ "-march=$arm_arch" ]
     }
   }

@@ -752,13 +752,13 @@ config("compiler_cpu_abi") {
         ldflags += [ "--target=arm-linux-gnueabihf" ]
       }
       if (!is_nacl) {
-        cflags += [
-          "-march=$arm_arch",
-          "-mfloat-abi=$arm_float_abi",
-        ]
+#        cflags += [
+#          "-march=$arm_arch",
+#          "-mfloat-abi=$arm_float_abi",
+#        ]
       }
       if (arm_tune != "") {
-        cflags += [ "-mtune=$arm_tune" ]
+#        cflags += [ "-mtune=$arm_tune" ]
       }
     } else if (current_cpu == "arm64") {
       if (is_clang && !is_android && !is_nacl && !is_fuchsia) {
@@ -1130,7 +1130,8 @@ config("clang_revision") {

 config("compiler_arm_fpu") {
   if (current_cpu == "arm" && !is_ios && !is_nacl) {
-    cflags = [ "-mfpu=$arm_fpu" ]
+#    cflags = [ "-mfpu=$arm_fpu" ]
+    cflags = [ ]
     asmflags = cflags
   }
 }

Quick (if you call can call it quick with miniumum 50 minutes compile time)
worked for a buildroot toolchain (which defaults to the right cpu) and
the rpi zero testcase..., but now no buildroot specific flags are
used for the compile (no optimize, no custom, no cpu type etc.)...,
will work with compilers with the right default values...

Not sure if other optional compiles depend on the right setting
of one of the arm_... parameters...

Regards,
Peter

>
> Thomas
Thomas Petazzoni March 3, 2020, 8 a.m. UTC | #3
Hello Peter,

On Mon, 2 Mar 2020 23:01:55 +0100
Peter Seiderer <ps.report@gmx.net> wrote:

> > Could we instead ask this thing to not do all this sorcery, and instead
> > just use the compiler as-is, without passing crazy
> > architecture-specific compiler flags ?  
> 
> Disabled all march/mfloat-abi/mtune/mfpu flags with the following patch:

[...]

Thanks for this work! To me this feels like a better solution, even
though it's annoying to maintain such a local patch. I assume there's
pretty much zero chance to get this merged by upstream Chromium, and
then back into the qt5webengine code anyway.

> Quick (if you call can call it quick with miniumum 50 minutes compile time)
> worked for a buildroot toolchain (which defaults to the right cpu) and
> the rpi zero testcase..., but now no buildroot specific flags are
> used for the compile (no optimize, no custom, no cpu type etc.)...,
> will work with compilers with the right default values...

The CPU type is encoded into the compiler wrapper. So it's really only
the optimization/debug flags that you will be missing.

Thomas
diff mbox series

Patch

diff --git a/package/qt5/qt5webengine/qt5webengine.mk b/package/qt5/qt5webengine/qt5webengine.mk
index 898725937b..9596c8f178 100644
--- a/package/qt5/qt5webengine/qt5webengine.mk
+++ b/package/qt5/qt5webengine/qt5webengine.mk
@@ -63,7 +63,76 @@  QT5WEBENGINE_PRE_CONFIGURE_HOOKS += QT5WEBENGINE_CREATE_HOST_PKG_CONFIG
 QT5WEBENGINE_ENV += GN_PKG_CONFIG_HOST=$(@D)/host-bin/host-pkg-config
 endif
 
+# configure arm architecture paramter for chromium compile
+ifeq ($(BR2_arm),y)
+ifeq ($(BR2_ARM_CPU_ARMV4),y)
+define QT5WEBENGINE_CONFIGURE_ARM_VERSION
+	$(SED) 's/^    arm_version = 7$$/    arm_version = 4/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+endif
+
+ifeq ($(BR2_ARM_CPU_ARMV5),y)
+define QT5WEBENGINE_CONFIGURE_ARM_VERSION
+	$(SED) 's/^    arm_version = 7$$/    arm_version = 5/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+endif
+
+ifeq ($(BR2_ARM_CPU_ARMV6),y)
+define QT5WEBENGINE_CONFIGURE_ARM_VERSION
+	$(SED) 's/^    arm_version = 7$$/    arm_version = 6/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+endif
+
+# no entriy for BR2_ARM_CPU_ARMV7A/BR2_ARM_CPU_ARMV7M, arm_vesion = 7 is already set as default
+
+ifeq ($(BR2_ARM_CPU_ARMV8A),y)
+define QT5WEBENGINE_CONFIGURE_ARM_VERSION
+	$(SED) 's/^    arm_version = 7$$/    arm_version = 8/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+endif
+
+define QT5WEBENGINE_CONFIGURE_ARM_ARCH
+	$(SED) 's/^    arm_arch = ""$$/    arm_arch = $(BR2_GCC_TARGET_ARCH)/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+
+define QT5WEBENGINE_CONFIGURE_ARM_FPU
+	$(SED) 's/^    arm_fpu = ""$$/    arm_fpu = $(BR2_GCC_TARGET_FPU)/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+
+define QT5WEBENGINE_CONFIGURE_ARM_FLOAT_ABI
+	$(SED) 's/^    arm_float_abi = ""$$/    arm_float_abi = $(BR2_GCC_TARGET_FLOAT_ABI)/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+
+define QT5WEBENGINE_CONFIGURE_ARM_TUNE
+	$(SED) 's/^    arm_tune = ""$$/    arm_tune = $(BR2_GCC_TARGET_CPU)/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+
+ifeq ($(BR2_ARM_CPU_HAS_NEON),y)
+define QT5WEBENGINE_CONFIGURE_ARM_NEON
+	$(SED) 's/^    arm_use_neon = ""$$/    arm_use_neon = "true"/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+	$(SED) 's/^    arm_optionally_use_neon = false$$/    arm_optionally_use_neon = true/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+else
+define QT5WEBENGINE_CONFIGURE_ARM_NEON
+	$(SED) 's/^    arm_use_neon = ""$$/    arm_use_neon = "false"/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+endif
+
+ifeq ($(BR2_ARM_CPU_HAS_THUMB),)
+define QT5WEBENGINE_CONFIGURE_ARM_THUMB
+	$(SED) 's/^    arm_use_thumb = true$$/    arm_use_thumb = false/' $(@D)/src/3rdparty/chromium/build/config/arm.gni
+endef
+endif
+endif
+
 define QT5WEBENGINE_CONFIGURE_CMDS
+	$(QT5WEBENGINE_CONFIGURE_ARM_VERSION)
+	$(QT5WEBENGINE_CONFIGURE_ARM_ARCH)
+	$(QT5WEBENGINE_CONFIGURE_ARM_FPU)
+	$(QT5WEBENGINE_CONFIGURE_ARM_FLOAT_ABI)
+	$(QT5WEBENGINE_CONFIGURE_ARM_TUNE)
+	$(QT5WEBENGINE_CONFIGURE_ARM_NEON)
+	$(QT5WEBENGINE_CONFIGURE_ARM_THUMB)
 	(cd $(@D); $(TARGET_MAKE_ENV) $(QT5WEBENGINE_ENV) $(HOST_DIR)/bin/qmake $(QT5WEBENGINE_QMAKEFLAGS))
 endef