Home | History | Annotate | Line # | Download | only in bfd
      1       1.1     skrll /* BFD back-end for National Semiconductor's CR16 ELF
      2  1.1.1.12  christos    Copyright (C) 2007-2026 Free Software Foundation, Inc.
      3       1.1     skrll    Written by M R Swami Reddy.
      4       1.1     skrll 
      5       1.1     skrll    This file is part of BFD, the Binary File Descriptor library.
      6       1.1     skrll 
      7       1.1     skrll    This program is free software; you can redistribute it and/or modify
      8       1.1     skrll    it under the terms of the GNU General Public License as published by
      9       1.1     skrll    the Free Software Foundation; either version 3 of the License, or
     10       1.1     skrll    (at your option) any later version.
     11       1.1     skrll 
     12       1.1     skrll    This program is distributed in the hope that it will be useful,
     13       1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14       1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15       1.1     skrll    GNU General Public License for more details.
     16       1.1     skrll 
     17       1.1     skrll    You should have received a copy of the GNU General Public License
     18       1.1     skrll    along with this program; if not, write to the Free Software Foundation,
     19       1.1     skrll    Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
     20       1.1     skrll 
     21       1.1     skrll #include "sysdep.h"
     22       1.1     skrll #include "bfd.h"
     23       1.1     skrll #include "bfdlink.h"
     24       1.1     skrll #include "libbfd.h"
     25       1.1     skrll #include "libiberty.h"
     26       1.1     skrll #include "elf-bfd.h"
     27       1.1     skrll #include "elf/cr16.h"
     28   1.1.1.8  christos #include "elf32-cr16.h"
     29       1.1     skrll 
     30   1.1.1.2  christos /* The cr16 linker needs to keep track of the number of relocs that
     31   1.1.1.2  christos    it decides to copy in check_relocs for each symbol.  This is so
     32   1.1.1.2  christos    that it can discard PC relative relocs if it doesn't need them when
     33   1.1.1.2  christos    linking with -Bsymbolic.  We store the information in a field
     34   1.1.1.2  christos    extending the regular ELF linker hash table.  */
     35   1.1.1.2  christos 
     36   1.1.1.2  christos struct elf32_cr16_link_hash_entry
     37   1.1.1.2  christos {
     38   1.1.1.2  christos   /* The basic elf link hash table entry.  */
     39   1.1.1.2  christos   struct elf_link_hash_entry root;
     40   1.1.1.2  christos 
     41   1.1.1.2  christos   /* For function symbols, the number of times this function is
     42   1.1.1.2  christos      called directly (ie by name).  */
     43   1.1.1.2  christos   unsigned int direct_calls;
     44   1.1.1.2  christos 
     45   1.1.1.2  christos   /* For function symbols, the size of this function's stack
     46   1.1.1.2  christos      (if <= 255 bytes).  We stuff this into "call" instructions
     47   1.1.1.2  christos      to this target when it's valid and profitable to do so.
     48   1.1.1.2  christos 
     49   1.1.1.2  christos      This does not include stack allocated by movm!  */
     50   1.1.1.2  christos   unsigned char stack_size;
     51   1.1.1.2  christos 
     52   1.1.1.2  christos   /* For function symbols, arguments (if any) for movm instruction
     53   1.1.1.2  christos      in the prologue.  We stuff this value into "call" instructions
     54   1.1.1.2  christos      to the target when it's valid and profitable to do so.  */
     55   1.1.1.2  christos   unsigned char movm_args;
     56   1.1.1.2  christos 
     57   1.1.1.2  christos   /* For function symbols, the amount of stack space that would be allocated
     58   1.1.1.2  christos      by the movm instruction.  This is redundant with movm_args, but we
     59   1.1.1.2  christos      add it to the hash table to avoid computing it over and over.  */
     60   1.1.1.2  christos   unsigned char movm_stack_size;
     61   1.1.1.2  christos 
     62   1.1.1.2  christos /* Used to mark functions which have had redundant parts of their
     63   1.1.1.2  christos    prologue deleted.  */
     64   1.1.1.2  christos #define CR16_DELETED_PROLOGUE_BYTES 0x1
     65   1.1.1.2  christos   unsigned char flags;
     66   1.1.1.2  christos 
     67   1.1.1.2  christos   /* Calculated value.  */
     68   1.1.1.2  christos   bfd_vma value;
     69   1.1.1.2  christos };
     70   1.1.1.2  christos 
     71       1.1     skrll /* cr16_reloc_map array maps BFD relocation enum into a CRGAS relocation type.  */
     72       1.1     skrll 
     73       1.1     skrll struct cr16_reloc_map
     74       1.1     skrll {
     75       1.1     skrll   bfd_reloc_code_real_type bfd_reloc_enum; /* BFD relocation enum.  */
     76   1.1.1.6  christos   unsigned short cr16_reloc_type;	   /* CR16 relocation type.  */
     77       1.1     skrll };
     78       1.1     skrll 
     79       1.1     skrll static const struct cr16_reloc_map cr16_reloc_map[R_CR16_MAX] =
     80       1.1     skrll {
     81   1.1.1.6  christos   {BFD_RELOC_NONE,	     R_CR16_NONE},
     82   1.1.1.6  christos   {BFD_RELOC_CR16_NUM8,	     R_CR16_NUM8},
     83       1.1     skrll   {BFD_RELOC_CR16_NUM16,     R_CR16_NUM16},
     84       1.1     skrll   {BFD_RELOC_CR16_NUM32,     R_CR16_NUM32},
     85       1.1     skrll   {BFD_RELOC_CR16_NUM32a,    R_CR16_NUM32a},
     86       1.1     skrll   {BFD_RELOC_CR16_REGREL4,   R_CR16_REGREL4},
     87       1.1     skrll   {BFD_RELOC_CR16_REGREL4a,  R_CR16_REGREL4a},
     88       1.1     skrll   {BFD_RELOC_CR16_REGREL14,  R_CR16_REGREL14},
     89       1.1     skrll   {BFD_RELOC_CR16_REGREL14a, R_CR16_REGREL14a},
     90       1.1     skrll   {BFD_RELOC_CR16_REGREL16,  R_CR16_REGREL16},
     91       1.1     skrll   {BFD_RELOC_CR16_REGREL20,  R_CR16_REGREL20},
     92       1.1     skrll   {BFD_RELOC_CR16_REGREL20a, R_CR16_REGREL20a},
     93       1.1     skrll   {BFD_RELOC_CR16_ABS20,     R_CR16_ABS20},
     94       1.1     skrll   {BFD_RELOC_CR16_ABS24,     R_CR16_ABS24},
     95   1.1.1.6  christos   {BFD_RELOC_CR16_IMM4,	     R_CR16_IMM4},
     96   1.1.1.6  christos   {BFD_RELOC_CR16_IMM8,	     R_CR16_IMM8},
     97       1.1     skrll   {BFD_RELOC_CR16_IMM16,     R_CR16_IMM16},
     98       1.1     skrll   {BFD_RELOC_CR16_IMM20,     R_CR16_IMM20},
     99       1.1     skrll   {BFD_RELOC_CR16_IMM24,     R_CR16_IMM24},
    100       1.1     skrll   {BFD_RELOC_CR16_IMM32,     R_CR16_IMM32},
    101       1.1     skrll   {BFD_RELOC_CR16_IMM32a,    R_CR16_IMM32a},
    102       1.1     skrll   {BFD_RELOC_CR16_DISP4,     R_CR16_DISP4},
    103       1.1     skrll   {BFD_RELOC_CR16_DISP8,     R_CR16_DISP8},
    104       1.1     skrll   {BFD_RELOC_CR16_DISP16,    R_CR16_DISP16},
    105       1.1     skrll   {BFD_RELOC_CR16_DISP24,    R_CR16_DISP24},
    106       1.1     skrll   {BFD_RELOC_CR16_DISP24a,   R_CR16_DISP24a},
    107       1.1     skrll   {BFD_RELOC_CR16_SWITCH8,   R_CR16_SWITCH8},
    108       1.1     skrll   {BFD_RELOC_CR16_SWITCH16,  R_CR16_SWITCH16},
    109   1.1.1.2  christos   {BFD_RELOC_CR16_SWITCH32,  R_CR16_SWITCH32},
    110   1.1.1.2  christos   {BFD_RELOC_CR16_GOT_REGREL20, R_CR16_GOT_REGREL20},
    111   1.1.1.2  christos   {BFD_RELOC_CR16_GOTC_REGREL20, R_CR16_GOTC_REGREL20},
    112  1.1.1.12  christos   {BFD_RELOC_GLOB_DAT,       R_CR16_GLOB_DAT}
    113       1.1     skrll };
    114       1.1     skrll 
    115       1.1     skrll static reloc_howto_type cr16_elf_howto_table[] =
    116       1.1     skrll {
    117   1.1.1.6  christos   HOWTO (R_CR16_NONE,		   /* type */
    118   1.1.1.6  christos 	 0,			   /* rightshift */
    119   1.1.1.9  christos 	 0,			   /* size */
    120   1.1.1.6  christos 	 0,			   /* bitsize */
    121   1.1.1.9  christos 	 false,			   /* pc_relative */
    122   1.1.1.6  christos 	 0,			   /* bitpos */
    123   1.1.1.6  christos 	 complain_overflow_dont,   /* complain_on_overflow */
    124   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    125   1.1.1.6  christos 	 "R_CR16_NONE",		   /* name */
    126   1.1.1.9  christos 	 false,			   /* partial_inplace */
    127   1.1.1.6  christos 	 0,			   /* src_mask */
    128   1.1.1.6  christos 	 0,			   /* dst_mask */
    129   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    130   1.1.1.6  christos 
    131   1.1.1.6  christos   HOWTO (R_CR16_NUM8,		   /* type */
    132   1.1.1.6  christos 	 0,			   /* rightshift */
    133   1.1.1.9  christos 	 1,			   /* size */
    134   1.1.1.6  christos 	 8,			   /* bitsize */
    135   1.1.1.9  christos 	 false,			   /* pc_relative */
    136   1.1.1.6  christos 	 0,			   /* bitpos */
    137   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    138   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    139   1.1.1.6  christos 	 "R_CR16_NUM8",		   /* name */
    140   1.1.1.9  christos 	 false,			   /* partial_inplace */
    141   1.1.1.6  christos 	 0x0,			   /* src_mask */
    142   1.1.1.6  christos 	 0xff,			   /* dst_mask */
    143   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    144   1.1.1.6  christos 
    145   1.1.1.6  christos   HOWTO (R_CR16_NUM16,		   /* type */
    146   1.1.1.6  christos 	 0,			   /* rightshift */
    147   1.1.1.9  christos 	 2,			   /* size */
    148   1.1.1.6  christos 	 16,			   /* bitsize */
    149   1.1.1.9  christos 	 false,			   /* pc_relative */
    150   1.1.1.6  christos 	 0,			   /* bitpos */
    151   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    152   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    153   1.1.1.6  christos 	 "R_CR16_NUM16",	   /* name */
    154   1.1.1.9  christos 	 false,			   /* partial_inplace */
    155   1.1.1.6  christos 	 0x0,			   /* src_mask */
    156   1.1.1.6  christos 	 0xffff,		   /* dst_mask */
    157   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    158   1.1.1.6  christos 
    159   1.1.1.6  christos   HOWTO (R_CR16_NUM32,		   /* type */
    160   1.1.1.6  christos 	 0,			   /* rightshift */
    161   1.1.1.9  christos 	 4,			   /* size */
    162   1.1.1.6  christos 	 32,			   /* bitsize */
    163   1.1.1.9  christos 	 false,			   /* pc_relative */
    164   1.1.1.6  christos 	 0,			   /* bitpos */
    165   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    166   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    167   1.1.1.6  christos 	 "R_CR16_NUM32",	   /* name */
    168   1.1.1.9  christos 	 false,			   /* partial_inplace */
    169   1.1.1.6  christos 	 0x0,			   /* src_mask */
    170   1.1.1.6  christos 	 0xffffffff,		   /* dst_mask */
    171   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    172   1.1.1.6  christos 
    173   1.1.1.6  christos   HOWTO (R_CR16_NUM32a,		   /* type */
    174   1.1.1.6  christos 	 1,			   /* rightshift */
    175   1.1.1.9  christos 	 4,			   /* size */
    176   1.1.1.6  christos 	 32,			   /* bitsize */
    177   1.1.1.9  christos 	 false,			   /* pc_relative */
    178   1.1.1.6  christos 	 0,			   /* bitpos */
    179   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    180   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    181   1.1.1.6  christos 	 "R_CR16_NUM32a",	   /* name */
    182   1.1.1.9  christos 	 false,			   /* partial_inplace */
    183   1.1.1.6  christos 	 0x0,			   /* src_mask */
    184   1.1.1.6  christos 	 0xffffffff,		   /* dst_mask */
    185   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    186   1.1.1.6  christos 
    187   1.1.1.6  christos   HOWTO (R_CR16_REGREL4,	   /* type */
    188   1.1.1.6  christos 	 0,			   /* rightshift */
    189   1.1.1.9  christos 	 1,			   /* size */
    190   1.1.1.6  christos 	 4,			   /* bitsize */
    191   1.1.1.9  christos 	 false,			   /* pc_relative */
    192   1.1.1.6  christos 	 0,			   /* bitpos */
    193   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    194   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    195   1.1.1.6  christos 	 "R_CR16_REGREL4",	   /* name */
    196   1.1.1.9  christos 	 false,			   /* partial_inplace */
    197   1.1.1.6  christos 	 0x0,			   /* src_mask */
    198   1.1.1.6  christos 	 0xf,			   /* dst_mask */
    199   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    200   1.1.1.6  christos 
    201   1.1.1.6  christos   HOWTO (R_CR16_REGREL4a,	   /* type */
    202   1.1.1.6  christos 	 0,			   /* rightshift */
    203   1.1.1.9  christos 	 1,			   /* size */
    204   1.1.1.6  christos 	 4,			   /* bitsize */
    205   1.1.1.9  christos 	 false,			   /* pc_relative */
    206   1.1.1.6  christos 	 0,			   /* bitpos */
    207   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    208   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    209   1.1.1.6  christos 	 "R_CR16_REGREL4a",	   /* name */
    210   1.1.1.9  christos 	 false,			   /* partial_inplace */
    211   1.1.1.6  christos 	 0x0,			   /* src_mask */
    212   1.1.1.6  christos 	 0xf,			   /* dst_mask */
    213   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    214   1.1.1.6  christos 
    215   1.1.1.6  christos   HOWTO (R_CR16_REGREL14,	   /* type */
    216   1.1.1.6  christos 	 0,			   /* rightshift */
    217   1.1.1.9  christos 	 2,			   /* size */
    218   1.1.1.6  christos 	 14,			   /* bitsize */
    219   1.1.1.9  christos 	 false,			   /* pc_relative */
    220   1.1.1.6  christos 	 0,			   /* bitpos */
    221   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    222   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    223   1.1.1.6  christos 	 "R_CR16_REGREL14",	   /* name */
    224   1.1.1.9  christos 	 false,			   /* partial_inplace */
    225   1.1.1.6  christos 	 0x0,			   /* src_mask */
    226   1.1.1.6  christos 	 0x3fff,		   /* dst_mask */
    227   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    228   1.1.1.6  christos 
    229   1.1.1.6  christos   HOWTO (R_CR16_REGREL14a,	   /* type */
    230   1.1.1.6  christos 	 0,			   /* rightshift */
    231   1.1.1.9  christos 	 2,			   /* size */
    232   1.1.1.6  christos 	 14,			   /* bitsize */
    233   1.1.1.9  christos 	 false,			   /* pc_relative */
    234   1.1.1.6  christos 	 0,			   /* bitpos */
    235   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    236   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    237   1.1.1.6  christos 	 "R_CR16_REGREL14a",	   /* name */
    238   1.1.1.9  christos 	 false,			   /* partial_inplace */
    239   1.1.1.6  christos 	 0x0,			   /* src_mask */
    240   1.1.1.6  christos 	 0x3fff,		   /* dst_mask */
    241   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    242   1.1.1.6  christos 
    243   1.1.1.6  christos   HOWTO (R_CR16_REGREL16,	   /* type */
    244   1.1.1.6  christos 	 0,			   /* rightshift */
    245   1.1.1.9  christos 	 2,			   /* size */
    246   1.1.1.6  christos 	 16,			   /* bitsize */
    247   1.1.1.9  christos 	 false,			   /* pc_relative */
    248   1.1.1.6  christos 	 0,			   /* bitpos */
    249   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    250   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    251   1.1.1.6  christos 	 "R_CR16_REGREL16",	   /* name */
    252   1.1.1.9  christos 	 false,			   /* partial_inplace */
    253   1.1.1.6  christos 	 0x0,			   /* src_mask */
    254   1.1.1.6  christos 	 0xffff,		   /* dst_mask */
    255   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    256   1.1.1.6  christos 
    257   1.1.1.6  christos   HOWTO (R_CR16_REGREL20,	   /* type */
    258   1.1.1.6  christos 	 0,			   /* rightshift */
    259   1.1.1.9  christos 	 4,			   /* size */
    260   1.1.1.6  christos 	 20,			   /* bitsize */
    261   1.1.1.9  christos 	 false,			   /* pc_relative */
    262   1.1.1.6  christos 	 0,			   /* bitpos */
    263   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    264   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    265   1.1.1.6  christos 	 "R_CR16_REGREL20",	   /* name */
    266   1.1.1.9  christos 	 false,			   /* partial_inplace */
    267   1.1.1.6  christos 	 0x0,			   /* src_mask */
    268   1.1.1.6  christos 	 0xfffff,		   /* dst_mask */
    269   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    270   1.1.1.6  christos 
    271   1.1.1.6  christos   HOWTO (R_CR16_REGREL20a,	   /* type */
    272   1.1.1.6  christos 	 0,			   /* rightshift */
    273   1.1.1.9  christos 	 4,			   /* size */
    274   1.1.1.6  christos 	 20,			   /* bitsize */
    275   1.1.1.9  christos 	 false,			   /* pc_relative */
    276   1.1.1.6  christos 	 0,			   /* bitpos */
    277   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    278   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    279   1.1.1.6  christos 	 "R_CR16_REGREL20a",	   /* name */
    280   1.1.1.9  christos 	 false,			   /* partial_inplace */
    281   1.1.1.6  christos 	 0x0,			   /* src_mask */
    282   1.1.1.6  christos 	 0xfffff,		   /* dst_mask */
    283   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    284   1.1.1.6  christos 
    285   1.1.1.6  christos   HOWTO (R_CR16_ABS20,		   /* type */
    286   1.1.1.6  christos 	 0,			   /* rightshift */
    287   1.1.1.9  christos 	 4,			   /* size */
    288   1.1.1.6  christos 	 20,			   /* bitsize */
    289   1.1.1.9  christos 	 false,			   /* pc_relative */
    290   1.1.1.6  christos 	 0,			   /* bitpos */
    291   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    292   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    293   1.1.1.6  christos 	 "R_CR16_ABS20",	   /* name */
    294   1.1.1.9  christos 	 false,			   /* partial_inplace */
    295   1.1.1.6  christos 	 0x0,			   /* src_mask */
    296   1.1.1.6  christos 	 0xfffff,		   /* dst_mask */
    297   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    298   1.1.1.6  christos 
    299   1.1.1.6  christos   HOWTO (R_CR16_ABS24,		   /* type */
    300   1.1.1.6  christos 	 0,			   /* rightshift */
    301   1.1.1.9  christos 	 4,			   /* size */
    302   1.1.1.6  christos 	 24,			   /* bitsize */
    303   1.1.1.9  christos 	 false,			   /* pc_relative */
    304   1.1.1.6  christos 	 0,			   /* bitpos */
    305   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    306   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    307   1.1.1.6  christos 	 "R_CR16_ABS24",	   /* name */
    308   1.1.1.9  christos 	 false,			   /* partial_inplace */
    309   1.1.1.6  christos 	 0x0,			   /* src_mask */
    310   1.1.1.6  christos 	 0xffffff,		   /* dst_mask */
    311   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    312   1.1.1.6  christos 
    313   1.1.1.6  christos   HOWTO (R_CR16_IMM4,		   /* type */
    314   1.1.1.6  christos 	 0,			   /* rightshift */
    315   1.1.1.9  christos 	 1,			   /* size */
    316   1.1.1.6  christos 	 4,			   /* bitsize */
    317   1.1.1.9  christos 	 false,			   /* pc_relative */
    318   1.1.1.6  christos 	 0,			   /* bitpos */
    319   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    320   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    321   1.1.1.6  christos 	 "R_CR16_IMM4",		   /* name */
    322   1.1.1.9  christos 	 false,			   /* partial_inplace */
    323   1.1.1.6  christos 	 0x0,			   /* src_mask */
    324   1.1.1.6  christos 	 0xf,			   /* dst_mask */
    325   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    326   1.1.1.6  christos 
    327   1.1.1.6  christos   HOWTO (R_CR16_IMM8,		   /* type */
    328   1.1.1.6  christos 	 0,			   /* rightshift */
    329   1.1.1.9  christos 	 1,			   /* size */
    330   1.1.1.6  christos 	 8,			   /* bitsize */
    331   1.1.1.9  christos 	 false,			   /* pc_relative */
    332   1.1.1.6  christos 	 0,			   /* bitpos */
    333   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    334   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    335   1.1.1.6  christos 	 "R_CR16_IMM8",		   /* name */
    336   1.1.1.9  christos 	 false,			   /* partial_inplace */
    337   1.1.1.6  christos 	 0x0,			   /* src_mask */
    338   1.1.1.6  christos 	 0xff,			   /* dst_mask */
    339   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    340   1.1.1.6  christos 
    341   1.1.1.6  christos   HOWTO (R_CR16_IMM16,		   /* type */
    342   1.1.1.6  christos 	 0,			   /* rightshift */
    343   1.1.1.9  christos 	 2,			   /* size */
    344   1.1.1.6  christos 	 16,			   /* bitsize */
    345   1.1.1.9  christos 	 false,			   /* pc_relative */
    346   1.1.1.6  christos 	 0,			   /* bitpos */
    347   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    348   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    349   1.1.1.6  christos 	 "R_CR16_IMM16",	   /* name */
    350   1.1.1.9  christos 	 false,			   /* partial_inplace */
    351   1.1.1.6  christos 	 0x0,			   /* src_mask */
    352   1.1.1.6  christos 	 0xffff,		   /* dst_mask */
    353   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    354   1.1.1.6  christos 
    355   1.1.1.6  christos   HOWTO (R_CR16_IMM20,		   /* type */
    356   1.1.1.6  christos 	 0,			   /* rightshift */
    357   1.1.1.9  christos 	 4,			   /* size */
    358   1.1.1.6  christos 	 20,			   /* bitsize */
    359   1.1.1.9  christos 	 false,			   /* pc_relative */
    360   1.1.1.6  christos 	 0,			   /* bitpos */
    361   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    362   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    363   1.1.1.6  christos 	 "R_CR16_IMM20",	   /* name */
    364   1.1.1.9  christos 	 false,			   /* partial_inplace */
    365   1.1.1.6  christos 	 0x0,			   /* src_mask */
    366   1.1.1.6  christos 	 0xfffff,		   /* dst_mask */
    367   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    368   1.1.1.6  christos 
    369   1.1.1.6  christos   HOWTO (R_CR16_IMM24,		   /* type */
    370   1.1.1.6  christos 	 0,			   /* rightshift */
    371   1.1.1.9  christos 	 4,			   /* size */
    372   1.1.1.6  christos 	 24,			   /* bitsize */
    373   1.1.1.9  christos 	 false,			   /* pc_relative */
    374   1.1.1.6  christos 	 0,			   /* bitpos */
    375   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    376   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    377   1.1.1.6  christos 	 "R_CR16_IMM24",	   /* name */
    378   1.1.1.9  christos 	 false,			   /* partial_inplace */
    379   1.1.1.6  christos 	 0x0,			   /* src_mask */
    380   1.1.1.6  christos 	 0xffffff,		   /* dst_mask */
    381   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    382   1.1.1.6  christos 
    383   1.1.1.6  christos   HOWTO (R_CR16_IMM32,		   /* type */
    384   1.1.1.6  christos 	 0,			   /* rightshift */
    385   1.1.1.9  christos 	 4,			   /* size */
    386   1.1.1.6  christos 	 32,			   /* bitsize */
    387   1.1.1.9  christos 	 false,			   /* pc_relative */
    388   1.1.1.6  christos 	 0,			   /* bitpos */
    389   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    390   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    391   1.1.1.6  christos 	 "R_CR16_IMM32",	   /* name */
    392   1.1.1.9  christos 	 false,			   /* partial_inplace */
    393   1.1.1.6  christos 	 0x0,			   /* src_mask */
    394   1.1.1.6  christos 	 0xffffffff,		   /* dst_mask */
    395   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    396   1.1.1.6  christos 
    397   1.1.1.6  christos   HOWTO (R_CR16_IMM32a,		   /* type */
    398   1.1.1.6  christos 	 1,			   /* rightshift */
    399   1.1.1.9  christos 	 4,			   /* size */
    400   1.1.1.6  christos 	 32,			   /* bitsize */
    401   1.1.1.9  christos 	 false,			   /* pc_relative */
    402   1.1.1.6  christos 	 0,			   /* bitpos */
    403   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    404   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    405   1.1.1.6  christos 	 "R_CR16_IMM32a",	   /* name */
    406   1.1.1.9  christos 	 false,			   /* partial_inplace */
    407   1.1.1.6  christos 	 0x0,			   /* src_mask */
    408   1.1.1.6  christos 	 0xffffffff,		   /* dst_mask */
    409   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    410   1.1.1.6  christos 
    411   1.1.1.6  christos   HOWTO (R_CR16_DISP4,		   /* type */
    412   1.1.1.6  christos 	 1,			   /* rightshift */
    413   1.1.1.9  christos 	 1,			   /* size */
    414   1.1.1.6  christos 	 4,			   /* bitsize */
    415   1.1.1.9  christos 	 true,			   /* pc_relative */
    416   1.1.1.6  christos 	 0,			   /* bitpos */
    417   1.1.1.6  christos 	 complain_overflow_unsigned, /* complain_on_overflow */
    418   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    419   1.1.1.6  christos 	 "R_CR16_DISP4",	   /* name */
    420   1.1.1.9  christos 	 false,			   /* partial_inplace */
    421   1.1.1.6  christos 	 0x0,			   /* src_mask */
    422   1.1.1.6  christos 	 0xf,			   /* dst_mask */
    423   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    424   1.1.1.6  christos 
    425   1.1.1.6  christos   HOWTO (R_CR16_DISP8,		   /* type */
    426   1.1.1.6  christos 	 1,			   /* rightshift */
    427   1.1.1.9  christos 	 1,			   /* size */
    428   1.1.1.6  christos 	 8,			   /* bitsize */
    429   1.1.1.9  christos 	 true,			   /* pc_relative */
    430   1.1.1.6  christos 	 0,			   /* bitpos */
    431   1.1.1.6  christos 	 complain_overflow_unsigned, /* complain_on_overflow */
    432   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    433   1.1.1.6  christos 	 "R_CR16_DISP8",	   /* name */
    434   1.1.1.9  christos 	 false,			   /* partial_inplace */
    435   1.1.1.6  christos 	 0x0,			   /* src_mask */
    436   1.1.1.6  christos 	 0x1ff,			   /* dst_mask */
    437   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    438   1.1.1.6  christos 
    439   1.1.1.6  christos   HOWTO (R_CR16_DISP16,		   /* type */
    440   1.1.1.6  christos 	 0,			   /* rightshift REVIITS: To sync with WinIDEA*/
    441   1.1.1.9  christos 	 2,			   /* size */
    442   1.1.1.6  christos 	 16,			   /* bitsize */
    443   1.1.1.9  christos 	 true,			   /* pc_relative */
    444   1.1.1.6  christos 	 0,			   /* bitpos */
    445   1.1.1.6  christos 	 complain_overflow_unsigned, /* complain_on_overflow */
    446   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    447   1.1.1.6  christos 	 "R_CR16_DISP16",	   /* name */
    448   1.1.1.9  christos 	 false,			   /* partial_inplace */
    449   1.1.1.6  christos 	 0x0,			   /* src_mask */
    450   1.1.1.6  christos 	 0x1ffff,		   /* dst_mask */
    451   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    452       1.1     skrll   /* REVISIT: DISP24 should be left-shift by 2 as per ISA doc
    453       1.1     skrll      but its not done, to sync with WinIDEA and CR16 4.1 tools */
    454   1.1.1.6  christos   HOWTO (R_CR16_DISP24,		   /* type */
    455   1.1.1.6  christos 	 0,			   /* rightshift */
    456   1.1.1.9  christos 	 4,			   /* size */
    457   1.1.1.6  christos 	 24,			   /* bitsize */
    458   1.1.1.9  christos 	 true,			   /* pc_relative */
    459   1.1.1.6  christos 	 0,			   /* bitpos */
    460   1.1.1.6  christos 	 complain_overflow_unsigned, /* complain_on_overflow */
    461   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    462   1.1.1.6  christos 	 "R_CR16_DISP24",	   /* name */
    463   1.1.1.9  christos 	 false,			   /* partial_inplace */
    464   1.1.1.6  christos 	 0x0,			   /* src_mask */
    465   1.1.1.6  christos 	 0x1ffffff,		   /* dst_mask */
    466   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    467   1.1.1.6  christos 
    468   1.1.1.6  christos   HOWTO (R_CR16_DISP24a,	   /* type */
    469   1.1.1.6  christos 	 0,			   /* rightshift */
    470   1.1.1.9  christos 	 4,			   /* size */
    471   1.1.1.6  christos 	 24,			   /* bitsize */
    472   1.1.1.9  christos 	 true,			   /* pc_relative */
    473   1.1.1.6  christos 	 0,			   /* bitpos */
    474   1.1.1.6  christos 	 complain_overflow_unsigned, /* complain_on_overflow */
    475   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    476   1.1.1.6  christos 	 "R_CR16_DISP24a",	   /* name */
    477   1.1.1.9  christos 	 false,			   /* partial_inplace */
    478   1.1.1.6  christos 	 0x0,			   /* src_mask */
    479   1.1.1.6  christos 	 0xffffff,		   /* dst_mask */
    480   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    481       1.1     skrll 
    482       1.1     skrll   /* An 8 bit switch table entry.  This is generated for an expression
    483       1.1     skrll      such as ``.byte L1 - L2''.  The offset holds the difference
    484       1.1     skrll      between the reloc address and L2.  */
    485   1.1.1.6  christos   HOWTO (R_CR16_SWITCH8,	   /* type */
    486   1.1.1.6  christos 	 0,			   /* rightshift */
    487   1.1.1.9  christos 	 1,			   /* size */
    488   1.1.1.6  christos 	 8,			   /* bitsize */
    489   1.1.1.9  christos 	 false,			   /* pc_relative */
    490   1.1.1.6  christos 	 0,			   /* bitpos */
    491   1.1.1.6  christos 	 complain_overflow_unsigned, /* complain_on_overflow */
    492   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    493   1.1.1.6  christos 	 "R_CR16_SWITCH8",	   /* name */
    494   1.1.1.9  christos 	 false,			   /* partial_inplace */
    495   1.1.1.6  christos 	 0x0,			   /* src_mask */
    496   1.1.1.6  christos 	 0xff,			   /* dst_mask */
    497   1.1.1.9  christos 	 true),			   /* pcrel_offset */
    498       1.1     skrll 
    499       1.1     skrll   /* A 16 bit switch table entry.  This is generated for an expression
    500       1.1     skrll      such as ``.word L1 - L2''.  The offset holds the difference
    501       1.1     skrll      between the reloc address and L2.  */
    502   1.1.1.6  christos   HOWTO (R_CR16_SWITCH16,	   /* type */
    503   1.1.1.6  christos 	 0,			   /* rightshift */
    504   1.1.1.9  christos 	 2,			   /* size */
    505   1.1.1.6  christos 	 16,			   /* bitsize */
    506   1.1.1.9  christos 	 false,			   /* pc_relative */
    507   1.1.1.6  christos 	 0,			   /* bitpos */
    508   1.1.1.6  christos 	 complain_overflow_unsigned, /* complain_on_overflow */
    509   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    510   1.1.1.6  christos 	 "R_CR16_SWITCH16",	   /* name */
    511   1.1.1.9  christos 	 false,			   /* partial_inplace */
    512   1.1.1.6  christos 	 0x0,			   /* src_mask */
    513   1.1.1.6  christos 	 0xffff,		   /* dst_mask */
    514   1.1.1.9  christos 	 true),			   /* pcrel_offset */
    515       1.1     skrll 
    516       1.1     skrll   /* A 32 bit switch table entry.  This is generated for an expression
    517       1.1     skrll      such as ``.long L1 - L2''.  The offset holds the difference
    518       1.1     skrll      between the reloc address and L2.  */
    519   1.1.1.6  christos   HOWTO (R_CR16_SWITCH32,	   /* type */
    520   1.1.1.6  christos 	 0,			   /* rightshift */
    521   1.1.1.9  christos 	 4,			   /* size */
    522   1.1.1.6  christos 	 32,			   /* bitsize */
    523   1.1.1.9  christos 	 false,			   /* pc_relative */
    524   1.1.1.6  christos 	 0,			   /* bitpos */
    525   1.1.1.6  christos 	 complain_overflow_unsigned, /* complain_on_overflow */
    526   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    527   1.1.1.6  christos 	 "R_CR16_SWITCH32",	   /* name */
    528   1.1.1.9  christos 	 false,			   /* partial_inplace */
    529   1.1.1.6  christos 	 0x0,			   /* src_mask */
    530   1.1.1.6  christos 	 0xffffffff,		   /* dst_mask */
    531   1.1.1.9  christos 	 true),			   /* pcrel_offset */
    532   1.1.1.6  christos 
    533   1.1.1.6  christos   HOWTO (R_CR16_GOT_REGREL20,	   /* type */
    534   1.1.1.6  christos 	 0,			   /* rightshift */
    535   1.1.1.9  christos 	 4,			   /* size */
    536   1.1.1.6  christos 	 20,			   /* bitsize */
    537   1.1.1.9  christos 	 false,			   /* pc_relative */
    538   1.1.1.6  christos 	 0,			   /* bitpos */
    539   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    540   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    541   1.1.1.6  christos 	 "R_CR16_GOT_REGREL20",	   /* name */
    542   1.1.1.9  christos 	 true,			   /* partial_inplace */
    543   1.1.1.6  christos 	 0x0,			   /* src_mask */
    544   1.1.1.6  christos 	 0xfffff,		   /* dst_mask */
    545   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    546   1.1.1.6  christos 
    547   1.1.1.6  christos   HOWTO (R_CR16_GOTC_REGREL20,	   /* type */
    548   1.1.1.6  christos 	 0,			   /* rightshift */
    549   1.1.1.9  christos 	 4,			   /* size */
    550   1.1.1.6  christos 	 20,			   /* bitsize */
    551   1.1.1.9  christos 	 false,			   /* pc_relative */
    552   1.1.1.6  christos 	 0,			   /* bitpos */
    553   1.1.1.6  christos 	 complain_overflow_bitfield,/* complain_on_overflow */
    554   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    555   1.1.1.6  christos 	 "R_CR16_GOTC_REGREL20",   /* name */
    556   1.1.1.9  christos 	 true,			   /* partial_inplace */
    557   1.1.1.6  christos 	 0x0,			   /* src_mask */
    558   1.1.1.6  christos 	 0xfffff,		   /* dst_mask */
    559   1.1.1.9  christos 	 false),		   /* pcrel_offset */
    560   1.1.1.6  christos 
    561   1.1.1.6  christos   HOWTO (R_CR16_GLOB_DAT,	   /* type */
    562   1.1.1.6  christos 	 0,			   /* rightshift */
    563   1.1.1.9  christos 	 4,			   /* size */
    564   1.1.1.6  christos 	 32,			   /* bitsize */
    565   1.1.1.9  christos 	 false,			   /* pc_relative */
    566   1.1.1.6  christos 	 0,			   /* bitpos */
    567   1.1.1.6  christos 	 complain_overflow_unsigned, /* complain_on_overflow */
    568   1.1.1.6  christos 	 bfd_elf_generic_reloc,	   /* special_function */
    569   1.1.1.6  christos 	 "R_CR16_GLOB_DAT",	   /* name */
    570   1.1.1.9  christos 	 false,			   /* partial_inplace */
    571   1.1.1.6  christos 	 0x0,			   /* src_mask */
    572   1.1.1.6  christos 	 0xffffffff,		   /* dst_mask */
    573   1.1.1.9  christos 	 true)			   /* pcrel_offset */
    574       1.1     skrll };
    575       1.1     skrll 
    576   1.1.1.2  christos 
    577   1.1.1.2  christos /* Create the GOT section.  */
    578   1.1.1.2  christos 
    579   1.1.1.9  christos static bool
    580   1.1.1.2  christos _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info)
    581   1.1.1.2  christos {
    582   1.1.1.2  christos   flagword   flags;
    583   1.1.1.2  christos   asection * s;
    584   1.1.1.2  christos   struct elf_link_hash_entry * h;
    585  1.1.1.12  christos   elf_backend_data * bed = get_elf_backend_data (abfd);
    586   1.1.1.6  christos   struct elf_link_hash_table *htab = elf_hash_table (info);
    587   1.1.1.2  christos   int ptralign;
    588   1.1.1.2  christos 
    589   1.1.1.2  christos   /* This function may be called more than once.  */
    590   1.1.1.6  christos   if (htab->sgot != NULL)
    591   1.1.1.9  christos     return true;
    592   1.1.1.2  christos 
    593   1.1.1.2  christos   switch (bed->s->arch_size)
    594   1.1.1.2  christos     {
    595   1.1.1.2  christos     case 16:
    596   1.1.1.2  christos       ptralign = 1;
    597   1.1.1.2  christos       break;
    598   1.1.1.2  christos 
    599   1.1.1.2  christos     case 32:
    600   1.1.1.2  christos       ptralign = 2;
    601   1.1.1.2  christos       break;
    602   1.1.1.2  christos 
    603   1.1.1.2  christos     default:
    604   1.1.1.2  christos       bfd_set_error (bfd_error_bad_value);
    605   1.1.1.9  christos       return false;
    606   1.1.1.2  christos     }
    607   1.1.1.2  christos 
    608   1.1.1.2  christos   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
    609   1.1.1.6  christos 	   | SEC_LINKER_CREATED);
    610   1.1.1.2  christos 
    611   1.1.1.3  christos   s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
    612   1.1.1.6  christos   htab->sgot= s;
    613   1.1.1.2  christos   if (s == NULL
    614   1.1.1.8  christos       || !bfd_set_section_alignment (s, ptralign))
    615   1.1.1.9  christos     return false;
    616   1.1.1.2  christos 
    617   1.1.1.2  christos   if (bed->want_got_plt)
    618   1.1.1.2  christos     {
    619   1.1.1.3  christos       s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
    620   1.1.1.6  christos       htab->sgotplt = s;
    621   1.1.1.2  christos       if (s == NULL
    622   1.1.1.8  christos 	  || !bfd_set_section_alignment (s, ptralign))
    623   1.1.1.9  christos 	return false;
    624   1.1.1.2  christos     }
    625   1.1.1.2  christos 
    626   1.1.1.2  christos   /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
    627   1.1.1.2  christos      (or .got.plt) section.  We don't do this in the linker script
    628   1.1.1.2  christos      because we don't want to define the symbol if we are not creating
    629   1.1.1.2  christos      a global offset table.  */
    630   1.1.1.2  christos   h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_");
    631   1.1.1.6  christos   htab->hgot = h;
    632   1.1.1.2  christos   if (h == NULL)
    633   1.1.1.9  christos     return false;
    634   1.1.1.2  christos 
    635   1.1.1.2  christos   /* The first bit of the global offset table is the header.  */
    636   1.1.1.2  christos   s->size += bed->got_header_size;
    637   1.1.1.2  christos 
    638   1.1.1.9  christos   return true;
    639   1.1.1.2  christos }
    640   1.1.1.2  christos 
    641   1.1.1.2  christos 
    642       1.1     skrll /* Retrieve a howto ptr using a BFD reloc_code.  */
    643       1.1     skrll 
    644       1.1     skrll static reloc_howto_type *
    645   1.1.1.7  christos elf_cr16_reloc_type_lookup (bfd *abfd,
    646   1.1.1.6  christos 			    bfd_reloc_code_real_type code)
    647       1.1     skrll {
    648       1.1     skrll   unsigned int i;
    649       1.1     skrll 
    650       1.1     skrll   for (i = 0; i < R_CR16_MAX; i++)
    651       1.1     skrll     if (code == cr16_reloc_map[i].bfd_reloc_enum)
    652       1.1     skrll       return &cr16_elf_howto_table[cr16_reloc_map[i].cr16_reloc_type];
    653       1.1     skrll 
    654   1.1.1.7  christos   _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
    655   1.1.1.7  christos 		      abfd, code);
    656       1.1     skrll   return NULL;
    657       1.1     skrll }
    658       1.1     skrll 
    659       1.1     skrll static reloc_howto_type *
    660       1.1     skrll elf_cr16_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    661   1.1.1.6  christos 			    const char *r_name)
    662       1.1     skrll {
    663       1.1     skrll   unsigned int i;
    664       1.1     skrll 
    665       1.1     skrll   for (i = 0; ARRAY_SIZE (cr16_elf_howto_table); i++)
    666       1.1     skrll     if (cr16_elf_howto_table[i].name != NULL
    667   1.1.1.6  christos 	&& strcasecmp (cr16_elf_howto_table[i].name, r_name) == 0)
    668       1.1     skrll       return cr16_elf_howto_table + i;
    669       1.1     skrll 
    670       1.1     skrll   return NULL;
    671       1.1     skrll }
    672       1.1     skrll 
    673       1.1     skrll /* Retrieve a howto ptr using an internal relocation entry.  */
    674       1.1     skrll 
    675   1.1.1.9  christos static bool
    676   1.1.1.7  christos elf_cr16_info_to_howto (bfd *abfd, arelent *cache_ptr,
    677   1.1.1.6  christos 			Elf_Internal_Rela *dst)
    678       1.1     skrll {
    679       1.1     skrll   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
    680       1.1     skrll 
    681   1.1.1.4  christos   if (r_type >= R_CR16_MAX)
    682   1.1.1.4  christos     {
    683   1.1.1.6  christos       /* xgettext:c-format */
    684   1.1.1.7  christos       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
    685   1.1.1.6  christos 			  abfd, r_type);
    686   1.1.1.4  christos       bfd_set_error (bfd_error_bad_value);
    687   1.1.1.9  christos       return false;
    688   1.1.1.4  christos     }
    689   1.1.1.2  christos   cache_ptr->howto = cr16_elf_howto_table + r_type;
    690   1.1.1.9  christos   return true;
    691   1.1.1.2  christos }
    692   1.1.1.2  christos 
    693   1.1.1.2  christos /* Look through the relocs for a section during the first phase.
    694   1.1.1.2  christos    Since we don't do .gots or .plts, we just need to consider the
    695   1.1.1.2  christos    virtual table relocs for gc.  */
    696   1.1.1.2  christos 
    697   1.1.1.9  christos static bool
    698   1.1.1.2  christos cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
    699   1.1.1.6  christos 		       const Elf_Internal_Rela *relocs)
    700   1.1.1.2  christos {
    701   1.1.1.2  christos   Elf_Internal_Shdr *symtab_hdr;
    702   1.1.1.2  christos   Elf_Internal_Sym * isymbuf = NULL;
    703   1.1.1.9  christos   struct elf_link_hash_entry **sym_hashes;
    704   1.1.1.2  christos   const Elf_Internal_Rela *rel;
    705   1.1.1.2  christos   const Elf_Internal_Rela *rel_end;
    706   1.1.1.2  christos   bfd *      dynobj;
    707   1.1.1.2  christos   bfd_vma *  local_got_offsets;
    708   1.1.1.2  christos   asection * sgot;
    709   1.1.1.2  christos   asection * srelgot;
    710   1.1.1.2  christos 
    711   1.1.1.2  christos   sgot    = NULL;
    712   1.1.1.2  christos   srelgot = NULL;
    713   1.1.1.9  christos   bool result = false;
    714   1.1.1.2  christos 
    715   1.1.1.4  christos   if (bfd_link_relocatable (info))
    716   1.1.1.9  christos     return true;
    717   1.1.1.2  christos 
    718   1.1.1.2  christos   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
    719   1.1.1.2  christos   sym_hashes = elf_sym_hashes (abfd);
    720   1.1.1.2  christos 
    721   1.1.1.2  christos   dynobj = elf_hash_table (info)->dynobj;
    722   1.1.1.2  christos   local_got_offsets = elf_local_got_offsets (abfd);
    723   1.1.1.2  christos   rel_end = relocs + sec->reloc_count;
    724   1.1.1.2  christos   for (rel = relocs; rel < rel_end; rel++)
    725   1.1.1.2  christos     {
    726   1.1.1.2  christos       struct elf_link_hash_entry *h;
    727   1.1.1.2  christos       unsigned long r_symndx;
    728   1.1.1.2  christos 
    729   1.1.1.2  christos       r_symndx = ELF32_R_SYM (rel->r_info);
    730   1.1.1.2  christos       if (r_symndx < symtab_hdr->sh_info)
    731   1.1.1.6  christos 	h = NULL;
    732   1.1.1.2  christos       else
    733   1.1.1.6  christos 	{
    734   1.1.1.6  christos 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
    735   1.1.1.6  christos 	  while (h->root.type == bfd_link_hash_indirect
    736   1.1.1.6  christos 		 || h->root.type == bfd_link_hash_warning)
    737   1.1.1.6  christos 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
    738   1.1.1.6  christos 	}
    739   1.1.1.2  christos 
    740   1.1.1.2  christos       /* Some relocs require a global offset table.  */
    741   1.1.1.2  christos       if (dynobj == NULL)
    742   1.1.1.6  christos 	{
    743   1.1.1.6  christos 	  switch (ELF32_R_TYPE (rel->r_info))
    744   1.1.1.6  christos 	    {
    745   1.1.1.6  christos 	    case R_CR16_GOT_REGREL20:
    746   1.1.1.6  christos 	    case R_CR16_GOTC_REGREL20:
    747   1.1.1.6  christos 	      elf_hash_table (info)->dynobj = dynobj = abfd;
    748   1.1.1.6  christos 	      if (! _bfd_cr16_elf_create_got_section (dynobj, info))
    749   1.1.1.6  christos 		goto fail;
    750   1.1.1.6  christos 	      break;
    751   1.1.1.6  christos 
    752   1.1.1.6  christos 	    default:
    753   1.1.1.6  christos 	      break;
    754   1.1.1.6  christos 	    }
    755   1.1.1.6  christos 	}
    756   1.1.1.2  christos 
    757   1.1.1.2  christos       switch (ELF32_R_TYPE (rel->r_info))
    758   1.1.1.6  christos 	{
    759   1.1.1.6  christos 	case R_CR16_GOT_REGREL20:
    760   1.1.1.6  christos 	case R_CR16_GOTC_REGREL20:
    761   1.1.1.6  christos 	  /* This symbol requires a global offset table entry.  */
    762   1.1.1.6  christos 
    763   1.1.1.6  christos 	  sgot = elf_hash_table (info)->sgot;
    764   1.1.1.6  christos 	  srelgot = elf_hash_table (info)->srelgot;
    765   1.1.1.6  christos 	  BFD_ASSERT (sgot != NULL && srelgot != NULL);
    766   1.1.1.6  christos 
    767   1.1.1.6  christos 	  if (h != NULL)
    768   1.1.1.6  christos 	    {
    769   1.1.1.6  christos 	      if (h->got.offset != (bfd_vma) -1)
    770   1.1.1.6  christos 		/* We have already allocated space in the .got.  */
    771   1.1.1.6  christos 		break;
    772   1.1.1.6  christos 
    773   1.1.1.6  christos 	      h->got.offset = sgot->size;
    774   1.1.1.6  christos 
    775   1.1.1.6  christos 	      /* Make sure this symbol is output as a dynamic symbol.  */
    776   1.1.1.6  christos 	      if (h->dynindx == -1)
    777   1.1.1.6  christos 		{
    778   1.1.1.6  christos 		  if (! bfd_elf_link_record_dynamic_symbol (info, h))
    779   1.1.1.6  christos 		    goto fail;
    780   1.1.1.6  christos 		}
    781   1.1.1.6  christos 
    782   1.1.1.6  christos 	      srelgot->size += sizeof (Elf32_External_Rela);
    783   1.1.1.6  christos 	    }
    784   1.1.1.6  christos 	  else
    785   1.1.1.6  christos 	    {
    786   1.1.1.6  christos 	      /* This is a global offset table entry for a local
    787   1.1.1.6  christos 		 symbol.  */
    788   1.1.1.6  christos 	      if (local_got_offsets == NULL)
    789   1.1.1.6  christos 		{
    790   1.1.1.6  christos 		  size_t       size;
    791   1.1.1.6  christos 		  unsigned int i;
    792   1.1.1.6  christos 
    793   1.1.1.6  christos 		  size = symtab_hdr->sh_info * sizeof (bfd_vma);
    794   1.1.1.6  christos 		  local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
    795   1.1.1.6  christos 
    796   1.1.1.6  christos 		  if (local_got_offsets == NULL)
    797   1.1.1.6  christos 		    goto fail;
    798   1.1.1.6  christos 
    799   1.1.1.6  christos 		  elf_local_got_offsets (abfd) = local_got_offsets;
    800   1.1.1.6  christos 
    801   1.1.1.6  christos 		  for (i = 0; i < symtab_hdr->sh_info; i++)
    802   1.1.1.6  christos 		    local_got_offsets[i] = (bfd_vma) -1;
    803   1.1.1.6  christos 		}
    804   1.1.1.6  christos 
    805   1.1.1.6  christos 	      if (local_got_offsets[r_symndx] != (bfd_vma) -1)
    806   1.1.1.6  christos 		/* We have already allocated space in the .got.  */
    807   1.1.1.6  christos 		break;
    808   1.1.1.6  christos 
    809   1.1.1.6  christos 	      local_got_offsets[r_symndx] = sgot->size;
    810   1.1.1.6  christos 
    811   1.1.1.6  christos 	      if (bfd_link_executable (info))
    812   1.1.1.6  christos 		/* If we are generating a shared object, we need to
    813   1.1.1.6  christos 		   output a R_CR16_RELATIVE reloc so that the dynamic
    814   1.1.1.6  christos 		   linker can adjust this GOT entry.  */
    815   1.1.1.6  christos 		srelgot->size += sizeof (Elf32_External_Rela);
    816   1.1.1.6  christos 	    }
    817   1.1.1.2  christos 
    818   1.1.1.6  christos 	  sgot->size += 4;
    819   1.1.1.6  christos 	  break;
    820   1.1.1.2  christos 
    821   1.1.1.6  christos 	}
    822   1.1.1.2  christos     }
    823   1.1.1.2  christos 
    824   1.1.1.9  christos   result = true;
    825   1.1.1.9  christos  fail:
    826   1.1.1.9  christos   free (isymbuf);
    827   1.1.1.2  christos 
    828   1.1.1.2  christos   return result;
    829       1.1     skrll }
    830       1.1     skrll 
    831       1.1     skrll /* Perform a relocation as part of a final link.  */
    832       1.1     skrll 
    833       1.1     skrll static bfd_reloc_status_type
    834       1.1     skrll cr16_elf_final_link_relocate (reloc_howto_type *howto,
    835   1.1.1.6  christos 			      bfd *input_bfd,
    836   1.1.1.6  christos 			      bfd *output_bfd ATTRIBUTE_UNUSED,
    837   1.1.1.6  christos 			      asection *input_section,
    838   1.1.1.6  christos 			      bfd_byte *contents,
    839   1.1.1.6  christos 			      bfd_vma offset,
    840   1.1.1.6  christos 			      bfd_vma Rvalue,
    841   1.1.1.6  christos 			      bfd_vma addend,
    842   1.1.1.6  christos 			      struct elf_link_hash_entry * h,
    843   1.1.1.6  christos 			      unsigned long symndx  ATTRIBUTE_UNUSED,
    844   1.1.1.6  christos 			      struct bfd_link_info *info ATTRIBUTE_UNUSED,
    845   1.1.1.6  christos 			      asection *sec ATTRIBUTE_UNUSED,
    846   1.1.1.6  christos 			      int is_local ATTRIBUTE_UNUSED)
    847       1.1     skrll {
    848       1.1     skrll   unsigned short r_type = howto->type;
    849       1.1     skrll   bfd_byte *hit_data = contents + offset;
    850       1.1     skrll   bfd_vma reloc_bits, check, Rvalue1;
    851       1.1     skrll 
    852       1.1     skrll   switch (r_type)
    853       1.1     skrll     {
    854   1.1.1.9  christos     case R_CR16_IMM4:
    855   1.1.1.9  christos     case R_CR16_IMM20:
    856   1.1.1.9  christos     case R_CR16_ABS20:
    857   1.1.1.9  christos       break;
    858   1.1.1.9  christos 
    859   1.1.1.9  christos     case R_CR16_IMM8:
    860   1.1.1.9  christos     case R_CR16_IMM16:
    861   1.1.1.9  christos     case R_CR16_IMM32:
    862   1.1.1.9  christos     case R_CR16_IMM32a:
    863   1.1.1.9  christos     case R_CR16_REGREL4:
    864   1.1.1.9  christos     case R_CR16_REGREL4a:
    865   1.1.1.9  christos     case R_CR16_REGREL14:
    866   1.1.1.9  christos     case R_CR16_REGREL14a:
    867   1.1.1.9  christos     case R_CR16_REGREL16:
    868   1.1.1.9  christos     case R_CR16_REGREL20:
    869   1.1.1.9  christos     case R_CR16_REGREL20a:
    870   1.1.1.9  christos     case R_CR16_GOT_REGREL20:
    871   1.1.1.9  christos     case R_CR16_GOTC_REGREL20:
    872   1.1.1.9  christos     case R_CR16_ABS24:
    873   1.1.1.9  christos     case R_CR16_DISP16:
    874   1.1.1.9  christos     case R_CR16_DISP24:
    875   1.1.1.9  christos       /* 'hit_data' is relative to the start of the instruction, not the
    876   1.1.1.9  christos 	 relocation offset.  Advance it to account for the exact offset.  */
    877   1.1.1.9  christos       hit_data += 2;
    878   1.1.1.9  christos       break;
    879   1.1.1.9  christos 
    880   1.1.1.9  christos     case R_CR16_NONE:
    881   1.1.1.9  christos       return bfd_reloc_ok;
    882   1.1.1.9  christos       break;
    883       1.1     skrll 
    884   1.1.1.9  christos     case R_CR16_DISP4:
    885   1.1.1.9  christos       if (is_local)
    886   1.1.1.6  christos 	Rvalue += -1;
    887   1.1.1.9  christos       break;
    888       1.1     skrll 
    889   1.1.1.9  christos     case R_CR16_DISP8:
    890   1.1.1.9  christos     case R_CR16_DISP24a:
    891   1.1.1.9  christos       if (is_local)
    892   1.1.1.6  christos 	Rvalue -= -1;
    893   1.1.1.9  christos       break;
    894       1.1     skrll 
    895   1.1.1.9  christos     case R_CR16_SWITCH8:
    896   1.1.1.9  christos     case R_CR16_SWITCH16:
    897   1.1.1.9  christos     case R_CR16_SWITCH32:
    898   1.1.1.9  christos       /* We only care about the addend, where the difference between
    899   1.1.1.9  christos 	 expressions is kept.  */
    900   1.1.1.9  christos       Rvalue = 0;
    901   1.1.1.4  christos 
    902   1.1.1.9  christos     default:
    903   1.1.1.9  christos       break;
    904       1.1     skrll     }
    905       1.1     skrll 
    906       1.1     skrll   if (howto->pc_relative)
    907       1.1     skrll     {
    908       1.1     skrll       /* Subtract the address of the section containing the location.  */
    909       1.1     skrll       Rvalue -= (input_section->output_section->vma
    910   1.1.1.6  christos 		 + input_section->output_offset);
    911       1.1     skrll       /* Subtract the position of the location within the section.  */
    912       1.1     skrll       Rvalue -= offset;
    913       1.1     skrll     }
    914       1.1     skrll 
    915       1.1     skrll   /* Add in supplied addend.  */
    916       1.1     skrll   Rvalue += addend;
    917       1.1     skrll 
    918       1.1     skrll   /* Complain if the bitfield overflows, whether it is considered
    919       1.1     skrll      as signed or unsigned.  */
    920       1.1     skrll   check = Rvalue >> howto->rightshift;
    921       1.1     skrll 
    922   1.1.1.9  christos   reloc_bits = ((bfd_vma) 1 << (howto->bitsize - 1) << 1) - 1;
    923       1.1     skrll 
    924   1.1.1.2  christos   /* For GOT and GOTC relocs no boundary checks applied.  */
    925   1.1.1.2  christos   if (!((r_type == R_CR16_GOT_REGREL20)
    926   1.1.1.9  christos 	|| (r_type == R_CR16_GOTC_REGREL20)))
    927   1.1.1.2  christos     {
    928   1.1.1.2  christos       if (((bfd_vma) check & ~reloc_bits) != 0
    929   1.1.1.6  christos 	  && (((bfd_vma) check & ~reloc_bits)
    930   1.1.1.9  christos 	      != (-(bfd_vma) 1 & ~reloc_bits)))
    931   1.1.1.6  christos 	{
    932   1.1.1.6  christos 	  /* The above right shift is incorrect for a signed
    933   1.1.1.6  christos 	     value.  See if turning on the upper bits fixes the
    934   1.1.1.6  christos 	     overflow.  */
    935   1.1.1.6  christos 	  if (howto->rightshift && (bfd_signed_vma) Rvalue < 0)
    936   1.1.1.6  christos 	    {
    937   1.1.1.9  christos 	      check |= ((bfd_vma) -1
    938   1.1.1.9  christos 			& ~((bfd_vma) -1 >> howto->rightshift));
    939   1.1.1.6  christos 
    940   1.1.1.6  christos 	      if (((bfd_vma) check & ~reloc_bits)
    941   1.1.1.6  christos 		  != (-(bfd_vma) 1 & ~reloc_bits))
    942   1.1.1.9  christos 		return bfd_reloc_overflow;
    943   1.1.1.6  christos 	    }
    944   1.1.1.6  christos 	  else
    945   1.1.1.6  christos 	    return bfd_reloc_overflow;
    946   1.1.1.6  christos 	}
    947       1.1     skrll 
    948   1.1.1.2  christos       /* Drop unwanted bits from the value we are relocating to.  */
    949   1.1.1.2  christos       Rvalue >>= (bfd_vma) howto->rightshift;
    950       1.1     skrll 
    951   1.1.1.2  christos       /* Apply dst_mask to select only relocatable part of the insn.  */
    952   1.1.1.2  christos       Rvalue &= howto->dst_mask;
    953   1.1.1.2  christos     }
    954       1.1     skrll 
    955   1.1.1.9  christos   switch (bfd_get_reloc_size (howto))
    956       1.1     skrll     {
    957   1.1.1.9  christos     case 1:
    958   1.1.1.9  christos       if (r_type == R_CR16_DISP8)
    959   1.1.1.9  christos 	{
    960   1.1.1.9  christos 	  Rvalue1 = bfd_get_16 (input_bfd, hit_data);
    961   1.1.1.9  christos 	  Rvalue = ((Rvalue1 & 0xf000) | ((Rvalue << 4) & 0xf00)
    962   1.1.1.9  christos 		    | (Rvalue1 & 0x00f0) | (Rvalue & 0xf));
    963   1.1.1.9  christos 	  bfd_put_16 (input_bfd, Rvalue, hit_data);
    964   1.1.1.9  christos 	}
    965   1.1.1.9  christos       else if (r_type == R_CR16_IMM4)
    966   1.1.1.9  christos 	{
    967   1.1.1.9  christos 	  Rvalue1 = bfd_get_16 (input_bfd, hit_data);
    968   1.1.1.9  christos 	  Rvalue = (((Rvalue1 & 0xff) << 8) | ((Rvalue << 4) & 0xf0)
    969   1.1.1.9  christos 		    | ((Rvalue1 & 0x0f00) >> 8));
    970   1.1.1.9  christos 	  bfd_put_16 (input_bfd, Rvalue, hit_data);
    971   1.1.1.9  christos 	}
    972   1.1.1.9  christos       else if (r_type == R_CR16_DISP4)
    973   1.1.1.9  christos 	{
    974   1.1.1.9  christos 	  Rvalue1 = bfd_get_16 (input_bfd, hit_data);
    975   1.1.1.9  christos 	  Rvalue = (Rvalue1 | ((Rvalue & 0xf) << 4));
    976   1.1.1.9  christos 	  bfd_put_16 (input_bfd, Rvalue, hit_data);
    977   1.1.1.9  christos 	}
    978   1.1.1.9  christos       else
    979   1.1.1.9  christos 	{
    980   1.1.1.9  christos 	  bfd_put_8 (input_bfd, (unsigned char) Rvalue, hit_data);
    981   1.1.1.9  christos 	}
    982   1.1.1.9  christos       break;
    983   1.1.1.6  christos 
    984   1.1.1.9  christos     case 2:
    985   1.1.1.9  christos       if (r_type == R_CR16_DISP16)
    986   1.1.1.9  christos 	{
    987   1.1.1.9  christos 	  Rvalue |= (bfd_get_16 (input_bfd, hit_data));
    988   1.1.1.9  christos 	  Rvalue = ((Rvalue & 0xfffe) | ((Rvalue >> 16) & 0x1));
    989   1.1.1.9  christos 	}
    990   1.1.1.9  christos       if (r_type == R_CR16_IMM16)
    991   1.1.1.9  christos 	{
    992   1.1.1.9  christos 	  Rvalue1 = bfd_get_16 (input_bfd, hit_data);
    993   1.1.1.6  christos 
    994   1.1.1.9  christos 	  Rvalue1 = (Rvalue1 ^ 0x8000) - 0x8000;
    995   1.1.1.9  christos 	  Rvalue += Rvalue1;
    996   1.1.1.6  christos 
    997   1.1.1.9  christos 	  /* Check for range.  */
    998   1.1.1.9  christos 	  if (Rvalue > 0xffff)
    999   1.1.1.9  christos 	    return bfd_reloc_overflow;
   1000   1.1.1.9  christos 	}
   1001   1.1.1.6  christos 
   1002   1.1.1.9  christos       bfd_put_16 (input_bfd, Rvalue, hit_data);
   1003   1.1.1.9  christos       break;
   1004   1.1.1.6  christos 
   1005   1.1.1.9  christos     case 4:
   1006   1.1.1.9  christos       if ((r_type == R_CR16_ABS20) || (r_type == R_CR16_IMM20))
   1007   1.1.1.9  christos 	{
   1008   1.1.1.9  christos 	  Rvalue1 = (bfd_get_16 (input_bfd, hit_data + 2)
   1009   1.1.1.9  christos 		     | (((bfd_get_16 (input_bfd, hit_data) & 0xf) << 16)));
   1010   1.1.1.6  christos 
   1011   1.1.1.9  christos 	  Rvalue1 = (Rvalue1 ^ 0x80000) - 0x80000;
   1012   1.1.1.9  christos 	  Rvalue += Rvalue1;
   1013   1.1.1.9  christos 
   1014   1.1.1.9  christos 	  /* Check for range.  */
   1015   1.1.1.9  christos 	  if (Rvalue > 0xfffff)
   1016   1.1.1.9  christos 	    return bfd_reloc_overflow;
   1017   1.1.1.6  christos 
   1018   1.1.1.9  christos 	  bfd_put_16 (input_bfd, ((bfd_get_16 (input_bfd, hit_data) & 0xfff0)
   1019   1.1.1.9  christos 				  | ((Rvalue >> 16) & 0xf)), hit_data);
   1020   1.1.1.9  christos 	  bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
   1021   1.1.1.9  christos 	}
   1022   1.1.1.9  christos       else if (r_type == R_CR16_GOT_REGREL20)
   1023   1.1.1.9  christos 	{
   1024   1.1.1.9  christos 	  asection *sgot = elf_hash_table (info)->sgot;
   1025   1.1.1.9  christos 	  bfd_vma off;
   1026   1.1.1.6  christos 
   1027   1.1.1.9  christos 	  if (h != NULL)
   1028   1.1.1.9  christos 	    {
   1029   1.1.1.9  christos 	      off = h->got.offset;
   1030   1.1.1.9  christos 	      BFD_ASSERT (off != (bfd_vma) -1);
   1031   1.1.1.9  christos 
   1032   1.1.1.9  christos 	      if (! elf_hash_table (info)->dynamic_sections_created
   1033   1.1.1.9  christos 		  || SYMBOL_REFERENCES_LOCAL (info, h))
   1034   1.1.1.9  christos 		/* This is actually a static link, or it is a
   1035   1.1.1.9  christos 		   -Bsymbolic link and the symbol is defined
   1036   1.1.1.9  christos 		   locally, or the symbol was forced to be local
   1037   1.1.1.9  christos 		   because of a version file.  We must initialize
   1038   1.1.1.9  christos 		   this entry in the global offset table.
   1039   1.1.1.9  christos 		   When doing a dynamic link, we create a .rela.got
   1040   1.1.1.9  christos 		   relocation entry to initialize the value.  This
   1041   1.1.1.9  christos 		   is done in the finish_dynamic_symbol routine.  */
   1042   1.1.1.9  christos 		bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
   1043   1.1.1.9  christos 	    }
   1044   1.1.1.9  christos 	  else
   1045   1.1.1.9  christos 	    {
   1046   1.1.1.9  christos 	      off = elf_local_got_offsets (input_bfd)[symndx];
   1047   1.1.1.9  christos 	      bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
   1048   1.1.1.9  christos 	    }
   1049   1.1.1.9  christos 
   1050   1.1.1.9  christos 	  Rvalue = sgot->output_offset + off;
   1051   1.1.1.9  christos 	  Rvalue += addend;
   1052   1.1.1.9  christos 
   1053   1.1.1.9  christos 	  /* REVISIT: if ((long) Rvalue > 0xffffff ||
   1054   1.1.1.9  christos 	     (long) Rvalue < -0x800000).  */
   1055   1.1.1.9  christos 	  if (Rvalue > 0xffffff)
   1056   1.1.1.9  christos 	    return bfd_reloc_overflow;
   1057   1.1.1.9  christos 
   1058   1.1.1.9  christos 
   1059   1.1.1.9  christos 	  bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
   1060   1.1.1.9  christos 		      | (((Rvalue >> 16) & 0xf) << 8), hit_data);
   1061   1.1.1.9  christos 	  bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
   1062   1.1.1.9  christos 
   1063   1.1.1.9  christos 	}
   1064   1.1.1.9  christos       else if (r_type == R_CR16_GOTC_REGREL20)
   1065   1.1.1.9  christos 	{
   1066   1.1.1.9  christos 	  asection *sgot = elf_hash_table (info)->sgot;
   1067   1.1.1.9  christos 	  bfd_vma off;
   1068   1.1.1.9  christos 
   1069   1.1.1.9  christos 	  if (h != NULL)
   1070   1.1.1.9  christos 	    {
   1071   1.1.1.9  christos 	      off = h->got.offset;
   1072   1.1.1.9  christos 	      BFD_ASSERT (off != (bfd_vma) -1);
   1073   1.1.1.9  christos 
   1074   1.1.1.9  christos 	      Rvalue >>= 1; /* For code symbols.  */
   1075   1.1.1.9  christos 
   1076   1.1.1.9  christos 	      if (! elf_hash_table (info)->dynamic_sections_created
   1077   1.1.1.9  christos 		  || SYMBOL_REFERENCES_LOCAL (info, h))
   1078   1.1.1.9  christos 		/* This is actually a static link, or it is a
   1079   1.1.1.9  christos 		   -Bsymbolic link and the symbol is defined
   1080   1.1.1.9  christos 		   locally, or the symbol was forced to be local
   1081   1.1.1.9  christos 		   because of a version file.  We must initialize
   1082   1.1.1.9  christos 		   this entry in the global offset table.
   1083   1.1.1.9  christos 		   When doing a dynamic link, we create a .rela.got
   1084   1.1.1.9  christos 		   relocation entry to initialize the value.  This
   1085   1.1.1.9  christos 		   is done in the finish_dynamic_symbol routine.  */
   1086   1.1.1.9  christos 		bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
   1087   1.1.1.9  christos 	    }
   1088   1.1.1.9  christos 	  else
   1089   1.1.1.9  christos 	    {
   1090   1.1.1.9  christos 	      off = elf_local_got_offsets (input_bfd)[symndx];
   1091   1.1.1.9  christos 	      Rvalue >>= 1;
   1092   1.1.1.9  christos 	      bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
   1093   1.1.1.9  christos 	    }
   1094   1.1.1.9  christos 
   1095   1.1.1.9  christos 	  Rvalue = sgot->output_offset + off;
   1096   1.1.1.9  christos 	  Rvalue += addend;
   1097   1.1.1.9  christos 
   1098   1.1.1.9  christos 	  /* Check if any value in DISP.  */
   1099   1.1.1.9  christos 	  Rvalue1 = bfd_get_32 (input_bfd, hit_data);
   1100   1.1.1.9  christos 	  Rvalue1 = ((Rvalue1 >> 16) | ((Rvalue1 & 0xfff) >> 8 << 16));
   1101   1.1.1.9  christos 
   1102   1.1.1.9  christos 	  Rvalue1 = (Rvalue1 ^ 0x80000) - 0x80000;
   1103   1.1.1.9  christos 	  Rvalue += Rvalue1;
   1104   1.1.1.9  christos 
   1105   1.1.1.9  christos 	  /* Check for range.  */
   1106   1.1.1.9  christos 	  /* REVISIT: if ((long) Rvalue > 0xffffff
   1107   1.1.1.9  christos 	     || (long) Rvalue < -0x800000).  */
   1108   1.1.1.9  christos 	  if (Rvalue > 0xffffff)
   1109   1.1.1.9  christos 	    return bfd_reloc_overflow;
   1110   1.1.1.9  christos 
   1111   1.1.1.9  christos 	  bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
   1112   1.1.1.9  christos 		      | (((Rvalue >> 16) & 0xf) << 8), hit_data);
   1113   1.1.1.9  christos 	  bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
   1114   1.1.1.9  christos 	}
   1115   1.1.1.9  christos       else
   1116   1.1.1.9  christos 	{
   1117   1.1.1.9  christos 	  if (r_type == R_CR16_ABS24)
   1118   1.1.1.9  christos 	    {
   1119   1.1.1.9  christos 	      Rvalue1 = bfd_get_32 (input_bfd, hit_data);
   1120   1.1.1.9  christos 	      Rvalue1 = ((Rvalue1 >> 16)
   1121   1.1.1.9  christos 			 | ((Rvalue1 & 0xfff) >> 8 << 16)
   1122   1.1.1.9  christos 			 | ((Rvalue1 & 0xf) << 20));
   1123   1.1.1.9  christos 
   1124   1.1.1.9  christos 	      Rvalue1 = (Rvalue1 ^ 0x800000) - 0x800000;
   1125   1.1.1.9  christos 	      Rvalue += Rvalue1;
   1126   1.1.1.9  christos 
   1127   1.1.1.9  christos 	      /* Check for Range.  */
   1128   1.1.1.9  christos 	      if (Rvalue > 0xffffff)
   1129   1.1.1.9  christos 		return bfd_reloc_overflow;
   1130   1.1.1.9  christos 
   1131   1.1.1.9  christos 	      Rvalue = ((((Rvalue >> 20) & 0xf) | (((Rvalue >> 16) & 0xf)<<8)
   1132   1.1.1.9  christos 			 | (bfd_get_32 (input_bfd, hit_data) & 0xf0f0))
   1133   1.1.1.9  christos 			| ((Rvalue & 0xffff) << 16));
   1134   1.1.1.9  christos 	    }
   1135   1.1.1.9  christos 	  else if (r_type == R_CR16_DISP24)
   1136   1.1.1.9  christos 	    {
   1137   1.1.1.9  christos 	      Rvalue = ((((Rvalue >> 20)& 0xf) | (((Rvalue >>16) & 0xf)<<8)
   1138   1.1.1.9  christos 			 | (bfd_get_16 (input_bfd, hit_data)))
   1139   1.1.1.9  christos 			| (((Rvalue & 0xfffe) | ((Rvalue >> 24) & 0x1)) << 16));
   1140   1.1.1.9  christos 	    }
   1141   1.1.1.9  christos 	  else if ((r_type == R_CR16_IMM32) || (r_type == R_CR16_IMM32a))
   1142   1.1.1.9  christos 	    {
   1143   1.1.1.9  christos 	      Rvalue1 = bfd_get_32 (input_bfd, hit_data);
   1144   1.1.1.9  christos 	      Rvalue1 = (((Rvalue1 >> 16) & 0xffff)
   1145   1.1.1.9  christos 			 | ((Rvalue1 & 0xffff) << 16));
   1146   1.1.1.9  christos 
   1147   1.1.1.9  christos 	      Rvalue1 = (Rvalue1 ^ 0x80000000) - 0x80000000;
   1148   1.1.1.9  christos 	      Rvalue += Rvalue1;
   1149   1.1.1.6  christos 
   1150   1.1.1.6  christos 	      /* Check for range.  */
   1151   1.1.1.9  christos 	      if (Rvalue > 0xffffffff)
   1152   1.1.1.9  christos 		return bfd_reloc_overflow;
   1153   1.1.1.6  christos 
   1154   1.1.1.9  christos 	      Rvalue = (((Rvalue >> 16) & 0xffff) | (Rvalue & 0xffff) << 16);
   1155   1.1.1.9  christos 	    }
   1156   1.1.1.9  christos 	  else if (r_type == R_CR16_DISP24a)
   1157   1.1.1.9  christos 	    {
   1158   1.1.1.9  christos 	      Rvalue = (((Rvalue & 0xfffffe) | (Rvalue >> 23)));
   1159   1.1.1.9  christos 	      Rvalue = (((Rvalue >> 16) & 0xff) | ((Rvalue & 0xffff) << 16)
   1160   1.1.1.9  christos 			| bfd_get_32 (input_bfd, hit_data));
   1161   1.1.1.9  christos 	    }
   1162   1.1.1.9  christos 	  else if ((r_type == R_CR16_REGREL20)
   1163   1.1.1.9  christos 		   || (r_type == R_CR16_REGREL20a))
   1164   1.1.1.9  christos 	    {
   1165   1.1.1.9  christos 	      Rvalue1 = bfd_get_32 (input_bfd, hit_data);
   1166   1.1.1.9  christos 	      Rvalue1 = (((Rvalue1 >> 16) & 0xffff)
   1167   1.1.1.9  christos 			 | ((Rvalue1 & 0xfff) >> 8 << 16));
   1168   1.1.1.6  christos 
   1169   1.1.1.9  christos 	      Rvalue1 = (Rvalue1 ^ 0x80000) - 0x80000;
   1170   1.1.1.9  christos 	      Rvalue += Rvalue1;
   1171       1.1     skrll 
   1172   1.1.1.9  christos 	      /* Check for range.  */
   1173   1.1.1.9  christos 	      if (Rvalue > 0xfffff)
   1174   1.1.1.9  christos 		return bfd_reloc_overflow;
   1175   1.1.1.9  christos 
   1176   1.1.1.9  christos 	      Rvalue = (((((Rvalue >> 20) & 0xf) | (((Rvalue >> 16) & 0xf) << 8)
   1177   1.1.1.9  christos 			  | ((Rvalue & 0xffff) << 16)))
   1178   1.1.1.9  christos 			| (bfd_get_32 (input_bfd, hit_data) & 0xf0ff));
   1179   1.1.1.9  christos 
   1180   1.1.1.9  christos 	    }
   1181   1.1.1.9  christos 	  else if (r_type == R_CR16_NUM32)
   1182   1.1.1.9  christos 	    {
   1183   1.1.1.9  christos 	      Rvalue1 = (bfd_get_32 (input_bfd, hit_data));
   1184   1.1.1.9  christos 
   1185   1.1.1.9  christos 	      Rvalue1 = (Rvalue1 ^ 0x80000000) - 0x80000000;
   1186   1.1.1.9  christos 	      Rvalue += Rvalue1;
   1187   1.1.1.9  christos 
   1188   1.1.1.9  christos 	      /* Check for Range.  */
   1189   1.1.1.9  christos 	      if (Rvalue > 0xffffffff)
   1190   1.1.1.9  christos 		return bfd_reloc_overflow;
   1191   1.1.1.9  christos 	    }
   1192   1.1.1.9  christos 
   1193   1.1.1.9  christos 	  bfd_put_32 (input_bfd, Rvalue, hit_data);
   1194   1.1.1.9  christos 	}
   1195   1.1.1.9  christos       break;
   1196   1.1.1.9  christos 
   1197   1.1.1.9  christos     default:
   1198   1.1.1.9  christos       return bfd_reloc_notsupported;
   1199       1.1     skrll     }
   1200       1.1     skrll 
   1201       1.1     skrll   return bfd_reloc_ok;
   1202       1.1     skrll }
   1203       1.1     skrll 
   1204       1.1     skrll /* Delete some bytes from a section while relaxing.  */
   1205       1.1     skrll 
   1206   1.1.1.9  christos static bool
   1207       1.1     skrll elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd,
   1208   1.1.1.6  christos 			       asection *sec, bfd_vma addr, int count)
   1209       1.1     skrll {
   1210       1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   1211       1.1     skrll   unsigned int sec_shndx;
   1212       1.1     skrll   bfd_byte *contents;
   1213       1.1     skrll   Elf_Internal_Rela *irel, *irelend;
   1214       1.1     skrll   bfd_vma toaddr;
   1215       1.1     skrll   Elf_Internal_Sym *isym;
   1216       1.1     skrll   Elf_Internal_Sym *isymend;
   1217       1.1     skrll   struct elf_link_hash_entry **sym_hashes;
   1218       1.1     skrll   struct elf_link_hash_entry **end_hashes;
   1219       1.1     skrll   struct elf_link_hash_entry **start_hashes;
   1220       1.1     skrll   unsigned int symcount;
   1221       1.1     skrll 
   1222       1.1     skrll   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
   1223       1.1     skrll 
   1224       1.1     skrll   contents = elf_section_data (sec)->this_hdr.contents;
   1225       1.1     skrll 
   1226       1.1     skrll   toaddr = sec->size;
   1227       1.1     skrll 
   1228       1.1     skrll   irel = elf_section_data (sec)->relocs;
   1229       1.1     skrll   irelend = irel + sec->reloc_count;
   1230       1.1     skrll 
   1231       1.1     skrll   /* Actually delete the bytes.  */
   1232       1.1     skrll   memmove (contents + addr, contents + addr + count,
   1233   1.1.1.6  christos 	   (size_t) (toaddr - addr - count));
   1234       1.1     skrll   sec->size -= count;
   1235       1.1     skrll 
   1236       1.1     skrll   /* Adjust all the relocs.  */
   1237       1.1     skrll   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
   1238       1.1     skrll     /* Get the new reloc address.  */
   1239       1.1     skrll     if ((irel->r_offset > addr && irel->r_offset < toaddr))
   1240   1.1.1.9  christos       irel->r_offset -= count;
   1241       1.1     skrll 
   1242       1.1     skrll   /* Adjust the local symbols defined in this section.  */
   1243       1.1     skrll   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1244       1.1     skrll   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
   1245       1.1     skrll   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
   1246       1.1     skrll     {
   1247       1.1     skrll       if (isym->st_shndx == sec_shndx
   1248   1.1.1.6  christos 	  && isym->st_value > addr
   1249   1.1.1.6  christos 	  && isym->st_value < toaddr)
   1250   1.1.1.6  christos 	{
   1251   1.1.1.6  christos 	  /* Adjust the addend of SWITCH relocations in this section,
   1252   1.1.1.6  christos 	     which reference this local symbol.  */
   1253   1.1.1.2  christos #if 0
   1254   1.1.1.6  christos 	  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
   1255   1.1.1.6  christos 	    {
   1256   1.1.1.6  christos 	      unsigned long r_symndx;
   1257   1.1.1.6  christos 	      Elf_Internal_Sym *rsym;
   1258   1.1.1.6  christos 	      bfd_vma addsym, subsym;
   1259   1.1.1.6  christos 
   1260   1.1.1.6  christos 	      /* Skip if not a SWITCH relocation.  */
   1261   1.1.1.6  christos 	      if (ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH8
   1262   1.1.1.6  christos 		  && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH16
   1263   1.1.1.6  christos 		  && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH32)
   1264   1.1.1.9  christos 		continue;
   1265   1.1.1.6  christos 
   1266   1.1.1.6  christos 	      r_symndx = ELF32_R_SYM (irel->r_info);
   1267   1.1.1.6  christos 	      rsym = (Elf_Internal_Sym *) symtab_hdr->contents + r_symndx;
   1268   1.1.1.6  christos 
   1269   1.1.1.6  christos 	      /* Skip if not the local adjusted symbol.  */
   1270   1.1.1.6  christos 	      if (rsym != isym)
   1271   1.1.1.6  christos 		continue;
   1272   1.1.1.6  christos 
   1273   1.1.1.6  christos 	      addsym = isym->st_value;
   1274   1.1.1.6  christos 	      subsym = addsym - irel->r_addend;
   1275   1.1.1.6  christos 
   1276   1.1.1.6  christos 	      /* Fix the addend only when -->> (addsym > addr >= subsym).  */
   1277   1.1.1.6  christos 	      if (subsym <= addr)
   1278   1.1.1.6  christos 		irel->r_addend -= count;
   1279   1.1.1.6  christos 	      else
   1280   1.1.1.6  christos 		continue;
   1281   1.1.1.6  christos 	    }
   1282   1.1.1.2  christos #endif
   1283       1.1     skrll 
   1284   1.1.1.6  christos 	  isym->st_value -= count;
   1285   1.1.1.6  christos 	}
   1286       1.1     skrll     }
   1287       1.1     skrll 
   1288       1.1     skrll   /* Now adjust the global symbols defined in this section.  */
   1289       1.1     skrll   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
   1290   1.1.1.9  christos 	      - symtab_hdr->sh_info);
   1291       1.1     skrll   sym_hashes = start_hashes = elf_sym_hashes (abfd);
   1292       1.1     skrll   end_hashes = sym_hashes + symcount;
   1293       1.1     skrll 
   1294       1.1     skrll   for (; sym_hashes < end_hashes; sym_hashes++)
   1295       1.1     skrll     {
   1296       1.1     skrll       struct elf_link_hash_entry *sym_hash = *sym_hashes;
   1297       1.1     skrll 
   1298       1.1     skrll       /* The '--wrap SYMBOL' option is causing a pain when the object file,
   1299   1.1.1.6  christos 	 containing the definition of __wrap_SYMBOL, includes a direct
   1300   1.1.1.6  christos 	 call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
   1301   1.1.1.6  christos 	 the same symbol (which is __wrap_SYMBOL), but still exist as two
   1302   1.1.1.6  christos 	 different symbols in 'sym_hashes', we don't want to adjust
   1303   1.1.1.6  christos 	 the global symbol __wrap_SYMBOL twice.
   1304   1.1.1.6  christos 	 This check is only relevant when symbols are being wrapped.  */
   1305       1.1     skrll       if (link_info->wrap_hash != NULL)
   1306   1.1.1.6  christos 	{
   1307   1.1.1.6  christos 	  struct elf_link_hash_entry **cur_sym_hashes;
   1308       1.1     skrll 
   1309   1.1.1.6  christos 	  /* Loop only over the symbols whom been already checked.  */
   1310   1.1.1.6  christos 	  for (cur_sym_hashes = start_hashes; cur_sym_hashes < sym_hashes;
   1311   1.1.1.6  christos 	       cur_sym_hashes++)
   1312   1.1.1.6  christos 	    /* If the current symbol is identical to 'sym_hash', that means
   1313   1.1.1.6  christos 	       the symbol was already adjusted (or at least checked).  */
   1314   1.1.1.6  christos 	    if (*cur_sym_hashes == sym_hash)
   1315   1.1.1.6  christos 	      break;
   1316   1.1.1.6  christos 
   1317   1.1.1.6  christos 	  /* Don't adjust the symbol again.  */
   1318   1.1.1.6  christos 	  if (cur_sym_hashes < sym_hashes)
   1319   1.1.1.6  christos 	    continue;
   1320   1.1.1.6  christos 	}
   1321       1.1     skrll 
   1322       1.1     skrll       if ((sym_hash->root.type == bfd_link_hash_defined
   1323   1.1.1.9  christos 	   || sym_hash->root.type == bfd_link_hash_defweak)
   1324   1.1.1.6  christos 	  && sym_hash->root.u.def.section == sec
   1325   1.1.1.6  christos 	  && sym_hash->root.u.def.value > addr
   1326   1.1.1.6  christos 	  && sym_hash->root.u.def.value < toaddr)
   1327   1.1.1.6  christos 	sym_hash->root.u.def.value -= count;
   1328       1.1     skrll     }
   1329       1.1     skrll 
   1330   1.1.1.9  christos   return true;
   1331       1.1     skrll }
   1332       1.1     skrll 
   1333       1.1     skrll /* Relocate a CR16 ELF section.  */
   1334       1.1     skrll 
   1335   1.1.1.9  christos static int
   1336       1.1     skrll elf32_cr16_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
   1337   1.1.1.6  christos 			     bfd *input_bfd, asection *input_section,
   1338   1.1.1.6  christos 			     bfd_byte *contents, Elf_Internal_Rela *relocs,
   1339   1.1.1.6  christos 			     Elf_Internal_Sym *local_syms,
   1340   1.1.1.6  christos 			     asection **local_sections)
   1341       1.1     skrll {
   1342       1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   1343       1.1     skrll   struct elf_link_hash_entry **sym_hashes;
   1344       1.1     skrll   Elf_Internal_Rela *rel, *relend;
   1345       1.1     skrll 
   1346       1.1     skrll   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   1347       1.1     skrll   sym_hashes = elf_sym_hashes (input_bfd);
   1348       1.1     skrll 
   1349       1.1     skrll   rel = relocs;
   1350       1.1     skrll   relend = relocs + input_section->reloc_count;
   1351       1.1     skrll   for (; rel < relend; rel++)
   1352       1.1     skrll     {
   1353       1.1     skrll       int r_type;
   1354       1.1     skrll       reloc_howto_type *howto;
   1355       1.1     skrll       unsigned long r_symndx;
   1356       1.1     skrll       Elf_Internal_Sym *sym;
   1357       1.1     skrll       asection *sec;
   1358       1.1     skrll       struct elf_link_hash_entry *h;
   1359       1.1     skrll       bfd_vma relocation;
   1360       1.1     skrll       bfd_reloc_status_type r;
   1361       1.1     skrll 
   1362       1.1     skrll       r_symndx = ELF32_R_SYM (rel->r_info);
   1363       1.1     skrll       r_type = ELF32_R_TYPE (rel->r_info);
   1364       1.1     skrll       howto = cr16_elf_howto_table + (r_type);
   1365       1.1     skrll 
   1366       1.1     skrll       h = NULL;
   1367       1.1     skrll       sym = NULL;
   1368       1.1     skrll       sec = NULL;
   1369       1.1     skrll       if (r_symndx < symtab_hdr->sh_info)
   1370   1.1.1.6  christos 	{
   1371   1.1.1.6  christos 	  sym = local_syms + r_symndx;
   1372   1.1.1.6  christos 	  sec = local_sections[r_symndx];
   1373   1.1.1.6  christos 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   1374   1.1.1.6  christos 	}
   1375       1.1     skrll       else
   1376   1.1.1.6  christos 	{
   1377   1.1.1.9  christos 	  bool unresolved_reloc, warned, ignored;
   1378       1.1     skrll 
   1379   1.1.1.6  christos 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   1380   1.1.1.6  christos 				   r_symndx, symtab_hdr, sym_hashes,
   1381   1.1.1.6  christos 				   h, sec, relocation,
   1382   1.1.1.6  christos 				   unresolved_reloc, warned, ignored);
   1383   1.1.1.6  christos 	}
   1384       1.1     skrll 
   1385   1.1.1.3  christos       if (sec != NULL && discarded_section (sec))
   1386   1.1.1.2  christos 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   1387  1.1.1.12  christos 					 rel, 1, relend, R_CR16_NONE,
   1388  1.1.1.12  christos 					 howto, 0, contents);
   1389   1.1.1.2  christos 
   1390   1.1.1.4  christos       if (bfd_link_relocatable (info))
   1391   1.1.1.6  christos 	continue;
   1392   1.1.1.2  christos 
   1393       1.1     skrll       r = cr16_elf_final_link_relocate (howto, input_bfd, output_bfd,
   1394   1.1.1.6  christos 					input_section,
   1395   1.1.1.6  christos 					contents, rel->r_offset,
   1396   1.1.1.6  christos 					relocation, rel->r_addend,
   1397   1.1.1.6  christos 					(struct elf_link_hash_entry *) h,
   1398   1.1.1.6  christos 					r_symndx,
   1399   1.1.1.6  christos 					info, sec, h == NULL);
   1400       1.1     skrll 
   1401       1.1     skrll       if (r != bfd_reloc_ok)
   1402   1.1.1.6  christos 	{
   1403   1.1.1.6  christos 	  const char *name;
   1404   1.1.1.6  christos 	  const char *msg = NULL;
   1405   1.1.1.6  christos 
   1406   1.1.1.6  christos 	  if (h != NULL)
   1407   1.1.1.6  christos 	    name = h->root.root.string;
   1408   1.1.1.6  christos 	  else
   1409   1.1.1.6  christos 	    {
   1410   1.1.1.6  christos 	      name = (bfd_elf_string_from_elf_section
   1411   1.1.1.6  christos 		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
   1412   1.1.1.6  christos 	      if (name == NULL || *name == '\0')
   1413   1.1.1.8  christos 		name = bfd_section_name (sec);
   1414   1.1.1.6  christos 	    }
   1415   1.1.1.6  christos 
   1416   1.1.1.6  christos 	  switch (r)
   1417   1.1.1.6  christos 	    {
   1418   1.1.1.9  christos 	    case bfd_reloc_overflow:
   1419   1.1.1.9  christos 	      (*info->callbacks->reloc_overflow)
   1420   1.1.1.9  christos 		(info, (h ? &h->root : NULL), name, howto->name,
   1421   1.1.1.9  christos 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
   1422   1.1.1.9  christos 	      break;
   1423       1.1     skrll 
   1424   1.1.1.9  christos 	    case bfd_reloc_undefined:
   1425   1.1.1.9  christos 	      (*info->callbacks->undefined_symbol)
   1426   1.1.1.9  christos 		(info, name, input_bfd, input_section, rel->r_offset, true);
   1427   1.1.1.9  christos 	      break;
   1428       1.1     skrll 
   1429   1.1.1.9  christos 	    case bfd_reloc_outofrange:
   1430   1.1.1.9  christos 	      msg = _("internal error: out of range error");
   1431   1.1.1.9  christos 	      goto common_error;
   1432   1.1.1.9  christos 
   1433   1.1.1.9  christos 	    case bfd_reloc_notsupported:
   1434   1.1.1.9  christos 	      msg = _("internal error: unsupported relocation error");
   1435   1.1.1.9  christos 	      goto common_error;
   1436   1.1.1.9  christos 
   1437   1.1.1.9  christos 	    case bfd_reloc_dangerous:
   1438   1.1.1.9  christos 	      msg = _("internal error: dangerous error");
   1439   1.1.1.9  christos 	      goto common_error;
   1440       1.1     skrll 
   1441   1.1.1.9  christos 	    default:
   1442   1.1.1.9  christos 	      msg = _("internal error: unknown error");
   1443   1.1.1.9  christos 	      /* Fall through.  */
   1444       1.1     skrll 
   1445   1.1.1.9  christos 	    common_error:
   1446   1.1.1.9  christos 	      (*info->callbacks->warning) (info, msg, name, input_bfd,
   1447   1.1.1.9  christos 					   input_section, rel->r_offset);
   1448   1.1.1.9  christos 	      break;
   1449   1.1.1.6  christos 	    }
   1450   1.1.1.6  christos 	}
   1451       1.1     skrll     }
   1452       1.1     skrll 
   1453   1.1.1.9  christos   return true;
   1454       1.1     skrll }
   1455       1.1     skrll 
   1456       1.1     skrll /* This is a version of bfd_generic_get_relocated_section_contents
   1457       1.1     skrll    which uses elf32_cr16_relocate_section.  */
   1458       1.1     skrll 
   1459       1.1     skrll static bfd_byte *
   1460       1.1     skrll elf32_cr16_get_relocated_section_contents (bfd *output_bfd,
   1461   1.1.1.6  christos 					   struct bfd_link_info *link_info,
   1462   1.1.1.6  christos 					   struct bfd_link_order *link_order,
   1463   1.1.1.6  christos 					   bfd_byte *data,
   1464   1.1.1.9  christos 					   bool relocatable,
   1465   1.1.1.6  christos 					   asymbol **symbols)
   1466       1.1     skrll {
   1467       1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   1468       1.1     skrll   asection *input_section = link_order->u.indirect.section;
   1469       1.1     skrll   bfd *input_bfd = input_section->owner;
   1470       1.1     skrll   asection **sections = NULL;
   1471       1.1     skrll   Elf_Internal_Rela *internal_relocs = NULL;
   1472       1.1     skrll   Elf_Internal_Sym *isymbuf = NULL;
   1473       1.1     skrll 
   1474       1.1     skrll   /* We only need to handle the case of relaxing, or of having a
   1475       1.1     skrll      particular set of section contents, specially.  */
   1476       1.1     skrll   if (relocatable
   1477       1.1     skrll       || elf_section_data (input_section)->this_hdr.contents == NULL)
   1478       1.1     skrll     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
   1479   1.1.1.6  christos 						       link_order, data,
   1480   1.1.1.6  christos 						       relocatable,
   1481   1.1.1.6  christos 						       symbols);
   1482       1.1     skrll 
   1483       1.1     skrll   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   1484       1.1     skrll 
   1485  1.1.1.10  christos   bfd_byte *orig_data = data;
   1486  1.1.1.10  christos   if (data == NULL)
   1487  1.1.1.10  christos     {
   1488  1.1.1.10  christos       data = bfd_malloc (input_section->size);
   1489  1.1.1.10  christos       if (data == NULL)
   1490  1.1.1.10  christos 	return NULL;
   1491  1.1.1.10  christos     }
   1492       1.1     skrll   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
   1493   1.1.1.6  christos 	  (size_t) input_section->size);
   1494       1.1     skrll 
   1495       1.1     skrll   if ((input_section->flags & SEC_RELOC) != 0
   1496       1.1     skrll       && input_section->reloc_count > 0)
   1497       1.1     skrll     {
   1498       1.1     skrll       Elf_Internal_Sym *isym;
   1499       1.1     skrll       Elf_Internal_Sym *isymend;
   1500       1.1     skrll       asection **secpp;
   1501       1.1     skrll       bfd_size_type amt;
   1502       1.1     skrll 
   1503       1.1     skrll       internal_relocs = _bfd_elf_link_read_relocs (input_bfd, input_section,
   1504   1.1.1.9  christos 						   NULL, NULL, false);
   1505       1.1     skrll       if (internal_relocs == NULL)
   1506   1.1.1.6  christos 	goto error_return;
   1507       1.1     skrll 
   1508       1.1     skrll       if (symtab_hdr->sh_info != 0)
   1509   1.1.1.6  christos 	{
   1510   1.1.1.6  christos 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   1511   1.1.1.6  christos 	  if (isymbuf == NULL)
   1512   1.1.1.6  christos 	    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
   1513   1.1.1.6  christos 					    symtab_hdr->sh_info, 0,
   1514   1.1.1.6  christos 					    NULL, NULL, NULL);
   1515   1.1.1.6  christos 	  if (isymbuf == NULL)
   1516   1.1.1.6  christos 	    goto error_return;
   1517   1.1.1.6  christos 	}
   1518       1.1     skrll 
   1519       1.1     skrll       amt = symtab_hdr->sh_info;
   1520       1.1     skrll       amt *= sizeof (asection *);
   1521       1.1     skrll       sections = bfd_malloc (amt);
   1522       1.1     skrll       if (sections == NULL && amt != 0)
   1523   1.1.1.6  christos 	goto error_return;
   1524       1.1     skrll 
   1525       1.1     skrll       isymend = isymbuf + symtab_hdr->sh_info;
   1526       1.1     skrll       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
   1527   1.1.1.6  christos 	{
   1528   1.1.1.6  christos 	  asection *isec;
   1529       1.1     skrll 
   1530   1.1.1.6  christos 	  if (isym->st_shndx == SHN_UNDEF)
   1531   1.1.1.6  christos 	    isec = bfd_und_section_ptr;
   1532   1.1.1.6  christos 	  else if (isym->st_shndx == SHN_ABS)
   1533   1.1.1.6  christos 	    isec = bfd_abs_section_ptr;
   1534   1.1.1.6  christos 	  else if (isym->st_shndx == SHN_COMMON)
   1535   1.1.1.6  christos 	    isec = bfd_com_section_ptr;
   1536   1.1.1.6  christos 	  else
   1537   1.1.1.6  christos 	    isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
   1538       1.1     skrll 
   1539   1.1.1.6  christos 	  *secpp = isec;
   1540   1.1.1.6  christos 	}
   1541       1.1     skrll 
   1542       1.1     skrll       if (! elf32_cr16_relocate_section (output_bfd, link_info, input_bfd,
   1543   1.1.1.9  christos 					 input_section, data, internal_relocs,
   1544   1.1.1.9  christos 					 isymbuf, sections))
   1545   1.1.1.6  christos 	goto error_return;
   1546       1.1     skrll 
   1547   1.1.1.9  christos       free (sections);
   1548   1.1.1.9  christos       if (symtab_hdr->contents != (unsigned char *) isymbuf)
   1549   1.1.1.6  christos 	free (isymbuf);
   1550       1.1     skrll       if (elf_section_data (input_section)->relocs != internal_relocs)
   1551   1.1.1.6  christos 	free (internal_relocs);
   1552       1.1     skrll     }
   1553       1.1     skrll 
   1554       1.1     skrll   return data;
   1555       1.1     skrll 
   1556       1.1     skrll  error_return:
   1557   1.1.1.9  christos   free (sections);
   1558   1.1.1.9  christos   if (symtab_hdr->contents != (unsigned char *) isymbuf)
   1559       1.1     skrll     free (isymbuf);
   1560   1.1.1.9  christos   if (elf_section_data (input_section)->relocs != internal_relocs)
   1561       1.1     skrll     free (internal_relocs);
   1562  1.1.1.10  christos   if (orig_data == NULL)
   1563  1.1.1.10  christos     free (data);
   1564       1.1     skrll   return NULL;
   1565       1.1     skrll }
   1566       1.1     skrll 
   1567   1.1.1.2  christos /* Assorted hash table functions.  */
   1568   1.1.1.2  christos 
   1569   1.1.1.2  christos /* Initialize an entry in the link hash table.  */
   1570   1.1.1.2  christos 
   1571   1.1.1.2  christos /* Create an entry in an CR16 ELF linker hash table.  */
   1572   1.1.1.2  christos 
   1573   1.1.1.2  christos static struct bfd_hash_entry *
   1574   1.1.1.2  christos elf32_cr16_link_hash_newfunc (struct bfd_hash_entry *entry,
   1575   1.1.1.6  christos 			      struct bfd_hash_table *table,
   1576   1.1.1.6  christos 			      const char *string)
   1577   1.1.1.2  christos {
   1578   1.1.1.2  christos   struct elf32_cr16_link_hash_entry *ret =
   1579   1.1.1.2  christos     (struct elf32_cr16_link_hash_entry *) entry;
   1580   1.1.1.2  christos 
   1581   1.1.1.2  christos   /* Allocate the structure if it has not already been allocated by a
   1582   1.1.1.2  christos      subclass.  */
   1583   1.1.1.2  christos   if (ret == (struct elf32_cr16_link_hash_entry *) NULL)
   1584   1.1.1.2  christos     ret = ((struct elf32_cr16_link_hash_entry *)
   1585   1.1.1.6  christos 	   bfd_hash_allocate (table,
   1586   1.1.1.6  christos 			      sizeof (struct elf32_cr16_link_hash_entry)));
   1587   1.1.1.2  christos   if (ret == (struct elf32_cr16_link_hash_entry *) NULL)
   1588   1.1.1.2  christos     return (struct bfd_hash_entry *) ret;
   1589   1.1.1.2  christos 
   1590   1.1.1.2  christos   /* Call the allocation method of the superclass.  */
   1591   1.1.1.2  christos   ret = ((struct elf32_cr16_link_hash_entry *)
   1592   1.1.1.6  christos 	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
   1593   1.1.1.6  christos 				     table, string));
   1594   1.1.1.2  christos   if (ret != (struct elf32_cr16_link_hash_entry *) NULL)
   1595   1.1.1.2  christos     {
   1596   1.1.1.2  christos       ret->direct_calls = 0;
   1597   1.1.1.2  christos       ret->stack_size = 0;
   1598   1.1.1.2  christos       ret->movm_args = 0;
   1599   1.1.1.2  christos       ret->movm_stack_size = 0;
   1600   1.1.1.2  christos       ret->flags = 0;
   1601   1.1.1.2  christos       ret->value = 0;
   1602   1.1.1.2  christos     }
   1603   1.1.1.2  christos 
   1604   1.1.1.2  christos   return (struct bfd_hash_entry *) ret;
   1605   1.1.1.2  christos }
   1606   1.1.1.2  christos 
   1607   1.1.1.2  christos /* Create an cr16 ELF linker hash table.  */
   1608   1.1.1.2  christos 
   1609   1.1.1.2  christos static struct bfd_link_hash_table *
   1610   1.1.1.2  christos elf32_cr16_link_hash_table_create (bfd *abfd)
   1611   1.1.1.2  christos {
   1612   1.1.1.2  christos   struct elf_link_hash_table *ret;
   1613   1.1.1.9  christos   size_t amt = sizeof (struct elf_link_hash_table);
   1614   1.1.1.2  christos 
   1615   1.1.1.4  christos   ret = (struct elf_link_hash_table *) bfd_zmalloc (amt);
   1616   1.1.1.2  christos   if (ret == (struct elf_link_hash_table *) NULL)
   1617   1.1.1.2  christos     return NULL;
   1618   1.1.1.2  christos 
   1619   1.1.1.2  christos   if (!_bfd_elf_link_hash_table_init (ret, abfd,
   1620   1.1.1.6  christos 				      elf32_cr16_link_hash_newfunc,
   1621  1.1.1.11  christos 				      sizeof (struct elf32_cr16_link_hash_entry)))
   1622   1.1.1.2  christos     {
   1623   1.1.1.2  christos       free (ret);
   1624   1.1.1.2  christos       return NULL;
   1625   1.1.1.2  christos     }
   1626   1.1.1.2  christos 
   1627   1.1.1.2  christos   return &ret->root;
   1628   1.1.1.2  christos }
   1629   1.1.1.2  christos 
   1630   1.1.1.2  christos static unsigned long
   1631   1.1.1.2  christos elf_cr16_mach (flagword flags)
   1632   1.1.1.2  christos {
   1633   1.1.1.2  christos   switch (flags)
   1634   1.1.1.2  christos     {
   1635   1.1.1.9  christos     case EM_CR16:
   1636   1.1.1.9  christos     default:
   1637   1.1.1.2  christos       return bfd_mach_cr16;
   1638   1.1.1.2  christos     }
   1639   1.1.1.2  christos }
   1640   1.1.1.2  christos 
   1641   1.1.1.2  christos /* The final processing done just before writing out a CR16 ELF object
   1642   1.1.1.2  christos    file.  This gets the CR16 architecture right based on the machine
   1643   1.1.1.2  christos    number.  */
   1644   1.1.1.2  christos 
   1645   1.1.1.9  christos static bool
   1646   1.1.1.8  christos _bfd_cr16_elf_final_write_processing (bfd *abfd)
   1647   1.1.1.2  christos {
   1648   1.1.1.2  christos   unsigned long val;
   1649   1.1.1.2  christos   switch (bfd_get_mach (abfd))
   1650   1.1.1.2  christos     {
   1651   1.1.1.9  christos     default:
   1652   1.1.1.9  christos     case bfd_mach_cr16:
   1653   1.1.1.9  christos       val = EM_CR16;
   1654   1.1.1.9  christos       break;
   1655   1.1.1.2  christos     }
   1656   1.1.1.8  christos   elf_elfheader (abfd)->e_flags |= val;
   1657   1.1.1.8  christos   return _bfd_elf_final_write_processing (abfd);
   1658   1.1.1.2  christos }
   1659   1.1.1.2  christos 
   1660   1.1.1.2  christos 
   1661   1.1.1.9  christos static bool
   1662   1.1.1.2  christos _bfd_cr16_elf_object_p (bfd *abfd)
   1663   1.1.1.2  christos {
   1664   1.1.1.2  christos   bfd_default_set_arch_mach (abfd, bfd_arch_cr16,
   1665   1.1.1.6  christos 			     elf_cr16_mach (elf_elfheader (abfd)->e_flags));
   1666   1.1.1.9  christos   return true;
   1667   1.1.1.2  christos }
   1668   1.1.1.2  christos 
   1669   1.1.1.2  christos /* Merge backend specific data from an object file to the output
   1670   1.1.1.2  christos    object file when linking.  */
   1671   1.1.1.2  christos 
   1672   1.1.1.9  christos static bool
   1673   1.1.1.6  christos _bfd_cr16_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   1674   1.1.1.2  christos {
   1675   1.1.1.6  christos   bfd *obfd = info->output_bfd;
   1676   1.1.1.6  christos 
   1677  1.1.1.12  christos   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
   1678   1.1.1.9  christos     return true;
   1679   1.1.1.2  christos 
   1680   1.1.1.2  christos   if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
   1681   1.1.1.2  christos       && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
   1682   1.1.1.2  christos     {
   1683   1.1.1.2  christos       if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
   1684   1.1.1.6  christos 			       bfd_get_mach (ibfd)))
   1685   1.1.1.9  christos 	return false;
   1686   1.1.1.9  christos     }
   1687   1.1.1.2  christos 
   1688   1.1.1.9  christos   return true;
   1689   1.1.1.2  christos }
   1690   1.1.1.2  christos 
   1691   1.1.1.2  christos 
   1692       1.1     skrll /* This function handles relaxing for the CR16.
   1693       1.1     skrll 
   1694       1.1     skrll    There's quite a few relaxing opportunites available on the CR16:
   1695       1.1     skrll 
   1696   1.1.1.6  christos 	* bcond:24 -> bcond:16				      1 byte
   1697   1.1.1.6  christos 	* bcond:16 -> bcond:8				      1 byte
   1698   1.1.1.6  christos 	* arithmetic imm32 -> arithmetic imm20		      12 bits
   1699   1.1.1.6  christos 	* arithmetic imm20/imm16 -> arithmetic imm4	      12/16 bits
   1700       1.1     skrll 
   1701       1.1     skrll    Symbol- and reloc-reading infrastructure copied from elf-m10200.c.  */
   1702       1.1     skrll 
   1703   1.1.1.9  christos static bool
   1704       1.1     skrll elf32_cr16_relax_section (bfd *abfd, asection *sec,
   1705   1.1.1.9  christos 			  struct bfd_link_info *link_info, bool *again)
   1706       1.1     skrll {
   1707       1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   1708       1.1     skrll   Elf_Internal_Rela *internal_relocs;
   1709       1.1     skrll   Elf_Internal_Rela *irel, *irelend;
   1710       1.1     skrll   bfd_byte *contents = NULL;
   1711       1.1     skrll   Elf_Internal_Sym *isymbuf = NULL;
   1712       1.1     skrll 
   1713       1.1     skrll   /* Assume nothing changes.  */
   1714   1.1.1.9  christos   *again = false;
   1715       1.1     skrll 
   1716       1.1     skrll   /* We don't have to do anything for a relocatable link, if
   1717       1.1     skrll      this section does not have relocs, or if this is not a
   1718       1.1     skrll      code section.  */
   1719   1.1.1.4  christos   if (bfd_link_relocatable (link_info)
   1720       1.1     skrll       || sec->reloc_count == 0
   1721  1.1.1.10  christos       || (sec->flags & SEC_RELOC) == 0
   1722  1.1.1.10  christos       || (sec->flags & SEC_HAS_CONTENTS) == 0
   1723       1.1     skrll       || (sec->flags & SEC_CODE) == 0)
   1724   1.1.1.9  christos     return true;
   1725       1.1     skrll 
   1726       1.1     skrll   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1727       1.1     skrll 
   1728       1.1     skrll   /* Get a copy of the native relocations.  */
   1729       1.1     skrll   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
   1730   1.1.1.6  christos 					       link_info->keep_memory);
   1731       1.1     skrll   if (internal_relocs == NULL)
   1732       1.1     skrll     goto error_return;
   1733       1.1     skrll 
   1734       1.1     skrll   /* Walk through them looking for relaxing opportunities.  */
   1735       1.1     skrll   irelend = internal_relocs + sec->reloc_count;
   1736       1.1     skrll   for (irel = internal_relocs; irel < irelend; irel++)
   1737       1.1     skrll     {
   1738       1.1     skrll       bfd_vma symval;
   1739       1.1     skrll 
   1740       1.1     skrll       /* If this isn't something that can be relaxed, then ignore
   1741   1.1.1.6  christos 	 this reloc.  */
   1742       1.1     skrll       if (ELF32_R_TYPE (irel->r_info) != (int) R_CR16_DISP16
   1743   1.1.1.6  christos 	  && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_DISP24
   1744   1.1.1.6  christos 	  && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM32
   1745   1.1.1.6  christos 	  && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM20
   1746   1.1.1.6  christos 	  && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM16)
   1747   1.1.1.6  christos 	continue;
   1748       1.1     skrll 
   1749       1.1     skrll       /* Get the section contents if we haven't done so already.  */
   1750       1.1     skrll       if (contents == NULL)
   1751   1.1.1.6  christos 	{
   1752   1.1.1.6  christos 	  /* Get cached copy if it exists.  */
   1753   1.1.1.6  christos 	  if (elf_section_data (sec)->this_hdr.contents != NULL)
   1754   1.1.1.6  christos 	    contents = elf_section_data (sec)->this_hdr.contents;
   1755   1.1.1.6  christos 	  /* Go get them off disk.  */
   1756   1.1.1.6  christos 	  else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
   1757   1.1.1.6  christos 	    goto error_return;
   1758   1.1.1.6  christos 	}
   1759       1.1     skrll 
   1760       1.1     skrll       /* Read this BFD's local symbols if we haven't done so already.  */
   1761       1.1     skrll       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
   1762   1.1.1.6  christos 	{
   1763   1.1.1.6  christos 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   1764   1.1.1.6  christos 	  if (isymbuf == NULL)
   1765   1.1.1.6  christos 	    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
   1766   1.1.1.6  christos 					    symtab_hdr->sh_info, 0,
   1767   1.1.1.6  christos 					    NULL, NULL, NULL);
   1768   1.1.1.6  christos 	  if (isymbuf == NULL)
   1769   1.1.1.6  christos 	    goto error_return;
   1770   1.1.1.6  christos 	}
   1771       1.1     skrll 
   1772       1.1     skrll       /* Get the value of the symbol referred to by the reloc.  */
   1773       1.1     skrll       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
   1774   1.1.1.6  christos 	{
   1775   1.1.1.6  christos 	  /* A local symbol.  */
   1776   1.1.1.6  christos 	  Elf_Internal_Sym *isym;
   1777   1.1.1.6  christos 	  asection *sym_sec;
   1778   1.1.1.6  christos 
   1779   1.1.1.6  christos 	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
   1780   1.1.1.6  christos 	  if (isym->st_shndx == SHN_UNDEF)
   1781   1.1.1.6  christos 	    sym_sec = bfd_und_section_ptr;
   1782   1.1.1.6  christos 	  else if (isym->st_shndx == SHN_ABS)
   1783   1.1.1.6  christos 	    sym_sec = bfd_abs_section_ptr;
   1784   1.1.1.6  christos 	  else if (isym->st_shndx == SHN_COMMON)
   1785   1.1.1.6  christos 	    sym_sec = bfd_com_section_ptr;
   1786   1.1.1.6  christos 	  else
   1787   1.1.1.6  christos 	    sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
   1788   1.1.1.6  christos 	  symval = (isym->st_value
   1789   1.1.1.6  christos 		    + sym_sec->output_section->vma
   1790   1.1.1.6  christos 		    + sym_sec->output_offset);
   1791   1.1.1.6  christos 	}
   1792       1.1     skrll       else
   1793   1.1.1.6  christos 	{
   1794   1.1.1.6  christos 	  unsigned long indx;
   1795   1.1.1.6  christos 	  struct elf_link_hash_entry *h;
   1796   1.1.1.6  christos 
   1797   1.1.1.6  christos 	  /* An external symbol.  */
   1798   1.1.1.6  christos 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
   1799   1.1.1.6  christos 	  h = elf_sym_hashes (abfd)[indx];
   1800   1.1.1.6  christos 	  BFD_ASSERT (h != NULL);
   1801   1.1.1.6  christos 
   1802   1.1.1.6  christos 	  if (h->root.type != bfd_link_hash_defined
   1803   1.1.1.6  christos 	      && h->root.type != bfd_link_hash_defweak)
   1804   1.1.1.6  christos 	    /* This appears to be a reference to an undefined
   1805   1.1.1.6  christos 	       symbol.  Just ignore it--it will be caught by the
   1806   1.1.1.6  christos 	       regular reloc processing.  */
   1807   1.1.1.6  christos 	    continue;
   1808   1.1.1.6  christos 
   1809   1.1.1.6  christos 	  symval = (h->root.u.def.value
   1810   1.1.1.6  christos 		    + h->root.u.def.section->output_section->vma
   1811   1.1.1.6  christos 		    + h->root.u.def.section->output_offset);
   1812   1.1.1.6  christos 	}
   1813       1.1     skrll 
   1814       1.1     skrll       /* For simplicity of coding, we are going to modify the section
   1815   1.1.1.6  christos 	 contents, the section relocs, and the BFD symbol table.  We
   1816   1.1.1.6  christos 	 must tell the rest of the code not to free up this
   1817   1.1.1.6  christos 	 information.  It would be possible to instead create a table
   1818   1.1.1.6  christos 	 of changes which have to be made, as is done in coff-mips.c;
   1819   1.1.1.6  christos 	 that would be more work, but would require less memory when
   1820   1.1.1.6  christos 	 the linker is run.  */
   1821       1.1     skrll 
   1822       1.1     skrll       /* Try to turn a 24  branch/call into a 16bit relative
   1823   1.1.1.6  christos 	 branch/call.  */
   1824       1.1     skrll       if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_DISP24)
   1825   1.1.1.6  christos 	{
   1826   1.1.1.6  christos 	  bfd_vma value = symval;
   1827       1.1     skrll 
   1828   1.1.1.6  christos 	  /* Deal with pc-relative gunk.  */
   1829   1.1.1.6  christos 	  value -= (sec->output_section->vma + sec->output_offset);
   1830   1.1.1.6  christos 	  value -= irel->r_offset;
   1831   1.1.1.6  christos 	  value += irel->r_addend;
   1832   1.1.1.6  christos 
   1833   1.1.1.6  christos 	  /* See if the value will fit in 16 bits, note the high value is
   1834   1.1.1.6  christos 	     0xfffe + 2 as the target will be two bytes closer if we are
   1835   1.1.1.6  christos 	     able to relax.  */
   1836   1.1.1.6  christos 	  if ((long) value < 0x10000 && (long) value > -0x10002)
   1837   1.1.1.6  christos 	    {
   1838   1.1.1.6  christos 	      unsigned int code;
   1839   1.1.1.6  christos 
   1840   1.1.1.6  christos 	      /* Get the opcode.  */
   1841   1.1.1.9  christos 	      code = (unsigned int) bfd_get_32 (abfd,
   1842   1.1.1.9  christos 						contents + irel->r_offset);
   1843   1.1.1.6  christos 
   1844   1.1.1.6  christos 	      /* Verify it's a 'bcond' and fix the opcode.  */
   1845   1.1.1.6  christos 	      if ((code  & 0xffff) == 0x0010)
   1846   1.1.1.9  christos 		bfd_put_16 (abfd, 0x1800 | ((0xf & (code >> 20)) << 4),
   1847   1.1.1.9  christos 			    contents + irel->r_offset);
   1848   1.1.1.6  christos 	      else
   1849   1.1.1.6  christos 		continue;
   1850   1.1.1.6  christos 
   1851   1.1.1.6  christos 	      /* Note that we've changed the relocs, section contents, etc.  */
   1852   1.1.1.6  christos 	      elf_section_data (sec)->relocs = internal_relocs;
   1853   1.1.1.6  christos 	      elf_section_data (sec)->this_hdr.contents = contents;
   1854   1.1.1.6  christos 	      symtab_hdr->contents = (unsigned char *) isymbuf;
   1855   1.1.1.6  christos 
   1856   1.1.1.6  christos 	      /* Fix the relocation's type.  */
   1857   1.1.1.6  christos 	      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   1858   1.1.1.6  christos 					   R_CR16_DISP16);
   1859   1.1.1.6  christos 
   1860   1.1.1.6  christos 	      /* Delete two bytes of data.  */
   1861   1.1.1.6  christos 	      if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
   1862   1.1.1.9  christos 						  irel->r_offset + 2, 2))
   1863   1.1.1.6  christos 		goto error_return;
   1864   1.1.1.6  christos 
   1865   1.1.1.6  christos 	      /* That will change things, so, we should relax again.
   1866   1.1.1.6  christos 		 Note that this is not required, and it may be slow.  */
   1867   1.1.1.9  christos 	      *again = true;
   1868   1.1.1.6  christos 	    }
   1869   1.1.1.6  christos 	}
   1870       1.1     skrll 
   1871   1.1.1.2  christos       /* Try to turn a 16bit pc-relative branch into an
   1872   1.1.1.6  christos 	 8bit pc-relative branch.  */
   1873       1.1     skrll       if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_DISP16)
   1874   1.1.1.6  christos 	{
   1875   1.1.1.6  christos 	  bfd_vma value = symval;
   1876       1.1     skrll 
   1877   1.1.1.6  christos 	  /* Deal with pc-relative gunk.  */
   1878   1.1.1.6  christos 	  value -= (sec->output_section->vma + sec->output_offset);
   1879   1.1.1.6  christos 	  value -= irel->r_offset;
   1880   1.1.1.6  christos 	  value += irel->r_addend;
   1881   1.1.1.6  christos 
   1882   1.1.1.6  christos 	  /* See if the value will fit in 8 bits, note the high value is
   1883   1.1.1.6  christos 	     0xfc + 2 as the target will be two bytes closer if we are
   1884   1.1.1.6  christos 	     able to relax.  */
   1885   1.1.1.6  christos 	  /*if ((long) value < 0x1fa && (long) value > -0x100) REVISIT:range */
   1886   1.1.1.6  christos 	  if ((long) value < 0xfa && (long) value > -0x100)
   1887   1.1.1.6  christos 	    {
   1888   1.1.1.6  christos 	      unsigned short code;
   1889   1.1.1.6  christos 
   1890   1.1.1.6  christos 	      /* Get the opcode.  */
   1891   1.1.1.9  christos 	      code = bfd_get_16 (abfd, contents + irel->r_offset);
   1892   1.1.1.6  christos 
   1893   1.1.1.6  christos 	      /* Verify it's a 'bcond' and fix the opcode.  */
   1894   1.1.1.6  christos 	      if ((code & 0xff0f) == 0x1800)
   1895   1.1.1.6  christos 		bfd_put_16 (abfd, (code & 0xf0f0), contents + irel->r_offset);
   1896   1.1.1.6  christos 	      else
   1897   1.1.1.6  christos 		continue;
   1898   1.1.1.6  christos 
   1899   1.1.1.6  christos 	      /* Note that we've changed the relocs, section contents, etc.  */
   1900   1.1.1.6  christos 	      elf_section_data (sec)->relocs = internal_relocs;
   1901   1.1.1.6  christos 	      elf_section_data (sec)->this_hdr.contents = contents;
   1902   1.1.1.6  christos 	      symtab_hdr->contents = (unsigned char *) isymbuf;
   1903   1.1.1.6  christos 
   1904   1.1.1.6  christos 	      /* Fix the relocation's type.  */
   1905   1.1.1.6  christos 	      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   1906   1.1.1.6  christos 					   R_CR16_DISP8);
   1907   1.1.1.6  christos 
   1908   1.1.1.6  christos 	      /* Delete two bytes of data.  */
   1909   1.1.1.6  christos 	      if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
   1910   1.1.1.9  christos 						  irel->r_offset + 2, 2))
   1911   1.1.1.6  christos 		goto error_return;
   1912   1.1.1.6  christos 
   1913   1.1.1.6  christos 	      /* That will change things, so, we should relax again.
   1914   1.1.1.6  christos 		 Note that this is not required, and it may be slow.  */
   1915   1.1.1.9  christos 	      *again = true;
   1916   1.1.1.6  christos 	    }
   1917   1.1.1.6  christos 	}
   1918       1.1     skrll 
   1919   1.1.1.2  christos       /* Try to turn a 32-bit IMM address into a 20/16-bit IMM address */
   1920       1.1     skrll       if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM32)
   1921   1.1.1.6  christos 	{
   1922   1.1.1.6  christos 	  bfd_vma value = symval;
   1923   1.1.1.6  christos 	  unsigned short is_add_mov = 0;
   1924   1.1.1.6  christos 	  bfd_vma value1 = 0;
   1925   1.1.1.6  christos 
   1926   1.1.1.6  christos 	  /* Get the existing value from the mcode */
   1927   1.1.1.9  christos 	  value1 = bfd_get_32 (abfd, contents + irel->r_offset + 2);
   1928   1.1.1.9  christos 	  value1 = (value1 >> 16) | ((value1 & 0xffff) << 16);
   1929   1.1.1.6  christos 
   1930   1.1.1.6  christos 	  /* See if the value will fit in 20 bits.  */
   1931   1.1.1.6  christos 	  if ((long) (value + value1) < 0xfffff && (long) (value + value1) > 0)
   1932   1.1.1.6  christos 	    {
   1933   1.1.1.6  christos 	      unsigned short code;
   1934   1.1.1.6  christos 
   1935   1.1.1.6  christos 	      /* Get the opcode.  */
   1936   1.1.1.9  christos 	      code = bfd_get_16 (abfd, contents + irel->r_offset);
   1937   1.1.1.6  christos 
   1938   1.1.1.6  christos 	      /* Verify it's a 'arithmetic ADDD or MOVD instruction'.
   1939   1.1.1.6  christos 		 For ADDD and MOVD only, convert to IMM32 -> IMM20.  */
   1940   1.1.1.6  christos 
   1941   1.1.1.6  christos 	      if (((code & 0xfff0) == 0x0070) || ((code & 0xfff0) == 0x0020))
   1942   1.1.1.9  christos 		is_add_mov = 1;
   1943   1.1.1.6  christos 
   1944   1.1.1.6  christos 	      if (is_add_mov)
   1945   1.1.1.6  christos 		{
   1946   1.1.1.6  christos 		  /* Note that we've changed the relocs, section contents,
   1947   1.1.1.6  christos 		     etc.  */
   1948   1.1.1.6  christos 		  elf_section_data (sec)->relocs = internal_relocs;
   1949   1.1.1.6  christos 		  elf_section_data (sec)->this_hdr.contents = contents;
   1950   1.1.1.6  christos 		  symtab_hdr->contents = (unsigned char *) isymbuf;
   1951   1.1.1.6  christos 
   1952   1.1.1.6  christos 		  /* Fix the opcode.  */
   1953   1.1.1.6  christos 		  if ((code & 0xfff0) == 0x0070) /* For movd.  */
   1954   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x05, contents + irel->r_offset + 1);
   1955   1.1.1.6  christos 		  else				 /* code == 0x0020 for addd.  */
   1956   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x04, contents + irel->r_offset + 1);
   1957   1.1.1.6  christos 
   1958   1.1.1.6  christos 		  bfd_put_8 (abfd, (code & 0xf) << 4, contents + irel->r_offset);
   1959   1.1.1.6  christos 
   1960   1.1.1.6  christos 		  /* If existing value is nagavive adjust approriately
   1961   1.1.1.6  christos 		     place the 16-20bits (ie 4 bit) in new opcode,
   1962   1.1.1.6  christos 		     as the 0xffffxxxx, the higher 2 byte values removed. */
   1963   1.1.1.6  christos 		  if (value1 & 0x80000000)
   1964   1.1.1.9  christos 		    bfd_put_8 (abfd,
   1965   1.1.1.9  christos 			       (0x0f | (bfd_get_8 (abfd,
   1966   1.1.1.9  christos 						   contents + irel->r_offset))),
   1967   1.1.1.9  christos 			       contents + irel->r_offset);
   1968   1.1.1.6  christos 		  else
   1969   1.1.1.9  christos 		    bfd_put_8 (abfd,
   1970   1.1.1.9  christos 			       (((value1 >> 16) & 0xf)
   1971   1.1.1.9  christos 				| (bfd_get_8 (abfd,
   1972   1.1.1.9  christos 					      contents + irel->r_offset))),
   1973   1.1.1.9  christos 			       contents + irel->r_offset);
   1974   1.1.1.6  christos 
   1975   1.1.1.6  christos 		  /* Fix the relocation's type.  */
   1976   1.1.1.6  christos 		  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   1977   1.1.1.6  christos 					       R_CR16_IMM20);
   1978   1.1.1.6  christos 
   1979   1.1.1.6  christos 		  /* Delete two bytes of data.  */
   1980   1.1.1.6  christos 		  if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
   1981   1.1.1.6  christos 						      irel->r_offset + 2, 2))
   1982   1.1.1.6  christos 		    goto error_return;
   1983   1.1.1.6  christos 
   1984   1.1.1.6  christos 		  /* That will change things, so, we should relax again.
   1985   1.1.1.6  christos 		     Note that this is not required, and it may be slow.  */
   1986   1.1.1.9  christos 		  *again = true;
   1987   1.1.1.6  christos 		}
   1988   1.1.1.6  christos 	    }
   1989   1.1.1.6  christos 
   1990   1.1.1.6  christos 	  /* See if the value will fit in 16 bits.  */
   1991   1.1.1.6  christos 	  if ((!is_add_mov)
   1992   1.1.1.6  christos 	      && ((long)(value + value1) < 0x7fff && (long)(value + value1) > 0))
   1993   1.1.1.6  christos 	    {
   1994   1.1.1.6  christos 	      unsigned short code;
   1995   1.1.1.6  christos 
   1996   1.1.1.6  christos 	      /* Get the opcode.  */
   1997   1.1.1.9  christos 	      code = bfd_get_16 (abfd, contents + irel->r_offset);
   1998   1.1.1.6  christos 
   1999   1.1.1.6  christos 	      /* Note that we've changed the relocs, section contents, etc.  */
   2000   1.1.1.6  christos 	      elf_section_data (sec)->relocs = internal_relocs;
   2001   1.1.1.6  christos 	      elf_section_data (sec)->this_hdr.contents = contents;
   2002   1.1.1.6  christos 	      symtab_hdr->contents = (unsigned char *) isymbuf;
   2003   1.1.1.6  christos 
   2004   1.1.1.6  christos 	      /* Fix the opcode.  */
   2005   1.1.1.6  christos 	      if ((code & 0xf0) == 0x70)	  /* For movd.  */
   2006   1.1.1.6  christos 		bfd_put_8 (abfd, 0x54, contents + irel->r_offset + 1);
   2007   1.1.1.6  christos 	      else if ((code & 0xf0) == 0x20)	  /* For addd.  */
   2008   1.1.1.6  christos 		bfd_put_8 (abfd, 0x60, contents + irel->r_offset + 1);
   2009   1.1.1.6  christos 	      else if ((code & 0xf0) == 0x90)	  /* For cmpd.  */
   2010   1.1.1.6  christos 		bfd_put_8 (abfd, 0x56, contents + irel->r_offset + 1);
   2011   1.1.1.6  christos 	      else
   2012   1.1.1.6  christos 		continue;
   2013   1.1.1.6  christos 
   2014   1.1.1.6  christos 	      bfd_put_8 (abfd, 0xb0 | (code & 0xf), contents + irel->r_offset);
   2015   1.1.1.6  christos 
   2016   1.1.1.6  christos 	      /* If existing value is nagavive adjust approriately
   2017   1.1.1.6  christos 		 place the 12-16bits (ie 4 bit) in new opcode,
   2018   1.1.1.6  christos 		 as the 0xfffffxxx, the higher 2 byte values removed. */
   2019   1.1.1.6  christos 	      if (value1 & 0x80000000)
   2020   1.1.1.9  christos 		bfd_put_8 (abfd,
   2021   1.1.1.9  christos 			   (0x0f | (bfd_get_8 (abfd,
   2022   1.1.1.9  christos 					       contents + irel->r_offset))),
   2023   1.1.1.9  christos 			   contents + irel->r_offset);
   2024   1.1.1.6  christos 	      else
   2025   1.1.1.6  christos 		bfd_put_16 (abfd, value1, contents + irel->r_offset + 2);
   2026   1.1.1.6  christos 
   2027   1.1.1.6  christos 
   2028   1.1.1.6  christos 	      /* Fix the relocation's type.  */
   2029   1.1.1.6  christos 	      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   2030   1.1.1.6  christos 					   R_CR16_IMM16);
   2031   1.1.1.6  christos 
   2032   1.1.1.6  christos 	      /* Delete two bytes of data.  */
   2033   1.1.1.6  christos 	      if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
   2034   1.1.1.6  christos 						  irel->r_offset + 2, 2))
   2035   1.1.1.6  christos 		goto error_return;
   2036   1.1.1.6  christos 
   2037   1.1.1.6  christos 	      /* That will change things, so, we should relax again.
   2038   1.1.1.6  christos 		 Note that this is not required, and it may be slow.  */
   2039   1.1.1.9  christos 	      *again = true;
   2040   1.1.1.6  christos 	    }
   2041   1.1.1.6  christos 	}
   2042       1.1     skrll 
   2043   1.1.1.2  christos #if 0
   2044   1.1.1.2  christos       /* Try to turn a 16bit immediate address into a 4bit
   2045   1.1.1.6  christos 	 immediate address.  */
   2046   1.1.1.4  christos       if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20)
   2047   1.1.1.6  christos 	  || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM16))
   2048   1.1.1.6  christos 	{
   2049   1.1.1.6  christos 	  bfd_vma value = symval;
   2050   1.1.1.6  christos 	  bfd_vma value1 = 0;
   2051   1.1.1.6  christos 
   2052   1.1.1.6  christos 	  /* Get the existing value from the mcode */
   2053   1.1.1.6  christos 	  value1 = ((bfd_get_16 (abfd, contents + irel->r_offset + 2) & 0xffff));
   2054   1.1.1.6  christos 
   2055   1.1.1.6  christos 	  if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20)
   2056   1.1.1.6  christos 	    {
   2057   1.1.1.9  christos 	      value1 |= ((bfd_get_16 (abfd, contents + irel->r_offset + 1)
   2058   1.1.1.9  christos 			  & 0xf000) << 0x4);
   2059   1.1.1.6  christos 	    }
   2060   1.1.1.6  christos 
   2061   1.1.1.6  christos 	  /* See if the value will fit in 4 bits.  */
   2062   1.1.1.6  christos 	  if ((((long) (value + value1)) < 0xf)
   2063   1.1.1.6  christos 	      && (((long) (value + value1)) > 0))
   2064   1.1.1.6  christos 	    {
   2065   1.1.1.6  christos 	      unsigned short code;
   2066   1.1.1.6  christos 
   2067   1.1.1.6  christos 	      /* Get the opcode.  */
   2068   1.1.1.9  christos 	      code = bfd_get_16 (abfd, contents + irel->r_offset);
   2069   1.1.1.6  christos 
   2070   1.1.1.6  christos 	      /* Note that we've changed the relocs, section contents, etc.  */
   2071   1.1.1.6  christos 	      elf_section_data (sec)->relocs = internal_relocs;
   2072   1.1.1.6  christos 	      elf_section_data (sec)->this_hdr.contents = contents;
   2073   1.1.1.6  christos 	      symtab_hdr->contents = (unsigned char *) isymbuf;
   2074   1.1.1.6  christos 
   2075   1.1.1.6  christos 	      /* Fix the opcode.  */
   2076   1.1.1.6  christos 	      if (((code & 0x0f00) == 0x0400) || ((code & 0x0f00) == 0x0500))
   2077   1.1.1.6  christos 		{
   2078   1.1.1.6  christos 		  if ((code & 0x0f00) == 0x0400)      /* For movd imm20.  */
   2079   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x60, contents + irel->r_offset);
   2080   1.1.1.6  christos 		  else				      /* For addd imm20.  */
   2081   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x54, contents + irel->r_offset);
   2082   1.1.1.9  christos 		  bfd_put_8 (abfd, (code & 0xf0) >> 4,
   2083   1.1.1.9  christos 			     contents + irel->r_offset + 1);
   2084   1.1.1.6  christos 		}
   2085   1.1.1.6  christos 	      else
   2086   1.1.1.6  christos 		{
   2087   1.1.1.6  christos 		  if ((code & 0xfff0) == 0x56b0)       /*  For cmpd imm16.  */
   2088   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x56, contents + irel->r_offset);
   2089   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x54b0)  /*  For movd imm16.  */
   2090   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x54, contents + irel->r_offset);
   2091   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x58b0)  /*  For movb imm16.  */
   2092   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x58, contents + irel->r_offset);
   2093   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x5Ab0)  /*  For movw imm16.  */
   2094   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x5A, contents + irel->r_offset);
   2095   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x60b0)  /*  For addd imm16.  */
   2096   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x60, contents + irel->r_offset);
   2097   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x30b0)  /*  For addb imm16.  */
   2098   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x30, contents + irel->r_offset);
   2099   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x2Cb0)  /*  For addub imm16.  */
   2100   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x2C, contents + irel->r_offset);
   2101   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x32b0)  /*  For adduw imm16.  */
   2102   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x32, contents + irel->r_offset);
   2103   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x38b0)  /*  For subb imm16.  */
   2104   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x38, contents + irel->r_offset);
   2105   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x3Cb0)  /*  For subcb imm16.  */
   2106   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x3C, contents + irel->r_offset);
   2107   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x3Fb0)  /*  For subcw imm16.  */
   2108   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x3F, contents + irel->r_offset);
   2109   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x3Ab0)  /*  For subw imm16.  */
   2110   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x3A, contents + irel->r_offset);
   2111   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x50b0)  /*  For cmpb imm16.  */
   2112   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x50, contents + irel->r_offset);
   2113   1.1.1.6  christos 		  else if ((code & 0xfff0) == 0x52b0)  /*  For cmpw imm16.  */
   2114   1.1.1.6  christos 		    bfd_put_8 (abfd, 0x52, contents + irel->r_offset);
   2115   1.1.1.6  christos 		  else
   2116   1.1.1.6  christos 		    continue;
   2117   1.1.1.6  christos 
   2118   1.1.1.6  christos 		  bfd_put_8 (abfd, (code & 0xf), contents + irel->r_offset + 1);
   2119   1.1.1.6  christos 		}
   2120   1.1.1.6  christos 
   2121   1.1.1.6  christos 	      /* Fix the relocation's type.  */
   2122   1.1.1.6  christos 	      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   2123   1.1.1.6  christos 					   R_CR16_IMM4);
   2124   1.1.1.6  christos 
   2125   1.1.1.6  christos 	      /* Delete two bytes of data.  */
   2126   1.1.1.6  christos 	      if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
   2127   1.1.1.6  christos 						  irel->r_offset + 2, 2))
   2128   1.1.1.6  christos 		goto error_return;
   2129   1.1.1.6  christos 
   2130   1.1.1.6  christos 	      /* That will change things, so, we should relax again.
   2131   1.1.1.6  christos 		 Note that this is not required, and it may be slow.  */
   2132   1.1.1.9  christos 	      *again = true;
   2133   1.1.1.6  christos 	    }
   2134   1.1.1.6  christos 	}
   2135   1.1.1.2  christos #endif
   2136       1.1     skrll     }
   2137       1.1     skrll 
   2138       1.1     skrll   if (isymbuf != NULL
   2139       1.1     skrll       && symtab_hdr->contents != (unsigned char *) isymbuf)
   2140       1.1     skrll     {
   2141       1.1     skrll       if (! link_info->keep_memory)
   2142   1.1.1.6  christos 	free (isymbuf);
   2143       1.1     skrll       else
   2144   1.1.1.9  christos 	/* Cache the symbols for elf_link_input_bfd.  */
   2145   1.1.1.9  christos 	symtab_hdr->contents = (unsigned char *) isymbuf;
   2146       1.1     skrll     }
   2147       1.1     skrll 
   2148       1.1     skrll   if (contents != NULL
   2149       1.1     skrll       && elf_section_data (sec)->this_hdr.contents != contents)
   2150       1.1     skrll     {
   2151       1.1     skrll       if (! link_info->keep_memory)
   2152   1.1.1.6  christos 	free (contents);
   2153       1.1     skrll       else
   2154   1.1.1.9  christos 	/* Cache the section contents for elf_link_input_bfd.  */
   2155   1.1.1.9  christos 	elf_section_data (sec)->this_hdr.contents = contents;
   2156   1.1.1.4  christos 
   2157       1.1     skrll     }
   2158       1.1     skrll 
   2159   1.1.1.9  christos   if (elf_section_data (sec)->relocs != internal_relocs)
   2160       1.1     skrll     free (internal_relocs);
   2161       1.1     skrll 
   2162   1.1.1.9  christos   return true;
   2163       1.1     skrll 
   2164       1.1     skrll  error_return:
   2165   1.1.1.9  christos   if (symtab_hdr->contents != (unsigned char *) isymbuf)
   2166       1.1     skrll     free (isymbuf);
   2167   1.1.1.9  christos   if (elf_section_data (sec)->this_hdr.contents != contents)
   2168       1.1     skrll     free (contents);
   2169   1.1.1.9  christos   if (elf_section_data (sec)->relocs != internal_relocs)
   2170       1.1     skrll     free (internal_relocs);
   2171       1.1     skrll 
   2172   1.1.1.9  christos   return false;
   2173       1.1     skrll }
   2174       1.1     skrll 
   2175   1.1.1.2  christos /* Create dynamic sections when linking against a dynamic object.  */
   2176   1.1.1.2  christos 
   2177   1.1.1.9  christos static bool
   2178   1.1.1.2  christos _bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
   2179   1.1.1.2  christos {
   2180   1.1.1.2  christos   flagword   flags;
   2181   1.1.1.2  christos   asection * s;
   2182  1.1.1.12  christos   elf_backend_data * bed = get_elf_backend_data (abfd);
   2183   1.1.1.6  christos   struct elf_link_hash_table *htab = elf_hash_table (info);
   2184   1.1.1.2  christos   int ptralign = 0;
   2185   1.1.1.2  christos 
   2186   1.1.1.2  christos   switch (bed->s->arch_size)
   2187       1.1     skrll     {
   2188   1.1.1.2  christos     case 16:
   2189   1.1.1.2  christos       ptralign = 1;
   2190   1.1.1.2  christos       break;
   2191   1.1.1.2  christos 
   2192   1.1.1.2  christos     case 32:
   2193   1.1.1.2  christos       ptralign = 2;
   2194   1.1.1.2  christos       break;
   2195   1.1.1.2  christos 
   2196   1.1.1.2  christos     default:
   2197   1.1.1.2  christos       bfd_set_error (bfd_error_bad_value);
   2198   1.1.1.9  christos       return false;
   2199   1.1.1.2  christos     }
   2200       1.1     skrll 
   2201   1.1.1.2  christos   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
   2202   1.1.1.2  christos      .rel[a].bss sections.  */
   2203       1.1     skrll 
   2204   1.1.1.2  christos   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
   2205   1.1.1.6  christos 	   | SEC_LINKER_CREATED);
   2206   1.1.1.2  christos 
   2207   1.1.1.3  christos   s = bfd_make_section_anyway_with_flags (abfd,
   2208   1.1.1.3  christos 					  (bed->default_use_rela_p
   2209   1.1.1.3  christos 					   ? ".rela.plt" : ".rel.plt"),
   2210   1.1.1.3  christos 					  flags | SEC_READONLY);
   2211   1.1.1.6  christos   htab->srelplt = s;
   2212   1.1.1.2  christos   if (s == NULL
   2213   1.1.1.8  christos       || !bfd_set_section_alignment (s, ptralign))
   2214   1.1.1.9  christos     return false;
   2215   1.1.1.2  christos 
   2216   1.1.1.2  christos   if (! _bfd_cr16_elf_create_got_section (abfd, info))
   2217   1.1.1.9  christos     return false;
   2218   1.1.1.2  christos 
   2219   1.1.1.2  christos   if (bed->want_dynbss)
   2220   1.1.1.2  christos     {
   2221   1.1.1.2  christos       /* The .dynbss section is a place to put symbols which are defined
   2222   1.1.1.6  christos 	 by dynamic objects, are referenced by regular objects, and are
   2223   1.1.1.6  christos 	 not functions.  We must allocate space for them in the process
   2224   1.1.1.6  christos 	 image and use a R_*_COPY reloc to tell the dynamic linker to
   2225   1.1.1.6  christos 	 initialize them at run time.  The linker script puts the .dynbss
   2226   1.1.1.6  christos 	 section into the .bss section of the final image.  */
   2227   1.1.1.3  christos       s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
   2228   1.1.1.3  christos 					      SEC_ALLOC | SEC_LINKER_CREATED);
   2229   1.1.1.2  christos       if (s == NULL)
   2230   1.1.1.9  christos 	return false;
   2231   1.1.1.2  christos 
   2232   1.1.1.2  christos       /* The .rel[a].bss section holds copy relocs.  This section is not
   2233   1.1.1.6  christos 	 normally needed.  We need to create it here, though, so that the
   2234   1.1.1.6  christos 	 linker will map it to an output section.  We can't just create it
   2235   1.1.1.6  christos 	 only if we need it, because we will not know whether we need it
   2236   1.1.1.6  christos 	 until we have seen all the input files, and the first time the
   2237   1.1.1.6  christos 	 main linker code calls BFD after examining all the input files
   2238   1.1.1.6  christos 	 (size_dynamic_sections) the input sections have already been
   2239   1.1.1.6  christos 	 mapped to the output sections.  If the section turns out not to
   2240   1.1.1.6  christos 	 be needed, we can discard it later.  We will never need this
   2241   1.1.1.6  christos 	 section when generating a shared object, since they do not use
   2242   1.1.1.6  christos 	 copy relocs.  */
   2243   1.1.1.4  christos       if (! bfd_link_executable (info))
   2244   1.1.1.6  christos 	{
   2245   1.1.1.6  christos 	  s = bfd_make_section_anyway_with_flags (abfd,
   2246   1.1.1.3  christos 						  (bed->default_use_rela_p
   2247   1.1.1.3  christos 						   ? ".rela.bss" : ".rel.bss"),
   2248   1.1.1.3  christos 						  flags | SEC_READONLY);
   2249   1.1.1.6  christos 	  if (s == NULL
   2250   1.1.1.8  christos 	      || !bfd_set_section_alignment (s, ptralign))
   2251   1.1.1.9  christos 	    return false;
   2252   1.1.1.6  christos 	}
   2253       1.1     skrll     }
   2254   1.1.1.2  christos 
   2255   1.1.1.9  christos   return true;
   2256       1.1     skrll }
   2257   1.1.1.2  christos 
   2258   1.1.1.2  christos /* Adjust a symbol defined by a dynamic object and referenced by a
   2260   1.1.1.2  christos    regular object.  The current definition is in some section of the
   2261   1.1.1.2  christos    dynamic object, but we're not including those sections.  We have to
   2262   1.1.1.2  christos    change the definition to something the rest of the link can
   2263       1.1     skrll    understand.  */
   2264   1.1.1.9  christos 
   2265   1.1.1.2  christos static bool
   2266   1.1.1.6  christos _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
   2267   1.1.1.2  christos 				     struct elf_link_hash_entry * h)
   2268   1.1.1.2  christos {
   2269   1.1.1.2  christos   bfd * dynobj;
   2270   1.1.1.2  christos   asection * s;
   2271   1.1.1.2  christos 
   2272   1.1.1.2  christos   dynobj = elf_hash_table (info)->dynobj;
   2273   1.1.1.2  christos 
   2274   1.1.1.2  christos   /* Make sure we know what is going on here.  */
   2275   1.1.1.6  christos   BFD_ASSERT (dynobj != NULL
   2276   1.1.1.6  christos 	      && (h->needs_plt
   2277   1.1.1.6  christos 		  || h->is_weakalias
   2278   1.1.1.6  christos 		  || (h->def_dynamic
   2279   1.1.1.6  christos 		      && h->ref_regular
   2280   1.1.1.2  christos 		      && !h->def_regular)));
   2281   1.1.1.2  christos 
   2282   1.1.1.2  christos   /* If this is a function, put it in the procedure linkage table.  We
   2283   1.1.1.2  christos      will fill in the contents of the procedure linkage table later,
   2284   1.1.1.2  christos      when we know the address of the .got section.  */
   2285   1.1.1.2  christos   if (h->type == STT_FUNC
   2286   1.1.1.2  christos       || h->needs_plt)
   2287   1.1.1.4  christos     {
   2288   1.1.1.6  christos       if (! bfd_link_executable (info)
   2289   1.1.1.6  christos 	  && !h->def_dynamic
   2290   1.1.1.6  christos 	  && !h->ref_dynamic)
   2291   1.1.1.6  christos 	{
   2292   1.1.1.6  christos 	  /* This case can occur if we saw a PLT reloc in an input
   2293   1.1.1.6  christos 	     file, but the symbol was never referred to by a dynamic
   2294   1.1.1.6  christos 	     object.  In such a case, we don't actually need to build
   2295   1.1.1.6  christos 	     a procedure linkage table, and we can just do a REL32
   2296   1.1.1.6  christos 	     reloc instead.  */
   2297   1.1.1.9  christos 	  BFD_ASSERT (h->needs_plt);
   2298   1.1.1.6  christos 	  return true;
   2299   1.1.1.2  christos 	}
   2300   1.1.1.2  christos 
   2301   1.1.1.2  christos       /* Make sure this symbol is output as a dynamic symbol.  */
   2302   1.1.1.6  christos       if (h->dynindx == -1)
   2303   1.1.1.6  christos 	{
   2304   1.1.1.9  christos 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2305   1.1.1.6  christos 	    return false;
   2306   1.1.1.2  christos 	}
   2307   1.1.1.2  christos 
   2308   1.1.1.6  christos       /* We also need to make an entry in the .got.plt section, which
   2309   1.1.1.2  christos 	 will be placed in the .got section by the linker script.  */
   2310   1.1.1.6  christos 
   2311   1.1.1.2  christos       s = elf_hash_table (info)->sgotplt;
   2312   1.1.1.2  christos       BFD_ASSERT (s != NULL);
   2313   1.1.1.2  christos       s->size += 4;
   2314   1.1.1.2  christos 
   2315   1.1.1.2  christos       /* We also need to make an entry in the .rela.plt section.  */
   2316   1.1.1.6  christos 
   2317   1.1.1.2  christos       s = elf_hash_table (info)->srelplt;
   2318   1.1.1.2  christos       BFD_ASSERT (s != NULL);
   2319   1.1.1.2  christos       s->size += sizeof (Elf32_External_Rela);
   2320   1.1.1.9  christos 
   2321   1.1.1.2  christos       return true;
   2322   1.1.1.2  christos     }
   2323   1.1.1.2  christos 
   2324   1.1.1.2  christos   /* If this is a weak symbol, and there is a real definition, the
   2325   1.1.1.2  christos      processor independent code will have arranged for us to see the
   2326   1.1.1.6  christos      real definition first, and we can just use the same value.  */
   2327   1.1.1.2  christos   if (h->is_weakalias)
   2328   1.1.1.6  christos     {
   2329   1.1.1.6  christos       struct elf_link_hash_entry *def = weakdef (h);
   2330   1.1.1.6  christos       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
   2331   1.1.1.6  christos       h->root.u.def.section = def->root.u.def.section;
   2332   1.1.1.9  christos       h->root.u.def.value = def->root.u.def.value;
   2333   1.1.1.2  christos       return true;
   2334   1.1.1.2  christos     }
   2335   1.1.1.2  christos 
   2336   1.1.1.2  christos   /* This is a reference to a symbol defined by a dynamic object which
   2337   1.1.1.2  christos      is not a function.  */
   2338   1.1.1.2  christos 
   2339   1.1.1.2  christos   /* If we are creating a shared library, we must presume that the
   2340   1.1.1.2  christos      only references to the symbol are via the global offset table.
   2341   1.1.1.2  christos      For such cases we need not do anything here; the relocations will
   2342   1.1.1.4  christos      be handled correctly by relocate_section.  */
   2343   1.1.1.9  christos   if (bfd_link_executable (info))
   2344   1.1.1.2  christos     return true;
   2345   1.1.1.2  christos 
   2346   1.1.1.2  christos   /* If there are no references to this symbol that do not use the
   2347   1.1.1.2  christos      GOT, we don't need to generate a copy reloc.  */
   2348   1.1.1.9  christos   if (!h->non_got_ref)
   2349   1.1.1.2  christos     return true;
   2350   1.1.1.2  christos 
   2351   1.1.1.2  christos   /* We must allocate the symbol in our .dynbss section, which will
   2352   1.1.1.2  christos      become part of the .bss section of the executable.  There will be
   2353   1.1.1.2  christos      an entry for this symbol in the .dynsym section.  The dynamic
   2354   1.1.1.2  christos      object will contain position independent code, so all references
   2355   1.1.1.2  christos      from the dynamic object to this symbol will go through the global
   2356   1.1.1.2  christos      offset table.  The dynamic linker will use the .dynsym entry to
   2357   1.1.1.2  christos      determine the address it must put in the global offset table, so
   2358   1.1.1.2  christos      both the dynamic object and the regular object will refer to the
   2359   1.1.1.2  christos      same memory location for the variable.  */
   2360   1.1.1.3  christos 
   2361   1.1.1.2  christos   s = bfd_get_linker_section (dynobj, ".dynbss");
   2362   1.1.1.2  christos   BFD_ASSERT (s != NULL);
   2363   1.1.1.2  christos 
   2364   1.1.1.2  christos   /* We must generate a R_CR16_COPY reloc to tell the dynamic linker to
   2365   1.1.1.2  christos      copy the initial value out of the dynamic object and into the
   2366   1.1.1.2  christos      runtime process image.  We need to remember the offset into the
   2367   1.1.1.3  christos      .rela.bss section we are going to use.  */
   2368   1.1.1.2  christos   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
   2369   1.1.1.2  christos     {
   2370   1.1.1.2  christos       asection * srel;
   2371   1.1.1.3  christos 
   2372   1.1.1.2  christos       srel = bfd_get_linker_section (dynobj, ".rela.bss");
   2373   1.1.1.2  christos       BFD_ASSERT (srel != NULL);
   2374   1.1.1.2  christos       srel->size += sizeof (Elf32_External_Rela);
   2375   1.1.1.2  christos       h->needs_copy = 1;
   2376   1.1.1.2  christos     }
   2377   1.1.1.4  christos 
   2378   1.1.1.2  christos   return _bfd_elf_adjust_dynamic_copy (info, h, s);
   2379   1.1.1.2  christos }
   2380   1.1.1.2  christos 
   2381       1.1     skrll /* Set the sizes of the dynamic sections.  */
   2382   1.1.1.9  christos 
   2383  1.1.1.11  christos static bool
   2384  1.1.1.11  christos _bfd_cr16_elf_late_size_sections (bfd * output_bfd,
   2385       1.1     skrll 				  struct bfd_link_info * info)
   2386   1.1.1.2  christos {
   2387   1.1.1.2  christos   bfd * dynobj;
   2388   1.1.1.9  christos   asection * s;
   2389   1.1.1.2  christos   bool relocs;
   2390   1.1.1.2  christos 
   2391  1.1.1.11  christos   dynobj = elf_hash_table (info)->dynobj;
   2392  1.1.1.11  christos   if (dynobj == NULL)
   2393   1.1.1.2  christos     return true;
   2394   1.1.1.2  christos 
   2395   1.1.1.2  christos   if (elf_hash_table (info)->dynamic_sections_created)
   2396   1.1.1.2  christos     {
   2397   1.1.1.4  christos       /* Set the contents of the .interp section to the interpreter.  */
   2398   1.1.1.6  christos       if (bfd_link_executable (info) && !info->nointerp)
   2399   1.1.1.2  christos 	{
   2400  1.1.1.12  christos #if 0
   2401   1.1.1.6  christos 	  s = elf_hash_table (info)->interp;
   2402   1.1.1.6  christos 	  BFD_ASSERT (s != NULL);
   2403   1.1.1.6  christos 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
   2404  1.1.1.11  christos 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
   2405   1.1.1.2  christos 	  s->alloced = 1;
   2406   1.1.1.6  christos #endif
   2407   1.1.1.2  christos 	}
   2408   1.1.1.2  christos     }
   2409   1.1.1.2  christos   else
   2410   1.1.1.2  christos     {
   2411   1.1.1.6  christos       /* We may have created entries in the .rela.got section.
   2412   1.1.1.6  christos 	 However, if we are not creating the dynamic sections, we will
   2413   1.1.1.6  christos 	 not actually use these entries.  Reset the size of .rela.got,
   2414   1.1.1.6  christos 	 which will cause it to get stripped from the output file
   2415   1.1.1.6  christos 	 below.  */
   2416   1.1.1.2  christos       s = elf_hash_table (info)->srelgot;
   2417   1.1.1.6  christos       if (s != NULL)
   2418   1.1.1.2  christos 	s->size = 0;
   2419   1.1.1.2  christos     }
   2420   1.1.1.2  christos 
   2421   1.1.1.2  christos   /* The check_relocs and adjust_dynamic_symbol entry points have
   2422   1.1.1.2  christos      determined the sizes of the various dynamic sections.  Allocate
   2423   1.1.1.9  christos      memory for them.  */
   2424   1.1.1.2  christos   relocs = false;
   2425   1.1.1.2  christos   for (s = dynobj->sections; s != NULL; s = s->next)
   2426   1.1.1.2  christos     {
   2427   1.1.1.2  christos       const char * name;
   2428   1.1.1.2  christos 
   2429   1.1.1.6  christos       if ((s->flags & SEC_LINKER_CREATED) == 0)
   2430   1.1.1.2  christos 	continue;
   2431   1.1.1.2  christos 
   2432   1.1.1.6  christos       /* It's OK to base decisions on the section name, because none
   2433   1.1.1.8  christos 	 of the dynobj section names depend upon the input files.  */
   2434   1.1.1.2  christos       name = bfd_section_name (s);
   2435   1.1.1.2  christos 
   2436   1.1.1.6  christos       if (strcmp (name, ".plt") == 0)
   2437   1.1.1.6  christos 	{
   2438   1.1.1.9  christos 	  /* Remember whether there is a PLT.  */
   2439   1.1.1.6  christos 	  ;
   2440   1.1.1.9  christos 	}
   2441   1.1.1.6  christos       else if (startswith (name, ".rela"))
   2442   1.1.1.6  christos 	{
   2443   1.1.1.6  christos 	  if (s->size != 0)
   2444   1.1.1.6  christos 	    {
   2445   1.1.1.6  christos 	      /* Remember whether there are any reloc sections other
   2446   1.1.1.6  christos 		 than .rela.plt.  */
   2447   1.1.1.9  christos 	      if (strcmp (name, ".rela.plt") != 0)
   2448   1.1.1.6  christos 		relocs = true;
   2449   1.1.1.6  christos 
   2450   1.1.1.6  christos 	      /* We use the reloc_count field as a counter if we need
   2451   1.1.1.6  christos 		 to copy relocs into the output file.  */
   2452   1.1.1.6  christos 	      s->reloc_count = 0;
   2453   1.1.1.6  christos 	    }
   2454   1.1.1.9  christos 	}
   2455   1.1.1.6  christos       else if (! startswith (name, ".got")
   2456   1.1.1.6  christos 	       && strcmp (name, ".dynbss") != 0)
   2457   1.1.1.6  christos 	/* It's not one of our sections, so don't allocate space.  */
   2458   1.1.1.2  christos 	continue;
   2459   1.1.1.2  christos 
   2460   1.1.1.6  christos       if (s->size == 0)
   2461   1.1.1.6  christos 	{
   2462   1.1.1.6  christos 	  /* If we don't need this section, strip it from the
   2463   1.1.1.6  christos 	     output file.  This is mostly to handle .rela.bss and
   2464   1.1.1.6  christos 	     .rela.plt.  We must create both sections in
   2465   1.1.1.6  christos 	     create_dynamic_sections, because they must be created
   2466   1.1.1.6  christos 	     before the linker maps input sections to output
   2467   1.1.1.6  christos 	     sections.  The linker does that before
   2468   1.1.1.6  christos 	     adjust_dynamic_symbol is called, and it is that
   2469   1.1.1.6  christos 	     function which decides whether anything needs to go
   2470   1.1.1.6  christos 	     into these sections.  */
   2471   1.1.1.6  christos 	  s->flags |= SEC_EXCLUDE;
   2472   1.1.1.6  christos 	  continue;
   2473   1.1.1.2  christos 	}
   2474   1.1.1.9  christos 
   2475   1.1.1.9  christos       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   2476   1.1.1.2  christos 	continue;
   2477   1.1.1.2  christos 
   2478   1.1.1.6  christos       /* Allocate memory for the section contents.  We use bfd_zalloc
   2479   1.1.1.6  christos 	 here in case unused entries are not reclaimed before the
   2480   1.1.1.6  christos 	 section's contents are written out.  This should not happen,
   2481   1.1.1.6  christos 	 but this way if it does, we get a R_CR16_NONE reloc
   2482   1.1.1.2  christos 	 instead of garbage.  */
   2483   1.1.1.2  christos       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
   2484   1.1.1.9  christos       if (s->contents == NULL)
   2485  1.1.1.11  christos 	return false;
   2486   1.1.1.2  christos       s->alloced = 1;
   2487   1.1.1.2  christos     }
   2488   1.1.1.9  christos 
   2489   1.1.1.2  christos   return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
   2490   1.1.1.2  christos }
   2491   1.1.1.2  christos 
   2492   1.1.1.2  christos /* Finish up dynamic symbol handling.  We set the contents of various
   2493   1.1.1.2  christos    dynamic sections here.  */
   2494   1.1.1.9  christos 
   2495   1.1.1.2  christos static bool
   2496   1.1.1.6  christos _bfd_cr16_elf_finish_dynamic_symbol (bfd * output_bfd,
   2497   1.1.1.6  christos 				     struct bfd_link_info * info,
   2498   1.1.1.6  christos 				     struct elf_link_hash_entry * h,
   2499   1.1.1.2  christos 				     Elf_Internal_Sym * sym)
   2500   1.1.1.2  christos {
   2501   1.1.1.2  christos   bfd * dynobj;
   2502   1.1.1.2  christos 
   2503   1.1.1.2  christos   dynobj = elf_hash_table (info)->dynobj;
   2504   1.1.1.2  christos 
   2505   1.1.1.2  christos   if (h->got.offset != (bfd_vma) -1)
   2506   1.1.1.6  christos     {
   2507   1.1.1.6  christos       asection *	sgot;
   2508   1.1.1.2  christos       asection *	srel;
   2509   1.1.1.2  christos       Elf_Internal_Rela rel;
   2510   1.1.1.2  christos 
   2511   1.1.1.2  christos       /* This symbol has an entry in the global offset table.  Set it up.  */
   2512   1.1.1.6  christos 
   2513   1.1.1.6  christos       sgot = elf_hash_table (info)->sgot;
   2514   1.1.1.2  christos       srel = elf_hash_table (info)->srelgot;
   2515   1.1.1.2  christos       BFD_ASSERT (sgot != NULL && srel != NULL);
   2516   1.1.1.2  christos 
   2517   1.1.1.6  christos       rel.r_offset = (sgot->output_section->vma
   2518   1.1.1.6  christos 		      + sgot->output_offset
   2519   1.1.1.2  christos 		      + (h->got.offset & ~1));
   2520   1.1.1.2  christos 
   2521   1.1.1.6  christos       /* If this is a -Bsymbolic link, and the symbol is defined
   2522   1.1.1.6  christos 	 locally, we just want to emit a RELATIVE reloc.  Likewise if
   2523   1.1.1.6  christos 	 the symbol was forced to be local because of a version file.
   2524   1.1.1.6  christos 	 The entry in the global offset table will already have been
   2525   1.1.1.4  christos 	 initialized in the relocate_section function.  */
   2526   1.1.1.6  christos       if (bfd_link_executable (info)
   2527   1.1.1.6  christos 	  && (info->symbolic || h->dynindx == -1)
   2528   1.1.1.6  christos 	  && h->def_regular)
   2529   1.1.1.6  christos 	{
   2530   1.1.1.6  christos 	  rel.r_info = ELF32_R_INFO (0, R_CR16_GOT_REGREL20);
   2531   1.1.1.6  christos 	  rel.r_addend = (h->root.u.def.value
   2532   1.1.1.6  christos 			  + h->root.u.def.section->output_section->vma
   2533   1.1.1.6  christos 			  + h->root.u.def.section->output_offset);
   2534   1.1.1.2  christos 	}
   2535   1.1.1.6  christos       else
   2536   1.1.1.6  christos 	{
   2537   1.1.1.6  christos 	  bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
   2538   1.1.1.6  christos 	  rel.r_info = ELF32_R_INFO (h->dynindx, R_CR16_GOT_REGREL20);
   2539   1.1.1.6  christos 	  rel.r_addend = 0;
   2540   1.1.1.2  christos 	}
   2541   1.1.1.2  christos 
   2542   1.1.1.6  christos       bfd_elf32_swap_reloca_out (output_bfd, &rel,
   2543   1.1.1.6  christos 				 (bfd_byte *) ((Elf32_External_Rela *) srel->contents
   2544   1.1.1.2  christos 					       + srel->reloc_count));
   2545   1.1.1.2  christos       ++ srel->reloc_count;
   2546   1.1.1.2  christos     }
   2547   1.1.1.2  christos 
   2548   1.1.1.2  christos   if (h->needs_copy)
   2549   1.1.1.6  christos     {
   2550   1.1.1.2  christos       asection *	s;
   2551   1.1.1.2  christos       Elf_Internal_Rela rel;
   2552   1.1.1.2  christos 
   2553   1.1.1.2  christos       /* This symbol needs a copy reloc.  Set it up.  */
   2554   1.1.1.6  christos       BFD_ASSERT (h->dynindx != -1
   2555   1.1.1.6  christos 		  && (h->root.type == bfd_link_hash_defined
   2556   1.1.1.2  christos 		      || h->root.type == bfd_link_hash_defweak));
   2557   1.1.1.3  christos 
   2558   1.1.1.2  christos       s = bfd_get_linker_section (dynobj, ".rela.bss");
   2559   1.1.1.2  christos       BFD_ASSERT (s != NULL);
   2560   1.1.1.2  christos 
   2561   1.1.1.6  christos       rel.r_offset = (h->root.u.def.value
   2562   1.1.1.6  christos 		      + h->root.u.def.section->output_section->vma
   2563   1.1.1.2  christos 		      + h->root.u.def.section->output_offset);
   2564   1.1.1.2  christos       rel.r_info = ELF32_R_INFO (h->dynindx, R_CR16_GOT_REGREL20);
   2565   1.1.1.2  christos       rel.r_addend = 0;
   2566   1.1.1.6  christos       bfd_elf32_swap_reloca_out (output_bfd, &rel,
   2567   1.1.1.6  christos 				 (bfd_byte *) ((Elf32_External_Rela *) s->contents
   2568   1.1.1.9  christos 					       + s->reloc_count));
   2569   1.1.1.2  christos       ++ s->reloc_count;
   2570   1.1.1.2  christos     }
   2571   1.1.1.2  christos 
   2572   1.1.1.4  christos   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
   2573   1.1.1.2  christos   if (h == elf_hash_table (info)->hdynamic
   2574   1.1.1.2  christos       || h == elf_hash_table (info)->hgot)
   2575   1.1.1.2  christos     sym->st_shndx = SHN_ABS;
   2576   1.1.1.9  christos 
   2577   1.1.1.2  christos   return true;
   2578   1.1.1.2  christos }
   2579   1.1.1.2  christos 
   2580   1.1.1.2  christos /* Finish up the dynamic sections.  */
   2581   1.1.1.9  christos 
   2582  1.1.1.12  christos static bool
   2583  1.1.1.12  christos _bfd_cr16_elf_finish_dynamic_sections (bfd *output_bfd,
   2584  1.1.1.12  christos 				       struct bfd_link_info *info,
   2585   1.1.1.2  christos 				       bfd_byte *buf ATTRIBUTE_UNUSED)
   2586   1.1.1.2  christos {
   2587   1.1.1.2  christos   bfd *      dynobj;
   2588   1.1.1.2  christos   asection * sgot;
   2589   1.1.1.2  christos   asection * sdyn;
   2590   1.1.1.2  christos 
   2591   1.1.1.2  christos   dynobj = elf_hash_table (info)->dynobj;
   2592   1.1.1.6  christos 
   2593   1.1.1.2  christos   sgot = elf_hash_table (info)->sgotplt;
   2594   1.1.1.3  christos   BFD_ASSERT (sgot != NULL);
   2595   1.1.1.2  christos   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
   2596   1.1.1.2  christos 
   2597   1.1.1.2  christos   if (elf_hash_table (info)->dynamic_sections_created)
   2598   1.1.1.2  christos     {
   2599   1.1.1.2  christos       Elf32_External_Dyn * dyncon;
   2600   1.1.1.2  christos       Elf32_External_Dyn * dynconend;
   2601   1.1.1.2  christos 
   2602   1.1.1.2  christos       BFD_ASSERT (sdyn != NULL);
   2603   1.1.1.2  christos 
   2604   1.1.1.2  christos       dyncon = (Elf32_External_Dyn *) sdyn->contents;
   2605   1.1.1.2  christos       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
   2606   1.1.1.2  christos 
   2607   1.1.1.6  christos       for (; dyncon < dynconend; dyncon++)
   2608   1.1.1.6  christos 	{
   2609   1.1.1.6  christos 	  Elf_Internal_Dyn dyn;
   2610   1.1.1.6  christos 	  asection * s;
   2611   1.1.1.6  christos 
   2612   1.1.1.6  christos 	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
   2613   1.1.1.6  christos 
   2614   1.1.1.6  christos 	  switch (dyn.d_tag)
   2615   1.1.1.6  christos 	    {
   2616   1.1.1.6  christos 	    default:
   2617   1.1.1.6  christos 	      break;
   2618   1.1.1.6  christos 
   2619   1.1.1.6  christos 	    case DT_PLTGOT:
   2620   1.1.1.6  christos 	      s = elf_hash_table (info)->sgotplt;
   2621   1.1.1.6  christos 	      goto get_vma;
   2622   1.1.1.6  christos 
   2623   1.1.1.6  christos 	    case DT_JMPREL:
   2624   1.1.1.6  christos 	      s = elf_hash_table (info)->srelplt;
   2625   1.1.1.6  christos 	    get_vma:
   2626   1.1.1.6  christos 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   2627   1.1.1.6  christos 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   2628   1.1.1.6  christos 	      break;
   2629   1.1.1.6  christos 
   2630   1.1.1.6  christos 	    case DT_PLTRELSZ:
   2631   1.1.1.6  christos 	      s = elf_hash_table (info)->srelplt;
   2632   1.1.1.6  christos 	      dyn.d_un.d_val = s->size;
   2633   1.1.1.6  christos 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   2634   1.1.1.6  christos 	      break;
   2635   1.1.1.6  christos 	    }
   2636   1.1.1.2  christos 	}
   2637   1.1.1.2  christos 
   2638   1.1.1.2  christos     }
   2639   1.1.1.2  christos 
   2640   1.1.1.2  christos   /* Fill in the first three entries in the global offset table.  */
   2641   1.1.1.2  christos   if (sgot->size > 0)
   2642   1.1.1.2  christos     {
   2643   1.1.1.6  christos       if (sdyn == NULL)
   2644   1.1.1.2  christos 	bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
   2645   1.1.1.6  christos       else
   2646   1.1.1.6  christos 	bfd_put_32 (output_bfd,
   2647   1.1.1.6  christos 		    sdyn->output_section->vma + sdyn->output_offset,
   2648   1.1.1.2  christos 		    sgot->contents);
   2649   1.1.1.2  christos     }
   2650   1.1.1.2  christos 
   2651   1.1.1.2  christos   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
   2652   1.1.1.9  christos 
   2653       1.1     skrll   return true;
   2654       1.1     skrll }
   2655   1.1.1.2  christos 
   2656   1.1.1.2  christos /* Given a .data.rel section and a .emreloc in-memory section, store
   2657   1.1.1.2  christos    relocation information into the .emreloc section which can be
   2658   1.1.1.2  christos    used at runtime to relocate the section.  This is called by the
   2659   1.1.1.2  christos    linker when the --embedded-relocs switch is used.  This is called
   2660   1.1.1.2  christos    after the add_symbols entry point has been called for all the
   2661   1.1.1.2  christos    objects, and before the final_link entry point is called.  */
   2662   1.1.1.9  christos 
   2663   1.1.1.2  christos bool
   2664   1.1.1.6  christos bfd_cr16_elf32_create_embedded_relocs (bfd *abfd,
   2665   1.1.1.6  christos 				       struct bfd_link_info *info,
   2666   1.1.1.6  christos 				       asection *datasec,
   2667   1.1.1.6  christos 				       asection *relsec,
   2668   1.1.1.2  christos 				       char **errmsg)
   2669   1.1.1.2  christos {
   2670   1.1.1.2  christos   Elf_Internal_Shdr *symtab_hdr;
   2671   1.1.1.2  christos   Elf_Internal_Sym *isymbuf = NULL;
   2672   1.1.1.2  christos   Elf_Internal_Rela *internal_relocs = NULL;
   2673   1.1.1.2  christos   Elf_Internal_Rela *irel, *irelend;
   2674   1.1.1.2  christos   bfd_byte *p;
   2675   1.1.1.2  christos   bfd_size_type amt;
   2676   1.1.1.4  christos 
   2677   1.1.1.2  christos   BFD_ASSERT (! bfd_link_relocatable (info));
   2678   1.1.1.2  christos 
   2679   1.1.1.2  christos   *errmsg = NULL;
   2680   1.1.1.2  christos 
   2681   1.1.1.9  christos   if (datasec->reloc_count == 0)
   2682   1.1.1.2  christos     return true;
   2683   1.1.1.2  christos 
   2684   1.1.1.2  christos   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   2685   1.1.1.2  christos 
   2686   1.1.1.2  christos   /* Get a copy of the native relocations.  */
   2687   1.1.1.6  christos   internal_relocs = (_bfd_elf_link_read_relocs
   2688   1.1.1.2  christos 		     (abfd, datasec, NULL, NULL, info->keep_memory));
   2689   1.1.1.2  christos   if (internal_relocs == NULL)
   2690   1.1.1.2  christos     goto error_return;
   2691   1.1.1.2  christos 
   2692   1.1.1.2  christos   amt = (bfd_size_type) datasec->reloc_count * 8;
   2693   1.1.1.2  christos   relsec->contents = (bfd_byte *) bfd_alloc (abfd, amt);
   2694   1.1.1.2  christos   if (relsec->contents == NULL)
   2695  1.1.1.11  christos     goto error_return;
   2696   1.1.1.2  christos   relsec->alloced = 1;
   2697   1.1.1.2  christos 
   2698   1.1.1.2  christos   p = relsec->contents;
   2699   1.1.1.2  christos 
   2700   1.1.1.2  christos   irelend = internal_relocs + datasec->reloc_count;
   2701   1.1.1.2  christos   for (irel = internal_relocs; irel < irelend; irel++, p += 8)
   2702   1.1.1.2  christos     {
   2703   1.1.1.2  christos       asection *targetsec;
   2704   1.1.1.2  christos 
   2705   1.1.1.9  christos       /* We are going to write a four byte longword into the runtime
   2706   1.1.1.9  christos 	 reloc section.  The longword will be the address in the data
   2707   1.1.1.9  christos 	 section which must be relocated.  It is followed by the name
   2708   1.1.1.9  christos 	 of the target section NUL-padded or truncated to 8
   2709   1.1.1.2  christos 	 characters.  */
   2710   1.1.1.2  christos 
   2711   1.1.1.2  christos       /* We can only relocate absolute longword relocs at run time.  */
   2712   1.1.1.9  christos       if (!((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32a)
   2713   1.1.1.6  christos 	    || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32)))
   2714   1.1.1.7  christos 	{
   2715   1.1.1.6  christos 	  *errmsg = _("unsupported relocation type");
   2716   1.1.1.6  christos 	  bfd_set_error (bfd_error_bad_value);
   2717   1.1.1.6  christos 	  goto error_return;
   2718   1.1.1.2  christos 	}
   2719   1.1.1.2  christos 
   2720   1.1.1.2  christos       /* Get the target section referred to by the reloc.  */
   2721   1.1.1.6  christos       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
   2722   1.1.1.6  christos 	{
   2723   1.1.1.6  christos 	  /* A local symbol.  */
   2724   1.1.1.6  christos 	  Elf_Internal_Sym *isym;
   2725   1.1.1.6  christos 
   2726   1.1.1.6  christos 	  /* Read this BFD's local symbols if we haven't done so already.  */
   2727   1.1.1.6  christos 	  if (isymbuf == NULL)
   2728   1.1.1.6  christos 	    {
   2729   1.1.1.6  christos 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   2730   1.1.1.6  christos 	      if (isymbuf == NULL)
   2731   1.1.1.6  christos 		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
   2732   1.1.1.6  christos 						symtab_hdr->sh_info, 0,
   2733   1.1.1.6  christos 						NULL, NULL, NULL);
   2734   1.1.1.6  christos 	      if (isymbuf == NULL)
   2735   1.1.1.6  christos 		goto error_return;
   2736   1.1.1.6  christos 	    }
   2737   1.1.1.6  christos 
   2738   1.1.1.6  christos 	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
   2739   1.1.1.6  christos 	  targetsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
   2740   1.1.1.2  christos 	}
   2741   1.1.1.6  christos       else
   2742   1.1.1.6  christos 	{
   2743   1.1.1.6  christos 	  unsigned long indx;
   2744   1.1.1.6  christos 	  struct elf_link_hash_entry *h;
   2745   1.1.1.6  christos 
   2746   1.1.1.6  christos 	  /* An external symbol.  */
   2747   1.1.1.6  christos 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
   2748   1.1.1.6  christos 	  h = elf_sym_hashes (abfd)[indx];
   2749   1.1.1.6  christos 	  BFD_ASSERT (h != NULL);
   2750   1.1.1.6  christos 	  if (h->root.type == bfd_link_hash_defined
   2751   1.1.1.6  christos 	      || h->root.type == bfd_link_hash_defweak)
   2752   1.1.1.6  christos 	    targetsec = h->root.u.def.section;
   2753   1.1.1.6  christos 	  else
   2754   1.1.1.6  christos 	    targetsec = NULL;
   2755   1.1.1.2  christos 	}
   2756   1.1.1.2  christos 
   2757   1.1.1.2  christos       bfd_put_32 (abfd, irel->r_offset + datasec->output_offset, p);
   2758   1.1.1.2  christos       memset (p + 4, 0, 4);
   2759   1.1.1.6  christos       if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32a)
   2760   1.1.1.9  christos 	  && (targetsec != NULL) )
   2761   1.1.1.2  christos 	strncpy ((char *) p + 4, targetsec->output_section->name, 4);
   2762   1.1.1.2  christos     }
   2763   1.1.1.9  christos 
   2764   1.1.1.2  christos   if (symtab_hdr->contents != (unsigned char *) isymbuf)
   2765   1.1.1.9  christos     free (isymbuf);
   2766   1.1.1.2  christos   if (elf_section_data (datasec)->relocs != internal_relocs)
   2767   1.1.1.9  christos     free (internal_relocs);
   2768   1.1.1.2  christos   return true;
   2769   1.1.1.9  christos 
   2770   1.1.1.9  christos  error_return:
   2771   1.1.1.2  christos   if (symtab_hdr->contents != (unsigned char *) isymbuf)
   2772   1.1.1.9  christos     free (isymbuf);
   2773   1.1.1.2  christos   if (elf_section_data (datasec)->relocs != internal_relocs)
   2774   1.1.1.9  christos     free (internal_relocs);
   2775   1.1.1.2  christos   return false;
   2776   1.1.1.2  christos }
   2777   1.1.1.2  christos 
   2778   1.1.1.2  christos 
   2779   1.1.1.2  christos /* Classify relocation types, such that combreloc can sort them
   2780   1.1.1.2  christos    properly.  */
   2781   1.1.1.2  christos 
   2782   1.1.1.4  christos static enum elf_reloc_type_class
   2783   1.1.1.4  christos _bfd_cr16_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2784   1.1.1.4  christos 				const asection *rel_sec ATTRIBUTE_UNUSED,
   2785   1.1.1.2  christos 				const Elf_Internal_Rela *rela)
   2786   1.1.1.2  christos {
   2787   1.1.1.2  christos   switch ((int) ELF32_R_TYPE (rela->r_info))
   2788   1.1.1.2  christos     {
   2789   1.1.1.2  christos     case R_CR16_GOT_REGREL20:
   2790   1.1.1.2  christos     case R_CR16_GOTC_REGREL20:
   2791   1.1.1.2  christos       return reloc_class_relative;
   2792   1.1.1.2  christos     default:
   2793   1.1.1.2  christos       return reloc_class_normal;
   2794   1.1.1.2  christos     }
   2795   1.1.1.2  christos }
   2796       1.1     skrll 
   2797   1.1.1.6  christos /* Definitions for setting CR16 target vector.  */
   2798   1.1.1.6  christos #define TARGET_LITTLE_SYM		  cr16_elf32_vec
   2799   1.1.1.6  christos #define TARGET_LITTLE_NAME		  "elf32-cr16"
   2800  1.1.1.11  christos #define ELF_ARCH			  bfd_arch_cr16
   2801   1.1.1.6  christos #define ELF_TARGET_ID			  CR16_ELF_DATA
   2802   1.1.1.6  christos #define ELF_MACHINE_CODE		  EM_CR16
   2803   1.1.1.6  christos #define ELF_MACHINE_ALT1		  EM_CR16_OLD
   2804   1.1.1.6  christos #define ELF_MAXPAGESIZE			  0x1
   2805   1.1.1.6  christos #define elf_symbol_leading_char		  '_'
   2806   1.1.1.6  christos 
   2807   1.1.1.6  christos #define bfd_elf32_bfd_reloc_type_lookup	  elf_cr16_reloc_type_lookup
   2808   1.1.1.6  christos #define bfd_elf32_bfd_reloc_name_lookup	  elf_cr16_reloc_name_lookup
   2809   1.1.1.7  christos #define elf_info_to_howto		  elf_cr16_info_to_howto
   2810   1.1.1.6  christos #define elf_info_to_howto_rel		  NULL
   2811   1.1.1.6  christos #define elf_backend_relocate_section	  elf32_cr16_relocate_section
   2812       1.1     skrll #define bfd_elf32_bfd_relax_section	  elf32_cr16_relax_section
   2813   1.1.1.6  christos #define bfd_elf32_bfd_get_relocated_section_contents \
   2814   1.1.1.6  christos 				elf32_cr16_get_relocated_section_contents
   2815   1.1.1.6  christos #define elf_backend_can_gc_sections	  1
   2816   1.1.1.6  christos #define elf_backend_rela_normal		  1
   2817   1.1.1.2  christos #define elf_backend_check_relocs	  cr16_elf_check_relocs
   2818   1.1.1.2  christos /* So we can set bits in e_flags.  */
   2819   1.1.1.6  christos #define elf_backend_final_write_processing \
   2820   1.1.1.6  christos 				 _bfd_cr16_elf_final_write_processing
   2821   1.1.1.2  christos #define elf_backend_object_p	 _bfd_cr16_elf_object_p
   2822   1.1.1.2  christos 
   2823   1.1.1.6  christos #define bfd_elf32_bfd_merge_private_bfd_data \
   2824   1.1.1.2  christos 				 _bfd_cr16_elf_merge_private_bfd_data
   2825   1.1.1.2  christos 
   2826   1.1.1.2  christos 
   2827   1.1.1.6  christos #define bfd_elf32_bfd_link_hash_table_create \
   2828   1.1.1.2  christos 				  elf32_cr16_link_hash_table_create
   2829   1.1.1.2  christos 
   2830   1.1.1.6  christos #define elf_backend_create_dynamic_sections \
   2831   1.1.1.2  christos 				  _bfd_cr16_elf_create_dynamic_sections
   2832   1.1.1.6  christos #define elf_backend_adjust_dynamic_symbol \
   2833  1.1.1.11  christos 				  _bfd_cr16_elf_adjust_dynamic_symbol
   2834  1.1.1.11  christos #define elf_backend_late_size_sections \
   2835   1.1.1.7  christos 				  _bfd_cr16_elf_late_size_sections
   2836   1.1.1.2  christos #define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
   2837   1.1.1.6  christos #define elf_backend_finish_dynamic_symbol \
   2838   1.1.1.2  christos 				   _bfd_cr16_elf_finish_dynamic_symbol
   2839   1.1.1.6  christos #define elf_backend_finish_dynamic_sections \
   2840   1.1.1.2  christos 				   _bfd_cr16_elf_finish_dynamic_sections
   2841   1.1.1.2  christos 
   2842   1.1.1.2  christos #define elf_backend_reloc_type_class   _bfd_cr16_elf_reloc_type_class
   2843   1.1.1.2  christos 
   2844   1.1.1.6  christos 
   2845   1.1.1.6  christos #define elf_backend_want_got_plt	1
   2846   1.1.1.6  christos #define elf_backend_plt_readonly	1
   2847   1.1.1.6  christos #define elf_backend_want_plt_sym	0
   2848   1.1.1.6  christos #define elf_backend_got_header_size	12
   2849       1.1     skrll #define elf_backend_dtrel_excludes_plt	1
   2850       1.1     skrll 
   2851                     #include "elf32-target.h"
   2852