gdb/configure.ac: add --enable-source-highlight
[deliverable/binutils-gdb.git] / gas / write.c
index b902bf85659024d9f6124fa817cf42bebc7d9ed9..050fbe8da62e7e14ebf390fde333f9b3b8df394b 100644 (file)
@@ -1,5 +1,5 @@
 /* write.c - emit .o file
-   Copyright (C) 1986-2018 Free Software Foundation, Inc.
+   Copyright (C) 1986-2019 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -143,8 +143,8 @@ static int n_fixups;
 
 static fixS *
 fix_new_internal (fragS *frag,         /* Which frag?  */
-                 int where,            /* Where in that frag?  */
-                 int size,             /* 1, 2, or 4 usually.  */
+                 unsigned long where,  /* Where in that frag?  */
+                 unsigned long size,   /* 1, 2, or 4 usually.  */
                  symbolS *add_symbol,  /* X_add_symbol.  */
                  symbolS *sub_symbol,  /* X_op_symbol.  */
                  offsetT offset,       /* X_add_number.  */
@@ -164,7 +164,7 @@ fix_new_internal (fragS *frag,              /* Which frag?  */
   /* We've made fx_size a narrow field; check that it's wide enough.  */
   if (fixP->fx_size != size)
     {
-      as_bad (_("field fx_size too small to hold %d"), size);
+      as_bad (_("field fx_size too small to hold %lu"), size);
       abort ();
     }
   fixP->fx_addsy = add_symbol;
@@ -174,9 +174,7 @@ fix_new_internal (fragS *frag,              /* Which frag?  */
   fixP->fx_dot_frag = dot_frag;
   fixP->fx_pcrel = pcrel;
   fixP->fx_r_type = r_type;
-  fixP->fx_im_disp = 0;
   fixP->fx_pcrel_adjust = 0;
-  fixP->fx_bit_fixP = 0;
   fixP->fx_addnumber = 0;
   fixP->fx_tcbit = 0;
   fixP->fx_tcbit2 = 0;
@@ -228,10 +226,10 @@ fix_new_internal (fragS *frag,            /* Which frag?  */
 /* Create a fixup relative to a symbol (plus a constant).  */
 
 fixS *
-fix_new (fragS *frag,          /* Which frag?  */
-        int where,                     /* Where in that frag?  */
-        int size,                      /* 1, 2, or 4 usually.  */
-        symbolS *add_symbol,   /* X_add_symbol.  */
+fix_new (fragS *frag,                  /* Which frag?  */
+        unsigned long where,           /* Where in that frag?  */
+        unsigned long size,            /* 1, 2, or 4 usually.  */
+        symbolS *add_symbol,           /* X_add_symbol.  */
         offsetT offset,                /* X_add_number.  */
         int pcrel,                     /* TRUE if PC-relative relocation.  */
         RELOC_ENUM r_type              /* Relocation type.  */)
@@ -246,8 +244,8 @@ fix_new (fragS *frag,               /* Which frag?  */
 
 fixS *
 fix_new_exp (fragS *frag,              /* Which frag?  */
-            int where,                 /* Where in that frag?  */
-            int size,                  /* 1, 2, or 4 usually.  */
+            unsigned long where,       /* Where in that frag?  */
+            unsigned long size,        /* 1, 2, or 4 usually.  */
             expressionS *exp,          /* Expression.  */
             int pcrel,                 /* TRUE if PC-relative relocation.  */
             RELOC_ENUM r_type          /* Relocation type.  */)
@@ -313,7 +311,7 @@ fix_new_exp (fragS *frag,           /* Which frag?  */
    as for fix_new, except that WHERE is implicitly 0.  */
 
 fixS *
-fix_at_start (fragS *frag, int size, symbolS *add_symbol,
+fix_at_start (fragS *frag, unsigned long size, symbolS *add_symbol,
              offsetT offset, int pcrel, RELOC_ENUM r_type)
 {
   return fix_new_internal (frag, 0, size, add_symbol,
@@ -502,8 +500,8 @@ skip_align:
       md_convert_frag (stdoutput, sec, fragP);
 
       gas_assert (fragP->fr_next == NULL
-             || ((offsetT) (fragP->fr_next->fr_address - fragP->fr_address)
-                 == fragP->fr_fix));
+                 || (fragP->fr_next->fr_address - fragP->fr_address
+                     == fragP->fr_fix));
 
       /* After md_convert_frag, we make the frag into a ".space 0".
         md_convert_frag() should set up any fixSs and constants
@@ -1093,7 +1091,7 @@ fixup_segment (fixS *fixP, segT this_segment)
            symbol_mark_used_in_reloc (fixP->fx_subsy);
        }
 
-      if (!fixP->fx_bit_fixP && !fixP->fx_no_overflow && fixP->fx_size != 0)
+      if (!fixP->fx_no_overflow && fixP->fx_size != 0)
        {
          if (fixP->fx_size < sizeof (valueT))
            {
@@ -1131,7 +1129,7 @@ fixup_segment (fixS *fixP, segT this_segment)
                          (long) add_number,
                          (long) (fragP->fr_address + fixP->fx_where));
 #endif
-       }                       /* Not a bit fix.  */
+       }
 
 #ifdef TC_VALIDATE_FIX
     skip:  ATTRIBUTE_UNUSED_LABEL
@@ -1264,7 +1262,7 @@ write_relocs (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
   for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
     {
       int fx_size, slack;
-      offsetT loc;
+      valueT loc;
       arelent **reloc;
 #ifndef RELOC_EXPANSION_POSSIBLE
       arelent *rel;
@@ -1886,8 +1884,6 @@ create_obj_attrs_section (void)
   size_seg (stdoutput, s, NULL);
 }
 
-#include "struc-symbol.h"
-
 /* Create a relocation against an entry in a GNU Build attribute section.  */
 
 static void
@@ -1904,7 +1900,7 @@ create_note_reloc (segT           sec,
 
   /* We create a .b type reloc as resolve_reloc_expr_symbols() has already been called.  */
   reloc->u.b.sec   = sec;
-  reloc->u.b.s     = sym->bsym;
+  reloc->u.b.s     = symbol_get_bfdsym (sym);
   reloc->u.b.r.sym_ptr_ptr = & reloc->u.b.s;
   reloc->u.b.r.address     = offset;
   reloc->u.b.r.addend      = addend;
@@ -1946,10 +1942,12 @@ maybe_generate_build_notes (void)
   segT      sec;
   char *    note;
   offsetT   note_size;
+  offsetT   total_size;
   offsetT   desc_size;
   offsetT   desc2_offset;
   int       desc_reloc;
   symbolS * sym;
+  asymbol * bsym;
 
   if (! flag_generate_build_notes
       || bfd_get_section_by_name (stdoutput,
@@ -1963,7 +1961,8 @@ maybe_generate_build_notes (void)
                         SEC_READONLY | SEC_HAS_CONTENTS | SEC_DATA);
   bfd_set_section_alignment (stdoutput, sec, 2);
 
-  /* Create a version note.  */
+  /* Work out the size of the notes that we will create,
+     and the relocation we should use.  */
   if (bfd_arch_bits_per_address (stdoutput) <= 32)
     {
       note_size = 28;
@@ -1997,65 +1996,59 @@ maybe_generate_build_notes (void)
        desc_reloc = BFD_RELOC_64;
     }
   
-  frag_now_fix ();
-  note = frag_more (note_size);
-  memset (note, 0, note_size);
-
-  if (target_big_endian)
-    {
-      note[3] = 8; /* strlen (name) + 1.  */
-      note[7] = desc_size; /* Two 8-byte offsets.  */
-      note[10] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
-      note[11] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
-    }
-  else
-    {
-      note[0] = 8; /* strlen (name) + 1.  */
-      note[4] = desc_size; /* Two 8-byte offsets.  */
-      note[8] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
-      note[9] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
-    }
-
-  /* The a1 version number indicates that this note was
-     generated by the assembler and not the gcc annobin plugin.  */
-  memcpy (note + 12, "GA$\ 13a1", 8);
-
-  /* Find the first code section symbol.  */
-  for (sym = symbol_rootP; sym != NULL; sym = sym->sy_next)
-    if (sym->bsym != NULL
-       && sym->bsym->flags & BSF_SECTION_SYM
-       && sym->bsym->section != NULL
-       && sym->bsym->section->flags & SEC_CODE)
+  /* We have to create a note for *each* code section.
+     Linker garbage collection might discard some.  */
+  total_size = 0;
+  note = NULL;
+
+  for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
+    if ((bsym = symbol_get_bfdsym (sym)) != NULL
+       && bsym->flags & BSF_SECTION_SYM
+       && bsym->section != NULL
+       /* Skip linkonce sections - we cannot use these section symbols as they may disappear.  */
+       && (bsym->section->flags & (SEC_CODE | SEC_LINK_ONCE)) == SEC_CODE
+       /* Not all linkonce sections are flagged...  */
+       && strncmp (S_GET_NAME (sym), ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) != 0)
       {
-       /* Found one - now create a relocation against this symbol.  */
-       create_note_reloc (sec, sym, 20, desc_reloc, 0, note);
-       break;
-      }
+       /* Create a version note.  */
+       frag_now_fix ();
+       note = frag_more (note_size);
+       memset (note, 0, note_size);
 
-  /* Find the last code section symbol.  */
-  if (sym)
-    {
-      for (sym = symbol_lastP; sym != NULL; sym = sym->sy_previous)
-       if (sym->bsym != NULL
-           && sym->bsym->flags & BSF_SECTION_SYM
-           && sym->bsym->section != NULL
-           && sym->bsym->section->flags & SEC_CODE)
+       if (target_big_endian)
          {
-           /* Create a relocation against the end of this symbol.  */
-           create_note_reloc (sec, sym, desc2_offset, desc_reloc,
-                              bfd_get_section_size (sym->bsym->section),
-                              note);
-           break;
+           note[3] = 8; /* strlen (name) + 1.  */
+           note[7] = desc_size; /* Two 8-byte offsets.  */
+           note[10] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
+           note[11] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
          }
-    }
-  /* else - if we were unable to find any code section symbols then
-     probably there is no code in the output.  So leaving the start
-     and end values as zero in the note is OK.  */
+       else
+         {
+           note[0] = 8; /* strlen (name) + 1.  */
+           note[4] = desc_size; /* Two 8-byte offsets.  */
+           note[8] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
+           note[9] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
+         }
+
+       /* The a1 version number indicates that this note was
+          generated by the assembler and not the gcc annobin plugin.  */
+       memcpy (note + 12, "GA$\ 13a1", 8);
+
+       /* Create a relocation to install the start address of the note...  */
+       create_note_reloc (sec, sym, total_size + 20, desc_reloc, 0, note);
 
-  /* FIXME: Maybe add a note recording the assembler command line and version ?  */
+       /* ...and another one to install the end address.  */
+       create_note_reloc (sec, sym, total_size + desc2_offset, desc_reloc,
+                          bfd_get_section_size (bsym->section),
+                          note);
+
+       total_size += note_size;
+       /* FIXME: Maybe add a note recording the assembler command line and version ?  */
+      }
 
   /* Install the note(s) into the section.  */
-  bfd_set_section_contents (stdoutput, sec, (bfd_byte *) note, 0, note_size);
+  if (total_size)
+    bfd_set_section_contents (stdoutput, sec, (bfd_byte *) note, 0, total_size);
   subsegs_finish_section (sec);
   relax_segment (seg_info (sec)->frchainP->frch_root, sec, 0);
   size_seg (stdoutput, sec, NULL);
@@ -3147,14 +3140,6 @@ print_fixup (fixS *fixp)
     fprintf (stderr, " pcrel");
   if (fixp->fx_pcrel_adjust)
     fprintf (stderr, " pcrel_adjust=%d", fixp->fx_pcrel_adjust);
-  if (fixp->fx_im_disp)
-    {
-#ifdef TC_NS32K
-      fprintf (stderr, " im_disp=%d", fixp->fx_im_disp);
-#else
-      fprintf (stderr, " im_disp");
-#endif
-    }
   if (fixp->fx_tcbit)
     fprintf (stderr, " tcbit");
   if (fixp->fx_done)
This page took 0.030342 seconds and 4 git commands to generate.