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