This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, MIPS] Ensure softfloat and single float take precendence in consistency checks


This patch fixes a subtle mistake in the FP ABI consistency check
logic.  The error reporting does not currently follow the
intended precedence of the various FP ABIs. I.e. softfloat,
singlefloat and then all the hardfloat variants.  When someone
uses -msingle-float with a GNU attribute which is not 4,2 then
the initial warning should be that it is not compatible with
singlefloat. Likewise for softfloat and attribute 4,3.

Tested on a variety of configurations including mips-linux-gnu.

Thanks,
Matthew

gas/

	* tc-mips.c (check_fpabi): Move softfloat and single float
	checks higher.

gas/testsuite/

	* gas/mips/attr-gnu-4-5-msingle-float.l: New file.
	* gas/mips/attr-gnu-4-5-msingle-float.s: Likewise.
	* gas/mips/attr-gnu-4-5-msoft-float.l: Likewise.
	* gas/mips/attr-gnu-4-5-msoft-float.s: Likewise.
	* gas/mips/attr-gnu-4-6-msingle-float.l: Update expected output.
	* gas/mips/attr-gnu-4-6-msoft-float.l: Likewise.
	* gas/mips/attr-gnu-4-7-msingle-float.l: Likewise.
	* gas/mips/attr-gnu-4-7-msoft-float.l: Likewise.
	* gas/mips/mips.exp: Update expected output for FP ABI 5,6,7.

diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 59d8635..2dabdf4 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -3672,39 +3672,44 @@ fpabi_requires (int fpabi, const char *what)
 static void
 check_fpabi (int fpabi)
 {
-  bfd_boolean needs_check = FALSE;
   switch (fpabi)
     {
     case Val_GNU_MIPS_ABI_FP_DOUBLE:
+      if (file_mips_opts.soft_float)
+	fpabi_incompatible_with (fpabi, "softfloat");
+      else if (file_mips_opts.single_float)
+	fpabi_incompatible_with (fpabi, "singlefloat");
       if (file_mips_opts.gp == 64 && file_mips_opts.fp == 32)
 	fpabi_incompatible_with (fpabi, "gp=64 fp=32");
       else if (file_mips_opts.gp == 32 && file_mips_opts.fp == 64)
 	fpabi_incompatible_with (fpabi, "gp=32 fp=64");
-      else
-	needs_check = TRUE;
       break;
 
     case Val_GNU_MIPS_ABI_FP_XX:
       if (mips_abi != O32_ABI)
 	fpabi_requires (fpabi, "-mabi=32");
+      else if (file_mips_opts.soft_float)
+	fpabi_incompatible_with (fpabi, "softfloat");
+      else if (file_mips_opts.single_float)
+	fpabi_incompatible_with (fpabi, "singlefloat");
       else if (file_mips_opts.fp != 0)
 	fpabi_requires (fpabi, "fp=xx");
-      else
-	needs_check = TRUE;
       break;
 
     case Val_GNU_MIPS_ABI_FP_64A:
     case Val_GNU_MIPS_ABI_FP_64:
       if (mips_abi != O32_ABI)
 	fpabi_requires (fpabi, "-mabi=32");
+      else if (file_mips_opts.soft_float)
+	fpabi_incompatible_with (fpabi, "softfloat");
+      else if (file_mips_opts.single_float)
+	fpabi_incompatible_with (fpabi, "singlefloat");
       else if (file_mips_opts.fp != 64)
 	fpabi_requires (fpabi, "fp=64");
       else if (fpabi == Val_GNU_MIPS_ABI_FP_64 && !file_mips_opts.oddspreg)
 	fpabi_incompatible_with (fpabi, "nooddspreg");
       else if (fpabi == Val_GNU_MIPS_ABI_FP_64A && file_mips_opts.oddspreg)
 	fpabi_requires (fpabi, "nooddspreg");
-      else
-	needs_check = TRUE;
       break;
 
     case Val_GNU_MIPS_ABI_FP_SINGLE:
@@ -3729,11 +3734,6 @@ check_fpabi (int fpabi)
 	         " floating-point ABI"), Tag_GNU_MIPS_ABI_FP, fpabi);
       break;
     }
-
-  if (needs_check && file_mips_opts.soft_float)
-    fpabi_incompatible_with (fpabi, "softfloat");
-  else if (needs_check && file_mips_opts.single_float)
-    fpabi_incompatible_with (fpabi, "singlefloat");
 }
 
 /* Perform consistency checks on the current options.  */
diff --git a/gas/testsuite/gas/mips/attr-gnu-4-5-msingle-float.l b/gas/testsuite/gas/mips/attr-gnu-4-5-msingle-float.l
new file mode 100644
index 0000000..be2017d
--- /dev/null
+++ b/gas/testsuite/gas/mips/attr-gnu-4-5-msingle-float.l
@@ -0,0 +1,2 @@
+.*: Assembler messages:
+.*: Warning: .gnu_attribute 4,5 is incompatible with `singlefloat'
diff --git a/gas/testsuite/gas/mips/attr-gnu-4-5-msingle-float.s b/gas/testsuite/gas/mips/attr-gnu-4-5-msingle-float.s
new file mode 100644
index 0000000..b21ec3b
--- /dev/null
+++ b/gas/testsuite/gas/mips/attr-gnu-4-5-msingle-float.s
@@ -0,0 +1 @@
+.gnu_attribute 4,5
diff --git a/gas/testsuite/gas/mips/attr-gnu-4-5-msoft-float.l b/gas/testsuite/gas/mips/attr-gnu-4-5-msoft-float.l
new file mode 100644
index 0000000..3385c5f
--- /dev/null
+++ b/gas/testsuite/gas/mips/attr-gnu-4-5-msoft-float.l
@@ -0,0 +1,2 @@
+.*: Assembler messages:
+.*: Warning: .gnu_attribute 4,5 is incompatible with `softfloat'
diff --git a/gas/testsuite/gas/mips/attr-gnu-4-5-msoft-float.s b/gas/testsuite/gas/mips/attr-gnu-4-5-msoft-float.s
new file mode 100644
index 0000000..b21ec3b
--- /dev/null
+++ b/gas/testsuite/gas/mips/attr-gnu-4-5-msoft-float.s
@@ -0,0 +1 @@
+.gnu_attribute 4,5
diff --git a/gas/testsuite/gas/mips/attr-gnu-4-6-msingle-float.l b/gas/testsuite/gas/mips/attr-gnu-4-6-msingle-float.l
index 999b5e2..ab12f1d 100644
--- a/gas/testsuite/gas/mips/attr-gnu-4-6-msingle-float.l
+++ b/gas/testsuite/gas/mips/attr-gnu-4-6-msingle-float.l
@@ -1,2 +1,2 @@
 .*: Assembler messages:
-.*: Warning: .gnu_attribute 4,6 is incompatible with `fp=32'
+.*: Warning: .gnu_attribute 4,6 is incompatible with `singlefloat'
diff --git a/gas/testsuite/gas/mips/attr-gnu-4-6-msoft-float.l b/gas/testsuite/gas/mips/attr-gnu-4-6-msoft-float.l
index 999b5e2..3bf1946 100644
--- a/gas/testsuite/gas/mips/attr-gnu-4-6-msoft-float.l
+++ b/gas/testsuite/gas/mips/attr-gnu-4-6-msoft-float.l
@@ -1,2 +1,2 @@
 .*: Assembler messages:
-.*: Warning: .gnu_attribute 4,6 is incompatible with `fp=32'
+.*: Warning: .gnu_attribute 4,6 is incompatible with `softfloat'
diff --git a/gas/testsuite/gas/mips/attr-gnu-4-7-msingle-float.l b/gas/testsuite/gas/mips/attr-gnu-4-7-msingle-float.l
index 999b5e2..ab12f1d 100644
--- a/gas/testsuite/gas/mips/attr-gnu-4-7-msingle-float.l
+++ b/gas/testsuite/gas/mips/attr-gnu-4-7-msingle-float.l
@@ -1,2 +1,2 @@
 .*: Assembler messages:
-.*: Warning: .gnu_attribute 4,6 is incompatible with `fp=32'
+.*: Warning: .gnu_attribute 4,6 is incompatible with `singlefloat'
diff --git a/gas/testsuite/gas/mips/attr-gnu-4-7-msoft-float.l b/gas/testsuite/gas/mips/attr-gnu-4-7-msoft-float.l
index 999b5e2..3bf1946 100644
--- a/gas/testsuite/gas/mips/attr-gnu-4-7-msoft-float.l
+++ b/gas/testsuite/gas/mips/attr-gnu-4-7-msoft-float.l
@@ -1,2 +1,2 @@
 .*: Assembler messages:
-.*: Warning: .gnu_attribute 4,6 is incompatible with `fp=32'
+.*: Warning: .gnu_attribute 4,6 is incompatible with `softfloat'
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index 8f36918..1495b9b 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -1325,9 +1325,9 @@ if { [istarget mips*-*-vxworks*] } {
 				    [mips_arch_list_matching mips32r2]
     run_list_test_arches "attr-gnu-4-5-64" "-64 -mfp64" \
 				    [mips_arch_list_matching mips3]
-    run_list_test_arches "attr-gnu-4-5" "-32 -msingle-float" \
+    run_list_test_arches "attr-gnu-4-5-msingle-float" "-32 -msingle-float" \
 				    [mips_arch_list_matching mips1]
-    run_list_test_arches "attr-gnu-4-5" "-32 -msoft-float" \
+    run_list_test_arches "attr-gnu-4-5-msoft-float" "-32 -msoft-float" \
 				    [mips_arch_list_matching mips1]
     run_dump_test_arches "attr-gnu-4-5" \
 				    [mips_arch_list_matching mips2 !r5900]
@@ -1338,9 +1338,9 @@ if { [istarget mips*-*-vxworks*] } {
 				    [mips_arch_list_matching mips32r2]
     run_list_test_arches "attr-gnu-4-6-64" "-64 -mfp64" \
 				    [mips_arch_list_matching mips3]
-    run_list_test_arches "attr-gnu-4-6" "-32 -msingle-float" \
+    run_list_test_arches "attr-gnu-4-6-msingle-float" "-32 -msingle-float" \
 				    [mips_arch_list_matching mips1]
-    run_list_test_arches "attr-gnu-4-6" "-32 -msoft-float" \
+    run_list_test_arches "attr-gnu-4-6-msoft-float" "-32 -msoft-float" \
 				    [mips_arch_list_matching mips1]
     run_list_test_arches "attr-gnu-4-6" "-32 -mfpxx" \
 				    [mips_arch_list_matching mips2 !r5900]
@@ -1353,9 +1353,9 @@ if { [istarget mips*-*-vxworks*] } {
 				    [mips_arch_list_matching mips32r2]
     run_list_test_arches "attr-gnu-4-7-64" "-64 -mfp64" \
 				    [mips_arch_list_matching mips3]
-    run_list_test_arches "attr-gnu-4-7" "-32 -msingle-float" \
+    run_list_test_arches "attr-gnu-4-7-msingle-float" "-32 -msingle-float" \
 				    [mips_arch_list_matching mips1]
-    run_list_test_arches "attr-gnu-4-7" "-32 -msoft-float" \
+    run_list_test_arches "attr-gnu-4-7-msoft-float" "-32 -msoft-float" \
 				    [mips_arch_list_matching mips1]
     run_list_test_arches "attr-gnu-4-7" "-32 -mfpxx" \
 				    [mips_arch_list_matching mips2 !r5900]



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]