ARM process record: median instructions
[deliverable/binutils-gdb.git] / bfd / mmo.c
index b269ffba6036d3fc2b3b172fc33c44bdf537e83b..d396fd742816b13ab7255b9a341e714a8292083c 100644 (file)
--- a/bfd/mmo.c
+++ b/bfd/mmo.c
@@ -1,5 +1,5 @@
 /* BFD back-end for mmo objects (MMIX-specific object-format).
-   Copyright (C) 2001-2015 Free Software Foundation, Inc.
+   Copyright (C) 2001-2016 Free Software Foundation, Inc.
    Written by Hans-Peter Nilsson (hp@bitrange.com).
    Infrastructure and other bits originally copied from srec.c and
    binary.c.
@@ -330,6 +330,14 @@ struct mmo_data_struct
 
     /* We also need a buffer to hold the bytes we count reading or writing.  */
     bfd_byte buf[4];
+
+    /* Whether we've calculated symbol consistency requirement yet.  We do this
+       when-needed, which must be at some time after all section
+       contents is known.  */
+    bfd_boolean symbol_consistency_override_calculated;
+
+    /* Whether to consistency-check symbol values, in particular "Main".  */
+    bfd_boolean ignore_symbol_consistency;
   };
 
 typedef struct mmo_data_struct tdata_type;
@@ -585,6 +593,34 @@ mmo_mkobject (bfd *abfd)
   return TRUE;
 }
 
+static bfd_boolean
+mmo_section_has_contents (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *p ATTRIBUTE_UNUSED)
+{
+  /* The point is to match what --extract-symbols does (well, negated).  */
+  return bfd_get_section_size (sec) != 0;
+}
+
+/* Find out whether we should omit symbol consistency checks for this
+   bfd and cache the value.
+
+   This function must only be called when all section contents is
+   known.  However, calculating symbol consistency at the time the
+   private BFD data is initialized is too late for some uses.  */
+
+static bfd_boolean
+mmo_ignore_symbol_consistency (bfd *abfd)
+{
+  if (!abfd->tdata.mmo_data->symbol_consistency_override_calculated)
+    {
+      abfd->tdata.mmo_data->ignore_symbol_consistency =
+       bfd_sections_find_if (abfd, mmo_section_has_contents, NULL) == NULL;
+
+      abfd->tdata.mmo_data->symbol_consistency_override_calculated = TRUE;
+    }
+
+  return abfd->tdata.mmo_data->ignore_symbol_consistency;
+}
+
 static bfd_boolean
 mmo_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 {
@@ -1208,7 +1244,8 @@ mmo_create_symbol (bfd *abfd, const char *symname, bfd_vma addr, enum
      object.  For written objects, we do it while setting the symbol
      table.  */
   if (strcmp (symname, MMIX_START_SYMBOL_NAME) == 0
-      && bfd_get_start_address (abfd) != addr)
+      && bfd_get_start_address (abfd) != addr
+      && !mmo_ignore_symbol_consistency (abfd))
     {
       (*_bfd_error_handler)
        (_("%s: invalid mmo file: initialization value for $255 is not `Main'\n"),
@@ -2896,16 +2933,18 @@ mmo_write_symbols_and_terminator (bfd *abfd)
        && (table[i]->flags & (BSF_DEBUGGING|BSF_GLOBAL)) == BSF_GLOBAL)
       {
        asymbol *mainsym = table[i];
+       bfd_vma mainvalue
+         = (mainsym->value
+            + mainsym->section->output_section->vma
+            + mainsym->section->output_offset);
        memcpy (table + 1, orig_table, i * sizeof (asymbol *));
        table[0] = mainsym;
 
        /* Check that the value assigned to :Main is the same as the entry
           address.  The default linker script asserts this.  This is as
           good a place as any to check this consistency. */
-       if ((mainsym->value
-            + mainsym->section->output_section->vma
-            + mainsym->section->output_offset)
-           != bfd_get_start_address (abfd))
+       if (mainvalue != bfd_get_start_address (abfd)
+           && !mmo_ignore_symbol_consistency (abfd))
          {
            /* Arbitrary buffer to hold the printable representation of a
               vma.  */
@@ -2913,7 +2952,7 @@ mmo_write_symbols_and_terminator (bfd *abfd)
            char vmas_start[40];
            bfd_vma vma_start = bfd_get_start_address (abfd);
 
-           sprintf_vma (vmas_main, mainsym->value);
+           sprintf_vma (vmas_main, mainvalue);
            sprintf_vma (vmas_start, vma_start);
 
            (*_bfd_error_handler)
This page took 0.024251 seconds and 4 git commands to generate.