ChangeLog rotatation and copyright year update
[deliverable/binutils-gdb.git] / bfd / cpu-i386.c
index f8991cf1ec438cae87e4fa8bc527b13221e5dee4..b727ac81909a69f17a93bbf07ca97e6b5188200e 100644 (file)
@@ -1,7 +1,5 @@
 /* BFD support for the Intel 386 architecture.
-   Copyright 1992, 1994, 1995, 1996, 1998, 2000, 2001, 2002, 2004, 2005,
-   2007, 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright (C) 1992-2015 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -25,7 +23,8 @@
 #include "libbfd.h"
 #include "libiberty.h"
 
-extern void * bfd_arch_i386_fill (bfd_size_type, bfd_boolean, bfd_boolean);
+extern void * bfd_arch_i386_short_nop_fill (bfd_size_type, bfd_boolean,
+                                           bfd_boolean);
 
 static const bfd_arch_info_type *
 bfd_i386_compatible (const bfd_arch_info_type *a,
@@ -41,16 +40,16 @@ bfd_i386_compatible (const bfd_arch_info_type *a,
   return compat;
 }
 
-/* Fill the buffer with zero or nop instruction if CODE is TRUE.  */
+/* Fill the buffer with zero or nop instruction if CODE is TRUE.  Use
+   multi byte nop instructions if LONG_NOP is TRUE.  */
 
-void *
-bfd_arch_i386_fill (bfd_size_type count,
-                   bfd_boolean is_bigendian ATTRIBUTE_UNUSED,
-                   bfd_boolean code)
+static void *
+bfd_arch_i386_fill (bfd_size_type count, bfd_boolean code,
+                   bfd_boolean long_nop)
 {
   /* nop */
-  static const char nop_1[] = { 0x90 };        
-  /* nopw */
+  static const char nop_1[] = { 0x90 };
+  /* xchg %ax,%ax */
   static const char nop_2[] = { 0x66, 0x90 };
   /* nopl (%[re]ax) */
   static const char nop_3[] = { 0x0f, 0x1f, 0x00 };
@@ -74,6 +73,7 @@ bfd_arch_i386_fill (bfd_size_type count,
   static const char *const nops[] =
     { nop_1, nop_2, nop_3, nop_4, nop_5,
       nop_6, nop_7, nop_8, nop_9, nop_10 };
+  bfd_size_type nop_size = long_nop ? ARRAY_SIZE (nops) : 2;
 
   void *fill = bfd_malloc (count);
   if (fill == NULL)
@@ -82,11 +82,11 @@ bfd_arch_i386_fill (bfd_size_type count,
   if (code)
     {
       bfd_byte *p = fill;
-      while (count >= ARRAY_SIZE (nops))
+      while (count >= nop_size)
        {
-         memcpy (p, nops[ARRAY_SIZE (nops) - 1], ARRAY_SIZE (nops));
-         p += ARRAY_SIZE (nops);
-         count -= ARRAY_SIZE (nops);
+         memcpy (p, nops[nop_size - 1], nop_size);
+         p += nop_size;
+         count -= nop_size;
        }
       if (count != 0)
        memcpy (p, nops[count - 1], count);
@@ -97,6 +97,91 @@ bfd_arch_i386_fill (bfd_size_type count,
   return fill;
 }
 
+/* Fill the buffer with zero or short nop instruction if CODE is TRUE.  */
+
+void *
+bfd_arch_i386_short_nop_fill (bfd_size_type count,
+                             bfd_boolean is_bigendian ATTRIBUTE_UNUSED,
+                             bfd_boolean code)
+{
+  return bfd_arch_i386_fill (count, code, FALSE);
+}
+
+/* Fill the buffer with zero or long nop instruction if CODE is TRUE.  */
+
+static void *
+bfd_arch_i386_long_nop_fill (bfd_size_type count,
+                            bfd_boolean is_bigendian ATTRIBUTE_UNUSED,
+                            bfd_boolean code)
+{
+  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 */
@@ -110,8 +195,8 @@ static const bfd_arch_info_type bfd_x64_32_arch_intel_syntax =
   FALSE,
   bfd_i386_compatible,
   bfd_default_scan,
-  bfd_arch_i386_fill,
-  0
+  bfd_arch_i386_long_nop_fill,
+  &bfd_i386_nacl_arch
 };
 
 static const bfd_arch_info_type bfd_x86_64_arch_intel_syntax =
@@ -127,7 +212,7 @@ static const bfd_arch_info_type bfd_x86_64_arch_intel_syntax =
   FALSE,
   bfd_i386_compatible,
   bfd_default_scan,
-  bfd_arch_i386_fill,
+  bfd_arch_i386_long_nop_fill,
   &bfd_x64_32_arch_intel_syntax,
 };
 
@@ -144,7 +229,7 @@ static const bfd_arch_info_type bfd_i386_arch_intel_syntax =
   TRUE,
   bfd_i386_compatible,
   bfd_default_scan,
-  bfd_arch_i386_fill,
+  bfd_arch_i386_short_nop_fill,
   &bfd_x86_64_arch_intel_syntax
 };
 
@@ -161,7 +246,7 @@ static const bfd_arch_info_type i8086_arch =
   FALSE,
   bfd_i386_compatible,
   bfd_default_scan,
-  bfd_arch_i386_fill,
+  bfd_arch_i386_short_nop_fill,
   &bfd_i386_arch_intel_syntax
 };
 
@@ -178,7 +263,7 @@ static const bfd_arch_info_type bfd_x64_32_arch =
   FALSE,
   bfd_i386_compatible,
   bfd_default_scan,
-  bfd_arch_i386_fill,
+  bfd_arch_i386_long_nop_fill,
   &i8086_arch
 };
 
@@ -195,7 +280,7 @@ static const bfd_arch_info_type bfd_x86_64_arch =
   FALSE,
   bfd_i386_compatible,
   bfd_default_scan,
-  bfd_arch_i386_fill,
+  bfd_arch_i386_long_nop_fill,
   &bfd_x64_32_arch
 };
 
@@ -212,6 +297,6 @@ const bfd_arch_info_type bfd_i386_arch =
   TRUE,
   bfd_i386_compatible,
   bfd_default_scan,
-  bfd_arch_i386_fill,
+  bfd_arch_i386_short_nop_fill,
   &bfd_x86_64_arch
 };
This page took 0.026481 seconds and 4 git commands to generate.