* elf64-ppc.c (elf_backend_add_symbol_hook): Define.
[external/binutils.git] / bfd / elf32-v850.c
1 /* V850-specific support for 32-bit ELF
2    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
3    Free Software Foundation, Inc.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
22    dependencies.  As is the gas & simulator code for the v850.  */
23
24 #include "bfd.h"
25 #include "sysdep.h"
26 #include "bfdlink.h"
27 #include "libbfd.h"
28 #include "elf-bfd.h"
29 #include "elf/v850.h"
30 #include "libiberty.h"
31
32 /* Sign-extend a 24-bit number.  */
33 #define SEXT24(x)       ((((x) & 0xffffff) ^ 0x800000) - 0x800000)
34
35 static reloc_howto_type *v850_elf_reloc_type_lookup
36   PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
37 static void v850_elf_info_to_howto_rel
38   PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
39 static void v850_elf_info_to_howto_rela
40   PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
41 static bfd_reloc_status_type v850_elf_reloc
42   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
43 static bfd_boolean v850_elf_is_local_label_name
44   PARAMS ((bfd *, const char *));
45 static bfd_boolean v850_elf_relocate_section
46   PARAMS((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
47           Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
48 static bfd_reloc_status_type v850_elf_perform_relocation
49   PARAMS ((bfd *, unsigned int, bfd_vma, bfd_byte *));
50 static bfd_boolean v850_elf_check_relocs
51   PARAMS ((bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *));
52 static void remember_hi16s_reloc
53   PARAMS ((bfd *, bfd_vma, bfd_byte *));
54 static bfd_byte * find_remembered_hi16s_reloc
55   PARAMS ((bfd_vma, bfd_boolean *));
56 static bfd_reloc_status_type v850_elf_final_link_relocate
57   PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *, bfd_vma,
58            bfd_vma, bfd_vma, struct bfd_link_info *, asection *, int));
59 static bfd_boolean v850_elf_object_p
60   PARAMS ((bfd *));
61 static bfd_boolean v850_elf_fake_sections
62   PARAMS ((bfd *, Elf_Internal_Shdr *, asection *));
63 static void v850_elf_final_write_processing
64   PARAMS ((bfd *, bfd_boolean));
65 static bfd_boolean v850_elf_set_private_flags
66   PARAMS ((bfd *, flagword));
67 static bfd_boolean v850_elf_merge_private_bfd_data
68   PARAMS ((bfd *, bfd *));
69 static bfd_boolean v850_elf_print_private_bfd_data
70   PARAMS ((bfd *, PTR));
71 static bfd_boolean v850_elf_section_from_bfd_section
72   PARAMS ((bfd *, asection *, int *));
73 static void v850_elf_symbol_processing
74   PARAMS ((bfd *, asymbol *));
75 static bfd_boolean v850_elf_add_symbol_hook
76   PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Sym *,
77            const char **, flagword *, asection **, bfd_vma *));
78 static bfd_boolean v850_elf_link_output_symbol_hook
79   PARAMS ((struct bfd_link_info *, const char *, Elf_Internal_Sym *,
80            asection *, struct elf_link_hash_entry *));
81 static bfd_boolean v850_elf_section_from_shdr
82   PARAMS ((bfd *, Elf_Internal_Shdr *, const char *));
83 static bfd_boolean v850_elf_gc_sweep_hook
84   PARAMS ((bfd *, struct bfd_link_info *, asection *,
85            const Elf_Internal_Rela *));
86 static asection * v850_elf_gc_mark_hook
87   PARAMS ((asection *, struct bfd_link_info *,
88            Elf_Internal_Rela *, struct elf_link_hash_entry *,
89            Elf_Internal_Sym *));
90 static bfd_reloc_status_type v850_elf_ignore_reloc
91   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
92 static bfd_boolean v850_elf_relax_delete_bytes
93   PARAMS ((bfd *, asection *, bfd_vma, bfd_vma, int));
94 static bfd_boolean v850_elf_relax_section
95   PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *));
96
97 /* Note: It is REQUIRED that the 'type' value of each entry
98    in this array match the index of the entry in the array.  */
99 static reloc_howto_type v850_elf_howto_table[] =
100 {
101   /* This reloc does nothing.  */
102   HOWTO (R_V850_NONE,                   /* type */
103          0,                             /* rightshift */
104          2,                             /* size (0 = byte, 1 = short, 2 = long) */
105          32,                            /* bitsize */
106          FALSE,                         /* pc_relative */
107          0,                             /* bitpos */
108          complain_overflow_bitfield,    /* complain_on_overflow */
109          bfd_elf_generic_reloc,         /* special_function */
110          "R_V850_NONE",                 /* name */
111          FALSE,                         /* partial_inplace */
112          0,                             /* src_mask */
113          0,                             /* dst_mask */
114          FALSE),                        /* pcrel_offset */
115
116   /* A PC relative 9 bit branch.  */
117   HOWTO (R_V850_9_PCREL,                /* type */
118          2,                             /* rightshift */
119          2,                             /* size (0 = byte, 1 = short, 2 = long) */
120          26,                            /* bitsize */
121          TRUE,                          /* pc_relative */
122          0,                             /* bitpos */
123          complain_overflow_bitfield,    /* complain_on_overflow */
124          v850_elf_reloc,                /* special_function */
125          "R_V850_9_PCREL",              /* name */
126          FALSE,                         /* partial_inplace */
127          0x00ffffff,                    /* src_mask */
128          0x00ffffff,                    /* dst_mask */
129          TRUE),                         /* pcrel_offset */
130
131   /* A PC relative 22 bit branch.  */
132   HOWTO (R_V850_22_PCREL,               /* type */
133          2,                             /* rightshift */
134          2,                             /* size (0 = byte, 1 = short, 2 = long) */
135          22,                            /* bitsize */
136          TRUE,                          /* pc_relative */
137          7,                             /* bitpos */
138          complain_overflow_signed,      /* complain_on_overflow */
139          v850_elf_reloc,                /* special_function */
140          "R_V850_22_PCREL",             /* name */
141          FALSE,                         /* partial_inplace */
142          0x07ffff80,                    /* src_mask */
143          0x07ffff80,                    /* dst_mask */
144          TRUE),                         /* pcrel_offset */
145
146   /* High 16 bits of symbol value.  */
147   HOWTO (R_V850_HI16_S,                 /* type */
148          0,                             /* rightshift */
149          1,                             /* size (0 = byte, 1 = short, 2 = long) */
150          16,                            /* bitsize */
151          FALSE,                         /* pc_relative */
152          0,                             /* bitpos */
153          complain_overflow_dont,        /* complain_on_overflow */
154          v850_elf_reloc,                /* special_function */
155          "R_V850_HI16_S",               /* name */
156          FALSE,                         /* partial_inplace */
157          0xffff,                        /* src_mask */
158          0xffff,                        /* dst_mask */
159          FALSE),                        /* pcrel_offset */
160
161   /* High 16 bits of symbol value.  */
162   HOWTO (R_V850_HI16,                   /* type */
163          0,                             /* rightshift */
164          1,                             /* size (0 = byte, 1 = short, 2 = long) */
165          16,                            /* bitsize */
166          FALSE,                         /* pc_relative */
167          0,                             /* bitpos */
168          complain_overflow_dont,        /* complain_on_overflow */
169          v850_elf_reloc,                /* special_function */
170          "R_V850_HI16",                 /* name */
171          FALSE,                         /* partial_inplace */
172          0xffff,                        /* src_mask */
173          0xffff,                        /* dst_mask */
174          FALSE),                        /* pcrel_offset */
175
176   /* Low 16 bits of symbol value.  */
177   HOWTO (R_V850_LO16,                   /* type */
178          0,                             /* rightshift */
179          1,                             /* size (0 = byte, 1 = short, 2 = long) */
180          16,                            /* bitsize */
181          FALSE,                         /* pc_relative */
182          0,                             /* bitpos */
183          complain_overflow_dont,        /* complain_on_overflow */
184          v850_elf_reloc,                /* special_function */
185          "R_V850_LO16",                 /* name */
186          FALSE,                         /* partial_inplace */
187          0xffff,                        /* src_mask */
188          0xffff,                        /* dst_mask */
189          FALSE),                        /* pcrel_offset */
190
191   /* Simple 32bit reloc.  */
192   HOWTO (R_V850_ABS32,                  /* type */
193          0,                             /* rightshift */
194          2,                             /* size (0 = byte, 1 = short, 2 = long) */
195          32,                            /* bitsize */
196          FALSE,                         /* pc_relative */
197          0,                             /* bitpos */
198          complain_overflow_dont,        /* complain_on_overflow */
199          v850_elf_reloc,                /* special_function */
200          "R_V850_ABS32",                /* name */
201          FALSE,                         /* partial_inplace */
202          0xffffffff,                    /* src_mask */
203          0xffffffff,                    /* dst_mask */
204          FALSE),                        /* pcrel_offset */
205
206   /* Simple 16bit reloc.  */
207   HOWTO (R_V850_16,                     /* type */
208          0,                             /* rightshift */
209          1,                             /* size (0 = byte, 1 = short, 2 = long) */
210          16,                            /* bitsize */
211          FALSE,                         /* pc_relative */
212          0,                             /* bitpos */
213          complain_overflow_dont,        /* complain_on_overflow */
214          bfd_elf_generic_reloc,         /* special_function */
215          "R_V850_16",                   /* name */
216          FALSE,                         /* partial_inplace */
217          0xffff,                        /* src_mask */
218          0xffff,                        /* dst_mask */
219          FALSE),                        /* pcrel_offset */
220
221   /* Simple 8bit reloc.  */
222   HOWTO (R_V850_8,                      /* type */
223          0,                             /* rightshift */
224          0,                             /* size (0 = byte, 1 = short, 2 = long) */
225          8,                             /* bitsize */
226          FALSE,                         /* pc_relative */
227          0,                             /* bitpos */
228          complain_overflow_dont,        /* complain_on_overflow */
229          bfd_elf_generic_reloc,         /* special_function */
230          "R_V850_8",                    /* name */
231          FALSE,                         /* partial_inplace */
232          0xff,                          /* src_mask */
233          0xff,                          /* dst_mask */
234          FALSE),                        /* pcrel_offset */
235
236   /* 16 bit offset from the short data area pointer.  */
237   HOWTO (R_V850_SDA_16_16_OFFSET,       /* type */
238          0,                             /* rightshift */
239          1,                             /* size (0 = byte, 1 = short, 2 = long) */
240          16,                            /* bitsize */
241          FALSE,                         /* pc_relative */
242          0,                             /* bitpos */
243          complain_overflow_dont,        /* complain_on_overflow */
244          v850_elf_reloc,                /* special_function */
245          "R_V850_SDA_16_16_OFFSET",     /* name */
246          FALSE,                         /* partial_inplace */
247          0xffff,                        /* src_mask */
248          0xffff,                        /* dst_mask */
249          FALSE),                        /* pcrel_offset */
250
251   /* 15 bit offset from the short data area pointer.  */
252   HOWTO (R_V850_SDA_15_16_OFFSET,       /* type */
253          1,                             /* rightshift */
254          1,                             /* size (0 = byte, 1 = short, 2 = long) */
255          16,                            /* bitsize */
256          FALSE,                         /* pc_relative */
257          1,                             /* bitpos */
258          complain_overflow_dont,        /* complain_on_overflow */
259          v850_elf_reloc,                /* special_function */
260          "R_V850_SDA_15_16_OFFSET",     /* name */
261          FALSE,                         /* partial_inplace */
262          0xfffe,                        /* src_mask */
263          0xfffe,                        /* dst_mask */
264          FALSE),                        /* pcrel_offset */
265
266   /* 16 bit offset from the zero data area pointer.  */
267   HOWTO (R_V850_ZDA_16_16_OFFSET,       /* type */
268          0,                             /* rightshift */
269          1,                             /* size (0 = byte, 1 = short, 2 = long) */
270          16,                            /* bitsize */
271          FALSE,                         /* pc_relative */
272          0,                             /* bitpos */
273          complain_overflow_dont,        /* complain_on_overflow */
274          v850_elf_reloc,                /* special_function */
275          "R_V850_ZDA_16_16_OFFSET",     /* name */
276          FALSE,                         /* partial_inplace */
277          0xffff,                        /* src_mask */
278          0xffff,                        /* dst_mask */
279          FALSE),                        /* pcrel_offset */
280
281   /* 15 bit offset from the zero data area pointer.  */
282   HOWTO (R_V850_ZDA_15_16_OFFSET,       /* type */
283          1,                             /* rightshift */
284          1,                             /* size (0 = byte, 1 = short, 2 = long) */
285          16,                            /* bitsize */
286          FALSE,                         /* pc_relative */
287          1,                             /* bitpos */
288          complain_overflow_dont,        /* complain_on_overflow */
289          v850_elf_reloc,                /* special_function */
290          "R_V850_ZDA_15_16_OFFSET",     /* name */
291          FALSE,                         /* partial_inplace */
292          0xfffe,                        /* src_mask */
293          0xfffe,                        /* dst_mask */
294          FALSE),                        /* pcrel_offset */
295
296   /* 6 bit offset from the tiny data area pointer.  */
297   HOWTO (R_V850_TDA_6_8_OFFSET,         /* type */
298          2,                             /* rightshift */
299          1,                             /* size (0 = byte, 1 = short, 2 = long) */
300          8,                             /* bitsize */
301          FALSE,                         /* pc_relative */
302          1,                             /* bitpos */
303          complain_overflow_dont,        /* complain_on_overflow */
304          v850_elf_reloc,                /* special_function */
305          "R_V850_TDA_6_8_OFFSET",       /* name */
306          FALSE,                         /* partial_inplace */
307          0x7e,                          /* src_mask */
308          0x7e,                          /* dst_mask */
309          FALSE),                        /* pcrel_offset */
310
311   /* 8 bit offset from the tiny data area pointer.  */
312   HOWTO (R_V850_TDA_7_8_OFFSET,         /* type */
313          1,                             /* rightshift */
314          1,                             /* size (0 = byte, 1 = short, 2 = long) */
315          8,                             /* bitsize */
316          FALSE,                         /* pc_relative */
317          0,                             /* bitpos */
318          complain_overflow_dont,        /* complain_on_overflow */
319          v850_elf_reloc,                /* special_function */
320          "R_V850_TDA_7_8_OFFSET",       /* name */
321          FALSE,                         /* partial_inplace */
322          0x7f,                          /* src_mask */
323          0x7f,                          /* dst_mask */
324          FALSE),                        /* pcrel_offset */
325
326   /* 7 bit offset from the tiny data area pointer.  */
327   HOWTO (R_V850_TDA_7_7_OFFSET,         /* type */
328          0,                             /* rightshift */
329          1,                             /* size (0 = byte, 1 = short, 2 = long) */
330          7,                             /* bitsize */
331          FALSE,                         /* pc_relative */
332          0,                             /* bitpos */
333          complain_overflow_dont,        /* complain_on_overflow */
334          v850_elf_reloc,                /* special_function */
335          "R_V850_TDA_7_7_OFFSET",       /* name */
336          FALSE,                         /* partial_inplace */
337          0x7f,                          /* src_mask */
338          0x7f,                          /* dst_mask */
339          FALSE),                        /* pcrel_offset */
340
341   /* 16 bit offset from the tiny data area pointer!  */
342   HOWTO (R_V850_TDA_16_16_OFFSET,       /* type */
343          0,                             /* rightshift */
344          1,                             /* size (0 = byte, 1 = short, 2 = long) */
345          16,                            /* bitsize */
346          FALSE,                         /* pc_relative */
347          0,                             /* bitpos */
348          complain_overflow_dont,        /* complain_on_overflow */
349          v850_elf_reloc,                /* special_function */
350          "R_V850_TDA_16_16_OFFSET",     /* name */
351          FALSE,                         /* partial_inplace */
352          0xffff,                        /* src_mask */
353          0xfff,                         /* dst_mask */
354          FALSE),                        /* pcrel_offset */
355
356   /* 5 bit offset from the tiny data area pointer.  */
357   HOWTO (R_V850_TDA_4_5_OFFSET,         /* type */
358          1,                             /* rightshift */
359          1,                             /* size (0 = byte, 1 = short, 2 = long) */
360          5,                             /* bitsize */
361          FALSE,                         /* pc_relative */
362          0,                             /* bitpos */
363          complain_overflow_dont,        /* complain_on_overflow */
364          v850_elf_reloc,                /* special_function */
365          "R_V850_TDA_4_5_OFFSET",       /* name */
366          FALSE,                         /* partial_inplace */
367          0x0f,                          /* src_mask */
368          0x0f,                          /* dst_mask */
369          FALSE),                        /* pcrel_offset */
370
371   /* 4 bit offset from the tiny data area pointer.  */
372   HOWTO (R_V850_TDA_4_4_OFFSET,         /* type */
373          0,                             /* rightshift */
374          1,                             /* size (0 = byte, 1 = short, 2 = long) */
375          4,                             /* bitsize */
376          FALSE,                         /* pc_relative */
377          0,                             /* bitpos */
378          complain_overflow_dont,        /* complain_on_overflow */
379          v850_elf_reloc,                /* special_function */
380          "R_V850_TDA_4_4_OFFSET",       /* name */
381          FALSE,                         /* partial_inplace */
382          0x0f,                          /* src_mask */
383          0x0f,                          /* dst_mask */
384          FALSE),                        /* pcrel_offset */
385
386   /* 16 bit offset from the short data area pointer.  */
387   HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET, /* type */
388          0,                             /* rightshift */
389          2,                             /* size (0 = byte, 1 = short, 2 = long) */
390          16,                            /* bitsize */
391          FALSE,                         /* pc_relative */
392          0,                             /* bitpos */
393          complain_overflow_dont,        /* complain_on_overflow */
394          v850_elf_reloc,                /* special_function */
395          "R_V850_SDA_16_16_SPLIT_OFFSET",/* name */
396          FALSE,                         /* partial_inplace */
397          0xfffe0020,                    /* src_mask */
398          0xfffe0020,                    /* dst_mask */
399          FALSE),                        /* pcrel_offset */
400
401   /* 16 bit offset from the zero data area pointer.  */
402   HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET, /* type */
403          0,                             /* rightshift */
404          2,                             /* size (0 = byte, 1 = short, 2 = long) */
405          16,                            /* bitsize */
406          FALSE,                         /* pc_relative */
407          0,                             /* bitpos */
408          complain_overflow_dont,        /* complain_on_overflow */
409          v850_elf_reloc,                /* special_function */
410          "R_V850_ZDA_16_16_SPLIT_OFFSET",/* name */
411          FALSE,                         /* partial_inplace */
412          0xfffe0020,                    /* src_mask */
413          0xfffe0020,                    /* dst_mask */
414          FALSE),                        /* pcrel_offset */
415
416   /* 6 bit offset from the call table base pointer.  */
417   HOWTO (R_V850_CALLT_6_7_OFFSET,       /* type */
418          0,                             /* rightshift */
419          1,                             /* size (0 = byte, 1 = short, 2 = long) */
420          7,                             /* bitsize */
421          FALSE,                         /* pc_relative */
422          0,                             /* bitpos */
423          complain_overflow_dont,        /* complain_on_overflow */
424          v850_elf_reloc,                /* special_function */
425          "R_V850_CALLT_6_7_OFFSET",     /* name */
426          FALSE,                         /* partial_inplace */
427          0x3f,                          /* src_mask */
428          0x3f,                          /* dst_mask */
429          FALSE),                        /* pcrel_offset */
430
431   /* 16 bit offset from the call table base pointer.  */
432   HOWTO (R_V850_CALLT_16_16_OFFSET,     /* type */
433          0,                             /* rightshift */
434          1,                             /* size (0 = byte, 1 = short, 2 = long) */
435          16,                            /* bitsize */
436          FALSE,                         /* pc_relative */
437          0,                             /* bitpos */
438          complain_overflow_dont,        /* complain_on_overflow */
439          v850_elf_reloc,                /* special_function */
440          "R_V850_CALLT_16_16_OFFSET",   /* name */
441          FALSE,                         /* partial_inplace */
442          0xffff,                        /* src_mask */
443          0xffff,                        /* dst_mask */
444          FALSE),                        /* pcrel_offset */
445
446   /* GNU extension to record C++ vtable hierarchy */
447   HOWTO (R_V850_GNU_VTINHERIT, /* type */
448          0,                     /* rightshift */
449          2,                     /* size (0 = byte, 1 = short, 2 = long) */
450          0,                     /* bitsize */
451          FALSE,                 /* pc_relative */
452          0,                     /* bitpos */
453          complain_overflow_dont, /* complain_on_overflow */
454          NULL,                  /* special_function */
455          "R_V850_GNU_VTINHERIT", /* name */
456          FALSE,                 /* partial_inplace */
457          0,                     /* src_mask */
458          0,                     /* dst_mask */
459          FALSE),                /* pcrel_offset */
460
461   /* GNU extension to record C++ vtable member usage */
462   HOWTO (R_V850_GNU_VTENTRY,     /* type */
463          0,                     /* rightshift */
464          2,                     /* size (0 = byte, 1 = short, 2 = long) */
465          0,                     /* bitsize */
466          FALSE,                 /* pc_relative */
467          0,                     /* bitpos */
468          complain_overflow_dont, /* complain_on_overflow */
469          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
470          "R_V850_GNU_VTENTRY",   /* name */
471          FALSE,                 /* partial_inplace */
472          0,                     /* src_mask */
473          0,                     /* dst_mask */
474          FALSE),                /* pcrel_offset */
475
476   /* Indicates a .longcall pseudo-op.  The compiler will generate a .longcall
477      pseudo-op when it finds a function call which can be relaxed.  */
478   HOWTO (R_V850_LONGCALL,     /* type */
479        0,                     /* rightshift */
480        2,                     /* size (0 = byte, 1 = short, 2 = long) */
481        32,                    /* bitsize */
482        TRUE,                  /* pc_relative */
483        0,                     /* bitpos */
484        complain_overflow_signed, /* complain_on_overflow */
485        v850_elf_ignore_reloc, /* special_function */
486        "R_V850_LONGCALL",     /* name */
487        FALSE,                 /* partial_inplace */
488        0,                     /* src_mask */
489        0,                     /* dst_mask */
490        TRUE),                 /* pcrel_offset */
491
492   /* Indicates a .longjump pseudo-op.  The compiler will generate a
493      .longjump pseudo-op when it finds a branch which can be relaxed.  */
494   HOWTO (R_V850_LONGJUMP,     /* type */
495        0,                     /* rightshift */
496        2,                     /* size (0 = byte, 1 = short, 2 = long) */
497        32,                    /* bitsize */
498        TRUE,                  /* pc_relative */
499        0,                     /* bitpos */
500        complain_overflow_signed, /* complain_on_overflow */
501        v850_elf_ignore_reloc, /* special_function */
502        "R_V850_LONGJUMP",     /* name */
503        FALSE,                 /* partial_inplace */
504        0,                     /* src_mask */
505        0,                     /* dst_mask */
506        TRUE),                 /* pcrel_offset */
507
508   HOWTO (R_V850_ALIGN,        /* type */
509        0,                     /* rightshift */
510        1,                     /* size (0 = byte, 1 = short, 2 = long) */
511        0,                     /* bitsize */
512        FALSE,                 /* pc_relative */
513        0,                     /* bitpos */
514        complain_overflow_unsigned, /* complain_on_overflow */
515        v850_elf_ignore_reloc, /* special_function */
516        "R_V850_ALIGN",        /* name */
517        FALSE,                 /* partial_inplace */
518        0,                     /* src_mask */
519        0,                     /* dst_mask */
520        TRUE),                 /* pcrel_offset */
521   
522   /* Simple pc-relative 32bit reloc.  */
523   HOWTO (R_V850_REL32,                  /* type */
524          0,                             /* rightshift */
525          2,                             /* size (0 = byte, 1 = short, 2 = long) */
526          32,                            /* bitsize */
527          TRUE,                          /* pc_relative */
528          0,                             /* bitpos */
529          complain_overflow_dont,        /* complain_on_overflow */
530          v850_elf_reloc,                /* special_function */
531          "R_V850_REL32",                /* name */
532          FALSE,                         /* partial_inplace */
533          0xffffffff,                    /* src_mask */
534          0xffffffff,                    /* dst_mask */
535          FALSE),                        /* pcrel_offset */
536 };
537
538 /* Map BFD reloc types to V850 ELF reloc types.  */
539
540 struct v850_elf_reloc_map
541 {
542   /* BFD_RELOC_V850_CALLT_16_16_OFFSET is 258, which will not fix in an
543      unsigned char.  */
544   bfd_reloc_code_real_type bfd_reloc_val;
545   unsigned int elf_reloc_val;
546 };
547
548 static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
549 {
550   { BFD_RELOC_NONE,                        R_V850_NONE                   },
551   { BFD_RELOC_V850_9_PCREL,                R_V850_9_PCREL                },
552   { BFD_RELOC_V850_22_PCREL,               R_V850_22_PCREL               },
553   { BFD_RELOC_HI16_S,                      R_V850_HI16_S                 },
554   { BFD_RELOC_HI16,                        R_V850_HI16                   },
555   { BFD_RELOC_LO16,                        R_V850_LO16                   },
556   { BFD_RELOC_32,                          R_V850_ABS32                  },
557   { BFD_RELOC_32_PCREL,                    R_V850_REL32                  },
558   { BFD_RELOC_16,                          R_V850_16                     },
559   { BFD_RELOC_8,                           R_V850_8                      },
560   { BFD_RELOC_V850_SDA_16_16_OFFSET,       R_V850_SDA_16_16_OFFSET       },
561   { BFD_RELOC_V850_SDA_15_16_OFFSET,       R_V850_SDA_15_16_OFFSET       },
562   { BFD_RELOC_V850_ZDA_16_16_OFFSET,       R_V850_ZDA_16_16_OFFSET       },
563   { BFD_RELOC_V850_ZDA_15_16_OFFSET,       R_V850_ZDA_15_16_OFFSET       },
564   { BFD_RELOC_V850_TDA_6_8_OFFSET,         R_V850_TDA_6_8_OFFSET         },
565   { BFD_RELOC_V850_TDA_7_8_OFFSET,         R_V850_TDA_7_8_OFFSET         },
566   { BFD_RELOC_V850_TDA_7_7_OFFSET,         R_V850_TDA_7_7_OFFSET         },
567   { BFD_RELOC_V850_TDA_16_16_OFFSET,       R_V850_TDA_16_16_OFFSET       },
568   { BFD_RELOC_V850_TDA_4_5_OFFSET,         R_V850_TDA_4_5_OFFSET         },
569   { BFD_RELOC_V850_TDA_4_4_OFFSET,         R_V850_TDA_4_4_OFFSET         },
570   { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, R_V850_SDA_16_16_SPLIT_OFFSET },
571   { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, R_V850_ZDA_16_16_SPLIT_OFFSET },
572   { BFD_RELOC_V850_CALLT_6_7_OFFSET,       R_V850_CALLT_6_7_OFFSET       },
573   { BFD_RELOC_V850_CALLT_16_16_OFFSET,     R_V850_CALLT_16_16_OFFSET     },
574   { BFD_RELOC_VTABLE_INHERIT,              R_V850_GNU_VTINHERIT          },
575   { BFD_RELOC_VTABLE_ENTRY,                R_V850_GNU_VTENTRY            },
576   { BFD_RELOC_V850_LONGCALL,               R_V850_LONGCALL               },
577   { BFD_RELOC_V850_LONGJUMP,               R_V850_LONGJUMP               },
578   { BFD_RELOC_V850_ALIGN,                  R_V850_ALIGN                  },
579
580 };
581 \f
582 /* Map a bfd relocation into the appropriate howto structure.  */
583
584 static reloc_howto_type *
585 v850_elf_reloc_type_lookup (abfd, code)
586      bfd *abfd ATTRIBUTE_UNUSED;
587      bfd_reloc_code_real_type code;
588 {
589   unsigned int i;
590
591   for (i = ARRAY_SIZE (v850_elf_reloc_map); i --;)
592     if (v850_elf_reloc_map[i].bfd_reloc_val == code)
593       {
594         unsigned int elf_reloc_val = v850_elf_reloc_map[i].elf_reloc_val;
595
596         BFD_ASSERT (v850_elf_howto_table[elf_reloc_val].type == elf_reloc_val);
597
598         return v850_elf_howto_table + elf_reloc_val;
599       }
600
601   return NULL;
602 }
603 \f
604 /* Set the howto pointer for an V850 ELF reloc.  */
605
606 static void
607 v850_elf_info_to_howto_rel (abfd, cache_ptr, dst)
608      bfd *abfd ATTRIBUTE_UNUSED;
609      arelent *cache_ptr;
610      Elf_Internal_Rela *dst;
611 {
612   unsigned int r_type;
613
614   r_type = ELF32_R_TYPE (dst->r_info);
615   BFD_ASSERT (r_type < (unsigned int) R_V850_max);
616   cache_ptr->howto = &v850_elf_howto_table[r_type];
617 }
618
619 /* Set the howto pointer for a V850 ELF reloc (type RELA).  */
620 static void
621 v850_elf_info_to_howto_rela (abfd, cache_ptr, dst)
622      bfd *abfd ATTRIBUTE_UNUSED;
623      arelent * cache_ptr;
624      Elf_Internal_Rela *dst;
625 {
626   unsigned int r_type;
627
628   r_type = ELF32_R_TYPE (dst->r_info);
629   BFD_ASSERT (r_type < (unsigned int) R_V850_max);
630   cache_ptr->howto = &v850_elf_howto_table[r_type];
631 }
632 \f
633 /* Look through the relocs for a section during the first phase, and
634    allocate space in the global offset table or procedure linkage
635    table.  */
636
637 static bfd_boolean
638 v850_elf_check_relocs (abfd, info, sec, relocs)
639      bfd *abfd;
640      struct bfd_link_info *info;
641      asection *sec;
642      const Elf_Internal_Rela *relocs;
643 {
644   bfd_boolean ret = TRUE;
645   bfd *dynobj;
646   Elf_Internal_Shdr *symtab_hdr;
647   struct elf_link_hash_entry **sym_hashes;
648   const Elf_Internal_Rela *rel;
649   const Elf_Internal_Rela *rel_end;
650   asection *sreloc;
651   enum v850_reloc_type r_type;
652   int other = 0;
653   const char *common = (const char *)0;
654
655   if (info->relocatable)
656     return TRUE;
657
658 #ifdef DEBUG
659   fprintf (stderr, "v850_elf_check_relocs called for section %s in %s\n",
660            bfd_get_section_name (abfd, sec),
661            bfd_archive_filename (abfd));
662 #endif
663
664   dynobj = elf_hash_table (info)->dynobj;
665   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
666   sym_hashes = elf_sym_hashes (abfd);
667   sreloc = NULL;
668
669   rel_end = relocs + sec->reloc_count;
670   for (rel = relocs; rel < rel_end; rel++)
671     {
672       unsigned long r_symndx;
673       struct elf_link_hash_entry *h;
674
675       r_symndx = ELF32_R_SYM (rel->r_info);
676       if (r_symndx < symtab_hdr->sh_info)
677         h = NULL;
678       else
679         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
680
681       r_type = (enum v850_reloc_type) ELF32_R_TYPE (rel->r_info);
682       switch (r_type)
683         {
684         default:
685         case R_V850_NONE:
686         case R_V850_9_PCREL:
687         case R_V850_22_PCREL:
688         case R_V850_HI16_S:
689         case R_V850_HI16:
690         case R_V850_LO16:
691         case R_V850_ABS32:
692         case R_V850_REL32:
693         case R_V850_16:
694         case R_V850_8:
695         case R_V850_CALLT_6_7_OFFSET:
696         case R_V850_CALLT_16_16_OFFSET:
697           break;
698
699         /* This relocation describes the C++ object vtable hierarchy.
700            Reconstruct it for later use during GC.  */
701         case R_V850_GNU_VTINHERIT:
702           if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
703             return FALSE;
704           break;
705
706         /* This relocation describes which C++ vtable entries
707            are actually used.  Record for later use during GC.  */
708         case R_V850_GNU_VTENTRY:
709           if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
710             return FALSE;
711           break;
712
713         case R_V850_SDA_16_16_SPLIT_OFFSET:
714         case R_V850_SDA_16_16_OFFSET:
715         case R_V850_SDA_15_16_OFFSET:
716           other = V850_OTHER_SDA;
717           common = ".scommon";
718           goto small_data_common;
719
720         case R_V850_ZDA_16_16_SPLIT_OFFSET:
721         case R_V850_ZDA_16_16_OFFSET:
722         case R_V850_ZDA_15_16_OFFSET:
723           other = V850_OTHER_ZDA;
724           common = ".zcommon";
725           goto small_data_common;
726
727         case R_V850_TDA_4_5_OFFSET:
728         case R_V850_TDA_4_4_OFFSET:
729         case R_V850_TDA_6_8_OFFSET:
730         case R_V850_TDA_7_8_OFFSET:
731         case R_V850_TDA_7_7_OFFSET:
732         case R_V850_TDA_16_16_OFFSET:
733           other = V850_OTHER_TDA;
734           common = ".tcommon";
735           /* fall through */
736
737 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
738
739         small_data_common:
740           if (h)
741             {
742               /* Flag which type of relocation was used.  */
743               h->other |= other;
744               if ((h->other & V850_OTHER_MASK) != (other & V850_OTHER_MASK)
745                   && (h->other & V850_OTHER_ERROR) == 0)
746                 {
747                   const char * msg;
748                   static char  buff[200]; /* XXX */
749
750                   switch (h->other & V850_OTHER_MASK)
751                     {
752                     default:
753                       msg = _("Variable `%s' cannot occupy in multiple small data regions");
754                       break;
755                     case V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA:
756                       msg = _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
757                       break;
758                     case V850_OTHER_SDA | V850_OTHER_ZDA:
759                       msg = _("Variable `%s' cannot be in both small and zero data regions simultaneously");
760                       break;
761                     case V850_OTHER_SDA | V850_OTHER_TDA:
762                       msg = _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
763                       break;
764                     case V850_OTHER_ZDA | V850_OTHER_TDA:
765                       msg = _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
766                       break;
767                     }
768
769                   sprintf (buff, msg, h->root.root.string);
770                   info->callbacks->warning (info, buff, h->root.root.string,
771                                             abfd, h->root.u.def.section,
772                                             (bfd_vma) 0);
773
774                   bfd_set_error (bfd_error_bad_value);
775                   h->other |= V850_OTHER_ERROR;
776                   ret = FALSE;
777                 }
778             }
779
780           if (h && h->root.type == bfd_link_hash_common
781               && h->root.u.c.p
782               && !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON"))
783             {
784               asection * section;
785
786               section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
787               section->flags |= SEC_IS_COMMON;
788             }
789
790 #ifdef DEBUG
791           fprintf (stderr, "v850_elf_check_relocs, found %s relocation for %s%s\n",
792                    v850_elf_howto_table[ (int)r_type ].name,
793                    (h && h->root.root.string) ? h->root.root.string : "<unknown>",
794                    (h->root.type == bfd_link_hash_common) ? ", symbol is common" : "");
795 #endif
796           break;
797         }
798     }
799
800   return ret;
801 }
802
803 /* In the old version, when an entry was checked out from the table,
804    it was deleted.  This produced an error if the entry was needed
805    more than once, as the second attempted retry failed.
806
807    In the current version, the entry is not deleted, instead we set
808    the field 'found' to TRUE.  If a second lookup matches the same
809    entry, then we know that the hi16s reloc has already been updated
810    and does not need to be updated a second time.
811
812    TODO - TOFIX: If it is possible that we need to restore 2 different
813    addresses from the same table entry, where the first generates an
814    overflow, whilst the second do not, then this code will fail.  */
815
816 typedef struct hi16s_location
817 {
818   bfd_vma addend;
819   bfd_byte *address;
820   unsigned long counter;
821   bfd_boolean found;
822   struct hi16s_location *next;
823 }
824 hi16s_location;
825
826 static hi16s_location *previous_hi16s;
827 static hi16s_location *free_hi16s;
828 static unsigned long hi16s_counter;
829
830 static void
831 remember_hi16s_reloc (abfd, addend, address)
832      bfd *abfd;
833      bfd_vma addend;
834      bfd_byte *address;
835 {
836   hi16s_location * entry = NULL;
837   bfd_size_type amt = sizeof (* free_hi16s);
838
839   /* Find a free structure.  */
840   if (free_hi16s == NULL)
841     free_hi16s = (hi16s_location *) bfd_zalloc (abfd, amt);
842
843   entry      = free_hi16s;
844   free_hi16s = free_hi16s->next;
845
846   entry->addend  = addend;
847   entry->address = address;
848   entry->counter = hi16s_counter ++;
849   entry->found   = FALSE;
850   entry->next    = previous_hi16s;
851   previous_hi16s = entry;
852
853   /* Cope with wrap around of our counter.  */
854   if (hi16s_counter == 0)
855     {
856       /* XXX - Assume that all counter entries differ only in their low 16 bits.  */
857       for (entry = previous_hi16s; entry != NULL; entry = entry->next)
858         entry->counter &= 0xffff;
859
860       hi16s_counter = 0x10000;
861     }
862
863   return;
864 }
865
866 static bfd_byte *
867 find_remembered_hi16s_reloc (addend, already_found)
868      bfd_vma addend;
869      bfd_boolean *already_found;
870 {
871   hi16s_location *match = NULL;
872   hi16s_location *entry;
873   hi16s_location *previous = NULL;
874   hi16s_location *prev;
875   bfd_byte *addr;
876
877   /* Search the table.  Record the most recent entry that matches.  */
878   for (entry = previous_hi16s; entry; entry = entry->next)
879     {
880       if (entry->addend == addend
881           && (match == NULL || match->counter < entry->counter))
882         {
883           previous = prev;
884           match    = entry;
885         }
886
887       prev = entry;
888     }
889
890   if (match == NULL)
891     return NULL;
892
893   /* Extract the address.  */
894   addr = match->address;
895
896   /* Remember if this entry has already been used before.  */
897   if (already_found)
898     * already_found = match->found;
899
900   /* Note that this entry has now been used.  */
901   match->found = TRUE;
902
903   return addr;
904 }
905
906 /* FIXME:  The code here probably ought to be removed and the code in reloc.c
907    allowed to do its stuff instead.  At least for most of the relocs, anyway.  */
908
909 static bfd_reloc_status_type
910 v850_elf_perform_relocation (abfd, r_type, addend, address)
911      bfd *abfd;
912      unsigned int r_type;
913      bfd_vma addend;
914      bfd_byte *address;
915 {
916   unsigned long insn;
917   bfd_signed_vma saddend = (bfd_signed_vma) addend;
918
919   switch (r_type)
920     {
921     default:
922       /* fprintf (stderr, "reloc type %d not SUPPORTED\n", r_type ); */
923       return bfd_reloc_notsupported;
924
925     case R_V850_REL32:
926     case R_V850_ABS32:
927       bfd_put_32 (abfd, addend, address);
928       return bfd_reloc_ok;
929
930     case R_V850_22_PCREL:
931       if (saddend > 0x1fffff || saddend < -0x200000)
932         return bfd_reloc_overflow;
933
934       if ((addend % 2) != 0)
935         return bfd_reloc_dangerous;
936
937       insn  = bfd_get_32 (abfd, address);
938       insn &= ~0xfffe003f;
939       insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
940       bfd_put_32 (abfd, (bfd_vma) insn, address);
941       return bfd_reloc_ok;
942
943     case R_V850_9_PCREL:
944       if (saddend > 0xff || saddend < -0x100)
945         return bfd_reloc_overflow;
946
947       if ((addend % 2) != 0)
948         return bfd_reloc_dangerous;
949
950       insn  = bfd_get_16 (abfd, address);
951       insn &= ~ 0xf870;
952       insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
953       break;
954
955     case R_V850_HI16:
956       addend += (bfd_get_16 (abfd, address) << 16);
957       addend = (addend >> 16);
958       insn = addend;
959       break;
960
961     case R_V850_HI16_S:
962       /* Remember where this relocation took place.  */
963       remember_hi16s_reloc (abfd, addend, address);
964
965       addend += (bfd_get_16 (abfd, address) << 16);
966       addend = (addend >> 16) + ((addend & 0x8000) != 0);
967
968       /* This relocation cannot overflow.  */
969       if (addend > 0x7fff)
970         addend = 0;
971
972       insn = addend;
973       break;
974
975     case R_V850_LO16:
976       /* Calculate the sum of the value stored in the instruction and the
977          addend and check for overflow from the low 16 bits into the high
978          16 bits.  The assembler has already done some of this:  If the
979          value stored in the instruction has its 15th bit set, (counting
980          from zero) then the assembler will have added 1 to the value
981          stored in the associated HI16S reloc.  So for example, these
982          relocations:
983
984              movhi hi( fred ), r0, r1
985              movea lo( fred ), r1, r1
986
987          will store 0 in the value fields for the MOVHI and MOVEA instructions
988          and addend will be the address of fred, but for these instructions:
989
990              movhi hi( fred + 0x123456), r0, r1
991              movea lo( fred + 0x123456), r1, r1
992
993          the value stored in the MOVHI instruction will be 0x12 and the value
994          stored in the MOVEA instruction will be 0x3456.  If however the
995          instructions were:
996
997              movhi hi( fred + 0x10ffff), r0, r1
998              movea lo( fred + 0x10ffff), r1, r1
999
1000          then the value stored in the MOVHI instruction would be 0x11 (not
1001          0x10) and the value stored in the MOVEA instruction would be 0xffff.
1002          Thus (assuming for the moment that the addend is 0), at run time the
1003          MOVHI instruction loads 0x110000 into r1, then the MOVEA instruction
1004          adds 0xffffffff (sign extension!) producing 0x10ffff.  Similarly if
1005          the instructions were:
1006
1007              movhi hi( fred - 1), r0, r1
1008              movea lo( fred - 1), r1, r1
1009
1010          then 0 is stored in the MOVHI instruction and -1 is stored in the
1011          MOVEA instruction.
1012
1013          Overflow can occur if the addition of the value stored in the
1014          instruction plus the addend sets the 15th bit when before it was clear.
1015          This is because the 15th bit will be sign extended into the high part,
1016          thus reducing its value by one, but since the 15th bit was originally
1017          clear, the assembler will not have added 1 to the previous HI16S reloc
1018          to compensate for this effect.  For example:
1019
1020             movhi hi( fred + 0x123456), r0, r1
1021             movea lo( fred + 0x123456), r1, r1
1022
1023          The value stored in HI16S reloc is 0x12, the value stored in the LO16
1024          reloc is 0x3456.  If we assume that the address of fred is 0x00007000
1025          then the relocations become:
1026
1027            HI16S: 0x0012 + (0x00007000 >> 16)    = 0x12
1028            LO16:  0x3456 + (0x00007000 & 0xffff) = 0xa456
1029
1030          but when the instructions are executed, the MOVEA instruction's value
1031          is signed extended, so the sum becomes:
1032
1033               0x00120000
1034             + 0xffffa456
1035             ------------
1036               0x0011a456    but 'fred + 0x123456' = 0x0012a456
1037
1038          Note that if the 15th bit was set in the value stored in the LO16
1039          reloc, then we do not have to do anything:
1040
1041             movhi hi( fred + 0x10ffff), r0, r1
1042             movea lo( fred + 0x10ffff), r1, r1
1043
1044             HI16S:  0x0011 + (0x00007000 >> 16)    = 0x11
1045             LO16:   0xffff + (0x00007000 & 0xffff) = 0x6fff
1046
1047               0x00110000
1048             + 0x00006fff
1049             ------------
1050               0x00116fff  = fred + 0x10ffff = 0x7000 + 0x10ffff
1051
1052          Overflow can also occur if the computation carries into the 16th bit
1053          and it also results in the 15th bit having the same value as the 15th
1054          bit of the original value.   What happens is that the HI16S reloc
1055          will have already examined the 15th bit of the original value and
1056          added 1 to the high part if the bit is set.  This compensates for the
1057          sign extension of 15th bit of the result of the computation.  But now
1058          there is a carry into the 16th bit, and this has not been allowed for.
1059
1060          So, for example if fred is at address 0xf000:
1061
1062            movhi hi( fred + 0xffff), r0, r1    [bit 15 of the offset is set]
1063            movea lo( fred + 0xffff), r1, r1
1064
1065            HI16S: 0x0001 + (0x0000f000 >> 16)    = 0x0001
1066            LO16:  0xffff + (0x0000f000 & 0xffff) = 0xefff   (carry into bit 16 is lost)
1067
1068              0x00010000
1069            + 0xffffefff
1070            ------------
1071              0x0000efff   but 'fred + 0xffff' = 0x0001efff
1072
1073          Similarly, if the 15th bit remains clear, but overflow occurs into
1074          the 16th bit then (assuming the address of fred is 0xf000):
1075
1076            movhi hi( fred + 0x7000), r0, r1    [bit 15 of the offset is clear]
1077            movea lo( fred + 0x7000), r1, r1
1078
1079            HI16S: 0x0000 + (0x0000f000 >> 16)    = 0x0000
1080            LO16:  0x7000 + (0x0000f000 & 0xffff) = 0x6fff  (carry into bit 16 is lost)
1081
1082              0x00000000
1083            + 0x00006fff
1084            ------------
1085              0x00006fff   but 'fred + 0x7000' = 0x00016fff
1086
1087          Note - there is no need to change anything if a carry occurs, and the
1088          15th bit changes its value from being set to being clear, as the HI16S
1089          reloc will have already added in 1 to the high part for us:
1090
1091            movhi hi( fred + 0xffff), r0, r1     [bit 15 of the offset is set]
1092            movea lo( fred + 0xffff), r1, r1
1093
1094            HI16S: 0x0001 + (0x00007000 >> 16)
1095            LO16:  0xffff + (0x00007000 & 0xffff) = 0x6fff  (carry into bit 16 is lost)
1096
1097              0x00010000
1098            + 0x00006fff   (bit 15 not set, so the top half is zero)
1099            ------------
1100              0x00016fff   which is right (assuming that fred is at 0x7000)
1101
1102          but if the 15th bit goes from being clear to being set, then we must
1103          once again handle overflow:
1104
1105            movhi hi( fred + 0x7000), r0, r1     [bit 15 of the offset is clear]
1106            movea lo( fred + 0x7000), r1, r1
1107
1108            HI16S: 0x0000 + (0x0000ffff >> 16)
1109            LO16:  0x7000 + (0x0000ffff & 0xffff) = 0x6fff  (carry into bit 16)
1110
1111              0x00000000
1112            + 0x00006fff   (bit 15 not set, so the top half is zero)
1113            ------------
1114              0x00006fff   which is wrong (assuming that fred is at 0xffff).  */
1115       {
1116         long result;
1117
1118         insn   = bfd_get_16 (abfd, address);
1119         result = insn + addend;
1120
1121 #define BIT15_SET(x) ((x) & 0x8000)
1122 #define OVERFLOWS(a,i) ((((a) & 0xffff) + (i)) > 0xffff)
1123
1124         if ((BIT15_SET (result) && ! BIT15_SET (addend))
1125             || (OVERFLOWS (addend, insn)
1126                 && ((! BIT15_SET (insn)) || (BIT15_SET (addend)))))
1127           {
1128             bfd_boolean already_updated;
1129             bfd_byte *hi16s_address = find_remembered_hi16s_reloc
1130               (addend, & already_updated);
1131
1132             /* Amend the matching HI16_S relocation.  */
1133             if (hi16s_address != NULL)
1134               {
1135                 if (! already_updated)
1136                   {
1137                     insn = bfd_get_16 (abfd, hi16s_address);
1138                     insn += 1;
1139                     bfd_put_16 (abfd, (bfd_vma) insn, hi16s_address);
1140                   }
1141               }
1142             else
1143               {
1144                 fprintf (stderr, _("FAILED to find previous HI16 reloc\n"));
1145                 return bfd_reloc_overflow;
1146               }
1147           }
1148
1149         /* Do not complain if value has top bit set, as this has been anticipated.  */
1150         insn = result & 0xffff;
1151         break;
1152       }
1153
1154     case R_V850_8:
1155       addend += (char) bfd_get_8 (abfd, address);
1156
1157       saddend = (bfd_signed_vma) addend;
1158
1159       if (saddend > 0x7f || saddend < -0x80)
1160         return bfd_reloc_overflow;
1161
1162       bfd_put_8 (abfd, addend, address);
1163       return bfd_reloc_ok;
1164
1165     case R_V850_CALLT_16_16_OFFSET:
1166       addend += bfd_get_16 (abfd, address);
1167
1168       saddend = (bfd_signed_vma) addend;
1169
1170       if (saddend > 0xffff || saddend < 0)
1171         return bfd_reloc_overflow;
1172
1173       insn = addend;
1174       break;
1175
1176     case R_V850_16:
1177
1178       /* drop through */
1179     case R_V850_SDA_16_16_OFFSET:
1180     case R_V850_ZDA_16_16_OFFSET:
1181     case R_V850_TDA_16_16_OFFSET:
1182       addend += bfd_get_16 (abfd, address);
1183
1184       saddend = (bfd_signed_vma) addend;
1185
1186       if (saddend > 0x7fff || saddend < -0x8000)
1187         return bfd_reloc_overflow;
1188
1189       insn = addend;
1190       break;
1191
1192     case R_V850_SDA_15_16_OFFSET:
1193     case R_V850_ZDA_15_16_OFFSET:
1194       insn = bfd_get_16 (abfd, address);
1195       addend += (insn & 0xfffe);
1196
1197       saddend = (bfd_signed_vma) addend;
1198
1199       if (saddend > 0x7ffe || saddend < -0x8000)
1200         return bfd_reloc_overflow;
1201
1202       if (addend & 1)
1203         return bfd_reloc_dangerous;
1204
1205       insn = (addend &~ (bfd_vma) 1) | (insn & 1);
1206       break;
1207
1208     case R_V850_TDA_6_8_OFFSET:
1209       insn = bfd_get_16 (abfd, address);
1210       addend += ((insn & 0x7e) << 1);
1211
1212       saddend = (bfd_signed_vma) addend;
1213
1214       if (saddend > 0xfc || saddend < 0)
1215         return bfd_reloc_overflow;
1216
1217       if (addend & 3)
1218         return bfd_reloc_dangerous;
1219
1220       insn &= 0xff81;
1221       insn |= (addend >> 1);
1222       break;
1223
1224     case R_V850_TDA_7_8_OFFSET:
1225       insn = bfd_get_16 (abfd, address);
1226       addend += ((insn & 0x7f) << 1);
1227
1228       saddend = (bfd_signed_vma) addend;
1229
1230       if (saddend > 0xfe || saddend < 0)
1231         return bfd_reloc_overflow;
1232
1233       if (addend & 1)
1234         return bfd_reloc_dangerous;
1235
1236       insn &= 0xff80;
1237       insn |= (addend >> 1);
1238       break;
1239
1240     case R_V850_TDA_7_7_OFFSET:
1241       insn = bfd_get_16 (abfd, address);
1242       addend += insn & 0x7f;
1243
1244       saddend = (bfd_signed_vma) addend;
1245
1246       if (saddend > 0x7f || saddend < 0)
1247         return bfd_reloc_overflow;
1248
1249       insn &= 0xff80;
1250       insn |= addend;
1251       break;
1252
1253     case R_V850_TDA_4_5_OFFSET:
1254       insn = bfd_get_16 (abfd, address);
1255       addend += ((insn & 0xf) << 1);
1256
1257       saddend = (bfd_signed_vma) addend;
1258
1259       if (saddend > 0x1e || saddend < 0)
1260         return bfd_reloc_overflow;
1261
1262       if (addend & 1)
1263         return bfd_reloc_dangerous;
1264
1265       insn &= 0xfff0;
1266       insn |= (addend >> 1);
1267       break;
1268
1269     case R_V850_TDA_4_4_OFFSET:
1270       insn = bfd_get_16 (abfd, address);
1271       addend += insn & 0xf;
1272
1273       saddend = (bfd_signed_vma) addend;
1274
1275       if (saddend > 0xf || saddend < 0)
1276         return bfd_reloc_overflow;
1277
1278       insn &= 0xfff0;
1279       insn |= addend;
1280       break;
1281
1282     case R_V850_ZDA_16_16_SPLIT_OFFSET:
1283     case R_V850_SDA_16_16_SPLIT_OFFSET:
1284       insn = bfd_get_32 (abfd, address);
1285       addend += ((insn & 0xfffe0000) >> 16) + ((insn & 0x20) >> 5);
1286
1287       saddend = (bfd_signed_vma) addend;
1288
1289       if (saddend > 0x7fff || saddend < -0x8000)
1290         return bfd_reloc_overflow;
1291
1292       insn &= 0x0001ffdf;
1293       insn |= (addend & 1) << 5;
1294       insn |= (addend &~ (bfd_vma) 1) << 16;
1295
1296       bfd_put_32 (abfd, (bfd_vma) insn, address);
1297       return bfd_reloc_ok;
1298
1299     case R_V850_CALLT_6_7_OFFSET:
1300       insn = bfd_get_16 (abfd, address);
1301       addend += ((insn & 0x3f) << 1);
1302
1303       saddend = (bfd_signed_vma) addend;
1304
1305       if (saddend > 0x7e || saddend < 0)
1306         return bfd_reloc_overflow;
1307
1308       if (addend & 1)
1309         return bfd_reloc_dangerous;
1310
1311       insn &= 0xff80;
1312       insn |= (addend >> 1);
1313       break;
1314
1315     case R_V850_GNU_VTINHERIT:
1316     case R_V850_GNU_VTENTRY:
1317       return bfd_reloc_ok;
1318
1319     }
1320
1321   bfd_put_16 (abfd, (bfd_vma) insn, address);
1322   return bfd_reloc_ok;
1323 }
1324 \f
1325 /* Insert the addend into the instruction.  */
1326
1327 static bfd_reloc_status_type
1328 v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
1329      bfd *abfd ATTRIBUTE_UNUSED;
1330      arelent *reloc;
1331      asymbol *symbol;
1332      PTR data ATTRIBUTE_UNUSED;
1333      asection *isection;
1334      bfd *obfd;
1335      char **err ATTRIBUTE_UNUSED;
1336 {
1337   long relocation;
1338
1339   /* If there is an output BFD,
1340      and the symbol is not a section name (which is only defined at final link time),
1341      and either we are not putting the addend into the instruction
1342       or the addend is zero, so there is nothing to add into the instruction
1343      then just fixup the address and return.  */
1344   if (obfd != (bfd *) NULL
1345       && (symbol->flags & BSF_SECTION_SYM) == 0
1346       && (! reloc->howto->partial_inplace
1347           || reloc->addend == 0))
1348     {
1349       reloc->address += isection->output_offset;
1350       return bfd_reloc_ok;
1351     }
1352
1353   /* Catch relocs involving undefined symbols.  */
1354   if (bfd_is_und_section (symbol->section)
1355       && (symbol->flags & BSF_WEAK) == 0
1356       && obfd == NULL)
1357     return bfd_reloc_undefined;
1358
1359   /* We handle final linking of some relocs ourselves.  */
1360
1361   /* Is the address of the relocation really within the section?  */
1362   if (reloc->address > isection->_cooked_size)
1363     return bfd_reloc_outofrange;
1364
1365   /* Work out which section the relocation is targeted at and the
1366      initial relocation command value.  */
1367
1368   if (reloc->howto->pc_relative)
1369     return bfd_reloc_ok;
1370
1371   /* Get symbol value.  (Common symbols are special.)  */
1372   if (bfd_is_com_section (symbol->section))
1373     relocation = 0;
1374   else
1375     relocation = symbol->value;
1376
1377   /* Convert input-section-relative symbol value to absolute + addend.  */
1378   relocation += symbol->section->output_section->vma;
1379   relocation += symbol->section->output_offset;
1380   relocation += reloc->addend;
1381
1382 #if 0 /* Since this reloc is going to be processed later on, we should
1383          not make it pc-relative here.  To test this, try assembling and
1384          linking this program:
1385
1386                 .text
1387                 .globl _start
1388                 nop
1389         _start:
1390                 jr foo
1391
1392                 .section ".foo","ax"
1393                 nop
1394         foo:
1395                 nop      */
1396   if (reloc->howto->pc_relative)
1397     {
1398       /* Here the variable relocation holds the final address of the
1399          symbol we are relocating against, plus any addend.  */
1400       relocation -= isection->output_section->vma + isection->output_offset;
1401
1402       /* Deal with pcrel_offset.  */
1403       relocation -= reloc->address;
1404     }
1405 #endif
1406   reloc->addend = relocation;
1407   return bfd_reloc_ok;
1408 }
1409
1410 /* This function is used for relocs which are only used
1411    for relaxing, which the linker should otherwise ignore.  */
1412
1413 static bfd_reloc_status_type
1414 v850_elf_ignore_reloc (abfd, reloc_entry, symbol, data, input_section,
1415                        output_bfd, error_message)
1416      bfd *abfd ATTRIBUTE_UNUSED;
1417      arelent *reloc_entry;
1418      asymbol *symbol ATTRIBUTE_UNUSED;
1419      PTR data ATTRIBUTE_UNUSED;
1420      asection *input_section;
1421      bfd *output_bfd;
1422      char **error_message ATTRIBUTE_UNUSED;
1423 {
1424   if (output_bfd != NULL)
1425     reloc_entry->address += input_section->output_offset;
1426
1427   return bfd_reloc_ok;
1428 }
1429 \f
1430 static bfd_boolean
1431 v850_elf_is_local_label_name (abfd, name)
1432      bfd *abfd ATTRIBUTE_UNUSED;
1433      const char *name;
1434 {
1435   return (   (name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
1436           || (name[0] == '_' &&  name[1] == '.' && name[2] == 'L' && name[3] == '_'));
1437 }
1438 \f
1439 /* We overload some of the bfd_reloc error codes for own purposes.  */
1440 #define bfd_reloc_gp_not_found          bfd_reloc_other
1441 #define bfd_reloc_ep_not_found          bfd_reloc_continue
1442 #define bfd_reloc_ctbp_not_found        (bfd_reloc_dangerous + 1)
1443
1444 /* Perform a relocation as part of a final link.  */
1445
1446 static bfd_reloc_status_type
1447 v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1448                               input_section, contents, offset, value,
1449                               addend, info, sym_sec, is_local)
1450      reloc_howto_type *howto;
1451      bfd *input_bfd;
1452      bfd *output_bfd ATTRIBUTE_UNUSED;
1453      asection *input_section;
1454      bfd_byte *contents;
1455      bfd_vma offset;
1456      bfd_vma value;
1457      bfd_vma addend;
1458      struct bfd_link_info *info;
1459      asection *sym_sec;
1460      int is_local ATTRIBUTE_UNUSED;
1461 {
1462   unsigned int r_type = howto->type;
1463   bfd_byte *hit_data = contents + offset;
1464
1465   /* Adjust the value according to the relocation.  */
1466   switch (r_type)
1467     {
1468     case R_V850_9_PCREL:
1469       value -= (input_section->output_section->vma
1470                 + input_section->output_offset);
1471       value -= offset;
1472       break;
1473
1474     case R_V850_22_PCREL:
1475       value -= (input_section->output_section->vma
1476                 + input_section->output_offset
1477                 + offset);
1478
1479       /* If the sign extension will corrupt the value then we have overflowed.  */
1480       if (((value & 0xff000000) != 0x0) && ((value & 0xff000000) != 0xff000000))
1481         return bfd_reloc_overflow;
1482
1483       /* Only the bottom 24 bits of the PC are valid */
1484       value = SEXT24 (value);
1485       break;
1486
1487     case R_V850_REL32:
1488       value -= (input_section->output_section->vma
1489                 + input_section->output_offset
1490                 + offset);
1491       break;
1492
1493     case R_V850_HI16_S:
1494     case R_V850_HI16:
1495     case R_V850_LO16:
1496     case R_V850_16:
1497     case R_V850_ABS32:
1498     case R_V850_8:
1499       break;
1500
1501     case R_V850_ZDA_15_16_OFFSET:
1502     case R_V850_ZDA_16_16_OFFSET:
1503     case R_V850_ZDA_16_16_SPLIT_OFFSET:
1504       if (sym_sec == NULL)
1505         return bfd_reloc_undefined;
1506
1507       value -= sym_sec->output_section->vma;
1508       break;
1509
1510     case R_V850_SDA_15_16_OFFSET:
1511     case R_V850_SDA_16_16_OFFSET:
1512     case R_V850_SDA_16_16_SPLIT_OFFSET:
1513       {
1514         unsigned long                gp;
1515         struct bfd_link_hash_entry * h;
1516
1517         if (sym_sec == NULL)
1518           return bfd_reloc_undefined;
1519
1520         /* Get the value of __gp.  */
1521         h = bfd_link_hash_lookup (info->hash, "__gp", FALSE, FALSE, TRUE);
1522         if (h == (struct bfd_link_hash_entry *) NULL
1523             || h->type != bfd_link_hash_defined)
1524           return bfd_reloc_gp_not_found;
1525
1526         gp = (h->u.def.value
1527               + h->u.def.section->output_section->vma
1528               + h->u.def.section->output_offset);
1529
1530         value -= sym_sec->output_section->vma;
1531         value -= (gp - sym_sec->output_section->vma);
1532       }
1533     break;
1534
1535     case R_V850_TDA_4_4_OFFSET:
1536     case R_V850_TDA_4_5_OFFSET:
1537     case R_V850_TDA_16_16_OFFSET:
1538     case R_V850_TDA_7_7_OFFSET:
1539     case R_V850_TDA_7_8_OFFSET:
1540     case R_V850_TDA_6_8_OFFSET:
1541       {
1542         unsigned long                ep;
1543         struct bfd_link_hash_entry * h;
1544
1545         /* Get the value of __ep.  */
1546         h = bfd_link_hash_lookup (info->hash, "__ep", FALSE, FALSE, TRUE);
1547         if (h == (struct bfd_link_hash_entry *) NULL
1548             || h->type != bfd_link_hash_defined)
1549           return bfd_reloc_ep_not_found;
1550
1551         ep = (h->u.def.value
1552               + h->u.def.section->output_section->vma
1553               + h->u.def.section->output_offset);
1554
1555         value -= ep;
1556       }
1557     break;
1558
1559     case R_V850_CALLT_6_7_OFFSET:
1560       {
1561         unsigned long                ctbp;
1562         struct bfd_link_hash_entry * h;
1563
1564         /* Get the value of __ctbp.  */
1565         h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1566         if (h == (struct bfd_link_hash_entry *) NULL
1567             || h->type != bfd_link_hash_defined)
1568           return bfd_reloc_ctbp_not_found;
1569
1570         ctbp = (h->u.def.value
1571               + h->u.def.section->output_section->vma
1572               + h->u.def.section->output_offset);
1573         value -= ctbp;
1574       }
1575     break;
1576
1577     case R_V850_CALLT_16_16_OFFSET:
1578       {
1579         unsigned long                ctbp;
1580         struct bfd_link_hash_entry * h;
1581
1582         if (sym_sec == NULL)
1583           return bfd_reloc_undefined;
1584
1585         /* Get the value of __ctbp.  */
1586         h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1587         if (h == (struct bfd_link_hash_entry *) NULL
1588             || h->type != bfd_link_hash_defined)
1589           return bfd_reloc_ctbp_not_found;
1590
1591         ctbp = (h->u.def.value
1592               + h->u.def.section->output_section->vma
1593               + h->u.def.section->output_offset);
1594
1595         value -= sym_sec->output_section->vma;
1596         value -= (ctbp - sym_sec->output_section->vma);
1597       }
1598     break;
1599
1600     case R_V850_NONE:
1601     case R_V850_GNU_VTINHERIT:
1602     case R_V850_GNU_VTENTRY:
1603     case R_V850_LONGCALL:
1604     case R_V850_LONGJUMP:
1605     case R_V850_ALIGN:
1606       return bfd_reloc_ok;
1607
1608     default:
1609       return bfd_reloc_notsupported;
1610     }
1611
1612   /* Perform the relocation.  */
1613   return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
1614 }
1615 \f
1616 /* Relocate an V850 ELF section.  */
1617
1618 static bfd_boolean
1619 v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1620                            contents, relocs, local_syms, local_sections)
1621      bfd *output_bfd;
1622      struct bfd_link_info *info;
1623      bfd *input_bfd;
1624      asection *input_section;
1625      bfd_byte *contents;
1626      Elf_Internal_Rela *relocs;
1627      Elf_Internal_Sym *local_syms;
1628      asection **local_sections;
1629 {
1630   Elf_Internal_Shdr *symtab_hdr;
1631   struct elf_link_hash_entry **sym_hashes;
1632   Elf_Internal_Rela *rel;
1633   Elf_Internal_Rela *relend;
1634
1635   if (info->relocatable)
1636     return TRUE;
1637
1638   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1639   sym_hashes = elf_sym_hashes (input_bfd);
1640
1641   if (sym_hashes == NULL)
1642     {
1643       info->callbacks->warning
1644         (info, "no hash table available",
1645          NULL, input_bfd, input_section, (bfd_vma) 0);
1646
1647       return FALSE;
1648     }
1649
1650   /* Reset the list of remembered HI16S relocs to empty.  */
1651   free_hi16s     = previous_hi16s;
1652   previous_hi16s = NULL;
1653   hi16s_counter  = 0;
1654
1655   rel    = relocs;
1656   relend = relocs + input_section->reloc_count;
1657   for (; rel < relend; rel++)
1658     {
1659       int r_type;
1660       reloc_howto_type *howto;
1661       unsigned long r_symndx;
1662       Elf_Internal_Sym *sym;
1663       asection *sec;
1664       struct elf_link_hash_entry *h;
1665       bfd_vma relocation;
1666       bfd_reloc_status_type r;
1667
1668       r_symndx = ELF32_R_SYM (rel->r_info);
1669       r_type   = ELF32_R_TYPE (rel->r_info);
1670
1671       if (r_type == R_V850_GNU_VTENTRY
1672           || r_type == R_V850_GNU_VTINHERIT)
1673         continue;
1674
1675       /* This is a final link.  */
1676       howto = v850_elf_howto_table + r_type;
1677       h = NULL;
1678       sym = NULL;
1679       sec = NULL;
1680       if (r_symndx < symtab_hdr->sh_info)
1681         {
1682           sym = local_syms + r_symndx;
1683           sec = local_sections[r_symndx];
1684           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1685 #if 0
1686           {
1687             char * name;
1688
1689             name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name);
1690             name = (name == NULL) ? "<none>" : name;
1691             fprintf (stderr, "local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
1692                      sec->name, name, sym->st_name,
1693                      sec->output_section->vma, sec->output_offset, sym->st_value, rel->r_addend);
1694           }
1695 #endif
1696         }
1697       else
1698         {
1699           bfd_boolean unresolved_reloc, warned;
1700
1701           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1702                                    r_symndx, symtab_hdr, sym_hashes,
1703                                    h, sec, relocation,
1704                                    unresolved_reloc, warned);
1705         }
1706
1707       /* FIXME: We should use the addend, but the COFF relocations don't.  */
1708       r = v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1709                                         input_section,
1710                                         contents, rel->r_offset,
1711                                         relocation, rel->r_addend,
1712                                         info, sec, h == NULL);
1713
1714       if (r != bfd_reloc_ok)
1715         {
1716           const char * name;
1717           const char * msg = (const char *)0;
1718
1719           if (h != NULL)
1720             name = h->root.root.string;
1721           else
1722             {
1723               name = (bfd_elf_string_from_elf_section
1724                       (input_bfd, symtab_hdr->sh_link, sym->st_name));
1725               if (name == NULL || *name == '\0')
1726                 name = bfd_section_name (input_bfd, sec);
1727             }
1728
1729           switch (r)
1730             {
1731             case bfd_reloc_overflow:
1732               if (! ((*info->callbacks->reloc_overflow)
1733                      (info, name, howto->name, (bfd_vma) 0,
1734                       input_bfd, input_section, rel->r_offset)))
1735                 return FALSE;
1736               break;
1737
1738             case bfd_reloc_undefined:
1739               if (! ((*info->callbacks->undefined_symbol)
1740                      (info, name, input_bfd, input_section,
1741                       rel->r_offset, TRUE)))
1742                 return FALSE;
1743               break;
1744
1745             case bfd_reloc_outofrange:
1746               msg = _("internal error: out of range error");
1747               goto common_error;
1748
1749             case bfd_reloc_notsupported:
1750               msg = _("internal error: unsupported relocation error");
1751               goto common_error;
1752
1753             case bfd_reloc_dangerous:
1754               msg = _("internal error: dangerous relocation");
1755               goto common_error;
1756
1757             case bfd_reloc_gp_not_found:
1758               msg = _("could not locate special linker symbol __gp");
1759               goto common_error;
1760
1761             case bfd_reloc_ep_not_found:
1762               msg = _("could not locate special linker symbol __ep");
1763               goto common_error;
1764
1765             case bfd_reloc_ctbp_not_found:
1766               msg = _("could not locate special linker symbol __ctbp");
1767               goto common_error;
1768
1769             default:
1770               msg = _("internal error: unknown error");
1771               /* fall through */
1772
1773             common_error:
1774               if (!((*info->callbacks->warning)
1775                     (info, msg, name, input_bfd, input_section,
1776                      rel->r_offset)))
1777                 return FALSE;
1778               break;
1779             }
1780         }
1781     }
1782
1783   return TRUE;
1784 }
1785
1786 static bfd_boolean
1787 v850_elf_gc_sweep_hook (abfd, info, sec, relocs)
1788      bfd *abfd ATTRIBUTE_UNUSED;
1789      struct bfd_link_info *info ATTRIBUTE_UNUSED;
1790      asection *sec ATTRIBUTE_UNUSED;
1791      const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
1792 {
1793   /* No got and plt entries for v850-elf.  */
1794   return TRUE;
1795 }
1796
1797 static asection *
1798 v850_elf_gc_mark_hook (sec, info, rel, h, sym)
1799        asection *sec;
1800        struct bfd_link_info *info ATTRIBUTE_UNUSED;
1801        Elf_Internal_Rela *rel;
1802        struct elf_link_hash_entry *h;
1803        Elf_Internal_Sym *sym;
1804 {
1805   if (h != NULL)
1806     {
1807       switch (ELF32_R_TYPE (rel->r_info))
1808       {
1809       case R_V850_GNU_VTINHERIT:
1810       case R_V850_GNU_VTENTRY:
1811         break;
1812
1813       default:
1814         switch (h->root.type)
1815           {
1816           case bfd_link_hash_defined:
1817           case bfd_link_hash_defweak:
1818             return h->root.u.def.section;
1819
1820           case bfd_link_hash_common:
1821             return h->root.u.c.p->section;
1822
1823           default:
1824             break;
1825           }
1826        }
1827      }
1828    else
1829      return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1830
1831   return NULL;
1832 }
1833
1834 /* Set the right machine number.  */
1835
1836 static bfd_boolean
1837 v850_elf_object_p (abfd)
1838      bfd *abfd;
1839 {
1840   switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1841     {
1842     default:
1843     case E_V850_ARCH:
1844       bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850);
1845       break;
1846     case E_V850E_ARCH:
1847       bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e);
1848       break;
1849     case E_V850E1_ARCH:
1850       bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e1);
1851       break;
1852     }
1853   return TRUE;
1854 }
1855
1856 /* Store the machine number in the flags field.  */
1857
1858 static void
1859 v850_elf_final_write_processing (abfd, linker)
1860      bfd *abfd;
1861      bfd_boolean linker ATTRIBUTE_UNUSED;
1862 {
1863   unsigned long val;
1864
1865   switch (bfd_get_mach (abfd))
1866     {
1867     default:
1868     case bfd_mach_v850:  val = E_V850_ARCH; break;
1869     case bfd_mach_v850e: val = E_V850E_ARCH; break;
1870     case bfd_mach_v850e1: val = E_V850E1_ARCH;  break;
1871     }
1872
1873   elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
1874   elf_elfheader (abfd)->e_flags |= val;
1875 }
1876
1877 /* Function to keep V850 specific file flags.  */
1878
1879 static bfd_boolean
1880 v850_elf_set_private_flags (abfd, flags)
1881      bfd *abfd;
1882      flagword flags;
1883 {
1884   BFD_ASSERT (!elf_flags_init (abfd)
1885               || elf_elfheader (abfd)->e_flags == flags);
1886
1887   elf_elfheader (abfd)->e_flags = flags;
1888   elf_flags_init (abfd) = TRUE;
1889   return TRUE;
1890 }
1891
1892 /* Merge backend specific data from an object file
1893    to the output object file when linking.  */
1894 static bfd_boolean
1895 v850_elf_merge_private_bfd_data (ibfd, obfd)
1896      bfd *ibfd;
1897      bfd *obfd;
1898 {
1899   flagword out_flags;
1900   flagword in_flags;
1901
1902   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1903       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1904     return TRUE;
1905
1906   in_flags = elf_elfheader (ibfd)->e_flags;
1907   out_flags = elf_elfheader (obfd)->e_flags;
1908
1909   if (! elf_flags_init (obfd))
1910     {
1911       /* If the input is the default architecture then do not
1912          bother setting the flags for the output architecture,
1913          instead allow future merges to do this.  If no future
1914          merges ever set these flags then they will retain their
1915          unitialised values, which surprise surprise, correspond
1916          to the default values.  */
1917       if (bfd_get_arch_info (ibfd)->the_default)
1918         return TRUE;
1919
1920       elf_flags_init (obfd) = TRUE;
1921       elf_elfheader (obfd)->e_flags = in_flags;
1922
1923       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1924           && bfd_get_arch_info (obfd)->the_default)
1925         return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
1926
1927       return TRUE;
1928     }
1929
1930   /* Check flag compatibility.  */
1931   if (in_flags == out_flags)
1932     return TRUE;
1933
1934   if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
1935       && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
1936     {
1937       /* Allow v850e1 binaries to be linked with v850e binaries.
1938          Set the output binary to v850e.  */
1939       if ((in_flags & EF_V850_ARCH) == E_V850E1_ARCH
1940           && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
1941         return TRUE;
1942
1943       if ((in_flags & EF_V850_ARCH) == E_V850E_ARCH
1944           && (out_flags & EF_V850_ARCH) == E_V850E1_ARCH)
1945         {
1946           elf_elfheader (obfd)->e_flags =
1947             ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
1948           return TRUE;
1949         }
1950
1951       _bfd_error_handler (_("%s: Architecture mismatch with previous modules"),
1952                           bfd_archive_filename (ibfd));
1953     }
1954
1955   return TRUE;
1956 }
1957
1958 /* Display the flags field.  */
1959
1960 static bfd_boolean
1961 v850_elf_print_private_bfd_data (abfd, ptr)
1962      bfd *abfd;
1963      PTR ptr;
1964 {
1965   FILE * file = (FILE *) ptr;
1966
1967   BFD_ASSERT (abfd != NULL && ptr != NULL);
1968
1969   _bfd_elf_print_private_bfd_data (abfd, ptr);
1970
1971   /* xgettext:c-format */
1972   fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
1973
1974   switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1975     {
1976     default:
1977     case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
1978     case E_V850E_ARCH:  fprintf (file, _("v850e architecture")); break;
1979     case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
1980     }
1981
1982   fputc ('\n', file);
1983
1984   return TRUE;
1985 }
1986
1987 /* V850 ELF uses four common sections.  One is the usual one, and the
1988    others are for (small) objects in one of the special data areas:
1989    small, tiny and zero.  All the objects are kept together, and then
1990    referenced via the gp register, the ep register or the r0 register
1991    respectively, which yields smaller, faster assembler code.  This
1992    approach is copied from elf32-mips.c.  */
1993
1994 static asection  v850_elf_scom_section;
1995 static asymbol   v850_elf_scom_symbol;
1996 static asymbol * v850_elf_scom_symbol_ptr;
1997 static asection  v850_elf_tcom_section;
1998 static asymbol   v850_elf_tcom_symbol;
1999 static asymbol * v850_elf_tcom_symbol_ptr;
2000 static asection  v850_elf_zcom_section;
2001 static asymbol   v850_elf_zcom_symbol;
2002 static asymbol * v850_elf_zcom_symbol_ptr;
2003
2004 /* Given a BFD section, try to locate the
2005    corresponding ELF section index.  */
2006
2007 static bfd_boolean
2008 v850_elf_section_from_bfd_section (abfd, sec, retval)
2009      bfd *abfd ATTRIBUTE_UNUSED;
2010      asection *sec;
2011      int *retval;
2012 {
2013   if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
2014     *retval = SHN_V850_SCOMMON;
2015   else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
2016     *retval = SHN_V850_TCOMMON;
2017   else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
2018     *retval = SHN_V850_ZCOMMON;
2019   else
2020     return FALSE;
2021
2022   return TRUE;
2023 }
2024
2025 /* Handle the special V850 section numbers that a symbol may use.  */
2026
2027 static void
2028 v850_elf_symbol_processing (abfd, asym)
2029      bfd *abfd;
2030      asymbol *asym;
2031 {
2032   elf_symbol_type * elfsym = (elf_symbol_type *) asym;
2033   unsigned int indx;
2034
2035   indx = elfsym->internal_elf_sym.st_shndx;
2036
2037   /* If the section index is an "ordinary" index, then it may
2038      refer to a v850 specific section created by the assembler.
2039      Check the section's type and change the index it matches.
2040
2041      FIXME: Should we alter the st_shndx field as well ?  */
2042
2043   if (indx < elf_numsections (abfd))
2044     switch (elf_elfsections(abfd)[indx]->sh_type)
2045       {
2046       case SHT_V850_SCOMMON:
2047         indx = SHN_V850_SCOMMON;
2048         break;
2049
2050       case SHT_V850_TCOMMON:
2051         indx = SHN_V850_TCOMMON;
2052         break;
2053
2054       case SHT_V850_ZCOMMON:
2055         indx = SHN_V850_ZCOMMON;
2056         break;
2057
2058       default:
2059         break;
2060       }
2061
2062   switch (indx)
2063     {
2064     case SHN_V850_SCOMMON:
2065       if (v850_elf_scom_section.name == NULL)
2066         {
2067           /* Initialize the small common section.  */
2068           v850_elf_scom_section.name           = ".scommon";
2069           v850_elf_scom_section.flags          = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
2070           v850_elf_scom_section.output_section = & v850_elf_scom_section;
2071           v850_elf_scom_section.symbol         = & v850_elf_scom_symbol;
2072           v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
2073           v850_elf_scom_symbol.name            = ".scommon";
2074           v850_elf_scom_symbol.flags           = BSF_SECTION_SYM;
2075           v850_elf_scom_symbol.section         = & v850_elf_scom_section;
2076           v850_elf_scom_symbol_ptr             = & v850_elf_scom_symbol;
2077         }
2078       asym->section = & v850_elf_scom_section;
2079       asym->value = elfsym->internal_elf_sym.st_size;
2080       break;
2081
2082     case SHN_V850_TCOMMON:
2083       if (v850_elf_tcom_section.name == NULL)
2084         {
2085           /* Initialize the tcommon section.  */
2086           v850_elf_tcom_section.name           = ".tcommon";
2087           v850_elf_tcom_section.flags          = SEC_IS_COMMON;
2088           v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
2089           v850_elf_tcom_section.symbol         = & v850_elf_tcom_symbol;
2090           v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
2091           v850_elf_tcom_symbol.name            = ".tcommon";
2092           v850_elf_tcom_symbol.flags           = BSF_SECTION_SYM;
2093           v850_elf_tcom_symbol.section         = & v850_elf_tcom_section;
2094           v850_elf_tcom_symbol_ptr             = & v850_elf_tcom_symbol;
2095         }
2096       asym->section = & v850_elf_tcom_section;
2097       asym->value = elfsym->internal_elf_sym.st_size;
2098       break;
2099
2100     case SHN_V850_ZCOMMON:
2101       if (v850_elf_zcom_section.name == NULL)
2102         {
2103           /* Initialize the zcommon section.  */
2104           v850_elf_zcom_section.name           = ".zcommon";
2105           v850_elf_zcom_section.flags          = SEC_IS_COMMON;
2106           v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
2107           v850_elf_zcom_section.symbol         = & v850_elf_zcom_symbol;
2108           v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
2109           v850_elf_zcom_symbol.name            = ".zcommon";
2110           v850_elf_zcom_symbol.flags           = BSF_SECTION_SYM;
2111           v850_elf_zcom_symbol.section         = & v850_elf_zcom_section;
2112           v850_elf_zcom_symbol_ptr             = & v850_elf_zcom_symbol;
2113         }
2114       asym->section = & v850_elf_zcom_section;
2115       asym->value = elfsym->internal_elf_sym.st_size;
2116       break;
2117     }
2118 }
2119
2120 /* Hook called by the linker routine which adds symbols from an object
2121    file.  We must handle the special v850 section numbers here.  */
2122
2123 static bfd_boolean
2124 v850_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2125      bfd *abfd;
2126      struct bfd_link_info *info ATTRIBUTE_UNUSED;
2127      Elf_Internal_Sym *sym;
2128      const char **namep ATTRIBUTE_UNUSED;
2129      flagword *flagsp ATTRIBUTE_UNUSED;
2130      asection **secp;
2131      bfd_vma *valp;
2132 {
2133   unsigned int indx = sym->st_shndx;
2134
2135   /* If the section index is an "ordinary" index, then it may
2136      refer to a v850 specific section created by the assembler.
2137      Check the section's type and change the index it matches.
2138
2139      FIXME: Should we alter the st_shndx field as well ?  */
2140
2141   if (indx < elf_numsections (abfd))
2142     switch (elf_elfsections(abfd)[indx]->sh_type)
2143       {
2144       case SHT_V850_SCOMMON:
2145         indx = SHN_V850_SCOMMON;
2146         break;
2147
2148       case SHT_V850_TCOMMON:
2149         indx = SHN_V850_TCOMMON;
2150         break;
2151
2152       case SHT_V850_ZCOMMON:
2153         indx = SHN_V850_ZCOMMON;
2154         break;
2155
2156       default:
2157         break;
2158       }
2159
2160   switch (indx)
2161     {
2162     case SHN_V850_SCOMMON:
2163       *secp = bfd_make_section_old_way (abfd, ".scommon");
2164       (*secp)->flags |= SEC_IS_COMMON;
2165       *valp = sym->st_size;
2166       break;
2167
2168     case SHN_V850_TCOMMON:
2169       *secp = bfd_make_section_old_way (abfd, ".tcommon");
2170       (*secp)->flags |= SEC_IS_COMMON;
2171       *valp = sym->st_size;
2172       break;
2173
2174     case SHN_V850_ZCOMMON:
2175       *secp = bfd_make_section_old_way (abfd, ".zcommon");
2176       (*secp)->flags |= SEC_IS_COMMON;
2177       *valp = sym->st_size;
2178       break;
2179     }
2180
2181   return TRUE;
2182 }
2183
2184 static bfd_boolean
2185 v850_elf_link_output_symbol_hook (info, name, sym, input_sec, h)
2186      struct bfd_link_info *info ATTRIBUTE_UNUSED;
2187      const char *name ATTRIBUTE_UNUSED;
2188      Elf_Internal_Sym *sym;
2189      asection *input_sec;
2190      struct elf_link_hash_entry *h ATTRIBUTE_UNUSED;
2191 {
2192   /* If we see a common symbol, which implies a relocatable link, then
2193      if a symbol was in a special common section in an input file, mark
2194      it as a special common in the output file.  */
2195
2196   if (sym->st_shndx == SHN_COMMON)
2197     {
2198       if (strcmp (input_sec->name, ".scommon") == 0)
2199         sym->st_shndx = SHN_V850_SCOMMON;
2200       else if (strcmp (input_sec->name, ".tcommon") == 0)
2201         sym->st_shndx = SHN_V850_TCOMMON;
2202       else if (strcmp (input_sec->name, ".zcommon") == 0)
2203         sym->st_shndx = SHN_V850_ZCOMMON;
2204     }
2205
2206   return TRUE;
2207 }
2208
2209 static bfd_boolean
2210 v850_elf_section_from_shdr (abfd, hdr, name)
2211      bfd *abfd;
2212      Elf_Internal_Shdr *hdr;
2213      const char *name;
2214 {
2215   /* There ought to be a place to keep ELF backend specific flags, but
2216      at the moment there isn't one.  We just keep track of the
2217      sections by their name, instead.  */
2218
2219   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
2220     return FALSE;
2221
2222   switch (hdr->sh_type)
2223     {
2224     case SHT_V850_SCOMMON:
2225     case SHT_V850_TCOMMON:
2226     case SHT_V850_ZCOMMON:
2227       if (! bfd_set_section_flags (abfd, hdr->bfd_section,
2228                                    (bfd_get_section_flags (abfd,
2229                                                            hdr->bfd_section)
2230                                     | SEC_IS_COMMON)))
2231         return FALSE;
2232     }
2233
2234   return TRUE;
2235 }
2236
2237 /* Set the correct type for a V850 ELF section.  We do this
2238    by the section name, which is a hack, but ought to work.  */
2239
2240 static bfd_boolean
2241 v850_elf_fake_sections (abfd, hdr, sec)
2242      bfd *abfd ATTRIBUTE_UNUSED;
2243      Elf_Internal_Shdr *hdr;
2244      asection *sec;
2245 {
2246   register const char * name;
2247
2248   name = bfd_get_section_name (abfd, sec);
2249
2250   if (strcmp (name, ".scommon") == 0)
2251     {
2252       hdr->sh_type = SHT_V850_SCOMMON;
2253     }
2254   else if (strcmp (name, ".tcommon") == 0)
2255     {
2256       hdr->sh_type = SHT_V850_TCOMMON;
2257     }
2258   else if (strcmp (name, ".zcommon") == 0)
2259     hdr->sh_type = SHT_V850_ZCOMMON;
2260
2261   return TRUE;
2262 }
2263
2264 /* Delete some bytes from a section while relaxing.  */
2265
2266 static bfd_boolean
2267 v850_elf_relax_delete_bytes (abfd, sec, addr, toaddr, count)
2268      bfd *abfd;
2269      asection *sec;
2270      bfd_vma addr;
2271      bfd_vma toaddr;
2272      int count;
2273 {
2274   Elf_Internal_Shdr *symtab_hdr;
2275   Elf32_External_Sym *extsyms;
2276   Elf32_External_Sym *esym;
2277   Elf32_External_Sym *esymend;
2278   int index;
2279   unsigned int sec_shndx;
2280   bfd_byte *contents;
2281   Elf_Internal_Rela *irel;
2282   Elf_Internal_Rela *irelend;
2283   struct elf_link_hash_entry *sym_hash;
2284   Elf_Internal_Shdr *shndx_hdr;
2285   Elf_External_Sym_Shndx *shndx;
2286
2287   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2288   extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
2289
2290   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2291
2292   contents = elf_section_data (sec)->this_hdr.contents;
2293
2294   /* The deletion must stop at the next ALIGN reloc for an alignment
2295      power larger than the number of bytes we are deleting.  */
2296
2297   /* Actually delete the bytes.  */
2298 #if (DEBUG_RELAX & 2)
2299   fprintf (stderr, "relax_delete: contents: sec: %s  %p .. %p %x\n",
2300            sec->name, addr, toaddr, count );
2301 #endif
2302   memmove (contents + addr, contents + addr + count,
2303            toaddr - addr - count);
2304   memset (contents + toaddr-count, 0, count);
2305
2306   /* Adjust all the relocs.  */
2307   irel = elf_section_data (sec)->relocs;
2308   irelend = irel + sec->reloc_count;
2309   shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
2310   shndx = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
2311
2312   for (; irel < irelend; irel++)
2313     {
2314       bfd_vma raddr, paddr, symval;
2315       Elf_Internal_Sym isym;
2316
2317       /* Get the new reloc address.  */
2318       raddr = irel->r_offset;
2319       if ((raddr >= (addr + count) && raddr < toaddr))
2320         irel->r_offset -= count;
2321
2322       if (raddr >= addr && raddr < addr + count)
2323         {
2324           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2325                                        (int) R_V850_NONE);
2326           continue;
2327         }
2328
2329       if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN)
2330         continue;
2331
2332       bfd_elf32_swap_symbol_in (abfd,
2333                                 extsyms + ELF32_R_SYM (irel->r_info),
2334                                 shndx ? shndx + ELF32_R_SYM (irel->r_info) : NULL,
2335                                 & isym);
2336
2337       if (isym.st_shndx != sec_shndx)
2338         continue;
2339
2340       /* Get the value of the symbol referred to by the reloc.  */
2341       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2342         {
2343           symval = isym.st_value;
2344 #if (DEBUG_RELAX & 2)
2345           {
2346             char * name = bfd_elf_string_from_elf_section
2347                            (abfd, symtab_hdr->sh_link, isym.st_name);
2348             fprintf (stderr,
2349                "relax_delete: local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2350                sec->name, name, isym.st_name,
2351                sec->output_section->vma, sec->output_offset,
2352                isym.st_value, irel->r_addend);
2353           }
2354 #endif
2355         }
2356       else
2357         {
2358           unsigned long indx;
2359           struct elf_link_hash_entry * h;
2360
2361           /* An external symbol.  */
2362           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2363
2364           h = elf_sym_hashes (abfd) [indx];
2365           BFD_ASSERT (h != NULL);
2366
2367           symval = h->root.u.def.value;
2368 #if (DEBUG_RELAX & 2)
2369           fprintf (stderr,
2370                    "relax_delete: defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2371                    sec->name, h->root.root.string, h->root.u.def.value,
2372                    sec->output_section->vma, sec->output_offset, irel->r_addend);
2373 #endif
2374         }
2375
2376       paddr = symval + irel->r_addend;
2377
2378       if ( (symval >= addr + count && symval < toaddr)
2379           && (paddr < addr + count || paddr >= toaddr))
2380         irel->r_addend += count;
2381       else if (    (symval < addr + count || symval >= toaddr)
2382                 && (paddr >= addr + count && paddr < toaddr))
2383         irel->r_addend -= count;
2384     }
2385
2386   /* Adjust the local symbols defined in this section.  */
2387   esym = extsyms;
2388   esymend = esym + symtab_hdr->sh_info;
2389
2390   for (; esym < esymend; esym++, shndx = (shndx ? shndx + 1 : NULL))
2391     {
2392       Elf_Internal_Sym isym;
2393
2394       bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2395
2396       if (isym.st_shndx == sec_shndx
2397           && isym.st_value >= addr + count
2398           && isym.st_value < toaddr)
2399         {
2400           isym.st_value -= count;
2401
2402           if (isym.st_value + isym.st_size >= toaddr)
2403             isym.st_size += count;
2404
2405           bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2406         }
2407       else if (isym.st_shndx == sec_shndx
2408                && isym.st_value < addr + count)
2409         {
2410           if (isym.st_value+isym.st_size >= addr + count
2411               && isym.st_value+isym.st_size < toaddr)
2412             isym.st_size -= count;
2413
2414           if (isym.st_value >= addr
2415               && isym.st_value <  addr + count)
2416             isym.st_value = addr;
2417
2418           bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2419         }
2420     }
2421
2422   /* Now adjust the global symbols defined in this section.  */
2423   esym = extsyms + symtab_hdr->sh_info;
2424   esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
2425
2426   for (index = 0; esym < esymend; esym ++, index ++)
2427     {
2428       Elf_Internal_Sym isym;
2429
2430       bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2431       sym_hash = elf_sym_hashes (abfd) [index];
2432
2433       if (isym.st_shndx == sec_shndx
2434           && ((sym_hash)->root.type == bfd_link_hash_defined
2435               || (sym_hash)->root.type == bfd_link_hash_defweak)
2436           && (sym_hash)->root.u.def.section == sec
2437           && (sym_hash)->root.u.def.value >= addr + count
2438           && (sym_hash)->root.u.def.value < toaddr)
2439         {
2440           if ((sym_hash)->root.u.def.value + isym.st_size >= toaddr)
2441             {
2442               isym.st_size += count;
2443               bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2444             }
2445
2446           (sym_hash)->root.u.def.value -= count;
2447         }
2448       else if (isym.st_shndx == sec_shndx
2449                && ((sym_hash)->root.type == bfd_link_hash_defined
2450                    || (sym_hash)->root.type == bfd_link_hash_defweak)
2451                && (sym_hash)->root.u.def.section == sec
2452                && (sym_hash)->root.u.def.value < addr + count)
2453         {
2454           if ((sym_hash)->root.u.def.value+isym.st_size >= addr + count
2455               && (sym_hash)->root.u.def.value+isym.st_size < toaddr)
2456             isym.st_size -= count;
2457
2458           if ((sym_hash)->root.u.def.value >= addr
2459               && (sym_hash)->root.u.def.value < addr + count)
2460             (sym_hash)->root.u.def.value = addr;
2461
2462           bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2463         }
2464
2465       if (shndx)
2466         ++ shndx;
2467     }
2468
2469   return TRUE;
2470 }
2471
2472 #define NOP_OPCODE      (0x0000)
2473 #define MOVHI           0x0640                          /* 4byte */
2474 #define MOVHI_MASK      0x07e0
2475 #define MOVHI_R1(insn)  ((insn) & 0x1f)                 /* 4byte */
2476 #define MOVHI_R2(insn)  ((insn) >> 11)
2477 #define MOVEA           0x0620                          /* 2byte */
2478 #define MOVEA_MASK      0x07e0
2479 #define MOVEA_R1(insn)  ((insn) & 0x1f)
2480 #define MOVEA_R2(insn)  ((insn) >> 11)
2481 #define JARL_4          0x00040780                              /* 4byte */
2482 #define JARL_4_MASK     0xFFFF07FF
2483 #define JARL_R2(insn)   (int)(((insn) & (~JARL_4_MASK)) >> 11)
2484 #define ADD_I           0x0240                                  /* 2byte */
2485 #define ADD_I_MASK      0x07e0
2486 #define ADD_I5(insn)    ((((insn) & 0x001f) << 11) >> 11)       /* 2byte */
2487 #define ADD_R2(insn)    ((insn) >> 11)
2488 #define JMP_R           0x0060                                  /* 2byte */
2489 #define JMP_R_MASK      0xFFE0
2490 #define JMP_R1(insn)    ((insn) & 0x1f)
2491
2492 static bfd_boolean
2493 v850_elf_relax_section (abfd, sec, link_info, again)
2494      bfd *abfd;
2495      asection *sec;
2496      struct bfd_link_info *link_info;
2497      bfd_boolean *again;
2498 {
2499   Elf_Internal_Shdr *symtab_hdr;
2500   Elf_Internal_Rela *internal_relocs;
2501   Elf_Internal_Rela *irel;
2502   Elf_Internal_Rela *irelend;
2503   Elf_Internal_Rela *irelalign = NULL;
2504   Elf_Internal_Sym *isymbuf = NULL;
2505   bfd_byte *contents = NULL;
2506   bfd_vma addr = 0;
2507   bfd_vma toaddr;
2508   int align_pad_size = 0;
2509   bfd_boolean result = TRUE;
2510
2511   *again = FALSE;
2512
2513   if (link_info->relocatable
2514       || (sec->flags & SEC_RELOC) == 0
2515       || sec->reloc_count == 0)
2516     return TRUE;
2517
2518   /* If this is the first time we have been called
2519      for this section, initialize the cooked size.  */
2520   if (sec->_cooked_size == 0)
2521     sec->_cooked_size = sec->_raw_size;
2522
2523   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
2524
2525   internal_relocs = (_bfd_elf_link_read_relocs
2526                      (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
2527                       link_info->keep_memory));
2528   if (internal_relocs == NULL)
2529     goto error_return;
2530
2531   irelend = internal_relocs + sec->reloc_count;
2532
2533   while (addr < sec->_cooked_size)
2534     {
2535       toaddr = sec->_cooked_size;
2536
2537       for (irel = internal_relocs; irel < irelend; irel ++)
2538         if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
2539             && irel->r_offset > addr
2540             && irel->r_offset < toaddr)
2541           toaddr = irel->r_offset;
2542
2543 #ifdef DEBUG_RELAX
2544       fprintf (stderr, "relax region 0x%x to 0x%x align pad %d\n",
2545                addr, toaddr, align_pad_size);
2546 #endif
2547       if (irelalign)
2548         {
2549           bfd_vma alignto;
2550           bfd_vma alignmoveto;
2551
2552           alignmoveto = BFD_ALIGN (addr - align_pad_size, 1 << irelalign->r_addend);
2553           alignto = BFD_ALIGN (addr, 1 << irelalign->r_addend);
2554
2555           if (alignmoveto < alignto)
2556             {
2557               unsigned int i;
2558
2559               align_pad_size = alignto - alignmoveto;
2560 #ifdef DEBUG_RELAX
2561               fprintf (stderr, "relax move region 0x%x to 0x%x delete size 0x%x\n",
2562                        alignmoveto, toaddr, align_pad_size);
2563 #endif
2564               if (!v850_elf_relax_delete_bytes (abfd, sec, alignmoveto,
2565                                                 toaddr, align_pad_size))
2566                 goto error_return;
2567
2568               for (i  = BFD_ALIGN (toaddr - align_pad_size, 1);
2569                    (i + 1) < toaddr; i += 2)
2570                 bfd_put_16 (abfd, NOP_OPCODE, contents + i);
2571
2572               addr = alignmoveto;
2573             }
2574           else
2575             align_pad_size = 0;
2576         }
2577
2578       for (irel = internal_relocs; irel < irelend; irel++)
2579         {
2580           bfd_vma laddr;
2581           bfd_vma addend;
2582           bfd_vma symval;
2583           int insn[5];
2584           int no_match = -1;
2585           Elf_Internal_Rela *hi_irelfn;
2586           Elf_Internal_Rela *lo_irelfn;
2587           Elf_Internal_Rela *irelcall;
2588           bfd_signed_vma foff;
2589
2590           if (! (irel->r_offset >= addr && irel->r_offset < toaddr
2591                  && (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL
2592                      || ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)))
2593             continue;
2594
2595 #ifdef DEBUG_RELAX
2596           fprintf (stderr, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
2597                    irel->r_info,
2598                    irel->r_offset,
2599                    irel->r_addend );
2600 #endif
2601
2602           /* Get the section contents.  */
2603           if (contents == NULL)
2604             {
2605               if (elf_section_data (sec)->this_hdr.contents != NULL)
2606                 contents = elf_section_data (sec)->this_hdr.contents;
2607               else
2608                 {
2609                   contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
2610                   if (contents == NULL)
2611                     goto error_return;
2612
2613                   if (! bfd_get_section_contents (abfd, sec, contents,
2614                                                   (file_ptr) 0, sec->_raw_size))
2615                     goto error_return;
2616                 }
2617             }
2618
2619           /* Read this BFD's local symbols if we haven't done so already.  */
2620           if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2621             {
2622               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2623               if (isymbuf == NULL)
2624                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2625                                                 symtab_hdr->sh_info, 0,
2626                                                 NULL, NULL, NULL);
2627               if (isymbuf == NULL)
2628                 goto error_return;
2629             }
2630
2631           laddr = irel->r_offset;
2632
2633           if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL)
2634             {
2635               /* Check code for -mlong-calls output. */
2636               if (laddr + 16 <= (bfd_vma) sec->_raw_size)
2637                 {
2638                   insn[0] = bfd_get_16 (abfd, contents + laddr);
2639                   insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
2640                   insn[2] = bfd_get_32 (abfd, contents + laddr + 8);
2641                   insn[3] = bfd_get_16 (abfd, contents + laddr + 12);
2642                   insn[4] = bfd_get_16 (abfd, contents + laddr + 14);
2643
2644                   if ((insn[0] & MOVHI_MASK) != MOVHI
2645                        || MOVHI_R1 (insn[0]) != 0)
2646                     no_match = 0;
2647
2648                   if (no_match < 0
2649                       && ((insn[1] & MOVEA_MASK) != MOVEA
2650                            || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
2651                     no_match = 1;
2652
2653                   if (no_match < 0
2654                       && (insn[2] & JARL_4_MASK) != JARL_4)
2655                     no_match = 2;
2656
2657                   if (no_match < 0
2658                       && ((insn[3] & ADD_I_MASK) != ADD_I
2659                            || ADD_I5 (insn[3]) != 4
2660                            || JARL_R2 (insn[2]) != ADD_R2 (insn[3])))
2661                     no_match = 3;
2662
2663                   if (no_match < 0
2664                       && ((insn[4] & JMP_R_MASK) != JMP_R
2665                            || MOVEA_R2 (insn[1]) != JMP_R1 (insn[4])))
2666                     no_match = 4;
2667                 }
2668               else
2669                 {
2670                   ((*_bfd_error_handler)
2671                    ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insns",
2672                     bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2673
2674                   continue;
2675                 }
2676
2677               if (no_match >= 0)
2678                 {
2679                   ((*_bfd_error_handler)
2680                    ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insn 0x%x",
2681                     bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
2682
2683                   continue;
2684                 }
2685
2686               /* Get the reloc for the address from which the register is
2687                  being loaded.  This reloc will tell us which function is
2688                  actually being called.  */
2689               for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
2690                 if (hi_irelfn->r_offset == laddr + 2
2691                     && ELF32_R_TYPE (hi_irelfn->r_info)
2692                         == (int) R_V850_HI16_S)
2693                   break;
2694
2695               for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
2696                 if (lo_irelfn->r_offset == laddr + 6
2697                     && ELF32_R_TYPE (lo_irelfn->r_info)
2698                         == (int) R_V850_LO16)
2699                   break;
2700
2701               for (irelcall = internal_relocs; irelcall < irelend; irelcall ++)
2702                 if (irelcall->r_offset == laddr + 8
2703                     && ELF32_R_TYPE (irelcall->r_info)
2704                         == (int) R_V850_22_PCREL)
2705                   break;
2706
2707               if (   hi_irelfn == irelend
2708                   || lo_irelfn == irelend
2709                   || irelcall  == irelend)
2710                 {
2711                   ((*_bfd_error_handler)
2712                    ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc",
2713                     bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
2714
2715                   continue;
2716                 }
2717
2718               if (ELF32_R_SYM (irelcall->r_info) < symtab_hdr->sh_info)
2719                 {
2720                   Elf_Internal_Sym *  isym;
2721
2722                   /* A local symbol.  */
2723                   isym = isymbuf + ELF32_R_SYM (irelcall->r_info);
2724
2725                   symval = isym->st_value;
2726                 }
2727               else
2728                 {
2729                   unsigned long indx;
2730                   struct elf_link_hash_entry * h;
2731
2732                   /* An external symbol.  */
2733                   indx = ELF32_R_SYM (irelcall->r_info) - symtab_hdr->sh_info;
2734                   h = elf_sym_hashes (abfd)[indx];
2735                   BFD_ASSERT (h != NULL);
2736
2737                   if (   h->root.type != bfd_link_hash_defined
2738                       && h->root.type != bfd_link_hash_defweak)
2739                     /* This appears to be a reference to an undefined
2740                        symbol.  Just ignore it--it will be caught by the
2741                        regular reloc processing.  */
2742                     continue;
2743
2744                   symval = h->root.u.def.value;
2745                 }
2746
2747               if (symval + irelcall->r_addend != irelcall->r_offset + 4)
2748                 {
2749                   ((*_bfd_error_handler)
2750                    ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc 0x%lx",
2751                     bfd_get_filename (abfd), (unsigned long) irel->r_offset, irelcall->r_offset ));
2752
2753                   continue;
2754                 }
2755
2756               /* Get the value of the symbol referred to by the reloc.  */
2757               if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2758                 {
2759                   Elf_Internal_Sym *isym;
2760                   asection *sym_sec;
2761
2762                   /* A local symbol.  */
2763                   isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
2764
2765                   if (isym->st_shndx == SHN_UNDEF)
2766                     sym_sec = bfd_und_section_ptr;
2767                   else if (isym->st_shndx == SHN_ABS)
2768                     sym_sec = bfd_abs_section_ptr;
2769                   else if (isym->st_shndx == SHN_COMMON)
2770                     sym_sec = bfd_com_section_ptr;
2771                   else
2772                     sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2773                   symval = (isym->st_value
2774                             + sym_sec->output_section->vma
2775                             + sym_sec->output_offset);
2776                 }
2777               else
2778                 {
2779                   unsigned long indx;
2780                   struct elf_link_hash_entry *h;
2781
2782                   /* An external symbol.  */
2783                   indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
2784                   h = elf_sym_hashes (abfd)[indx];
2785                   BFD_ASSERT (h != NULL);
2786
2787                   if (   h->root.type != bfd_link_hash_defined
2788                       && h->root.type != bfd_link_hash_defweak)
2789                     /* This appears to be a reference to an undefined
2790                        symbol.  Just ignore it--it will be caught by the
2791                        regular reloc processing.  */
2792                     continue;
2793
2794                   symval = (h->root.u.def.value
2795                             + h->root.u.def.section->output_section->vma
2796                             + h->root.u.def.section->output_offset);
2797                 }
2798
2799               addend = irel->r_addend;
2800
2801               foff = (symval + addend
2802                       - (irel->r_offset
2803                          + sec->output_section->vma
2804                          + sec->output_offset
2805                          + 4));
2806 #ifdef DEBUG_RELAX
2807               fprintf (stderr, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2808                        irel->r_offset,
2809                        (irel->r_offset
2810                         + sec->output_section->vma
2811                         + sec->output_offset),
2812                        symval, addend, foff);
2813 #endif
2814
2815               if (foff < -0x100000 || foff >= 0x100000)
2816                 /* After all that work, we can't shorten this function call.  */
2817                 continue;
2818
2819               /* For simplicity of coding, we are going to modify the section
2820                  contents, the section relocs, and the BFD symbol table.  We
2821                  must tell the rest of the code not to free up this
2822                  information.  It would be possible to instead create a table
2823                  of changes which have to be made, as is done in coff-mips.c;
2824                  that would be more work, but would require less memory when
2825                  the linker is run.  */
2826               elf_section_data (sec)->relocs = internal_relocs;
2827               elf_section_data (sec)->this_hdr.contents = contents;
2828               symtab_hdr->contents = (bfd_byte *) isymbuf;
2829
2830               /* Replace the long call with a jarl.  */
2831               irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_22_PCREL);
2832
2833               addend = 0;
2834
2835               if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2836                 /* If this needs to be changed because of future relaxing,
2837                    it will be handled here like other internal IND12W
2838                    relocs.  */
2839                 bfd_put_32 (abfd,
2840                             0x00000780 | (JARL_R2 (insn[2])<<11) | ((addend << 16) & 0xffff) | ((addend >> 16) & 0xf),
2841                             contents + irel->r_offset);
2842               else
2843                 /* We can't fully resolve this yet, because the external
2844                    symbol value may be changed by future relaxing.
2845                    We let the final link phase handle it.  */
2846                 bfd_put_32 (abfd, 0x00000780 | (JARL_R2 (insn[2])<<11),
2847                             contents + irel->r_offset);
2848
2849               hi_irelfn->r_info =
2850                 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2851               lo_irelfn->r_info =
2852                 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2853               irelcall->r_info =
2854                 ELF32_R_INFO (ELF32_R_SYM (irelcall->r_info), R_V850_NONE);
2855
2856               if (! v850_elf_relax_delete_bytes (abfd, sec,
2857                                                  irel->r_offset + 4, toaddr, 12))
2858                 goto error_return;
2859
2860               align_pad_size += 12;
2861             }
2862           else if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)
2863             {
2864               /* Check code for -mlong-jumps output.  */
2865               if (laddr + 10 <= (bfd_vma) sec->_raw_size)
2866                 {
2867                   insn[0] = bfd_get_16 (abfd, contents + laddr);
2868                   insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
2869                   insn[2] = bfd_get_16 (abfd, contents + laddr + 8);
2870
2871                   if ((insn[0] & MOVHI_MASK) != MOVHI
2872                        || MOVHI_R1 (insn[0]) != 0)
2873                     no_match = 0;
2874
2875                   if (no_match < 0
2876                       && ((insn[1] & MOVEA_MASK) != MOVEA
2877                            || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
2878                     no_match = 1;
2879
2880                   if (no_match < 0
2881                       && ((insn[2] & JMP_R_MASK) != JMP_R
2882                            || MOVEA_R2 (insn[1]) != JMP_R1 (insn[2])))
2883                     no_match = 4;
2884                 }
2885               else
2886                 {
2887                   ((*_bfd_error_handler)
2888                    ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insns",
2889                     bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2890
2891                   continue;
2892                 }
2893
2894               if (no_match >= 0)
2895                 {
2896                   ((*_bfd_error_handler)
2897                    ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insn 0x%x",
2898                     bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
2899
2900                   continue;
2901                 }
2902
2903               /* Get the reloc for the address from which the register is
2904                  being loaded.  This reloc will tell us which function is
2905                  actually being called.  */
2906               for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
2907                 if (hi_irelfn->r_offset == laddr + 2
2908                     && ELF32_R_TYPE (hi_irelfn->r_info) == (int) R_V850_HI16_S)
2909                   break;
2910
2911               for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
2912                 if (lo_irelfn->r_offset == laddr + 6
2913                     && ELF32_R_TYPE (lo_irelfn->r_info) == (int) R_V850_LO16)
2914                   break;
2915
2916               if (   hi_irelfn == irelend
2917                   || lo_irelfn == irelend)
2918                 {
2919                   ((*_bfd_error_handler)
2920                    ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized reloc",
2921                     bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
2922
2923                   continue;
2924                 }
2925
2926               /* Get the value of the symbol referred to by the reloc.  */
2927               if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2928                 {
2929                   Elf_Internal_Sym *  isym;
2930                   asection *          sym_sec;
2931
2932                   /* A local symbol.  */
2933                   isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
2934
2935                   if (isym->st_shndx == SHN_UNDEF)
2936                     sym_sec = bfd_und_section_ptr;
2937                   else if (isym->st_shndx == SHN_ABS)
2938                     sym_sec = bfd_abs_section_ptr;
2939                   else if (isym->st_shndx == SHN_COMMON)
2940                     sym_sec = bfd_com_section_ptr;
2941                   else
2942                     sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2943                   symval = (isym->st_value
2944                             + sym_sec->output_section->vma
2945                             + sym_sec->output_offset);
2946 #ifdef DEBUG_RELAX
2947                   {
2948                     char * name = bfd_elf_string_from_elf_section
2949                       (abfd, symtab_hdr->sh_link, isym->st_name);
2950
2951                     fprintf (stderr, "relax long jump local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2952                              sym_sec->name, name, isym->st_name,
2953                              sym_sec->output_section->vma,
2954                              sym_sec->output_offset,
2955                              isym->st_value, irel->r_addend);
2956                   }
2957 #endif
2958                 }
2959               else
2960                 {
2961                   unsigned long indx;
2962                   struct elf_link_hash_entry * h;
2963
2964                   /* An external symbol.  */
2965                   indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2966                   h = elf_sym_hashes (abfd)[indx];
2967                   BFD_ASSERT (h != NULL);
2968
2969                   if (   h->root.type != bfd_link_hash_defined
2970                       && h->root.type != bfd_link_hash_defweak)
2971                     /* This appears to be a reference to an undefined
2972                        symbol.  Just ignore it--it will be caught by the
2973                        regular reloc processing.  */
2974                     continue;
2975
2976                   symval = (h->root.u.def.value
2977                             + h->root.u.def.section->output_section->vma
2978                             + h->root.u.def.section->output_offset);
2979 #ifdef DEBUG_RELAX
2980                   fprintf (stderr,
2981                            "relax longjump defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2982                            sec->name, h->root.root.string, h->root.u.def.value,
2983                            sec->output_section->vma, sec->output_offset, irel->r_addend);
2984 #endif
2985                 }
2986
2987               addend = irel->r_addend;
2988
2989               foff = (symval + addend
2990                       - (irel->r_offset
2991                          + sec->output_section->vma
2992                          + sec->output_offset
2993                          + 4));
2994 #ifdef DEBUG_RELAX
2995               fprintf (stderr, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2996                        irel->r_offset,
2997                        (irel->r_offset
2998                         + sec->output_section->vma
2999                         + sec->output_offset),
3000                        symval, addend, foff);
3001 #endif
3002               if (foff < -0x100000 || foff >= 0x100000)
3003                 /* After all that work, we can't shorten this function call.  */
3004                 continue;
3005
3006               /* For simplicity of coding, we are going to modify the section
3007                  contents, the section relocs, and the BFD symbol table.  We
3008                  must tell the rest of the code not to free up this
3009                  information.  It would be possible to instead create a table
3010                  of changes which have to be made, as is done in coff-mips.c;
3011                  that would be more work, but would require less memory when
3012                  the linker is run.  */
3013               elf_section_data (sec)->relocs = internal_relocs;
3014               elf_section_data (sec)->this_hdr.contents = contents;
3015               symtab_hdr->contents = (bfd_byte *) isymbuf;
3016
3017               if (foff < -0x100 || foff >= 0x100)
3018                 {
3019                   /* Replace the long jump with a jr.  */
3020
3021                   irel->r_info =
3022                     ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_22_PCREL);
3023
3024                   irel->r_addend = addend;
3025                   addend = 0;
3026
3027                   if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
3028                     /* If this needs to be changed because of future relaxing,
3029                        it will be handled here like other internal IND12W
3030                        relocs.  */
3031                     bfd_put_32 (abfd,
3032                                 0x00000780 | ((addend << 15) & 0xffff0000) | ((addend >> 17) & 0xf),
3033                                 contents + irel->r_offset);
3034                   else
3035                     /* We can't fully resolve this yet, because the external
3036                        symbol value may be changed by future relaxing.
3037                        We let the final link phase handle it.  */
3038                     bfd_put_32 (abfd, 0x00000780, contents + irel->r_offset);
3039
3040                   hi_irelfn->r_info =
3041                         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
3042                   lo_irelfn->r_info =
3043                         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
3044                   if (!v850_elf_relax_delete_bytes (abfd, sec,
3045                                                     irel->r_offset + 4, toaddr, 6))
3046                     goto error_return;
3047
3048                   align_pad_size += 6;
3049                 }
3050               else
3051                 {
3052                   /* Replace the long jump with a br.  */
3053
3054                   irel->r_info =
3055                         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_9_PCREL);
3056
3057                   irel->r_addend = addend;
3058                   addend = 0;
3059
3060                   if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
3061                     /* If this needs to be changed because of future relaxing,
3062                        it will be handled here like other internal IND12W
3063                        relocs.  */
3064                     bfd_put_16 (abfd,
3065                                 0x0585 | ((addend << 10) & 0xf800) | ((addend << 3) & 0x0070),
3066                                 contents + irel->r_offset);
3067                   else
3068                     /* We can't fully resolve this yet, because the external
3069                        symbol value may be changed by future relaxing.
3070                        We let the final link phase handle it.  */
3071                     bfd_put_16 (abfd, 0x0585, contents + irel->r_offset);
3072
3073                   hi_irelfn->r_info =
3074                         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
3075                   lo_irelfn->r_info =
3076                         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
3077                   if (!v850_elf_relax_delete_bytes (abfd, sec,
3078                                                     irel->r_offset + 2, toaddr, 8))
3079                     goto error_return;
3080
3081                   align_pad_size += 8;
3082                 }
3083             }
3084         }
3085
3086       irelalign = NULL;
3087       for (irel = internal_relocs; irel < irelend; irel++)
3088         {
3089           if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
3090               && irel->r_offset == toaddr)
3091             {
3092               irel->r_offset -= align_pad_size;
3093
3094               if (irelalign == NULL || irelalign->r_addend > irel->r_addend)
3095                 irelalign = irel;
3096             }
3097         }
3098
3099       addr = toaddr;
3100     }
3101
3102   if (!irelalign)
3103     {
3104 #ifdef DEBUG_RELAX
3105       fprintf (stderr, "relax pad %d shorten %d -> %d\n",
3106                align_pad_size,
3107                sec->_cooked_size,
3108                sec->_cooked_size - align_pad_size);
3109 #endif
3110       sec->_cooked_size -= align_pad_size;
3111     }
3112
3113  finish:
3114   if (internal_relocs != NULL
3115       && elf_section_data (sec)->relocs != internal_relocs)
3116     free (internal_relocs);
3117
3118   if (contents != NULL
3119       && elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents)
3120     free (contents);
3121
3122   if (isymbuf != NULL
3123       && symtab_hdr->contents != (bfd_byte *) isymbuf)
3124     free (isymbuf);
3125
3126   return result;
3127
3128  error_return:
3129   result = FALSE;
3130   goto finish;
3131 }
3132
3133 static struct bfd_elf_special_section const v850_elf_special_sections[]=
3134 {
3135   { ".sdata",            6, -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3136                                                    + SHF_V850_GPREL) },
3137   { ".rosdata",          8, -2, SHT_PROGBITS,     (SHF_ALLOC
3138                                                    + SHF_V850_GPREL) },
3139   { ".sbss",             5, -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3140                                                    + SHF_V850_GPREL) },
3141   { ".scommon",          8, -2, SHT_V850_SCOMMON, (SHF_ALLOC + SHF_WRITE
3142                                                    + SHF_V850_GPREL) },
3143   { ".tdata",            6, -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3144                                                    + SHF_V850_EPREL) },
3145   { ".tbss",             5, -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3146                                                    + SHF_V850_EPREL) },
3147   { ".tcommon",          8, -2, SHT_V850_TCOMMON, (SHF_ALLOC + SHF_WRITE
3148                                                    + SHF_V850_R0REL) },
3149   { ".zdata",            6, -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3150                                                    + SHF_V850_R0REL) },
3151   { ".rozdata",          8, -2, SHT_PROGBITS,     (SHF_ALLOC
3152                                                    + SHF_V850_R0REL) },
3153   { ".zbss",             5, -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3154                                                    + SHF_V850_R0REL) },
3155   { ".zcommon",          8, -2, SHT_V850_ZCOMMON, (SHF_ALLOC + SHF_WRITE
3156                                                    + SHF_V850_R0REL) },
3157   { ".call_table_data", 16,  0, SHT_PROGBITS,     (SHF_ALLOC
3158                                                    + SHF_WRITE) },
3159   { ".call_table_text", 16,  0, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3160                                                    + SHF_EXECINSTR) },
3161   { NULL,               0,   0, 0,                0 }
3162 };
3163 \f
3164 #define TARGET_LITTLE_SYM                       bfd_elf32_v850_vec
3165 #define TARGET_LITTLE_NAME                      "elf32-v850"
3166 #define ELF_ARCH                                bfd_arch_v850
3167 #define ELF_MACHINE_CODE                        EM_V850
3168 #define ELF_MACHINE_ALT1                        EM_CYGNUS_V850
3169 #define ELF_MAXPAGESIZE                         0x1000
3170
3171 #define elf_info_to_howto                       v850_elf_info_to_howto_rela
3172 #define elf_info_to_howto_rel                   v850_elf_info_to_howto_rel
3173
3174 #define elf_backend_check_relocs                v850_elf_check_relocs
3175 #define elf_backend_relocate_section            v850_elf_relocate_section
3176 #define elf_backend_object_p                    v850_elf_object_p
3177 #define elf_backend_final_write_processing      v850_elf_final_write_processing
3178 #define elf_backend_section_from_bfd_section    v850_elf_section_from_bfd_section
3179 #define elf_backend_symbol_processing           v850_elf_symbol_processing
3180 #define elf_backend_add_symbol_hook             v850_elf_add_symbol_hook
3181 #define elf_backend_link_output_symbol_hook     v850_elf_link_output_symbol_hook
3182 #define elf_backend_section_from_shdr           v850_elf_section_from_shdr
3183 #define elf_backend_fake_sections               v850_elf_fake_sections
3184 #define elf_backend_gc_mark_hook                v850_elf_gc_mark_hook
3185 #define elf_backend_gc_sweep_hook               v850_elf_gc_sweep_hook
3186 #define elf_backend_special_sections            v850_elf_special_sections
3187
3188 #define elf_backend_can_gc_sections 1
3189 #define elf_backend_rela_normal 1
3190
3191 #define bfd_elf32_bfd_is_local_label_name       v850_elf_is_local_label_name
3192 #define bfd_elf32_bfd_reloc_type_lookup         v850_elf_reloc_type_lookup
3193 #define bfd_elf32_bfd_merge_private_bfd_data    v850_elf_merge_private_bfd_data
3194 #define bfd_elf32_bfd_set_private_flags         v850_elf_set_private_flags
3195 #define bfd_elf32_bfd_print_private_bfd_data    v850_elf_print_private_bfd_data
3196 #define bfd_elf32_bfd_relax_section             v850_elf_relax_section
3197
3198 #define elf_symbol_leading_char                 '_'
3199
3200 #include "elf32-target.h"