FPU POST: fix warnings when building with 2.18 binutils
authorYuri Tikhonov <yur@emcraft.com>
Sat, 20 Dec 2008 11:54:21 +0000 (14:54 +0300)
committerWolfgang Denk <wd@denx.de>
Sat, 24 Jan 2009 00:49:41 +0000 (01:49 +0100)
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.

Signed-off-by: Yuri Tikhonov <yur@emcraft.com>
include/post.h
post/lib_ppc/fpu/20001122-1.c
post/lib_ppc/fpu/20010114-2.c
post/lib_ppc/fpu/20010226-1.c
post/lib_ppc/fpu/980619-1.c
post/lib_ppc/fpu/Makefile
post/lib_ppc/fpu/acc1.c
post/lib_ppc/fpu/compare-fp-1.c
post/lib_ppc/fpu/fpu.c
post/lib_ppc/fpu/mul-subnormal-single-1.c

index 97583b7e9a31c87ccd8a82e9911299d79036358f..fe96312cb08b13d076963fb14c963a18a50accd7 100644 (file)
@@ -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
index a8537fa6a196370d4f55f92f21030344b72cbb4c..bef80c5f79e72e660dc81622e24adbfc067906a0 100644 (file)
@@ -30,6 +30,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 int fpu_post_test_math1 (void)
 {
        volatile double a, *p;
index 91e3631d0c48be4adbd54ec672ff12f35a258358..ee564e8d621f439cf15a621aecb00a8bdf8b6f7d 100644 (file)
@@ -30,6 +30,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 static float rintf (float x)
 {
        volatile float TWO23 = 8388608.0;
index b00386b18970de982899942fbff923edbad02f29..099ca4a64f7dcca83b2e7f2db7c2eaa9bb9bc374 100644 (file)
@@ -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;
index ceb2b76bf53c485bc5a9019900cae490aa2635ce..46a31aec45f95ffe4ba576daa2d3eef31eb6aa7e 100644 (file)
@@ -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;
index db435931d8d1e5206a966992e151d6b270ad6b1a..a6815398e5a9b87fee630cfe9e2b9f3809b234ea 100644 (file)
@@ -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
index 8a6519383639733a70eb988c51584f686aaeffea..9fca9b3788a32e27efe9ebfa3e3e1dcf7e813fda 100644 (file)
@@ -30,6 +30,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 static double func (const double *array)
 {
        double d = *array;
index ab476579e7fb5c6e70107a3d281acb583c3bca59..f836b29c08ede62ae9b68ed89ca699845a8f0de8 100644 (file)
@@ -32,6 +32,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 static int failed;
 
 #define TEST(c) if ((c) != ok) failed++
index 846b76d875052115b019a8f0be2b087496de9e86..3f3adea197baf57c9f1a1eb2a5bf1203aeb4b746 100644 (file)
@@ -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);
index 9c514e116706674c88b0e729a938ff2709a8d5d0..1f3732d9243fc193679497cad13f4d4e34d1deff 100644 (file)
@@ -32,6 +32,8 @@
 
 #if CONFIG_POST & CONFIG_SYS_POST_FPU
 
+GNU_FPOST_ATTR
+
 union uf
 {
        unsigned int u;