Statically initialise target common sections
[deliverable/binutils-gdb.git] / bfd / elf32-v850.c
index 667c4677958d9b2a7b97e677b59a51c40d8f07cc..88e774b88e499f83bb6931a0a70d2538ce287018 100644 (file)
@@ -183,7 +183,7 @@ v850_elf_check_relocs (bfd *abfd,
              asection * section;
 
              section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
-             section->flags |= SEC_IS_COMMON;
+             section->flags |= SEC_IS_COMMON | SEC_SMALL_DATA;
            }
 
 #ifdef DEBUG
@@ -230,7 +230,7 @@ static void
 remember_hi16s_reloc (bfd *abfd, bfd_vma addend, bfd_byte *address)
 {
   hi16s_location * entry = NULL;
-  bfd_size_type amt = sizeof (* free_hi16s);
+  size_t amt = sizeof (* free_hi16s);
 
   /* Find a free structure.  */
   if (free_hi16s == NULL)
@@ -2929,15 +2929,29 @@ v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
    respectively, which yields smaller, faster assembler code.  This
    approach is copied from elf32-mips.c.  */
 
-static asection  v850_elf_scom_section;
-static asymbol   v850_elf_scom_symbol;
-static asymbol * v850_elf_scom_symbol_ptr;
-static asection  v850_elf_tcom_section;
-static asymbol   v850_elf_tcom_symbol;
-static asymbol * v850_elf_tcom_symbol_ptr;
-static asection  v850_elf_zcom_section;
-static asymbol   v850_elf_zcom_symbol;
-static asymbol * v850_elf_zcom_symbol_ptr;
+static asection v850_elf_scom_section;
+static const asymbol v850_elf_scom_symbol =
+  GLOBAL_SYM_INIT (".scommon", &v850_elf_scom_section);
+static asection v850_elf_scom_section =
+  BFD_FAKE_SECTION (v850_elf_scom_section, &v850_elf_scom_symbol,
+                   ".scommon", 0,
+                   SEC_IS_COMMON | SEC_SMALL_DATA | SEC_ALLOC | SEC_DATA);
+
+static asection v850_elf_tcom_section;
+static const asymbol v850_elf_tcom_symbol =
+  GLOBAL_SYM_INIT (".tcommon", &v850_elf_tcom_section);
+static asection v850_elf_tcom_section =
+  BFD_FAKE_SECTION (v850_elf_tcom_section, &v850_elf_tcom_symbol,
+                   ".tcommon", 0,
+                   SEC_IS_COMMON | SEC_SMALL_DATA);
+
+static asection v850_elf_zcom_section;
+static const asymbol v850_elf_zcom_symbol =
+  GLOBAL_SYM_INIT (".zcommon", &v850_elf_zcom_section);
+static asection v850_elf_zcom_section =
+  BFD_FAKE_SECTION (v850_elf_zcom_section, &v850_elf_zcom_symbol,
+                   ".zcommon", 0,
+                   SEC_IS_COMMON | SEC_SMALL_DATA);
 
 /* Given a BFD section, try to locate the
    corresponding ELF section index.  */
@@ -2997,55 +3011,16 @@ v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
   switch (indx)
     {
     case SHN_V850_SCOMMON:
-      if (v850_elf_scom_section.name == NULL)
-       {
-         /* Initialize the small common section.  */
-         v850_elf_scom_section.name           = ".scommon";
-         v850_elf_scom_section.flags          = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
-         v850_elf_scom_section.output_section = & v850_elf_scom_section;
-         v850_elf_scom_section.symbol         = & v850_elf_scom_symbol;
-         v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
-         v850_elf_scom_symbol.name            = ".scommon";
-         v850_elf_scom_symbol.flags           = BSF_SECTION_SYM;
-         v850_elf_scom_symbol.section         = & v850_elf_scom_section;
-         v850_elf_scom_symbol_ptr             = & v850_elf_scom_symbol;
-       }
       asym->section = & v850_elf_scom_section;
       asym->value = elfsym->internal_elf_sym.st_size;
       break;
 
     case SHN_V850_TCOMMON:
-      if (v850_elf_tcom_section.name == NULL)
-       {
-         /* Initialize the tcommon section.  */
-         v850_elf_tcom_section.name           = ".tcommon";
-         v850_elf_tcom_section.flags          = SEC_IS_COMMON;
-         v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
-         v850_elf_tcom_section.symbol         = & v850_elf_tcom_symbol;
-         v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
-         v850_elf_tcom_symbol.name            = ".tcommon";
-         v850_elf_tcom_symbol.flags           = BSF_SECTION_SYM;
-         v850_elf_tcom_symbol.section         = & v850_elf_tcom_section;
-         v850_elf_tcom_symbol_ptr             = & v850_elf_tcom_symbol;
-       }
       asym->section = & v850_elf_tcom_section;
       asym->value = elfsym->internal_elf_sym.st_size;
       break;
 
     case SHN_V850_ZCOMMON:
-      if (v850_elf_zcom_section.name == NULL)
-       {
-         /* Initialize the zcommon section.  */
-         v850_elf_zcom_section.name           = ".zcommon";
-         v850_elf_zcom_section.flags          = SEC_IS_COMMON;
-         v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
-         v850_elf_zcom_section.symbol         = & v850_elf_zcom_symbol;
-         v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
-         v850_elf_zcom_symbol.name            = ".zcommon";
-         v850_elf_zcom_symbol.flags           = BSF_SECTION_SYM;
-         v850_elf_zcom_symbol.section         = & v850_elf_zcom_section;
-         v850_elf_zcom_symbol_ptr             = & v850_elf_zcom_symbol;
-       }
       asym->section = & v850_elf_zcom_section;
       asym->value = elfsym->internal_elf_sym.st_size;
       break;
@@ -3095,19 +3070,19 @@ v850_elf_add_symbol_hook (bfd *abfd,
     {
     case SHN_V850_SCOMMON:
       *secp = bfd_make_section_old_way (abfd, ".scommon");
-      (*secp)->flags |= SEC_IS_COMMON;
+      (*secp)->flags |= SEC_IS_COMMON | SEC_SMALL_DATA;
       *valp = sym->st_size;
       break;
 
     case SHN_V850_TCOMMON:
       *secp = bfd_make_section_old_way (abfd, ".tcommon");
-      (*secp)->flags |= SEC_IS_COMMON;
+      (*secp)->flags |= SEC_IS_COMMON | SEC_SMALL_DATA;
       *valp = sym->st_size;
       break;
 
     case SHN_V850_ZCOMMON:
       *secp = bfd_make_section_old_way (abfd, ".zcommon");
-      (*secp)->flags |= SEC_IS_COMMON;
+      (*secp)->flags |= SEC_IS_COMMON | SEC_SMALL_DATA;
       *valp = sym->st_size;
       break;
     }
@@ -3151,6 +3126,8 @@ v850_elf_section_from_shdr (bfd *abfd,
                            const char *name,
                            int shindex)
 {
+  flagword flags;
+
   /* There ought to be a place to keep ELF backend specific flags, but
      at the moment there isn't one.  We just keep track of the
      sections by their name, instead.  */
@@ -3158,18 +3135,21 @@ v850_elf_section_from_shdr (bfd *abfd,
   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
     return FALSE;
 
+  flags = 0;
   switch (hdr->sh_type)
     {
     case SHT_V850_SCOMMON:
     case SHT_V850_TCOMMON:
     case SHT_V850_ZCOMMON:
-      if (!bfd_set_section_flags (hdr->bfd_section,
-                                 (bfd_section_flags (hdr->bfd_section)
-                                  | SEC_IS_COMMON)))
-       return FALSE;
+      flags = SEC_IS_COMMON;
     }
 
-  return TRUE;
+  if ((hdr->sh_flags & SHF_V850_GPREL) != 0)
+    flags |= SEC_SMALL_DATA;
+
+  return (flags == 0
+         || bfd_set_section_flags (hdr->bfd_section,
+                                   hdr->bfd_section->flags | flags));
 }
 
 /* Set the correct type for a V850 ELF section.  We do this
@@ -3837,7 +3817,7 @@ v850_elf_relax_section (bfd *abfd,
                  if (no_match < 0
                      && ((insn[2] & JMP_R_MASK) != JMP_R
                           || MOVEA_R2 (insn[1]) != JMP_R1 (insn[2])))
-                   no_match = 4;
+                   no_match = 2;
                }
              else
                {
@@ -4088,16 +4068,13 @@ v850_elf_relax_section (bfd *abfd,
     }
 
  finish:
-  if (internal_relocs != NULL
-      && elf_section_data (sec)->relocs != internal_relocs)
+  if (elf_section_data (sec)->relocs != internal_relocs)
     free (internal_relocs);
 
-  if (contents != NULL
-      && elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents)
+  if (elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents)
     free (contents);
 
-  if (isymbuf != NULL
-      && symtab_hdr->contents != (bfd_byte *) isymbuf)
+  if (symtab_hdr->contents != (bfd_byte *) isymbuf)
     free (isymbuf);
 
   return result;
This page took 0.027799 seconds and 4 git commands to generate.