Skip to contentSkip to conversation

FPU POST: fix warnings when building with 2.18 binutils

PATCH New Yuri Tikhonov 2 participants 2 messages Dec 20, 2008 – Jan 24, 2009

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 FPU POST: fix warnings when building with 2.18 binutils

When compile u-boot with the 2.18 binutils the following warning messages for each object file in post/lib_ppc/fpu/ is produced at the linking stage:

post/libpost.a(acc1.o) uses hard float, u-boot uses soft-float
...

This is because of the fact that, in general, the soft-float and hard-float ABIs are incompatible; the 2.18 binutils do checking of the Tag_GNU_Power_ABI_FP attribute of the files to be linked, and produce the worning like above if these are not compatible.

The incompatibility of ABIs is concerned only the float values:
e.g. the soft-float ABI assumes the float argument passing in the pair of rX registers, and the hard-float ABI assumes passing of the float argument in the fX register. When we don't pass the float arguments between the functions compiled with different floatness, then such an application will work correctly.
This is the case for the FPU POST: u-boot (compiled with soft-float) doesn't pass to (and doesn't get from) the FPU POST functions any floats; there are no functions exported from the post/lib_ppc/fpu/ objects which would work with float parameters/returns too. So, we can reassure the linker not to worry about the difference in ABI attributes of linking files just by setting the 'soft-float' attribute for the objects in post/lib_ppc/fpu. And this patch does this.

Also, to avoid passing both soft- and hard-float options in CFLAGS when compiling the files from post/lib_ppc/fpu (which is OK, but looks rather dirty) this patch removes the soft-float string from CFLAGS in post/lib_ppc/fpu/Makefile.

---
 include/post.h                            |   13 +++++++++++++
 post/lib_ppc/fpu/20001122-1.c             |    2 ++
 post/lib_ppc/fpu/20010114-2.c             |    2 ++
 post/lib_ppc/fpu/20010226-1.c             |    2 ++
 post/lib_ppc/fpu/980619-1.c               |    2 ++
 post/lib_ppc/fpu/Makefile                 |    1 +
 post/lib_ppc/fpu/acc1.c                   |    2 ++
 post/lib_ppc/fpu/compare-fp-1.c           |    2 ++
 post/lib_ppc/fpu/fpu.c                    |    2 ++
 post/lib_ppc/fpu/mul-subnormal-single-1.c |    2 ++
 10 files changed, 30 insertions(+), 0 deletions(-)
include/post.h +13 -0
index 97583b7..fe96312 100644
@@ -80,6 +80,19 @@ extern struct post_test post_list[];
 extern unsigned int post_list_size;
 extern int post_hotkeys_pressed(void);
 
+/*
+ *  If GCC is configured to use a version of GAS that supports
+ * the .gnu_attribute directive, it will use that directive to
+ * record certain properties of the output code.
+ *  This feature is new to GCC 4.3.0.
+ *  .gnu_attribute is new to GAS 2.18.
+ */
+#if (__GNUC__ >= 4 && __GNUC_MINOR__ >= 3)
+/* Tag_GNU_Power_ABI_FP/soft-float */
+#define GNU_FPOST_ATTR	asm(".gnu_attribute	4, 2");
+#else
+#define GNU_FPOST_ATTR
+#endif /* __GNUC__ */
 #endif /* __ASSEMBLY__ */
 
 #define CONFIG_SYS_POST_RTC		0x00000001
post/lib_ppc/fpu/20001122-1.c +2 -0
index a8537fa..bef80c5 100644
@@ -30,6 +30,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 int fpu_post_test_math1 (void)
 {
 	volatile double a, *p;
post/lib_ppc/fpu/20010114-2.c +2 -0
index 91e3631..ee564e8 100644
@@ -30,6 +30,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 static float rintf (float x)
 {
 	volatile float TWO23 = 8388608.0;
post/lib_ppc/fpu/20010226-1.c +2 -0
index b00386b..099ca4a 100644
@@ -30,6 +30,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 int fpu_post_test_math3 (void)
 {
 	volatile long double dfrom = 1.1;
post/lib_ppc/fpu/980619-1.c +2 -0
index ceb2b76..46a31ae 100644
@@ -30,6 +30,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 int fpu_post_test_math4 (void)
 {
 	volatile float reale = 1.0f;
post/lib_ppc/fpu/Makefile +1 -0
index db43593..a681539 100644
@@ -29,4 +29,5 @@ COBJS-$(CONFIG_HAS_POST)	+= acc1.o compare-fp-1.o mul-subnormal-single-1.o
 
 include $(TOPDIR)/post/rules.mk
 
+CFLAGS := $(shell echo $(CFLAGS) | sed s/-msoft-float//)
 CFLAGS += -mhard-float -fkeep-inline-functions
post/lib_ppc/fpu/acc1.c +2 -0
index 8a65193..9fca9b3 100644
@@ -30,6 +30,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 static double func (const double *array)
 {
 	double d = *array;
post/lib_ppc/fpu/compare-fp-1.c +2 -0
index ab47657..f836b29 100644
@@ -32,6 +32,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 static int failed;
 
 #define TEST(c) if ((c) != ok) failed++
post/lib_ppc/fpu/fpu.c +2 -0
index 846b76d..3f3adea 100644
@@ -40,6 +40,8 @@
 
 #include <watchdog.h>
 
+GNU_FPOST_ATTR
+
 extern int fpu_status (void);
 extern void fpu_enable (void);
 extern void fpu_disable (void);
post/lib_ppc/fpu/mul-subnormal-single-1.c +2 -0
index 9c514e1..1f3732d 100644
@@ -32,6 +32,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 union uf
 {
 	unsigned int u;
Signature · 1 line
1.6.0.4
#1 lore raw

PATCH 1/1 FPU POST: fix warnings when building with 2.18 binutils

Dear Yuri Tikhonov,

Quoted 34 lines · In message <[email protected]> you wrote:

When compile u-boot with the 2.18 binutils the following warning messages for each object file in post/lib_ppc/fpu/ is produced at the linking stage:

post/libpost.a(acc1.o) uses hard float, u-boot uses soft-float
...

This is because of the fact that, in general, the soft-float and hard-float ABIs are incompatible; the 2.18 binutils do checking of the Tag_GNU_Power_ABI_FP attribute of the files to be linked, and produce the worning like above if these are not compatible.

The incompatibility of ABIs is concerned only the float values:
e.g. the soft-float ABI assumes the float argument passing in the pair of rX registers, and the hard-float ABI assumes passing of the float argument in the fX register. When we don't pass the float arguments between the functions compiled with different floatness, then such an application will work correctly.
This is the case for the FPU POST: u-boot (compiled with soft-float) doesn't pass to (and doesn't get from) the FPU POST functions any floats; there are no functions exported from the post/lib_ppc/fpu/ objects which would work with float parameters/returns too. So, we can reassure the linker not to worry about the difference in ABI attributes of linking files just by setting the 'soft-float' attribute for the objects in post/lib_ppc/fpu. And this patch does this.

Also, to avoid passing both soft- and hard-float options in CFLAGS when compiling the files from post/lib_ppc/fpu (which is OK, but looks rather dirty) this patch removes the soft-float string from CFLAGS in post/lib_ppc/fpu/Makefile.

Quoted 12 lines
---
 include/post.h                            |   13 +++++++++++++
 post/lib_ppc/fpu/20001122-1.c             |    2 ++
 post/lib_ppc/fpu/20010114-2.c             |    2 ++
 post/lib_ppc/fpu/20010226-1.c             |    2 ++
 post/lib_ppc/fpu/980619-1.c               |    2 ++
 post/lib_ppc/fpu/Makefile                 |    1 +
 post/lib_ppc/fpu/acc1.c                   |    2 ++
 post/lib_ppc/fpu/compare-fp-1.c           |    2 ++
 post/lib_ppc/fpu/fpu.c                    |    2 ++
 post/lib_ppc/fpu/mul-subnormal-single-1.c |    2 ++
 10 files changed, 30 insertions(+), 0 deletions(-)

Applied, thanks.

Best regards,

Wolfgang Denk

Signature · 4 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
It is much easier to suggest solutions when you know nothing