Automatic date update in version.in
[deliverable/binutils-gdb.git] / bfd / elf32-metag.c
index 6932a3b6327e63e8d33d5738da8eb9c371add499..984741847a9ed0d14f21a028d93266336c08b2b9 100644 (file)
@@ -1,5 +1,5 @@
 /* Meta support for 32-bit ELF
-   Copyright (C) 2013-2018 Free Software Foundation, Inc.
+   Copyright (C) 2013-2021 Free Software Foundation, Inc.
    Contributed by Imagination Technologies Ltd.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -97,90 +97,90 @@ static reloc_howto_type elf_metag_howto_table[] =
         16,                    /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HIADDR16",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Low order 16 bit absolute.  */
   HOWTO (R_METAG_LOADDR16,     /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont,/* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LOADDR16",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 32 bit absolute.  */
   HOWTO (R_METAG_ADDR32,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_ADDR32",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0x00000000,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* No relocation.  */
   HOWTO (R_METAG_NONE,         /* type */
         0,                     /* rightshift */
         3,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_NONE",        /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 19 bit pc relative */
   HOWTO (R_METAG_RELBRANCH,    /* type */
         2,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         19,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         5,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_RELBRANCH",   /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x00ffffe0,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* GET/SET offset */
   HOWTO (R_METAG_GETSETOFF,    /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GETSETOFF",   /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   EMPTY_HOWTO (6),
   EMPTY_HOWTO (7),
@@ -211,192 +211,192 @@ static reloc_howto_type elf_metag_howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        FALSE,         /* pc_relative */
+        false,         /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         NULL,                  /* special_function */
         "R_METAG_GNU_VTINHERIT", /* name */
-        FALSE,         /* partial_inplace */
+        false,         /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_GNU_VTENTRY,  /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         _bfd_elf_rel_vtable_reloc_fn, /* special_function */
         "R_METAG_GNU_VTENTRY",  /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* High order 16 bit GOT offset */
   HOWTO (R_METAG_HI16_GOTOFF,  /* type */
         16,                    /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HI16_GOTOFF", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Low order 16 bit GOT offset */
   HOWTO (R_METAG_LO16_GOTOFF,  /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LO16_GOTOFF", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* GET/SET GOT offset */
   HOWTO (R_METAG_GETSET_GOTOFF, /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GETSET_GOTOFF", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* GET/SET GOT relative */
   HOWTO (R_METAG_GETSET_GOT,   /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GETSET_GOT",  /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* High order 16 bit GOT reference */
   HOWTO (R_METAG_HI16_GOTPC,   /* type */
         16,                    /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HI16_GOTPC",  /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Low order 16 bit GOT reference */
   HOWTO (R_METAG_LO16_GOTPC,   /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LO16_GOTPC",  /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* High order 16 bit PLT */
   HOWTO (R_METAG_HI16_PLT,     /* type */
         16,                    /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_HI16_PLT",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Low order 16 bit PLT */
   HOWTO (R_METAG_LO16_PLT,     /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_LO16_PLT",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_RELBRANCH_PLT, /* type */
         2,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         19,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         5,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_RELBRANCH_PLT", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x00ffffe0,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Dummy relocs used by the linker internally.  */
   HOWTO (R_METAG_GOTOFF,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GOTOFF",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_PLT,          /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GOTOFF",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* This is used only by the dynamic linker.  The symbol should exist
      both in the object being run and in some shared library.  The
@@ -407,30 +407,30 @@ static reloc_howto_type elf_metag_howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_COPY",        /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Marks a procedure linkage table entry for a symbol.  */
   HOWTO (R_METAG_JMP_SLOT,     /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_JMP_SLOT",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Used only by the dynamic linker.  When the object is run, this
      longword is set to the load address of the object, plus the
@@ -439,242 +439,242 @@ static reloc_howto_type elf_metag_howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_RELATIVE",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_GLOB_DAT,     /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_GLOB_DAT",    /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_GD,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_GD",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_LDM,      /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDM",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_LDO_HI16, /* type */
         16,                    /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDO_HI16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_LDO_LO16, /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDO_LO16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Dummy reloc used by the linker internally.  */
   HOWTO (R_METAG_TLS_LDO,      /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LDO",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_IE,       /* type */
         2,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         12,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         7,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IE",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007ff80,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Dummy reloc used by the linker internally.  */
   HOWTO (R_METAG_TLS_IENONPIC,  /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IENONPIC", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_IENONPIC_HI16,/* type */
         16,                    /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IENONPIC_HI16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_IENONPIC_LO16,/* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_IENONPIC_LO16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_TPOFF,    /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_TPOFF",   /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_DTPMOD,   /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_DTPMOD",  /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_DTPOFF,   /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_DTPOFF",  /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Dummy reloc used by the linker internally.  */
   HOWTO (R_METAG_TLS_LE,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LE",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_LE_HI16,  /* type */
         16,                    /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LE_HI16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_METAG_TLS_LE_LO16,  /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         3,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_METAG_TLS_LE_LO16", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0007fff8,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
 };
 
@@ -785,10 +785,6 @@ struct elf_metag_link_hash_entry
      symbol.  */
   struct elf_metag_stub_hash_entry *hsh_cache;
 
-  /* Used to count relocations for delayed sizing of relocation
-     sections.  */
-  struct elf_dyn_relocs *dyn_relocs;
-
   enum
     {
       GOT_UNKNOWN = 0, GOT_NORMAL = 1, GOT_TLS_IE = 2, GOT_TLS_LDM = 4, GOT_TLS_GD = 8
@@ -827,9 +823,6 @@ struct elf_metag_link_hash_table
   asection **input_list;
   Elf_Internal_Sym **all_local_syms;
 
-  /* Small local sym cache.  */
-  struct sym_cache sym_cache;
-
   /* Data for LDM relocations.  */
   union
   {
@@ -864,8 +857,8 @@ tpoff (struct bfd_link_info *info, bfd_vma address)
                         elf_hash_table (info)->tls_sec->alignment_power));
 }
 
-static void
-metag_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
+static bool
+metag_info_to_howto_rela (bfd *abfd,
                          arelent *cache_ptr,
                          Elf_Internal_Rela *dst)
 {
@@ -875,10 +868,13 @@ metag_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
   if (r_type >= (unsigned int) R_METAG_MAX)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: invalid METAG reloc number: %d"), abfd, r_type);
-      r_type = 0;
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                         abfd, r_type);
+      bfd_set_error (bfd_error_bad_value);
+      return false;
     }
   cache_ptr->howto = & elf_metag_howto_table [r_type];
+  return true;
 }
 
 static reloc_howto_type *
@@ -910,8 +906,9 @@ metag_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 
 /* Various hash macros and functions.  */
 #define metag_link_hash_table(p) \
-  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
-  == METAG_ELF_DATA ? ((struct elf_metag_link_hash_table *) ((p)->hash)) : NULL)
+  ((is_elf_hash_table ((p)->hash)                                      \
+    && elf_hash_table_id (elf_hash_table (p)) == METAG_ELF_DATA)       \
+   ? (struct elf_metag_link_hash_table *) (p)->hash : NULL)
 
 #define metag_elf_hash_entry(ent) \
   ((struct elf_metag_link_hash_entry *)(ent))
@@ -991,7 +988,6 @@ metag_link_hash_newfunc (struct bfd_hash_entry *entry,
       /* Initialize the local fields.  */
       hh = (struct elf_metag_link_hash_entry *) entry;
       hh->hsh_cache = NULL;
-      hh->dyn_relocs = NULL;
       hh->tls_type = GOT_UNKNOWN;
     }
 
@@ -1018,7 +1014,7 @@ static struct bfd_link_hash_table *
 elf_metag_link_hash_table_create (bfd *abfd)
 {
   struct elf_metag_link_hash_table *htab;
-  bfd_size_type amt = sizeof (*htab);
+  size_t amt = sizeof (*htab);
 
   htab = bfd_zmalloc (amt);
   if (htab == NULL)
@@ -1041,6 +1037,7 @@ elf_metag_link_hash_table_create (bfd *abfd)
       return NULL;
     }
   htab->etab.root.hash_table_free = elf_metag_link_hash_table_free;
+  htab->etab.dt_pltgot_required = true;
 
   return &htab->etab.root;
 }
@@ -1123,7 +1120,7 @@ metag_get_stub_entry (const asection *input_section,
        return NULL;
 
       hsh = metag_stub_hash_lookup (&htab->bstab,
-                                   stub_name, FALSE, FALSE);
+                                   stub_name, false, false);
 
       if (hh != NULL)
        hh->hsh_cache = hsh;
@@ -1176,11 +1173,11 @@ metag_add_stub (const char *stub_name,
 
   /* Enter this entry into the linker stub hash table.  */
   hsh = metag_stub_hash_lookup (&htab->bstab, stub_name,
-                               TRUE, FALSE);
+                               true, false);
   if (hsh == NULL)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: cannot create stub entry %s"),
+      _bfd_error_handler (_("%pB: cannot create stub entry %s"),
                          section->owner, stub_name);
       return NULL;
     }
@@ -1194,7 +1191,7 @@ metag_add_stub (const char *stub_name,
 /* Check a signed integer value can be represented in the given number
    of bits.  */
 
-static bfd_boolean
+static bool
 within_signed_range (int value, unsigned int bits)
 {
   int min_val = -(1 << (bits - 1));
@@ -1393,7 +1390,7 @@ metag_final_link_relocate (reloc_howto_type *howto,
                                              rel, relend, howto, contents) \
   {                                                                    \
     _bfd_clear_contents (howto, input_bfd, input_section,              \
-                        contents + rel->r_offset);                     \
+                        contents, rel->r_offset);                      \
                                                                        \
     if (bfd_link_relocatable (info)                                    \
        && (input_section->flags & SEC_DEBUGGING))                      \
@@ -1455,7 +1452,7 @@ going to be the section symbol corresponding to the output
 section, which means that the addend must be adjusted
 accordingly.  */
 
-static bfd_boolean
+static int
 elf_metag_relocate_section (bfd *output_bfd,
                            struct bfd_link_info *info,
                            bfd *input_bfd,
@@ -1516,12 +1513,12 @@ elf_metag_relocate_section (bfd *output_bfd,
 
          name = bfd_elf_string_from_elf_section
            (input_bfd, symtab_hdr->sh_link, sym->st_name);
-         name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
+         name = name == NULL ? bfd_section_name (sec) : name;
        }
       else
        {
          struct elf_link_hash_entry *eh;
-         bfd_boolean unresolved_reloc, warned, ignored;
+         bool unresolved_reloc, warned, ignored;
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, eh_syms,
@@ -1549,8 +1546,8 @@ elf_metag_relocate_section (bfd *output_bfd,
          if ((bfd_link_pic (info)
               && r_symndx != STN_UNDEF
               && (input_section->flags & SEC_ALLOC) != 0
-              && (r_type != R_METAG_RELBRANCH
-                  || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
+              && !(r_type == R_METAG_RELBRANCH
+                   && (hh == NULL || SYMBOL_CALLS_LOCAL (info, &hh->eh))))
              || (!bfd_link_pic (info)
                  && hh != NULL
                  && hh->eh.dynindx != -1
@@ -1561,7 +1558,7 @@ elf_metag_relocate_section (bfd *output_bfd,
                      || hh->eh.root.type == bfd_link_hash_undefined)))
            {
              Elf_Internal_Rela outrel;
-             bfd_boolean skip, relocate;
+             bool skip, relocate;
              bfd_byte *loc;
 
              /* When generating a shared object, these relocations
@@ -1571,17 +1568,17 @@ elf_metag_relocate_section (bfd *output_bfd,
              sreloc = elf_section_data (input_section)->sreloc;
              BFD_ASSERT (sreloc != NULL);
 
-             skip = FALSE;
-             relocate = FALSE;
+             skip = false;
+             relocate = false;
 
              outrel.r_offset = _bfd_elf_section_offset (output_bfd,
                                                         info,
                                                         input_section,
                                                         rel->r_offset);
              if (outrel.r_offset == (bfd_vma) -1)
-               skip = TRUE;
+               skip = true;
              else if (outrel.r_offset == (bfd_vma) -2)
-               skip = TRUE, relocate = TRUE;
+               skip = true, relocate = true;
              outrel.r_offset += (input_section->output_section->vma
                                  + input_section->output_offset);
 
@@ -1604,7 +1601,7 @@ elf_metag_relocate_section (bfd *output_bfd,
                      || ((info->symbolic || hh->eh.dynindx == -1)
                          && hh->eh.def_regular))
                    {
-                     relocate = TRUE;
+                     relocate = true;
                      outrel.r_info = ELF32_R_INFO (0, R_METAG_RELATIVE);
                      outrel.r_addend = relocation + rel->r_addend;
                    }
@@ -1675,13 +1672,13 @@ elf_metag_relocate_section (bfd *output_bfd,
        case R_METAG_GETSET_GOT:
          {
            bfd_vma off;
-           bfd_boolean do_got = 0;
+           bool do_got = 0;
 
            /* Relocation is to the entry for this symbol in the
               global offset table.  */
            if (hh != NULL)
              {
-               bfd_boolean dyn;
+               bool dyn;
 
                off = hh->eh.got.offset;
                dyn = htab->etab.dynamic_sections_created;
@@ -1770,7 +1767,7 @@ elf_metag_relocate_section (bfd *output_bfd,
            indx = 0;
            if (hh != NULL)
              {
-               bfd_boolean dyn;
+               bool dyn;
                dyn = htab->etab.dynamic_sections_created;
 
                if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
@@ -1801,7 +1798,7 @@ elf_metag_relocate_section (bfd *output_bfd,
              off &= ~1;
            else
              {
-               bfd_boolean need_relocs = FALSE;
+               bool need_relocs = false;
                Elf_Internal_Rela outrel;
                bfd_byte *loc = NULL;
                int cur_off = off;
@@ -1815,7 +1812,7 @@ elf_metag_relocate_section (bfd *output_bfd,
                        || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
                        || hh->eh.root.type != bfd_link_hash_undefweak))
                  {
-                   need_relocs = TRUE;
+                   need_relocs = true;
                    loc = htab->etab.srelgot->contents;
                    /* FIXME (CAO): Should this be reloc_count++ ? */
                    loc += htab->etab.srelgot->reloc_count * sizeof (Elf32_External_Rela);
@@ -1857,12 +1854,12 @@ elf_metag_relocate_section (bfd *output_bfd,
                        /* We don't support changing the TLS model.  */
                        /* PR 20675 */
                        if (bfd_link_pic (info))
-                         _bfd_error_handler (_("%B(%A): multiple TLS models are not supported"),
+                         _bfd_error_handler (_("%pB(%pA): multiple TLS models are not supported"),
                                              input_bfd, input_section);
                        else
-                         _bfd_error_handler (_("%B(%A): shared library symbol %s encountered whilst performing a static link"),
+                         _bfd_error_handler (_("%pB(%pA): shared library symbol %s encountered whilst performing a static link"),
                                              input_bfd, input_section, name);
-                       return FALSE;
+                       return false;
                      }
 
                    cur_off += 8;
@@ -1913,9 +1910,11 @@ elf_metag_relocate_section (bfd *output_bfd,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B(%A+%#Lx): %s relocation not permitted in shared object"),
-                input_bfd, input_section, rel->r_offset, howto->name);
-             return FALSE;
+               (_("%pB(%pA+%#" PRIx64 "): "
+                  "%s relocation not permitted in shared object"),
+                input_bfd, input_section, (uint64_t) rel->r_offset,
+                howto->name);
+             return false;
            }
          else
            relocation = tpoff (info, relocation);
@@ -1978,7 +1977,7 @@ elf_metag_relocate_section (bfd *output_bfd,
 
            case bfd_reloc_undefined:
              (*info->callbacks->undefined_symbol)
-               (info, name, input_bfd, input_section, rel->r_offset, TRUE);
+               (info, name, input_bfd, input_section, rel->r_offset, true);
              break;
 
            case bfd_reloc_outofrange:
@@ -2004,13 +2003,13 @@ elf_metag_relocate_section (bfd *output_bfd,
        }
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Create the .plt and .got sections, and set up our hash table
    short-cuts to various dynamic sections.  */
 
-static bfd_boolean
+static bool
 elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 {
   struct elf_metag_link_hash_table *htab;
@@ -2021,11 +2020,11 @@ elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
   /* Don't try to create the .plt and .got twice.  */
   htab = metag_link_hash_table (info);
   if (htab->etab.splt != NULL)
-    return TRUE;
+    return true;
 
   /* Call the generic code to do most of the work.  */
   if (! _bfd_elf_create_dynamic_sections (abfd, info))
-    return FALSE;
+    return false;
 
   /* The header goes at the start of the dynamic .got section, which
      is placed after the dynamic .got.plt section.  ie. The header is
@@ -2036,8 +2035,8 @@ elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
   bh = NULL;
   if (!(_bfd_generic_link_add_one_symbol
        (info, abfd, "__GLOBAL_OFFSET_TABLE__", BSF_GLOBAL, htab->etab.sgot,
-        (bfd_vma) 0, NULL, FALSE, bed->collect, &bh)))
-    return FALSE;
+        (bfd_vma) 0, NULL, false, bed->collect, &bh)))
+    return false;
   eh = (struct elf_link_hash_entry *) bh;
   eh->def_regular = 1;
   eh->type = STT_OBJECT;
@@ -2045,11 +2044,11 @@ elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 
   if (! bfd_link_executable (info)
       && ! bfd_elf_link_record_dynamic_symbol (info, eh))
-    return FALSE;
+    return false;
 
   htab->etab.hgot = eh;
 
-  return TRUE;
+  return true;
 }
 
 /* Look through the relocs for a section during the first phase, and
@@ -2057,7 +2056,7 @@ elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
    table, and dynamic reloc sections.  At this point we haven't
    necessarily read all the input files.  */
 
-static bfd_boolean
+static bool
 elf_metag_check_relocs (bfd *abfd,
                        struct bfd_link_info *info,
                        asection *sec,
@@ -2073,7 +2072,7 @@ elf_metag_check_relocs (bfd *abfd,
   int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN;
 
   if (bfd_link_relocatable (info))
-    return TRUE;
+    return true;
 
   htab = metag_link_hash_table (info);
   dynobj = htab->etab.dynobj;
@@ -2082,7 +2081,7 @@ elf_metag_check_relocs (bfd *abfd,
   sreloc = NULL;
 
   if (htab == NULL)
-    return FALSE;
+    return false;
 
   rel_end = relocs + sec->reloc_count;
   for (rel = relocs; rel < rel_end; rel++)
@@ -2097,10 +2096,10 @@ elf_metag_check_relocs (bfd *abfd,
       if (r_symndx < symtab_hdr->sh_info)
        {
          /* A local symbol.  */
-         isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+         isym = bfd_sym_from_r_symndx (&htab->etab.sym_cache,
                                        abfd, r_symndx);
          if (isym == NULL)
-           return FALSE;
+           return false;
 
          hh = NULL;
        }
@@ -2136,7 +2135,7 @@ elf_metag_check_relocs (bfd *abfd,
              if (dynobj == NULL)
                htab->etab.dynobj = dynobj = abfd;
              if (!elf_metag_create_dynamic_sections (dynobj, info))
-               return FALSE;
+               return false;
              break;
 
            default:
@@ -2185,7 +2184,7 @@ elf_metag_check_relocs (bfd *abfd,
                  local_got_refcounts = ((bfd_signed_vma *)
                                         bfd_zalloc (abfd, size));
                  if (local_got_refcounts == NULL)
-                   return FALSE;
+                   return false;
                  elf_local_got_refcounts (abfd) = local_got_refcounts;
                  memset (metag_elf_local_got_tls_type (abfd),
                          GOT_UNKNOWN, symtab_hdr->sh_info);
@@ -2249,10 +2248,10 @@ elf_metag_check_relocs (bfd *abfd,
                name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
+               (_("%pB: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
                 abfd, elf_metag_howto_table[r_type].name, name);
              bfd_set_error (bfd_error_bad_value);
-             return FALSE;
+             return false;
            }
 
          /* Fall through.  */
@@ -2309,12 +2308,12 @@ elf_metag_check_relocs (bfd *abfd,
              if (sreloc == NULL)
                {
                  sreloc = _bfd_elf_make_dynamic_reloc_section
-                   (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
+                   (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ true);
 
                  if (sreloc == NULL)
                    {
                      bfd_set_error (bfd_error_bad_value);
-                     return FALSE;
+                     return false;
                    }
 
                  elf_section_data (sec)->sreloc = sreloc;
@@ -2323,7 +2322,7 @@ elf_metag_check_relocs (bfd *abfd,
              /* If this is a global symbol, we count the number of
                 relocations we need for this symbol.  */
              if (hh != NULL)
-               hdh_head = &((struct elf_metag_link_hash_entry *) hh)->dyn_relocs;
+               hdh_head = &hh->eh.dyn_relocs;
              else
                {
                  /* Track dynamic relocs needed for local syms too.  */
@@ -2344,7 +2343,7 @@ elf_metag_check_relocs (bfd *abfd,
                  hdh_p = ((struct elf_dyn_relocs *)
                           bfd_alloc (dynobj, sizeof *hdh_p));
                  if (hdh_p == NULL)
-                   return FALSE;
+                   return false;
                  hdh_p->next = *hdh_head;
                  *hdh_head = hdh_p;
                  hdh_p->sec = sec;
@@ -2363,21 +2362,19 @@ elf_metag_check_relocs (bfd *abfd,
        case R_METAG_GNU_VTINHERIT:
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh,
                                            rel->r_offset))
-           return FALSE;
+           return false;
          break;
 
          /* This relocation describes which C++ vtable entries are actually
             used.  Record for later use during GC.  */
        case R_METAG_GNU_VTENTRY:
-         BFD_ASSERT (hh != NULL);
-         if (hh != NULL
-             && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rel->r_addend))
-           return FALSE;
+         if (!bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rel->r_addend))
+           return false;
          break;
        }
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
@@ -2392,41 +2389,6 @@ elf_metag_copy_indirect_symbol (struct bfd_link_info *info,
   hh_dir = metag_elf_hash_entry (eh_dir);
   hh_ind = metag_elf_hash_entry (eh_ind);
 
-  if (hh_ind->dyn_relocs != NULL)
-    {
-      if (hh_dir->dyn_relocs != NULL)
-       {
-         struct elf_dyn_relocs **hdh_pp;
-         struct elf_dyn_relocs *hdh_p;
-
-         if (eh_ind->root.type == bfd_link_hash_indirect)
-           abort ();
-
-         /* Add reloc counts against the weak sym to the strong sym
-            list.  Merge any entries against the same section.  */
-         for (hdh_pp = &hh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
-           {
-             struct elf_dyn_relocs *hdh_q;
-
-             for (hdh_q = hh_dir->dyn_relocs; hdh_q != NULL;
-                  hdh_q = hdh_q->next)
-               if (hdh_q->sec == hdh_p->sec)
-                 {
-                   hdh_q->pc_count += hdh_p->pc_count;
-                   hdh_q->count += hdh_p->count;
-                   *hdh_pp = hdh_p->next;
-                   break;
-                 }
-             if (hdh_q == NULL)
-               hdh_pp = &hdh_p->next;
-           }
-         *hdh_pp = hh_dir->dyn_relocs;
-       }
-
-      hh_dir->dyn_relocs = hh_ind->dyn_relocs;
-      hh_ind->dyn_relocs = NULL;
-    }
-
   if (eh_ind->root.type == bfd_link_hash_indirect
       && eh_dir->got.refcount <= 0)
     {
@@ -2437,30 +2399,13 @@ elf_metag_copy_indirect_symbol (struct bfd_link_info *info,
   _bfd_elf_link_hash_copy_indirect (info, eh_dir, eh_ind);
 }
 
-/* Find dynamic relocs for H that apply to read-only sections.  */
-
-static asection *
-readonly_dynrelocs (struct elf_link_hash_entry *h)
-{
-  struct elf_dyn_relocs *p;
-
-  for (p = metag_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
-    {
-      asection *s = p->sec->output_section;
-
-      if (s != NULL && (s->flags & SEC_READONLY) != 0)
-       return p->sec;
-    }
-  return NULL;
-}
-
 /* Adjust a symbol defined by a dynamic object and referenced by a
    regular object.  The current definition is in some section of the
    dynamic object, but we're not including those sections.  We have to
    change the definition to something the rest of the link can
    understand.  */
 
-static bfd_boolean
+static bool
 elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
                                 struct elf_link_hash_entry *eh)
 {
@@ -2487,7 +2432,7 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
          eh->needs_plt = 0;
        }
 
-      return TRUE;
+      return true;
     }
   else
     eh->plt.offset = (bfd_vma) -1;
@@ -2502,7 +2447,7 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
       eh->root.u.def.section = def->root.u.def.section;
       eh->root.u.def.value = def->root.u.def.value;
       eh->non_got_ref = def->non_got_ref;
-      return TRUE;
+      return true;
     }
 
   /* This is a reference to a symbol defined by a dynamic object which
@@ -2513,26 +2458,26 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
   if (bfd_link_pic (info))
-    return TRUE;
+    return true;
 
   /* If there are no references to this symbol that do not use the
      GOT, we don't need to generate a copy reloc.  */
   if (!eh->non_got_ref)
-    return TRUE;
+    return true;
 
   /* If -z nocopyreloc was given, we won't generate them either.  */
   if (info->nocopyreloc)
     {
       eh->non_got_ref = 0;
-      return TRUE;
+      return true;
     }
 
   /* If we don't find any dynamic relocs in read-only sections, then
      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
-  if (!readonly_dynrelocs (eh))
+  if (!_bfd_elf_readonly_dynrelocs (eh))
     {
       eh->non_got_ref = 0;
-      return TRUE;
+      return true;
     }
 
   /* We must allocate the symbol in our .dynbss section, which will
@@ -2572,16 +2517,15 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info,
 /* Allocate space in .plt, .got and associated reloc sections for
    global syms.  */
 
-static bfd_boolean
+static bool
 allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
 {
   struct bfd_link_info *info;
   struct elf_metag_link_hash_table *htab;
-  struct elf_metag_link_hash_entry *hh;
   struct elf_dyn_relocs *hdh_p;
 
   if (eh->root.type == bfd_link_hash_indirect)
-    return TRUE;
+    return true;
 
   if (eh->root.type == bfd_link_hash_warning)
     eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
@@ -2598,7 +2542,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
          && !eh->forced_local)
        {
          if (! bfd_elf_link_record_dynamic_symbol (info, eh))
-           return FALSE;
+           return false;
        }
 
       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), eh))
@@ -2649,7 +2593,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
   if (eh->got.refcount > 0)
     {
       asection *s;
-      bfd_boolean dyn;
+      bool dyn;
       int tls_type = metag_elf_hash_entry (eh)->tls_type;
 
       /* Make sure this symbol is output as a dynamic symbol.
@@ -2658,7 +2602,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
          && !eh->forced_local)
        {
          if (! bfd_elf_link_record_dynamic_symbol (info, eh))
-           return FALSE;
+           return false;
        }
 
       s = htab->etab.sgot;
@@ -2684,9 +2628,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
   else
     eh->got.offset = (bfd_vma) -1;
 
-  hh = (struct elf_metag_link_hash_entry *) eh;
-  if (hh->dyn_relocs == NULL)
-    return TRUE;
+  if (eh->dyn_relocs == NULL)
+    return true;
 
   /* If this is a -Bsymbolic shared link, then we need to discard all
      space allocated for dynamic pc-relative relocs against symbols
@@ -2699,7 +2642,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
        {
          struct elf_dyn_relocs **hdh_pp;
 
-         for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
+         for (hdh_pp = &eh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
            {
              hdh_p->count -= hdh_p->pc_count;
              hdh_p->pc_count = 0;
@@ -2712,11 +2655,11 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
 
       /* Also discard relocs on undefined weak syms with non-default
         visibility.  */
-      if (hh->dyn_relocs != NULL
+      if (eh->dyn_relocs != NULL
          && eh->root.type == bfd_link_hash_undefweak)
        {
          if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
-           hh->dyn_relocs = NULL;
+           eh->dyn_relocs = NULL;
 
          /* Make sure undefined weak symbols are output as a dynamic
             symbol in PIEs.  */
@@ -2724,7 +2667,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
                   && !eh->forced_local)
            {
              if (! bfd_elf_link_record_dynamic_symbol (info, eh))
-               return FALSE;
+               return false;
            }
        }
     }
@@ -2746,7 +2689,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
              && !eh->forced_local)
            {
              if (! bfd_elf_link_record_dynamic_symbol (info, eh))
-               return FALSE;
+               return false;
            }
 
          /* If that succeeded, we know we'll be keeping all the
@@ -2755,52 +2698,25 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
            goto keep;
        }
 
-      hh->dyn_relocs = NULL;
-      return TRUE;
+      eh->dyn_relocs = NULL;
+      return true;
 
     keep: ;
     }
 
   /* Finally, allocate space.  */
-  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->next)
+  for (hdh_p = eh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->next)
     {
       asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
       sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
     }
 
-  return TRUE;
-}
-
-/* Set DF_TEXTREL if we find any dynamic relocs that apply to
-   read-only sections.  */
-
-static bfd_boolean
-maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
-{
-  asection *sec;
-
-  if (h->root.type == bfd_link_hash_indirect)
-    return TRUE;
-
-  sec = readonly_dynrelocs (h);
-  if (sec != NULL)
-    {
-      struct bfd_link_info *info = (struct bfd_link_info *) info_p;
-
-      info->flags |= DF_TEXTREL;
-      info->callbacks->minfo
-       (_("%B: dynamic relocation against `%T' in read-only section `%A'\n"),
-        sec->owner, h->root.root.string, sec);
-
-      /* Not an error, just cut short the traversal.  */
-      return FALSE;
-    }
-  return TRUE;
+  return true;
 }
 
 /* Set the sizes of the dynamic sections.  */
 
-static bfd_boolean
+static bool
 elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
                                 struct bfd_link_info *info)
 {
@@ -2808,7 +2724,7 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   bfd *dynobj;
   bfd *ibfd;
   asection *s;
-  bfd_boolean relocs;
+  bool relocs;
 
   htab = metag_link_hash_table (info);
   dynobj = htab->etab.dynobj;
@@ -2914,10 +2830,10 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
   /* We now have determined the sizes of the various dynamic sections.
      Allocate memory for them.  */
-  relocs = FALSE;
+  relocs = false;
   for (s = dynobj->sections; s != NULL; s = s->next)
     {
-      bfd_boolean reloc_section = FALSE;
+      bool reloc_section = false;
 
       if ((s->flags & SEC_LINKER_CREATED) == 0)
        continue;
@@ -2931,15 +2847,15 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
          /* Strip this section if we don't need it; see the
             comment below.  */
        }
-      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
+      else if (startswith (bfd_section_name (s), ".rela"))
        {
          if (s->size != 0 && s != htab->etab.srelplt)
-           relocs = TRUE;
+           relocs = true;
 
          /* We use the reloc_count field as a counter if we need
             to copy relocs into the output file.  */
          s->reloc_count = 0;
-         reloc_section = TRUE;
+         reloc_section = true;
        }
       else
        {
@@ -2968,7 +2884,7 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
       /* Allocate memory for the section contents.  */
       s->contents = bfd_zalloc (dynobj, s->size);
       if (s->contents == NULL)
-       return FALSE;
+       return false;
       else if (reloc_section)
        {
          unsigned char *contents = s->contents;
@@ -2985,61 +2901,13 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
        }
     }
 
-  if (htab->etab.dynamic_sections_created)
-    {
-      /* Add some entries to the .dynamic section.  We fill in the
-        values later, in elf_metag_finish_dynamic_sections, but we
-        must add the entries now so that we get the correct size for
-        the .dynamic section.  The DT_DEBUG entry is filled in by the
-        dynamic linker and used by the debugger.  */
-#define add_dynamic_entry(TAG, VAL) \
-  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
-
-      if (!add_dynamic_entry (DT_PLTGOT, 0))
-       return FALSE;
-
-      if (bfd_link_executable (info))
-       {
-         if (!add_dynamic_entry (DT_DEBUG, 0))
-           return FALSE;
-       }
-
-      if (htab->etab.srelplt->size != 0)
-       {
-         if (!add_dynamic_entry (DT_PLTRELSZ, 0)
-             || !add_dynamic_entry (DT_PLTREL, DT_RELA)
-             || !add_dynamic_entry (DT_JMPREL, 0))
-           return FALSE;
-       }
-
-      if (relocs)
-       {
-         if (!add_dynamic_entry (DT_RELA, 0)
-             || !add_dynamic_entry (DT_RELASZ, 0)
-             || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
-           return FALSE;
-
-         /* If any dynamic relocs apply to a read-only section,
-            then we need a DT_TEXTREL entry.  */
-         if ((info->flags & DF_TEXTREL) == 0)
-           elf_link_hash_traverse (&htab->etab, maybe_set_textrel, info);
-
-         if ((info->flags & DF_TEXTREL) != 0)
-           {
-             if (!add_dynamic_entry (DT_TEXTREL, 0))
-               return FALSE;
-           }
-       }
-    }
-#undef add_dynamic_entry
-
-  return TRUE;
+  return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
 }
 
 /* Finish up dynamic symbol handling.  We set the contents of various
    dynamic sections here.  */
 
-static bfd_boolean
+static bool
 elf_metag_finish_dynamic_symbol (bfd *output_bfd,
                                 struct bfd_link_info *info,
                                 struct elf_link_hash_entry *eh,
@@ -3229,19 +3097,22 @@ elf_metag_finish_dynamic_symbol (bfd *output_bfd,
       sym->st_shndx = SHN_ABS;
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Set the Meta ELF ABI version.  */
 
-static void
-elf_metag_post_process_headers (bfd * abfd, struct bfd_link_info * link_info)
+static bool
+elf_metag_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
 {
   Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form.  */
 
-  _bfd_elf_post_process_headers (abfd, link_info);
+  if (!_bfd_elf_init_file_header (abfd, link_info))
+    return false;
+
   i_ehdrp = elf_elfheader (abfd);
   i_ehdrp->e_ident[EI_ABIVERSION] = METAG_ELF_ABI_VERSION;
+  return true;
 }
 
 /* Used to decide how to sort relocs in an optimal manner for the
@@ -3267,7 +3138,7 @@ elf_metag_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
 
 /* Finish up the dynamic sections.  */
 
-static bfd_boolean
+static bool
 elf_metag_finish_dynamic_sections (bfd *output_bfd,
                                   struct bfd_link_info *info)
 {
@@ -3378,7 +3249,7 @@ elf_metag_finish_dynamic_sections (bfd *output_bfd,
        ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Return the section that should be marked against GC for a given
@@ -3452,8 +3323,8 @@ metag_type_of_stub (asection *input_sec,
 #define ADD_A0_3_A0_3  0x82180000
 #define MOV_PC_A0_3    0xa3180ca0
 
-static bfd_boolean
-metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
+static bool
+metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
 {
   struct elf_metag_stub_hash_entry *hsh;
   asection *stub_sec;
@@ -3461,9 +3332,19 @@ metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_U
   bfd_byte *loc;
   bfd_vma sym_value;
   int size;
+  struct bfd_link_info *info;
 
   /* Massage our args to the form they really have.  */
   hsh = (struct elf_metag_stub_hash_entry *) gen_entry;
+  info = (struct bfd_link_info *) in_arg;
+
+  /* Fail if the target section could not be assigned to an output
+     section.  The user should fix his linker script.  */
+  if (hsh->target_section->output_section == NULL
+      && info->non_contiguous_regions)
+    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
+                             "Retry without --enable-non-contiguous-regions.\n"),
+                           hsh->target_section);
 
   stub_sec = hsh->stub_sec;
 
@@ -3516,17 +3397,17 @@ metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_U
       break;
     default:
       BFD_FAIL ();
-      return FALSE;
+      return false;
     }
 
   stub_sec->size += size;
-  return TRUE;
+  return true;
 }
 
 /* As above, but don't actually build the stub.  Just bump offset so
    we know stub section sizes.  */
 
-static bfd_boolean
+static bool
 metag_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
 {
   struct elf_metag_stub_hash_entry *hsh;
@@ -3541,7 +3422,7 @@ metag_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UN
     size = 12;
 
   hsh->stub_sec->size += size;
-  return TRUE;
+  return true;
 }
 
 /* Set up various things so that we can make a list of input sections
@@ -3556,7 +3437,7 @@ elf_metag_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
   unsigned int top_id, top_index;
   asection *section;
   asection **input_list, **list;
-  bfd_size_type amt;
+  size_t amt;
   struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
 
   /* Count the number of input BFDs and find the top input section id.  */
@@ -3656,7 +3537,7 @@ elf_metag_next_input_section (struct bfd_link_info *info, asection *isec)
 static void
 group_sections (struct elf_metag_link_hash_table *htab,
                bfd_size_type stub_group_size,
-               bfd_boolean stubs_always_before_branch)
+               bool stubs_always_before_branch)
 {
   asection **list = htab->input_list + htab->top_index;
   do
@@ -3669,7 +3550,7 @@ group_sections (struct elf_metag_link_hash_table *htab,
          asection *curr;
          asection *prev;
          bfd_size_type total;
-         bfd_boolean big_sec;
+         bool big_sec;
 
          curr = tail;
          total = tail->size;
@@ -3735,7 +3616,7 @@ get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
   /* We want to read in symbol extension records only once.  To do this
      we need to read in the local symbols in parallel and save them for
      later use; so hold pointers to the local symbols in an array.  */
-  bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
+  size_t amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
   all_local_syms = bfd_zmalloc (amt);
   htab->all_local_syms = all_local_syms;
   if (all_local_syms == NULL)
@@ -3780,7 +3661,7 @@ instruction.  */
 
 /* See elf32-hppa.c and elf64-ppc.c.  */
 
-bfd_boolean
+bool
 elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
                     struct bfd_link_info *info,
                     bfd_signed_vma group_size,
@@ -3788,8 +3669,8 @@ elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
                     void (*layout_sections_again) (void))
 {
   bfd_size_type stub_group_size;
-  bfd_boolean stubs_always_before_branch;
-  bfd_boolean stub_changed;
+  bool stubs_always_before_branch;
+  bool stub_changed;
   struct elf_metag_link_hash_table *htab = metag_link_hash_table (info);
 
   /* Stash our params away.  */
@@ -3822,14 +3703,14 @@ elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
     default:
       if (htab->all_local_syms)
        goto error_ret_free_local;
-      return FALSE;
+      return false;
 
     case 0:
-      stub_changed = FALSE;
+      stub_changed = false;
       break;
 
     case 1:
-      stub_changed = TRUE;
+      stub_changed = true;
       break;
     }
 
@@ -4007,7 +3888,7 @@ elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
 
                  hsh = metag_stub_hash_lookup (&htab->bstab,
                                                stub_name,
-                                               FALSE, FALSE);
+                                               false, false);
                  if (hsh != NULL)
                    {
                      /* The proper stub has already been created.  */
@@ -4026,7 +3907,7 @@ elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
                  hsh->stub_type = stub_type;
                  hsh->hh = hh;
                  hsh->addend = irela->r_addend;
-                 stub_changed = TRUE;
+                 stub_changed = true;
                }
 
              /* We're done with the internal relocs, free them.  */
@@ -4049,22 +3930,22 @@ elf_metag_size_stubs(bfd *output_bfd, bfd *stub_bfd,
 
       /* Ask the linker to do its stuff.  */
       (*htab->layout_sections_again) ();
-      stub_changed = FALSE;
+      stub_changed = false;
     }
 
   free (htab->all_local_syms);
-  return TRUE;
+  return true;
 
  error_ret_free_local:
   free (htab->all_local_syms);
-  return FALSE;
+  return false;
 }
 
 /* Build all the stubs associated with the current output file.  The
    stubs are kept in a hash table attached to the main linker hash
    table.  This function is called via metagelf_finish in the linker.  */
 
-bfd_boolean
+bool
 elf_metag_build_stubs (struct bfd_link_info *info)
 {
   asection *stub_sec;
@@ -4083,7 +3964,7 @@ elf_metag_build_stubs (struct bfd_link_info *info)
       size = stub_sec->size;
       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
       if (stub_sec->contents == NULL && size != 0)
-       return FALSE;
+       return false;
       stub_sec->size = 0;
     }
 
@@ -4091,12 +3972,12 @@ elf_metag_build_stubs (struct bfd_link_info *info)
   table = &htab->bstab;
   bfd_hash_traverse (table, metag_build_one_stub, info);
 
-  return TRUE;
+  return true;
 }
 
 /* Return TRUE if SYM represents a local label symbol.  */
 
-static bfd_boolean
+static bool
 elf_metag_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
 {
   if (name[0] == '$' && name[1] == 'L')
@@ -4142,7 +4023,7 @@ elf_metag_plt_sym_val (bfd_vma i, const asection *plt,
 #define elf_backend_size_dynamic_sections      elf_metag_size_dynamic_sections
 #define elf_backend_omit_section_dynsym \
        _bfd_elf_omit_section_dynsym_all
-#define elf_backend_post_process_headers       elf_metag_post_process_headers
+#define elf_backend_init_file_header           elf_metag_init_file_header
 #define elf_backend_reloc_type_class           elf_metag_reloc_type_class
 #define elf_backend_copy_indirect_symbol       elf_metag_copy_indirect_symbol
 #define elf_backend_plt_sym_val                elf_metag_plt_sym_val
This page took 0.060041 seconds and 4 git commands to generate.