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