From 1098fd41ac4a8efe7ed5a96487e89f53ff79165d Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Mon, 26 Aug 2013 22:18:07 +0000 Subject: [PATCH] bfd/ * archures.c (bfd_mach_i386_nacl, bfd_mach_i386_i386_nacl): New macros. (bfd_mach_x86_64_nacl, bfd_mach_x64_32_nacl): New macros. * cpu-i386.c (bfd_arch_i386_onebyte_nop_fill): New function. (bfd_i386_nacl_arch): New variable. (bfd_x86_64_nacl_arch, bfd_x64_32_nacl_arch): New variables. (bfd_x64_32_arch_intel_syntax): Link them into the list. * bfd-in2.h: Regenerate. ld/ * emulparams/elf_i386_nacl.sh (ARCH): Set to i386:nacl. * emulparams/elf_x86_64_nacl.sh (ARCH): Set to i386:x86-64:nacl. * emulparams/elf32_x86_64_nacl.sh (ARCH): Set to i386:x64-32:nacl. ld/testsuite/ * ld-x86-64/x86-64.exp (Mixed x86_64 and i386 input test 1): Loosen string match to admit i386:x86-64*. (Mixed x86_64 and i386 input test 2): Likewise. * ld-x86-64/ilp32-2.d: Likewise. * ld-x86-64/ilp32-3.d: Likewise. * ld-x86-64/lp64-2.d: Likewise. * ld-x86-64/lp64-3.d: Likewise. * ld-x86-64/ia32-2.d: Likewise, and i386.* too. * ld-x86-64/ia32-3.d: Likewise. --- bfd/ChangeLog | 10 +++++ bfd/archures.c | 4 ++ bfd/bfd-in2.h | 6 ++- bfd/cpu-i386.c | 69 +++++++++++++++++++++++++++++- ld/ChangeLog | 6 +++ ld/emulparams/elf32_x86_64_nacl.sh | 1 + ld/emulparams/elf_i386_nacl.sh | 1 + ld/emulparams/elf_x86_64_nacl.sh | 1 + ld/testsuite/ChangeLog | 12 ++++++ ld/testsuite/ld-x86-64/ia32-2.d | 2 +- ld/testsuite/ld-x86-64/ia32-3.d | 2 +- ld/testsuite/ld-x86-64/ilp32-2.d | 2 +- ld/testsuite/ld-x86-64/ilp32-3.d | 2 +- ld/testsuite/ld-x86-64/lp64-2.d | 2 +- ld/testsuite/ld-x86-64/lp64-3.d | 2 +- ld/testsuite/ld-x86-64/x86-64.exp | 6 +-- 16 files changed, 116 insertions(+), 12 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ebae60d7c84..815503bc0dd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2013-08-26 Roland McGrath + + * archures.c (bfd_mach_i386_nacl, bfd_mach_i386_i386_nacl): New macros. + (bfd_mach_x86_64_nacl, bfd_mach_x64_32_nacl): New macros. + * cpu-i386.c (bfd_arch_i386_onebyte_nop_fill): New function. + (bfd_i386_nacl_arch): New variable. + (bfd_x86_64_nacl_arch, bfd_x64_32_nacl_arch): New variables. + (bfd_x64_32_arch_intel_syntax): Link them into the list. + * bfd-in2.h: Regenerate. + 2013-08-26 Roland McGrath * elf-nacl.c (nacl_modify_segment_map): Fix logic reordering the diff --git a/bfd/archures.c b/bfd/archures.c index d00b0e19d44..53962bfa38c 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -189,9 +189,13 @@ DESCRIPTION .#define bfd_mach_i386_i386 (1 << 2) .#define bfd_mach_x86_64 (1 << 3) .#define bfd_mach_x64_32 (1 << 4) +.#define bfd_mach_i386_nacl (1 << 5) .#define bfd_mach_i386_i386_intel_syntax (bfd_mach_i386_i386 | bfd_mach_i386_intel_syntax) .#define bfd_mach_x86_64_intel_syntax (bfd_mach_x86_64 | bfd_mach_i386_intel_syntax) .#define bfd_mach_x64_32_intel_syntax (bfd_mach_x64_32 | bfd_mach_i386_intel_syntax) +.#define bfd_mach_i386_i386_nacl (bfd_mach_i386_i386 | bfd_mach_i386_nacl) +.#define bfd_mach_x86_64_nacl (bfd_mach_x86_64 | bfd_mach_i386_nacl) +.#define bfd_mach_x64_32_nacl (bfd_mach_x64_32 | bfd_mach_i386_nacl) . bfd_arch_l1om, {* Intel L1OM *} .#define bfd_mach_l1om (1 << 5) .#define bfd_mach_l1om_intel_syntax (bfd_mach_l1om | bfd_mach_i386_intel_syntax) diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 0cf9a2966cf..41f7a682c3d 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -7,7 +7,7 @@ /* Main header file for the bfd library -- portable access to object files. - Copyright 1990-2013 2013 Free Software Foundation, Inc. + Copyright 1990-2013 Free Software Foundation, Inc. Contributed by Cygnus Support. @@ -1944,9 +1944,13 @@ enum bfd_architecture #define bfd_mach_i386_i386 (1 << 2) #define bfd_mach_x86_64 (1 << 3) #define bfd_mach_x64_32 (1 << 4) +#define bfd_mach_i386_nacl (1 << 5) #define bfd_mach_i386_i386_intel_syntax (bfd_mach_i386_i386 | bfd_mach_i386_intel_syntax) #define bfd_mach_x86_64_intel_syntax (bfd_mach_x86_64 | bfd_mach_i386_intel_syntax) #define bfd_mach_x64_32_intel_syntax (bfd_mach_x64_32 | bfd_mach_i386_intel_syntax) +#define bfd_mach_i386_i386_nacl (bfd_mach_i386_i386 | bfd_mach_i386_nacl) +#define bfd_mach_x86_64_nacl (bfd_mach_x86_64 | bfd_mach_i386_nacl) +#define bfd_mach_x64_32_nacl (bfd_mach_x64_32 | bfd_mach_i386_nacl) bfd_arch_l1om, /* Intel L1OM */ #define bfd_mach_l1om (1 << 5) #define bfd_mach_l1om_intel_syntax (bfd_mach_l1om | bfd_mach_i386_intel_syntax) diff --git a/bfd/cpu-i386.c b/bfd/cpu-i386.c index 6174612ebb8..2a6bb97b944 100644 --- a/bfd/cpu-i386.c +++ b/bfd/cpu-i386.c @@ -1,6 +1,6 @@ /* BFD support for the Intel 386 architecture. Copyright 1992, 1994, 1995, 1996, 1998, 2000, 2001, 2002, 2004, 2005, - 2007, 2009, 2010, 2011 + 2007, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -119,6 +119,71 @@ bfd_arch_i386_long_nop_fill (bfd_size_type count, return bfd_arch_i386_fill (count, code, TRUE); } +/* Fill the buffer with zero, or one-byte nop instructions if CODE is TRUE. */ + +static void * +bfd_arch_i386_onebyte_nop_fill (bfd_size_type count, + bfd_boolean is_bigendian ATTRIBUTE_UNUSED, + bfd_boolean code) +{ + void *fill = bfd_malloc (count); + if (fill != NULL) + memset (fill, code ? 0x90 : 0, count); + return fill; +} + + +static const bfd_arch_info_type bfd_x64_32_nacl_arch = +{ + 64, /* 64 bits in a word */ + 64, /* 64 bits in an address */ + 8, /* 8 bits in a byte */ + bfd_arch_i386, + bfd_mach_x64_32_nacl, + "i386", + "i386:x64-32:nacl", + 3, + FALSE, + bfd_i386_compatible, + bfd_default_scan, + bfd_arch_i386_onebyte_nop_fill, + NULL +}; + +static const bfd_arch_info_type bfd_x86_64_nacl_arch = +{ + 64, /* 64 bits in a word */ + 64, /* 64 bits in an address */ + 8, /* 8 bits in a byte */ + bfd_arch_i386, + bfd_mach_x86_64_nacl, + "i386", + "i386:x86-64:nacl", + 3, + FALSE, + bfd_i386_compatible, + bfd_default_scan, + bfd_arch_i386_onebyte_nop_fill, + &bfd_x64_32_nacl_arch +}; + +const bfd_arch_info_type bfd_i386_nacl_arch = +{ + 32, /* 32 bits in a word */ + 32, /* 32 bits in an address */ + 8, /* 8 bits in a byte */ + bfd_arch_i386, + bfd_mach_i386_i386_nacl, + "i386", + "i386:nacl", + 3, + TRUE, + bfd_i386_compatible, + bfd_default_scan, + bfd_arch_i386_onebyte_nop_fill, + &bfd_x86_64_nacl_arch +}; + static const bfd_arch_info_type bfd_x64_32_arch_intel_syntax = { 64, /* 64 bits in a word */ @@ -133,7 +198,7 @@ static const bfd_arch_info_type bfd_x64_32_arch_intel_syntax = bfd_i386_compatible, bfd_default_scan, bfd_arch_i386_long_nop_fill, - 0 + &bfd_i386_nacl_arch }; static const bfd_arch_info_type bfd_x86_64_arch_intel_syntax = diff --git a/ld/ChangeLog b/ld/ChangeLog index 27b4be715ee..b8341381c24 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2013-08-26 Roland McGrath + + * emulparams/elf_i386_nacl.sh (ARCH): Set to i386:nacl. + * emulparams/elf_x86_64_nacl.sh (ARCH): Set to i386:x86-64:nacl. + * emulparams/elf32_x86_64_nacl.sh (ARCH): Set to i386:x64-32:nacl. + 2013-08-23 Roland McGrath * emulparams/elf_nacl.sh (nacl_rodata_addr): Don't add in diff --git a/ld/emulparams/elf32_x86_64_nacl.sh b/ld/emulparams/elf32_x86_64_nacl.sh index 4570ef98f22..ea98b287b23 100644 --- a/ld/emulparams/elf32_x86_64_nacl.sh +++ b/ld/emulparams/elf32_x86_64_nacl.sh @@ -1,3 +1,4 @@ . ${srcdir}/emulparams/elf32_x86_64.sh . ${srcdir}/emulparams/elf_nacl.sh OUTPUT_FORMAT="elf32-x86-64-nacl" +ARCH="i386:x64-32:nacl" # The :nacl just means one-byte nops for code fill. diff --git a/ld/emulparams/elf_i386_nacl.sh b/ld/emulparams/elf_i386_nacl.sh index 81992d75845..294f7f5aba0 100644 --- a/ld/emulparams/elf_i386_nacl.sh +++ b/ld/emulparams/elf_i386_nacl.sh @@ -1,3 +1,4 @@ . ${srcdir}/emulparams/elf_i386.sh . ${srcdir}/emulparams/elf_nacl.sh OUTPUT_FORMAT="elf32-i386-nacl" +ARCH="i386:nacl" # The :nacl just means one-byte nops for code fill. diff --git a/ld/emulparams/elf_x86_64_nacl.sh b/ld/emulparams/elf_x86_64_nacl.sh index 7c79eee2c64..a6966bdaf3b 100644 --- a/ld/emulparams/elf_x86_64_nacl.sh +++ b/ld/emulparams/elf_x86_64_nacl.sh @@ -1,3 +1,4 @@ . ${srcdir}/emulparams/elf_x86_64.sh . ${srcdir}/emulparams/elf_nacl.sh OUTPUT_FORMAT="elf64-x86-64-nacl" +ARCH="i386:x86-64:nacl" # The :nacl just means one-byte nops for code fill. diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3adba9b2a1f..f27092fb9b3 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2013-08-26 Roland McGrath + + * ld-x86-64/x86-64.exp (Mixed x86_64 and i386 input test 1): + Loosen string match to admit i386:x86-64*. + (Mixed x86_64 and i386 input test 2): Likewise. + * ld-x86-64/ilp32-2.d: Likewise. + * ld-x86-64/ilp32-3.d: Likewise. + * ld-x86-64/lp64-2.d: Likewise. + * ld-x86-64/lp64-3.d: Likewise. + * ld-x86-64/ia32-2.d: Likewise, and i386.* too. + * ld-x86-64/ia32-3.d: Likewise. + 2013-08-26 Roland McGrath * ld-x86-64/ilp32-4-nacl.d: Loosen .shstrtab line regexp to match diff --git a/ld/testsuite/ld-x86-64/ia32-2.d b/ld/testsuite/ld-x86-64/ia32-2.d index 3a180b5b2ea..cea492730bb 100644 --- a/ld/testsuite/ld-x86-64/ia32-2.d +++ b/ld/testsuite/ld-x86-64/ia32-2.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --32 #ld: -m elf_i386 tmpdir/start32.o tmpdir/foox32.o -#error: .*i386:x64-32 architecture of input file `tmpdir/foox32.o' is incompatible with i386 output +#error: .*i386:x64-32.* architecture of input file `tmpdir/foox32.o' is incompatible with i386.* output diff --git a/ld/testsuite/ld-x86-64/ia32-3.d b/ld/testsuite/ld-x86-64/ia32-3.d index 1528399f360..ecd8b2eb780 100644 --- a/ld/testsuite/ld-x86-64/ia32-3.d +++ b/ld/testsuite/ld-x86-64/ia32-3.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --32 #ld: -m elf_i386 tmpdir/start32.o tmpdir/foo64.o -#error: .*i386:x86-64 architecture of input file `tmpdir/foo64.o' is incompatible with i386 output +#error: .*i386:x86-64.* architecture of input file `tmpdir/foo64.o' is incompatible with i386.* output diff --git a/ld/testsuite/ld-x86-64/ilp32-2.d b/ld/testsuite/ld-x86-64/ilp32-2.d index 19fc671bbc1..65b5298457b 100644 --- a/ld/testsuite/ld-x86-64/ilp32-2.d +++ b/ld/testsuite/ld-x86-64/ilp32-2.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --x32 #ld: -m elf32_x86_64 tmpdir/startx32.o tmpdir/foo32.o -#error: .*i386 architecture of input file `tmpdir/foo32.o' is incompatible with i386:x64-32 output +#error: .*i386 architecture of input file `tmpdir/foo32.o' is incompatible with i386:x64-32.* output diff --git a/ld/testsuite/ld-x86-64/ilp32-3.d b/ld/testsuite/ld-x86-64/ilp32-3.d index fdd906527fb..b05e531c607 100644 --- a/ld/testsuite/ld-x86-64/ilp32-3.d +++ b/ld/testsuite/ld-x86-64/ilp32-3.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --x32 #ld: -m elf32_x86_64 tmpdir/startx32.o tmpdir/foo64.o -#error: .*i386:x86-64 architecture of input file `tmpdir/foo64.o' is incompatible with i386:x64-32 output +#error: .*i386:x86-64 architecture of input file `tmpdir/foo64.o' is incompatible with i386:x64-32.* output diff --git a/ld/testsuite/ld-x86-64/lp64-2.d b/ld/testsuite/ld-x86-64/lp64-2.d index fde32020fa4..7515881a8b1 100644 --- a/ld/testsuite/ld-x86-64/lp64-2.d +++ b/ld/testsuite/ld-x86-64/lp64-2.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --64 #ld: -m elf_x86_64 tmpdir/start64.o tmpdir/foo32.o -#error: .*i386 architecture of input file `tmpdir/foo32.o' is incompatible with i386:x86-64 output +#error: .*i386 architecture of input file `tmpdir/foo32.o' is incompatible with i386:x86-64.* output diff --git a/ld/testsuite/ld-x86-64/lp64-3.d b/ld/testsuite/ld-x86-64/lp64-3.d index c89fbc43add..e60efeb9353 100644 --- a/ld/testsuite/ld-x86-64/lp64-3.d +++ b/ld/testsuite/ld-x86-64/lp64-3.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --64 #ld: -m elf_x86_64 tmpdir/start64.o tmpdir/foox32.o -#error: .*i386:x64-32 architecture of input file `tmpdir/foox32.o' is incompatible with i386:x86-64 output +#error: .*i386:x64-32 architecture of input file `tmpdir/foox32.o' is incompatible with i386:x86-64.* output diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 0fd03121ae6..8ca2da757a6 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -1,5 +1,5 @@ # Expect script for ld-x86_64 tests -# Copyright (C) 2002, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +# Copyright (C) 2002, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 # Free Software Foundation # # This file is part of the GNU Binutils. @@ -163,7 +163,7 @@ global ld set test_name "Mixed x86_64 and i386 input test 1" set test mixed1 if { ![ld_simple_link $ld tmpdir/$test "-m$emul tmpdir/${test}a.o tmpdir/${test}b.o"] } { - if [string match "*i386 architecture of input file `tmpdir/${test}b.o' is incompatible with i386:x86-64 output*" $link_output] { + if [string match "*i386 architecture of input file `tmpdir/${test}b.o' is incompatible with i386:x86-64* output*" $link_output] { pass "$test_name" } { fail "$test_name" @@ -173,7 +173,7 @@ if { ![ld_simple_link $ld tmpdir/$test "-m$emul tmpdir/${test}a.o tmpdir/${test} set test_name "Mixed x86_64 and i386 input test 2" set test mixed2 if { ![ld_simple_link $ld tmpdir/$test "-m$emul tmpdir/${test}a.o tmpdir/${test}b.o"] } { - if [string match "*i386 architecture of input file `tmpdir/${test}b.o' is incompatible with i386:x86-64 output*" $link_output] { + if [string match "*i386 architecture of input file `tmpdir/${test}b.o' is incompatible with i386:x86-64* output*" $link_output] { pass "$test_name" } { fail "$test_name" -- 2.30.2