include/elf/

* mips.h (EF_MIPS_NAN2008): New macro.

	bfd/
	* elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Handle
	EF_MIPS_NAN2008.
	(_bfd_mips_elf_print_private_bfd_data): Likewise.

	binutils/
	* readelf.c (get_machine_flags): Handle EF_MIPS_NAN2008.

	gas/
	* config/tc-mips.c (mips_flag_nan2008): New variable.
	(options): Add OPTION_NAN enum value.
	(md_longopts): Handle it.
	(md_parse_option): Likewise.
	(s_nan): New function.
	(mips_elf_final_processing): Handle EF_MIPS_NAN2008.
	(md_show_usage): Add -mnan.

	* doc/as.texinfo (Overview): Add -mnan.
	* doc/c-mips.texi (MIPS Opts): Document -mnan.
	(MIPS NaN Encodings): New node.  Document .nan directive.
	(MIPS-Dependent): List the new node.

	gas/testsuite/
	* gas/mips/nan-2008-1.d: New test.
	* gas/mips/nan-2008-2.d: New test.
	* gas/mips/nan-2008-3.d: New test.
	* gas/mips/nan-2008-4.d: New test.
	* gas/mips/nan-legacy-1.d: New test.
	* gas/mips/nan-legacy-2.d: New test.
	* gas/mips/nan-legacy-3.d: New test.
	* gas/mips/nan-legacy-4.d: New test.
	* gas/mips/nan-legacy-5.d: New test.
	* gas/mips/nan-error-1.l: New list test.
	* gas/mips/nan-error-2.l: New list test.
	* gas/mips/nan-2008-override.s: New test source.
	* gas/mips/nan-2008.s: New test source.
	* gas/mips/nan-legacy-override.s: New test source.
	* gas/mips/nan-legacy.s: New test source.
	* gas/mips/nan-error-1.s: New test source.
	* gas/mips/nan-error-2.s: New test source.
	* gas/mips/mips.exp: Run the new tests.

	ld/testsuite/
	* ld-mips-elf/nan-2008.d: New test.
	* ld-mips-elf/nan-legacy.d: New test.
	* ld-mips-elf/nan-mixed-1.d: New test.
	* ld-mips-elf/nan-mixed-2.d: New test.
	* ld-mips-elf/nan-2008.s: New test source.
	* ld-mips-elf/nan-legacy.s: New test source.
This commit is contained in:
Maciej W. Rozycki 2013-07-12 15:58:15 +00:00
parent 627e05482b
commit ba92f88752
37 changed files with 326 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2013-07-12 Maciej W. Rozycki <macro@codesourcery.com>
* elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Handle
EF_MIPS_NAN2008.
(_bfd_mips_elf_print_private_bfd_data): Likewise.
2013-07-09 Tristan Gingold <gingold@adacore.com>
* vms-alpha.c (struct vms_private_data_struct): Remove

View File

@ -14730,6 +14730,20 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
old_flags &= ~ EF_MIPS_ARCH_ASE;
}
/* Compare NaN encodings. */
if ((new_flags & EF_MIPS_NAN2008) != (old_flags & EF_MIPS_NAN2008))
{
_bfd_error_handler (_("%B: linking %s module with previous %s modules"),
ibfd,
(new_flags & EF_MIPS_NAN2008
? "-mnan=2008" : "-mnan=legacy"),
(old_flags & EF_MIPS_NAN2008
? "-mnan=2008" : "-mnan=legacy"));
ok = FALSE;
new_flags &= ~EF_MIPS_NAN2008;
old_flags &= ~EF_MIPS_NAN2008;
}
/* Warn about any other mismatches */
if (new_flags != old_flags)
{
@ -14921,6 +14935,9 @@ _bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
fprintf (file, " [micromips]");
if (elf_elfheader (abfd)->e_flags & EF_MIPS_NAN2008)
fprintf (file, " [nan2008]");
if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
fprintf (file, " [32bitmode]");
else

View File

@ -1,3 +1,7 @@
2013-07-12 Maciej W. Rozycki <macro@codesourcery.com>
* readelf.c (get_machine_flags): Handle EF_MIPS_NAN2008.
2013-07-10 Tristan Gingold <gingold@adacore.com>
* od-xcoff.c (OPT_LDINFO): Define.

View File

@ -2568,6 +2568,9 @@ get_machine_flags (unsigned e_flags, unsigned e_machine)
if (e_flags & EF_MIPS_32BITMODE)
strcat (buf, ", 32bitmode");
if (e_flags & EF_MIPS_NAN2008)
strcat (buf, ", nan2008");
switch ((e_flags & EF_MIPS_MACH))
{
case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;

View File

@ -1,3 +1,18 @@
2013-07-12 Maciej W. Rozycki <macro@codesourcery.com>
* config/tc-mips.c (mips_flag_nan2008): New variable.
(options): Add OPTION_NAN enum value.
(md_longopts): Handle it.
(md_parse_option): Likewise.
(s_nan): New function.
(mips_elf_final_processing): Handle EF_MIPS_NAN2008.
(md_show_usage): Add -mnan.
* doc/as.texinfo (Overview): Add -mnan.
* doc/c-mips.texi (MIPS Opts): Document -mnan.
(MIPS NaN Encodings): New node. Document .nan directive.
(MIPS-Dependent): List the new node.
2013-07-09 Tristan Gingold <gingold@adacore.com>
* configure.com: Define HAVE_SYS_TYPES_H and HAVE_UNISTD_H

View File

@ -272,6 +272,9 @@ static int file_mips_soft_float = 0;
/* 1 if -msingle-float, 0 if -mdouble-float. The default is 0. */
static int file_mips_single_float = 0;
/* True if -mnan=2008, false if -mnan=legacy. */
static bfd_boolean mips_flag_nan2008 = FALSE;
static struct mips_set_options mips_opts =
{
/* isa */ ISA_UNKNOWN, /* ase */ 0, /* mips16 */ -1, /* micromips */ -1,
@ -1310,6 +1313,7 @@ static void s_gpdword (int);
static void s_ehword (int);
static void s_cpadd (int);
static void s_insn (int);
static void s_nan (int);
static void md_obj_begin (void);
static void md_obj_end (void);
static void s_mips_ent (int);
@ -1441,6 +1445,7 @@ enum options
OPTION_PDR,
OPTION_NO_PDR,
OPTION_MVXWORKS_PIC,
OPTION_NAN,
OPTION_END_OF_ENUM
};
@ -1556,6 +1561,7 @@ struct option md_longopts[] =
{"mpdr", no_argument, NULL, OPTION_PDR},
{"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
{"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
{"mnan", required_argument, NULL, OPTION_NAN},
{NULL, no_argument, NULL, 0}
};
@ -1680,6 +1686,7 @@ static const pseudo_typeS mips_pseudo_table[] =
{"ehword", s_ehword, 0},
{"cpadd", s_cpadd, 0},
{"insn", s_insn, 0},
{"nan", s_nan, 0},
/* Relatively generic pseudo-ops that happen to be used on MIPS
chips. */
@ -15262,6 +15269,18 @@ md_parse_option (int c, char *arg)
mips_pic = VXWORKS_PIC;
break;
case OPTION_NAN:
if (strcmp (arg, "2008") == 0)
mips_flag_nan2008 = TRUE;
else if (strcmp (arg, "legacy") == 0)
mips_flag_nan2008 = FALSE;
else
{
as_fatal (_("Invalid NaN setting -mnan=%s"), arg);
return 0;
}
break;
default:
return 0;
}
@ -17152,6 +17171,30 @@ s_insn (int ignore ATTRIBUTE_UNUSED)
demand_empty_rest_of_line ();
}
/* Handle the .nan pseudo-op. */
static void
s_nan (int ignore ATTRIBUTE_UNUSED)
{
static const char str_legacy[] = "legacy";
static const char str_2008[] = "2008";
size_t i;
for (i = 0; !is_end_of_line[(unsigned char) input_line_pointer[i]]; i++);
if (i == sizeof (str_2008) - 1
&& memcmp (input_line_pointer, str_2008, i) == 0)
mips_flag_nan2008 = TRUE;
else if (i == sizeof (str_legacy) - 1
&& memcmp (input_line_pointer, str_legacy, i) == 0)
mips_flag_nan2008 = FALSE;
else
as_bad (_("Bad .nan directive"));
input_line_pointer += i;
demand_empty_rest_of_line ();
}
/* Handle a .stab[snd] directive. Ideally these directives would be
implemented in a transparent way, so that removing them would not
have any effect on the generated instructions. However, s_stab
@ -18751,6 +18794,9 @@ mips_elf_final_processing (void)
if (mips_32bitmode)
elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
if (mips_flag_nan2008)
elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NAN2008;
#if 0 /* XXX FIXME */
/* 32 bit code with 64 bit FP registers. */
if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
@ -19588,8 +19634,16 @@ MIPS options:\n\
-msingle-float only allow 32-bit floating-point operations\n\
-mdouble-float allow 32-bit and 64-bit floating-point operations\n\
--[no-]construct-floats [dis]allow floating point values to be constructed\n\
--[no-]relax-branch [dis]allow out-of-range branches to be relaxed\n"
));
--[no-]relax-branch [dis]allow out-of-range branches to be relaxed\n\
-mnan=ENCODING select an IEEE 754 NaN encoding convention, either of:\n"));
first = 1;
show (stream, "legacy", &column, &first);
show (stream, "2008", &column, &first);
fputc ('\n', stream);
fprintf (stream, _("\
-KPIC, -call_shared generate SVR4 position independent code\n\
-call_nonpic generate non-PIC code that can operate with DSOs\n\

View File

@ -402,6 +402,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
[@b{-mips3}] [@b{-mips4}] [@b{-mips5}] [@b{-mips32}] [@b{-mips32r2}]
[@b{-mips64}] [@b{-mips64r2}]
[@b{-construct-floats}] [@b{-no-construct-floats}]
[@b{-mnan=@var{encoding}}]
[@b{-trap}] [@b{-no-break}] [@b{-break}] [@b{-no-trap}]
[@b{-mips16}] [@b{-no-mips16}]
[@b{-mmicromips}] [@b{-mno-micromips}]
@ -1363,6 +1364,10 @@ The @samp{--relax-branch} option enables the relaxation of out-of-range
branches. By default @samp{--no-relax-branch} is selected, causing any
out-of-range branches to produce an error.
@item -mnan=@var{encoding}
Select between the IEEE 754-2008 (@option{-mnan=2008}) or the legacy
(@option{-mnan=legacy}) NaN encoding format. The latter is the default.
@cindex emulation
@item --emulation=@var{name}
This option was formerly used to switch between ELF and ECOFF output

View File

@ -30,6 +30,7 @@ Assembly Language Programming'' in the same work.
* MIPS assembly options:: Directives to control code generation
* MIPS autoextend:: Directives for extending MIPS 16 bit instructions
* MIPS insn:: Directive to mark data as an instruction
* MIPS NaN Encodings:: Directives to record which NaN encoding is being used
* MIPS Option Stack:: Directives to save and restore options
* MIPS ASE Instruction Generation Overrides:: Directives to control
generation of MIPS ASE instructions
@ -416,6 +417,16 @@ Also no MIPS16 branches are ever relaxed.
By default @samp{--no-relax-branch} is selected, causing any out-of-range
branches to produce an error.
@cindex @option{-mnan=} command line option, MIPS
@item -mnan=@var{encoding}
This option indicates whether the source code uses the IEEE 2008
NaN encoding (@option{-mnan=2008}) or the original MIPS encoding
(@option{-mnan=legacy}). It is equivalent to adding a @code{.nan}
directive to the beginning of the source file. @xref{MIPS NaN Encodings}.
@option{-mnan=legacy} is the default if no @option{-mnan} option or
@code{.nan} directive is used.
@item --trap
@itemx --no-break
@c FIXME! (1) reflect these options (next item too) in option summaries;
@ -722,6 +733,47 @@ baz:
@end example
@node MIPS NaN Encodings
@section Directives to record which NaN encoding is being used
@cindex MIPS IEEE 754 NaN data encoding selection
@cindex @code{.nan} directive, MIPS
The IEEE 754 floating-point standard defines two types of not-a-number
(NaN) data: ``signalling'' NaNs and ``quiet'' NaNs. The original version
of the standard did not specify how these two types should be
distinguished. Most implementations followed the i387 model, in which
the first bit of the significand is set for quiet NaNs and clear for
signalling NaNs. However, the original MIPS implementation assigned the
opposite meaning to the bit, so that it was set for signalling NaNs and
clear for quiet NaNs.
The 2008 revision of the standard formally suggested the i387 choice
and as from Sep 2012 the current release of the MIPS architecture
therefore optionally supports that form. Code that uses one NaN encoding
would usually be incompatible with code that uses the other NaN encoding,
so MIPS ELF objects have a flag (@code{EF_MIPS_NAN2008}) to record which
encoding is being used.
Assembly files can use the @code{.nan} directive to select between the
two encodings. @samp{.nan 2008} says that the assembly file uses the
IEEE 754-2008 encoding while @samp{.nan legacy} says that the file uses
the original MIPS encoding. If several @code{.nan} directives are given,
the final setting is the one that is used.
The command-line options @option{-mnan=legacy} and @option{-mnan=2008}
can be used instead of @samp{.nan legacy} and @samp{.nan 2008}
respectively. However, any @code{.nan} directive overrides the
command-line setting.
@samp{.nan legacy} is the default if no @code{.nan} directive or
@option{-mnan} option is given.
Note that @sc{gnu} @code{@value{AS}} does not produce NaNs itself and
therefore these directives do not affect code generation. They simply
control the setting of the @code{EF_MIPS_NAN2008} flag.
Traditional MIPS assemblers do not support these directives.
@node MIPS Option Stack
@section Directives to save and restore options

View File

@ -1,3 +1,24 @@
2013-07-12 Maciej W. Rozycki <macro@codesourcery.com>
* gas/mips/nan-2008-1.d: New test.
* gas/mips/nan-2008-2.d: New test.
* gas/mips/nan-2008-3.d: New test.
* gas/mips/nan-2008-4.d: New test.
* gas/mips/nan-legacy-1.d: New test.
* gas/mips/nan-legacy-2.d: New test.
* gas/mips/nan-legacy-3.d: New test.
* gas/mips/nan-legacy-4.d: New test.
* gas/mips/nan-legacy-5.d: New test.
* gas/mips/nan-error-1.l: New list test.
* gas/mips/nan-error-2.l: New list test.
* gas/mips/nan-2008-override.s: New test source.
* gas/mips/nan-2008.s: New test source.
* gas/mips/nan-legacy-override.s: New test source.
* gas/mips/nan-legacy.s: New test source.
* gas/mips/nan-error-1.s: New test source.
* gas/mips/nan-error-2.s: New test source.
* gas/mips/mips.exp: Run the new tests.
2013-07-09 Richard Sandiford <rdsandiford@googlemail.com>
* gas/mips/la-reloc.s, gas/mips/la-reloc.d, gas/mips/dla-reloc.s,

View File

@ -915,6 +915,20 @@ if { [istarget mips*-*-vxworks*] } {
run_dump_test_arches "loc-swap-2" [mips_arch_list_all]
run_dump_test_arches "loc-swap-3" [mips_arch_list_all]
run_dump_test "nan-legacy-1"
run_dump_test "nan-legacy-2"
run_dump_test "nan-legacy-3"
run_dump_test "nan-legacy-4"
run_dump_test "nan-legacy-5"
run_dump_test "nan-2008-1"
run_dump_test "nan-2008-2"
run_dump_test "nan-2008-3"
run_dump_test "nan-2008-4"
run_list_test "nan-error-1"
run_list_test "nan-error-2" "-mnan=foo"
if $has_newabi {
run_dump_test "n32-consec"
}

View File

@ -0,0 +1,6 @@
#name: MIPS 2008 NaN setting 1
#source: nan-2008.s
#objdump: -p
.*:.*file format.*mips.*
private flags = [0-9a-f]*[4-7c-f]..: .*[[,]nan2008[],].*

View File

@ -0,0 +1,7 @@
#name: MIPS 2008 NaN setting 2
#source: nan-2008.s
#objdump: -p
#as: -mnan=legacy
.*:.*file format.*mips.*
private flags = [0-9a-f]*[4-7c-f]..: .*[[,]nan2008[],].*

View File

@ -0,0 +1,6 @@
#name: MIPS 2008 NaN setting 3
#source: nan-2008-override.s
#objdump: -p
.*:.*file format.*mips.*
private flags = [0-9a-f]*[4-7c-f]..: .*[[,]nan2008[],].*

View File

@ -0,0 +1,7 @@
#name: MIPS 2008 NaN setting 4
#source: empty.s
#objdump: -p
#as: -mnan=2008
.*:.*file format.*mips.*
private flags = [0-9a-f]*[4-7c-f]..: .*[[,]nan2008[],].*

View File

@ -0,0 +1,2 @@
.nan legacy
.nan 2008

View File

@ -0,0 +1 @@
.nan 2008

View File

@ -0,0 +1,2 @@
.*\.s: Assembler messages:
.*\.s:1: Error: Bad .nan directive

View File

@ -0,0 +1 @@
.nan foo

View File

@ -0,0 +1,2 @@
Assembler messages:
Fatal error: Invalid NaN setting -mnan=foo

View File

@ -0,0 +1 @@
# No contents necessary.

View File

@ -0,0 +1,7 @@
#name: MIPS legacy NaN setting 1
#source: nan-legacy.s
#objdump: -p
.*:.*file format.*mips.*
#failif
private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*

View File

@ -0,0 +1,8 @@
#name: MIPS legacy NaN setting 2
#source: nan-legacy.s
#objdump: -p
#as: -mnan=2008
.*:.*file format.*mips.*
#failif
private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*

View File

@ -0,0 +1,7 @@
#name: MIPS legacy NaN setting 3
#source: nan-legacy-override.s
#objdump: -p
.*:.*file format.*mips.*
#failif
private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*

View File

@ -0,0 +1,8 @@
#name: MIPS legacy NaN setting 4
#source: empty.s
#objdump: -p
#as: -mnan=legacy
.*:.*file format.*mips.*
#failif
private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*

View File

@ -0,0 +1,7 @@
#name: MIPS legacy NaN setting 5
#source: empty.s
#objdump: -p
.*:.*file format.*mips.*
#failif
private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*

View File

@ -0,0 +1,2 @@
.nan 2008
.nan legacy

View File

@ -0,0 +1 @@
.nan legacy

View File

@ -1,3 +1,7 @@
2013-07-12 Maciej W. Rozycki <macro@codesourcery.com>
* mips.h (EF_MIPS_NAN2008): New macro.
2013-07-08 Tristan Gingold <gingold@adacore.com>
* ia64.h (STB_VMS_WEAK, STB_VMS_SYSTEM): Add.

View File

@ -191,6 +191,9 @@ END_RELOC_NUMBERS (R_MIPS_maxext)
(regs are 32-bits wide). */
#define EF_MIPS_32BITMODE 0x00000100
/* Code in file uses the IEEE 754-2008 NaN encoding convention. */
#define EF_MIPS_NAN2008 0x00000400
/* Architectural Extensions used by this file */
#define EF_MIPS_ARCH_ASE 0x0f000000

View File

@ -1,3 +1,12 @@
2013-07-12 Maciej W. Rozycki <macro@codesourcery.com>
* ld-mips-elf/nan-2008.d: New test.
* ld-mips-elf/nan-legacy.d: New test.
* ld-mips-elf/nan-mixed-1.d: New test.
* ld-mips-elf/nan-mixed-2.d: New test.
* ld-mips-elf/nan-2008.s: New test source.
* ld-mips-elf/nan-legacy.s: New test source.
2013-07-03 Marcus Shawcroft <marcus.shawcroft@arm.com>
* ld-aarch64/emit-relocs-309.s: Replace got_prel19 with got.

View File

@ -666,6 +666,11 @@ run_dump_test "attr-gnu-4-44"
run_dump_test "attr-gnu-4-45"
run_dump_test "attr-gnu-4-51"
run_dump_test "nan-legacy"
run_dump_test "nan-2008"
run_dump_test "nan-mixed-1"
run_dump_test "nan-mixed-2"
if { $linux_gnu } {
run_ld_link_tests {
{"GOT and versioning 1"

View File

@ -0,0 +1,7 @@
#source: nan-2008.s
#source: nan-2008.s
#ld: -r
#objdump: -p
.*:.*file format.*mips.*
private flags = [0-9a-f]*[4-7c-f]..: .*[[,]nan2008[],].*

View File

@ -0,0 +1,6 @@
.nan 2008
# We need some section contents for the ELF header flag compatibility check
# to trigger.
.data
.byte 0

View File

@ -0,0 +1,8 @@
#source: nan-legacy.s
#source: nan-legacy.s
#ld: -r
#objdump: -p
.*:.*file format.*mips.*
#failif
private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*

View File

@ -0,0 +1,6 @@
.nan legacy
# We need some section contents for the ELF header flag compatibility check
# to trigger.
.data
.byte 0

View File

@ -0,0 +1,5 @@
#source: nan-legacy.s
#source: nan-2008.s
#ld: -r
#error: \A[^\n]*: [^\n]* linking -mnan=2008 module with previous -mnan=legacy modules\n
#error: [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z

View File

@ -0,0 +1,5 @@
#source: nan-2008.s
#source: nan-legacy.s
#ld: -r
#error: \A[^\n]*: [^\n]* linking -mnan=legacy module with previous -mnan=2008 modules\n
#error: [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z