]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - bfd/elf32-v850.c
PR 3958
[thirdparty/binutils-gdb.git] / bfd / elf32-v850.c
1 /* V850-specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007 Free Software Foundation, Inc.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
22 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
23 dependencies. As is the gas & simulator code for the v850. */
24
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"
31 #include "libiberty.h"
32
33 /* Sign-extend a 24-bit number. */
34 #define SEXT24(x) ((((x) & 0xffffff) ^ 0x800000) - 0x800000)
35
36 static reloc_howto_type v850_elf_howto_table[];
37
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
42 static bfd_boolean
43 v850_elf_check_relocs (bfd *abfd,
44 struct bfd_link_info *info,
45 asection *sec,
46 const Elf_Internal_Rela *relocs)
47 {
48 bfd_boolean ret = TRUE;
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;
57 const char *common = NULL;
58
59 if (info->relocatable)
60 return TRUE;
61
62 #ifdef DEBUG
63 _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B",
64 sec, abfd);
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
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 }
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:
99 case R_V850_LO16_SPLIT_OFFSET:
100 case R_V850_ABS32:
101 case R_V850_REL32:
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:
111 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
112 return FALSE;
113 break;
114
115 /* This relocation describes which C++ vtable entries
116 are actually used. Record for later use during GC. */
117 case R_V850_GNU_VTENTRY:
118 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
119 return FALSE;
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;
128
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;
135
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 {
151 /* Flag which type of relocation was used. */
152 h->other |= other;
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,
180 abfd, h->root.u.def.section,
181 (bfd_vma) 0);
182
183 bfd_set_error (bfd_error_bad_value);
184 h->other |= V850_OTHER_ERROR;
185 ret = FALSE;
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 {
193 asection * section;
194
195 section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
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
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
217 the field 'found' to TRUE. If a second lookup matches the same
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. */
224
225 typedef struct hi16s_location
226 {
227 bfd_vma addend;
228 bfd_byte * address;
229 unsigned long counter;
230 bfd_boolean found;
231 struct hi16s_location * next;
232 }
233 hi16s_location;
234
235 static hi16s_location * previous_hi16s;
236 static hi16s_location * free_hi16s;
237 static unsigned long hi16s_counter;
238
239 static void
240 remember_hi16s_reloc (bfd *abfd, bfd_vma addend, bfd_byte *address)
241 {
242 hi16s_location * entry = NULL;
243 bfd_size_type amt = sizeof (* free_hi16s);
244
245 /* Find a free structure. */
246 if (free_hi16s == NULL)
247 free_hi16s = bfd_zalloc (abfd, amt);
248
249 entry = free_hi16s;
250 free_hi16s = free_hi16s->next;
251
252 entry->addend = addend;
253 entry->address = address;
254 entry->counter = hi16s_counter ++;
255 entry->found = FALSE;
256 entry->next = previous_hi16s;
257 previous_hi16s = entry;
258
259 /* Cope with wrap around of our counter. */
260 if (hi16s_counter == 0)
261 {
262 /* XXX: Assume that all counter entries differ only in their low 16 bits. */
263 for (entry = previous_hi16s; entry != NULL; entry = entry->next)
264 entry->counter &= 0xffff;
265
266 hi16s_counter = 0x10000;
267 }
268 }
269
270 static bfd_byte *
271 find_remembered_hi16s_reloc (bfd_vma addend, bfd_boolean *already_found)
272 {
273 hi16s_location *match = NULL;
274 hi16s_location *entry;
275 hi16s_location *previous = NULL;
276 hi16s_location *prev;
277 bfd_byte *addr;
278
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 }
288
289 prev = entry;
290 }
291
292 if (match == NULL)
293 return NULL;
294
295 /* Extract the address. */
296 addr = match->address;
297
298 /* Remember if this entry has already been used before. */
299 if (already_found)
300 * already_found = match->found;
301
302 /* Note that this entry has now been used. */
303 match->found = TRUE;
304
305 return addr;
306 }
307
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
450 static bfd_boolean
451 v850_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)
456
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
490 /* FIXME: The code here probably ought to be removed and the code in reloc.c
491 allowed to do its stuff instead. At least for most of the relocs, anyway. */
492
493 static bfd_reloc_status_type
494 v850_elf_perform_relocation (bfd *abfd,
495 unsigned int r_type,
496 bfd_vma addend,
497 bfd_byte *address)
498 {
499 unsigned long insn;
500 unsigned long result;
501 bfd_signed_vma saddend = (bfd_signed_vma) addend;
502
503 switch (r_type)
504 {
505 default:
506 return bfd_reloc_notsupported;
507
508 case R_V850_REL32:
509 case R_V850_ABS32:
510 bfd_put_32 (abfd, addend, address);
511 return bfd_reloc_ok;
512
513 case R_V850_22_PCREL:
514 if (saddend > 0x1fffff || saddend < -0x200000)
515 return bfd_reloc_overflow;
516
517 if ((addend % 2) != 0)
518 return bfd_reloc_dangerous;
519
520 insn = bfd_get_32 (abfd, address);
521 insn &= ~0xfffe003f;
522 insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
523 bfd_put_32 (abfd, (bfd_vma) insn, address);
524 return bfd_reloc_ok;
525
526 case R_V850_9_PCREL:
527 if (saddend > 0xff || saddend < -0x100)
528 return bfd_reloc_overflow;
529
530 if ((addend % 2) != 0)
531 return bfd_reloc_dangerous;
532
533 insn = bfd_get_16 (abfd, address);
534 insn &= ~ 0xf870;
535 insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
536 break;
537
538 case R_V850_HI16:
539 addend += (bfd_get_16 (abfd, address) << 16);
540 addend = (addend >> 16);
541 insn = addend;
542 break;
543
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);
550
551 /* This relocation cannot overflow. */
552 if (addend > 0x7fff)
553 addend = 0;
554
555 insn = addend;
556 break;
557
558 case R_V850_LO16:
559 insn = bfd_get_16 (abfd, address);
560 if (! v850_elf_perform_lo16_relocation (abfd, &insn, addend))
561 return bfd_reloc_overflow;
562 break;
563
564 case R_V850_8:
565 addend += (char) bfd_get_8 (abfd, address);
566
567 saddend = (bfd_signed_vma) addend;
568
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);
577
578 saddend = (bfd_signed_vma) addend;
579
580 if (saddend > 0xffff || saddend < 0)
581 return bfd_reloc_overflow;
582
583 insn = addend;
584 break;
585
586 case R_V850_16:
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);
591
592 saddend = (bfd_signed_vma) addend;
593
594 if (saddend > 0x7fff || saddend < -0x8000)
595 return bfd_reloc_overflow;
596
597 insn = addend;
598 break;
599
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);
604
605 saddend = (bfd_signed_vma) addend;
606
607 if (saddend > 0x7ffe || saddend < -0x8000)
608 return bfd_reloc_overflow;
609
610 if (addend & 1)
611 return bfd_reloc_dangerous;
612
613 insn = (addend &~ (bfd_vma) 1) | (insn & 1);
614 break;
615
616 case R_V850_TDA_6_8_OFFSET:
617 insn = bfd_get_16 (abfd, address);
618 addend += ((insn & 0x7e) << 1);
619
620 saddend = (bfd_signed_vma) addend;
621
622 if (saddend > 0xfc || saddend < 0)
623 return bfd_reloc_overflow;
624
625 if (addend & 3)
626 return bfd_reloc_dangerous;
627
628 insn &= 0xff81;
629 insn |= (addend >> 1);
630 break;
631
632 case R_V850_TDA_7_8_OFFSET:
633 insn = bfd_get_16 (abfd, address);
634 addend += ((insn & 0x7f) << 1);
635
636 saddend = (bfd_signed_vma) addend;
637
638 if (saddend > 0xfe || saddend < 0)
639 return bfd_reloc_overflow;
640
641 if (addend & 1)
642 return bfd_reloc_dangerous;
643
644 insn &= 0xff80;
645 insn |= (addend >> 1);
646 break;
647
648 case R_V850_TDA_7_7_OFFSET:
649 insn = bfd_get_16 (abfd, address);
650 addend += insn & 0x7f;
651
652 saddend = (bfd_signed_vma) addend;
653
654 if (saddend > 0x7f || saddend < 0)
655 return bfd_reloc_overflow;
656
657 insn &= 0xff80;
658 insn |= addend;
659 break;
660
661 case R_V850_TDA_4_5_OFFSET:
662 insn = bfd_get_16 (abfd, address);
663 addend += ((insn & 0xf) << 1);
664
665 saddend = (bfd_signed_vma) addend;
666
667 if (saddend > 0x1e || saddend < 0)
668 return bfd_reloc_overflow;
669
670 if (addend & 1)
671 return bfd_reloc_dangerous;
672
673 insn &= 0xfff0;
674 insn |= (addend >> 1);
675 break;
676
677 case R_V850_TDA_4_4_OFFSET:
678 insn = bfd_get_16 (abfd, address);
679 addend += insn & 0xf;
680
681 saddend = (bfd_signed_vma) addend;
682
683 if (saddend > 0xf || saddend < 0)
684 return bfd_reloc_overflow;
685
686 insn &= 0xfff0;
687 insn |= addend;
688 break;
689
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
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);
705
706 saddend = (bfd_signed_vma) addend;
707
708 if (saddend > 0x7fff || saddend < -0x8000)
709 return bfd_reloc_overflow;
710
711 insn &= 0x0001ffdf;
712 insn |= (addend & 1) << 5;
713 insn |= (addend &~ (bfd_vma) 1) << 16;
714
715 bfd_put_32 (abfd, (bfd_vma) insn, address);
716 return bfd_reloc_ok;
717
718 case R_V850_CALLT_6_7_OFFSET:
719 insn = bfd_get_16 (abfd, address);
720 addend += ((insn & 0x3f) << 1);
721
722 saddend = (bfd_signed_vma) addend;
723
724 if (saddend > 0x7e || saddend < 0)
725 return bfd_reloc_overflow;
726
727 if (addend & 1)
728 return bfd_reloc_dangerous;
729
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
740 bfd_put_16 (abfd, (bfd_vma) insn, address);
741 return bfd_reloc_ok;
742 }
743 \f
744 /* Insert the addend into the instruction. */
745
746 static bfd_reloc_status_type
747 v850_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)
754 {
755 long relocation;
756
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
760 or the addend is zero, so there is nothing to add into the instruction
761 then just fixup the address and return. */
762 if (obfd != NULL
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 }
770
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? */
780 if (reloc->address > bfd_get_section_limit (abfd, isection))
781 return bfd_reloc_outofrange;
782
783 /* Work out which section the relocation is targeted at and the
784 initial relocation command value. */
785
786 if (reloc->howto->pc_relative)
787 return bfd_reloc_ok;
788
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;
794
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;
799
800 reloc->addend = relocation;
801 return bfd_reloc_ok;
802 }
803
804 /* This function is used for relocs which are only used
805 for relaxing, which the linker should otherwise ignore. */
806
807 static bfd_reloc_status_type
808 v850_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)
815 {
816 if (output_bfd != NULL)
817 reloc_entry->address += input_section->output_offset;
818
819 return bfd_reloc_ok;
820 }
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. */
823 static 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
1279 struct 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
1287 static 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
1324 static reloc_howto_type *
1325 v850_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 }
1342 \f
1343 /* Set the howto pointer for an V850 ELF reloc. */
1344
1345 static void
1346 v850_elf_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
1347 arelent *cache_ptr,
1348 Elf_Internal_Rela *dst)
1349 {
1350 unsigned int r_type;
1351
1352 r_type = ELF32_R_TYPE (dst->r_info);
1353 BFD_ASSERT (r_type < (unsigned int) R_V850_max);
1354 cache_ptr->howto = &v850_elf_howto_table[r_type];
1355 }
1356
1357 /* Set the howto pointer for a V850 ELF reloc (type RELA). */
1358
1359 static void
1360 v850_elf_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
1361 arelent * cache_ptr,
1362 Elf_Internal_Rela *dst)
1363 {
1364 unsigned int r_type;
1365
1366 r_type = ELF32_R_TYPE (dst->r_info);
1367 BFD_ASSERT (r_type < (unsigned int) R_V850_max);
1368 cache_ptr->howto = &v850_elf_howto_table[r_type];
1369 }
1370 \f
1371 static bfd_boolean
1372 v850_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
1373 {
1374 return ( (name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
1375 || (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_'));
1376 }
1377 \f
1378 /* We overload some of the bfd_reloc error codes for own purposes. */
1379 #define bfd_reloc_gp_not_found bfd_reloc_other
1380 #define bfd_reloc_ep_not_found bfd_reloc_continue
1381 #define bfd_reloc_ctbp_not_found (bfd_reloc_dangerous + 1)
1382
1383 /* Perform a relocation as part of a final link. */
1384
1385 static bfd_reloc_status_type
1386 v850_elf_final_link_relocate (reloc_howto_type *howto,
1387 bfd *input_bfd,
1388 bfd *output_bfd ATTRIBUTE_UNUSED,
1389 asection *input_section,
1390 bfd_byte *contents,
1391 bfd_vma offset,
1392 bfd_vma value,
1393 bfd_vma addend,
1394 struct bfd_link_info *info,
1395 asection *sym_sec,
1396 int is_local ATTRIBUTE_UNUSED)
1397 {
1398 unsigned int r_type = howto->type;
1399 bfd_byte *hit_data = contents + offset;
1400
1401 /* Adjust the value according to the relocation. */
1402 switch (r_type)
1403 {
1404 case R_V850_9_PCREL:
1405 value -= (input_section->output_section->vma
1406 + input_section->output_offset);
1407 value -= offset;
1408 break;
1409
1410 case R_V850_22_PCREL:
1411 value -= (input_section->output_section->vma
1412 + input_section->output_offset
1413 + offset);
1414
1415 /* If the sign extension will corrupt the value then we have overflowed. */
1416 if (((value & 0xff000000) != 0x0) && ((value & 0xff000000) != 0xff000000))
1417 return bfd_reloc_overflow;
1418
1419 /* Only the bottom 24 bits of the PC are valid. */
1420 value = SEXT24 (value);
1421 break;
1422
1423 case R_V850_REL32:
1424 value -= (input_section->output_section->vma
1425 + input_section->output_offset
1426 + offset);
1427 break;
1428
1429 case R_V850_HI16_S:
1430 case R_V850_HI16:
1431 case R_V850_LO16:
1432 case R_V850_LO16_SPLIT_OFFSET:
1433 case R_V850_16:
1434 case R_V850_ABS32:
1435 case R_V850_8:
1436 break;
1437
1438 case R_V850_ZDA_15_16_OFFSET:
1439 case R_V850_ZDA_16_16_OFFSET:
1440 case R_V850_ZDA_16_16_SPLIT_OFFSET:
1441 if (sym_sec == NULL)
1442 return bfd_reloc_undefined;
1443
1444 value -= sym_sec->output_section->vma;
1445 break;
1446
1447 case R_V850_SDA_15_16_OFFSET:
1448 case R_V850_SDA_16_16_OFFSET:
1449 case R_V850_SDA_16_16_SPLIT_OFFSET:
1450 {
1451 unsigned long gp;
1452 struct bfd_link_hash_entry * h;
1453
1454 if (sym_sec == NULL)
1455 return bfd_reloc_undefined;
1456
1457 /* Get the value of __gp. */
1458 h = bfd_link_hash_lookup (info->hash, "__gp", FALSE, FALSE, TRUE);
1459 if (h == NULL
1460 || h->type != bfd_link_hash_defined)
1461 return bfd_reloc_gp_not_found;
1462
1463 gp = (h->u.def.value
1464 + h->u.def.section->output_section->vma
1465 + h->u.def.section->output_offset);
1466
1467 value -= sym_sec->output_section->vma;
1468 value -= (gp - sym_sec->output_section->vma);
1469 }
1470 break;
1471
1472 case R_V850_TDA_4_4_OFFSET:
1473 case R_V850_TDA_4_5_OFFSET:
1474 case R_V850_TDA_16_16_OFFSET:
1475 case R_V850_TDA_7_7_OFFSET:
1476 case R_V850_TDA_7_8_OFFSET:
1477 case R_V850_TDA_6_8_OFFSET:
1478 {
1479 unsigned long ep;
1480 struct bfd_link_hash_entry * h;
1481
1482 /* Get the value of __ep. */
1483 h = bfd_link_hash_lookup (info->hash, "__ep", FALSE, FALSE, TRUE);
1484 if (h == NULL
1485 || h->type != bfd_link_hash_defined)
1486 return bfd_reloc_ep_not_found;
1487
1488 ep = (h->u.def.value
1489 + h->u.def.section->output_section->vma
1490 + h->u.def.section->output_offset);
1491
1492 value -= ep;
1493 }
1494 break;
1495
1496 case R_V850_CALLT_6_7_OFFSET:
1497 {
1498 unsigned long ctbp;
1499 struct bfd_link_hash_entry * h;
1500
1501 /* Get the value of __ctbp. */
1502 h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1503 if (h == NULL
1504 || h->type != bfd_link_hash_defined)
1505 return bfd_reloc_ctbp_not_found;
1506
1507 ctbp = (h->u.def.value
1508 + h->u.def.section->output_section->vma
1509 + h->u.def.section->output_offset);
1510 value -= ctbp;
1511 }
1512 break;
1513
1514 case R_V850_CALLT_16_16_OFFSET:
1515 {
1516 unsigned long ctbp;
1517 struct bfd_link_hash_entry * h;
1518
1519 if (sym_sec == NULL)
1520 return bfd_reloc_undefined;
1521
1522 /* Get the value of __ctbp. */
1523 h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1524 if (h == NULL
1525 || h->type != bfd_link_hash_defined)
1526 return bfd_reloc_ctbp_not_found;
1527
1528 ctbp = (h->u.def.value
1529 + h->u.def.section->output_section->vma
1530 + h->u.def.section->output_offset);
1531
1532 value -= sym_sec->output_section->vma;
1533 value -= (ctbp - sym_sec->output_section->vma);
1534 }
1535 break;
1536
1537 case R_V850_NONE:
1538 case R_V850_GNU_VTINHERIT:
1539 case R_V850_GNU_VTENTRY:
1540 case R_V850_LONGCALL:
1541 case R_V850_LONGJUMP:
1542 case R_V850_ALIGN:
1543 return bfd_reloc_ok;
1544
1545 default:
1546 return bfd_reloc_notsupported;
1547 }
1548
1549 /* Perform the relocation. */
1550 return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
1551 }
1552 \f
1553 /* Relocate an V850 ELF section. */
1554
1555 static bfd_boolean
1556 v850_elf_relocate_section (bfd *output_bfd,
1557 struct bfd_link_info *info,
1558 bfd *input_bfd,
1559 asection *input_section,
1560 bfd_byte *contents,
1561 Elf_Internal_Rela *relocs,
1562 Elf_Internal_Sym *local_syms,
1563 asection **local_sections)
1564 {
1565 Elf_Internal_Shdr *symtab_hdr;
1566 struct elf_link_hash_entry **sym_hashes;
1567 Elf_Internal_Rela *rel;
1568 Elf_Internal_Rela *relend;
1569
1570 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1571 sym_hashes = elf_sym_hashes (input_bfd);
1572
1573 /* Reset the list of remembered HI16S relocs to empty. */
1574 free_hi16s = previous_hi16s;
1575 previous_hi16s = NULL;
1576 hi16s_counter = 0;
1577
1578 rel = relocs;
1579 relend = relocs + input_section->reloc_count;
1580 for (; rel < relend; rel++)
1581 {
1582 int r_type;
1583 reloc_howto_type *howto;
1584 unsigned long r_symndx;
1585 Elf_Internal_Sym *sym;
1586 asection *sec;
1587 struct elf_link_hash_entry *h;
1588 bfd_vma relocation;
1589 bfd_reloc_status_type r;
1590
1591 r_symndx = ELF32_R_SYM (rel->r_info);
1592 r_type = ELF32_R_TYPE (rel->r_info);
1593
1594 if (r_type == R_V850_GNU_VTENTRY
1595 || r_type == R_V850_GNU_VTINHERIT)
1596 continue;
1597
1598 howto = v850_elf_howto_table + r_type;
1599 h = NULL;
1600 sym = NULL;
1601 sec = NULL;
1602 if (r_symndx < symtab_hdr->sh_info)
1603 {
1604 sym = local_syms + r_symndx;
1605 sec = local_sections[r_symndx];
1606 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1607 }
1608 else
1609 {
1610 bfd_boolean unresolved_reloc, warned;
1611
1612 /* Note - this check is delayed until now as it is possible and
1613 valid to have a file without any symbols but with relocs that
1614 can be processed. */
1615 if (sym_hashes == NULL)
1616 {
1617 info->callbacks->warning
1618 (info, "no hash table available",
1619 NULL, input_bfd, input_section, (bfd_vma) 0);
1620
1621 return FALSE;
1622 }
1623
1624 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1625 r_symndx, symtab_hdr, sym_hashes,
1626 h, sec, relocation,
1627 unresolved_reloc, warned);
1628 }
1629
1630 if (sec != NULL && elf_discarded_section (sec))
1631 {
1632 /* For relocs against symbols from removed linkonce sections,
1633 or sections discarded by a linker script, we just want the
1634 section contents zeroed. Avoid any special processing. */
1635 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
1636 rel->r_info = 0;
1637 rel->r_addend = 0;
1638 continue;
1639 }
1640
1641 if (info->relocatable)
1642 continue;
1643
1644 /* FIXME: We should use the addend, but the COFF relocations don't. */
1645 r = v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1646 input_section,
1647 contents, rel->r_offset,
1648 relocation, rel->r_addend,
1649 info, sec, h == NULL);
1650
1651 if (r != bfd_reloc_ok)
1652 {
1653 const char * name;
1654 const char * msg = NULL;
1655
1656 if (h != NULL)
1657 name = h->root.root.string;
1658 else
1659 {
1660 name = (bfd_elf_string_from_elf_section
1661 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1662 if (name == NULL || *name == '\0')
1663 name = bfd_section_name (input_bfd, sec);
1664 }
1665
1666 switch (r)
1667 {
1668 case bfd_reloc_overflow:
1669 if (! ((*info->callbacks->reloc_overflow)
1670 (info, (h ? &h->root : NULL), name, howto->name,
1671 (bfd_vma) 0, input_bfd, input_section,
1672 rel->r_offset)))
1673 return FALSE;
1674 break;
1675
1676 case bfd_reloc_undefined:
1677 if (! ((*info->callbacks->undefined_symbol)
1678 (info, name, input_bfd, input_section,
1679 rel->r_offset, TRUE)))
1680 return FALSE;
1681 break;
1682
1683 case bfd_reloc_outofrange:
1684 msg = _("internal error: out of range error");
1685 goto common_error;
1686
1687 case bfd_reloc_notsupported:
1688 msg = _("internal error: unsupported relocation error");
1689 goto common_error;
1690
1691 case bfd_reloc_dangerous:
1692 msg = _("internal error: dangerous relocation");
1693 goto common_error;
1694
1695 case bfd_reloc_gp_not_found:
1696 msg = _("could not locate special linker symbol __gp");
1697 goto common_error;
1698
1699 case bfd_reloc_ep_not_found:
1700 msg = _("could not locate special linker symbol __ep");
1701 goto common_error;
1702
1703 case bfd_reloc_ctbp_not_found:
1704 msg = _("could not locate special linker symbol __ctbp");
1705 goto common_error;
1706
1707 default:
1708 msg = _("internal error: unknown error");
1709 /* fall through */
1710
1711 common_error:
1712 if (!((*info->callbacks->warning)
1713 (info, msg, name, input_bfd, input_section,
1714 rel->r_offset)))
1715 return FALSE;
1716 break;
1717 }
1718 }
1719 }
1720
1721 return TRUE;
1722 }
1723
1724 static asection *
1725 v850_elf_gc_mark_hook (asection *sec,
1726 struct bfd_link_info *info,
1727 Elf_Internal_Rela *rel,
1728 struct elf_link_hash_entry *h,
1729 Elf_Internal_Sym *sym)
1730 {
1731 if (h != NULL)
1732 switch (ELF32_R_TYPE (rel->r_info))
1733 {
1734 case R_V850_GNU_VTINHERIT:
1735 case R_V850_GNU_VTENTRY:
1736 return NULL;
1737 }
1738
1739 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1740 }
1741
1742 /* Set the right machine number. */
1743
1744 static bfd_boolean
1745 v850_elf_object_p (bfd *abfd)
1746 {
1747 switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1748 {
1749 default:
1750 case E_V850_ARCH:
1751 bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850);
1752 break;
1753 case E_V850E_ARCH:
1754 bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e);
1755 break;
1756 case E_V850E1_ARCH:
1757 bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e1);
1758 break;
1759 }
1760 return TRUE;
1761 }
1762
1763 /* Store the machine number in the flags field. */
1764
1765 static void
1766 v850_elf_final_write_processing (bfd *abfd,
1767 bfd_boolean linker ATTRIBUTE_UNUSED)
1768 {
1769 unsigned long val;
1770
1771 switch (bfd_get_mach (abfd))
1772 {
1773 default:
1774 case bfd_mach_v850: val = E_V850_ARCH; break;
1775 case bfd_mach_v850e: val = E_V850E_ARCH; break;
1776 case bfd_mach_v850e1: val = E_V850E1_ARCH; break;
1777 }
1778
1779 elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
1780 elf_elfheader (abfd)->e_flags |= val;
1781 }
1782
1783 /* Function to keep V850 specific file flags. */
1784
1785 static bfd_boolean
1786 v850_elf_set_private_flags (bfd *abfd, flagword flags)
1787 {
1788 BFD_ASSERT (!elf_flags_init (abfd)
1789 || elf_elfheader (abfd)->e_flags == flags);
1790
1791 elf_elfheader (abfd)->e_flags = flags;
1792 elf_flags_init (abfd) = TRUE;
1793 return TRUE;
1794 }
1795
1796 /* Merge backend specific data from an object file
1797 to the output object file when linking. */
1798
1799 static bfd_boolean
1800 v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
1801 {
1802 flagword out_flags;
1803 flagword in_flags;
1804
1805 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1806 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1807 return TRUE;
1808
1809 in_flags = elf_elfheader (ibfd)->e_flags;
1810 out_flags = elf_elfheader (obfd)->e_flags;
1811
1812 if (! elf_flags_init (obfd))
1813 {
1814 /* If the input is the default architecture then do not
1815 bother setting the flags for the output architecture,
1816 instead allow future merges to do this. If no future
1817 merges ever set these flags then they will retain their
1818 unitialised values, which surprise surprise, correspond
1819 to the default values. */
1820 if (bfd_get_arch_info (ibfd)->the_default)
1821 return TRUE;
1822
1823 elf_flags_init (obfd) = TRUE;
1824 elf_elfheader (obfd)->e_flags = in_flags;
1825
1826 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1827 && bfd_get_arch_info (obfd)->the_default)
1828 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
1829
1830 return TRUE;
1831 }
1832
1833 /* Check flag compatibility. */
1834 if (in_flags == out_flags)
1835 return TRUE;
1836
1837 if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
1838 && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
1839 {
1840 /* Allow v850e1 binaries to be linked with v850e binaries.
1841 Set the output binary to v850e. */
1842 if ((in_flags & EF_V850_ARCH) == E_V850E1_ARCH
1843 && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
1844 return TRUE;
1845
1846 if ((in_flags & EF_V850_ARCH) == E_V850E_ARCH
1847 && (out_flags & EF_V850_ARCH) == E_V850E1_ARCH)
1848 {
1849 elf_elfheader (obfd)->e_flags =
1850 ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
1851 return TRUE;
1852 }
1853
1854 _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
1855 ibfd);
1856 }
1857
1858 return TRUE;
1859 }
1860
1861 /* Display the flags field. */
1862
1863 static bfd_boolean
1864 v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
1865 {
1866 FILE * file = (FILE *) ptr;
1867
1868 BFD_ASSERT (abfd != NULL && ptr != NULL);
1869
1870 _bfd_elf_print_private_bfd_data (abfd, ptr);
1871
1872 /* xgettext:c-format */
1873 fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
1874
1875 switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1876 {
1877 default:
1878 case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
1879 case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
1880 case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
1881 }
1882
1883 fputc ('\n', file);
1884
1885 return TRUE;
1886 }
1887
1888 /* V850 ELF uses four common sections. One is the usual one, and the
1889 others are for (small) objects in one of the special data areas:
1890 small, tiny and zero. All the objects are kept together, and then
1891 referenced via the gp register, the ep register or the r0 register
1892 respectively, which yields smaller, faster assembler code. This
1893 approach is copied from elf32-mips.c. */
1894
1895 static asection v850_elf_scom_section;
1896 static asymbol v850_elf_scom_symbol;
1897 static asymbol * v850_elf_scom_symbol_ptr;
1898 static asection v850_elf_tcom_section;
1899 static asymbol v850_elf_tcom_symbol;
1900 static asymbol * v850_elf_tcom_symbol_ptr;
1901 static asection v850_elf_zcom_section;
1902 static asymbol v850_elf_zcom_symbol;
1903 static asymbol * v850_elf_zcom_symbol_ptr;
1904
1905 /* Given a BFD section, try to locate the
1906 corresponding ELF section index. */
1907
1908 static bfd_boolean
1909 v850_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
1910 asection *sec,
1911 int *retval)
1912 {
1913 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
1914 *retval = SHN_V850_SCOMMON;
1915 else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
1916 *retval = SHN_V850_TCOMMON;
1917 else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
1918 *retval = SHN_V850_ZCOMMON;
1919 else
1920 return FALSE;
1921
1922 return TRUE;
1923 }
1924
1925 /* Handle the special V850 section numbers that a symbol may use. */
1926
1927 static void
1928 v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
1929 {
1930 elf_symbol_type * elfsym = (elf_symbol_type *) asym;
1931 unsigned int indx;
1932
1933 indx = elfsym->internal_elf_sym.st_shndx;
1934
1935 /* If the section index is an "ordinary" index, then it may
1936 refer to a v850 specific section created by the assembler.
1937 Check the section's type and change the index it matches.
1938
1939 FIXME: Should we alter the st_shndx field as well ? */
1940
1941 if (indx < elf_numsections (abfd))
1942 switch (elf_elfsections(abfd)[indx]->sh_type)
1943 {
1944 case SHT_V850_SCOMMON:
1945 indx = SHN_V850_SCOMMON;
1946 break;
1947
1948 case SHT_V850_TCOMMON:
1949 indx = SHN_V850_TCOMMON;
1950 break;
1951
1952 case SHT_V850_ZCOMMON:
1953 indx = SHN_V850_ZCOMMON;
1954 break;
1955
1956 default:
1957 break;
1958 }
1959
1960 switch (indx)
1961 {
1962 case SHN_V850_SCOMMON:
1963 if (v850_elf_scom_section.name == NULL)
1964 {
1965 /* Initialize the small common section. */
1966 v850_elf_scom_section.name = ".scommon";
1967 v850_elf_scom_section.flags = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
1968 v850_elf_scom_section.output_section = & v850_elf_scom_section;
1969 v850_elf_scom_section.symbol = & v850_elf_scom_symbol;
1970 v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
1971 v850_elf_scom_symbol.name = ".scommon";
1972 v850_elf_scom_symbol.flags = BSF_SECTION_SYM;
1973 v850_elf_scom_symbol.section = & v850_elf_scom_section;
1974 v850_elf_scom_symbol_ptr = & v850_elf_scom_symbol;
1975 }
1976 asym->section = & v850_elf_scom_section;
1977 asym->value = elfsym->internal_elf_sym.st_size;
1978 break;
1979
1980 case SHN_V850_TCOMMON:
1981 if (v850_elf_tcom_section.name == NULL)
1982 {
1983 /* Initialize the tcommon section. */
1984 v850_elf_tcom_section.name = ".tcommon";
1985 v850_elf_tcom_section.flags = SEC_IS_COMMON;
1986 v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
1987 v850_elf_tcom_section.symbol = & v850_elf_tcom_symbol;
1988 v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
1989 v850_elf_tcom_symbol.name = ".tcommon";
1990 v850_elf_tcom_symbol.flags = BSF_SECTION_SYM;
1991 v850_elf_tcom_symbol.section = & v850_elf_tcom_section;
1992 v850_elf_tcom_symbol_ptr = & v850_elf_tcom_symbol;
1993 }
1994 asym->section = & v850_elf_tcom_section;
1995 asym->value = elfsym->internal_elf_sym.st_size;
1996 break;
1997
1998 case SHN_V850_ZCOMMON:
1999 if (v850_elf_zcom_section.name == NULL)
2000 {
2001 /* Initialize the zcommon section. */
2002 v850_elf_zcom_section.name = ".zcommon";
2003 v850_elf_zcom_section.flags = SEC_IS_COMMON;
2004 v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
2005 v850_elf_zcom_section.symbol = & v850_elf_zcom_symbol;
2006 v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
2007 v850_elf_zcom_symbol.name = ".zcommon";
2008 v850_elf_zcom_symbol.flags = BSF_SECTION_SYM;
2009 v850_elf_zcom_symbol.section = & v850_elf_zcom_section;
2010 v850_elf_zcom_symbol_ptr = & v850_elf_zcom_symbol;
2011 }
2012 asym->section = & v850_elf_zcom_section;
2013 asym->value = elfsym->internal_elf_sym.st_size;
2014 break;
2015 }
2016 }
2017
2018 /* Hook called by the linker routine which adds symbols from an object
2019 file. We must handle the special v850 section numbers here. */
2020
2021 static bfd_boolean
2022 v850_elf_add_symbol_hook (bfd *abfd,
2023 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2024 Elf_Internal_Sym *sym,
2025 const char **namep ATTRIBUTE_UNUSED,
2026 flagword *flagsp ATTRIBUTE_UNUSED,
2027 asection **secp,
2028 bfd_vma *valp)
2029 {
2030 unsigned int indx = sym->st_shndx;
2031
2032 /* If the section index is an "ordinary" index, then it may
2033 refer to a v850 specific section created by the assembler.
2034 Check the section's type and change the index it matches.
2035
2036 FIXME: Should we alter the st_shndx field as well ? */
2037
2038 if (indx < elf_numsections (abfd))
2039 switch (elf_elfsections(abfd)[indx]->sh_type)
2040 {
2041 case SHT_V850_SCOMMON:
2042 indx = SHN_V850_SCOMMON;
2043 break;
2044
2045 case SHT_V850_TCOMMON:
2046 indx = SHN_V850_TCOMMON;
2047 break;
2048
2049 case SHT_V850_ZCOMMON:
2050 indx = SHN_V850_ZCOMMON;
2051 break;
2052
2053 default:
2054 break;
2055 }
2056
2057 switch (indx)
2058 {
2059 case SHN_V850_SCOMMON:
2060 *secp = bfd_make_section_old_way (abfd, ".scommon");
2061 (*secp)->flags |= SEC_IS_COMMON;
2062 *valp = sym->st_size;
2063 break;
2064
2065 case SHN_V850_TCOMMON:
2066 *secp = bfd_make_section_old_way (abfd, ".tcommon");
2067 (*secp)->flags |= SEC_IS_COMMON;
2068 *valp = sym->st_size;
2069 break;
2070
2071 case SHN_V850_ZCOMMON:
2072 *secp = bfd_make_section_old_way (abfd, ".zcommon");
2073 (*secp)->flags |= SEC_IS_COMMON;
2074 *valp = sym->st_size;
2075 break;
2076 }
2077
2078 return TRUE;
2079 }
2080
2081 static bfd_boolean
2082 v850_elf_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2083 const char *name ATTRIBUTE_UNUSED,
2084 Elf_Internal_Sym *sym,
2085 asection *input_sec,
2086 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
2087 {
2088 /* If we see a common symbol, which implies a relocatable link, then
2089 if a symbol was in a special common section in an input file, mark
2090 it as a special common in the output file. */
2091
2092 if (sym->st_shndx == SHN_COMMON)
2093 {
2094 if (strcmp (input_sec->name, ".scommon") == 0)
2095 sym->st_shndx = SHN_V850_SCOMMON;
2096 else if (strcmp (input_sec->name, ".tcommon") == 0)
2097 sym->st_shndx = SHN_V850_TCOMMON;
2098 else if (strcmp (input_sec->name, ".zcommon") == 0)
2099 sym->st_shndx = SHN_V850_ZCOMMON;
2100 }
2101
2102 return TRUE;
2103 }
2104
2105 static bfd_boolean
2106 v850_elf_section_from_shdr (bfd *abfd,
2107 Elf_Internal_Shdr *hdr,
2108 const char *name,
2109 int shindex)
2110 {
2111 /* There ought to be a place to keep ELF backend specific flags, but
2112 at the moment there isn't one. We just keep track of the
2113 sections by their name, instead. */
2114
2115 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2116 return FALSE;
2117
2118 switch (hdr->sh_type)
2119 {
2120 case SHT_V850_SCOMMON:
2121 case SHT_V850_TCOMMON:
2122 case SHT_V850_ZCOMMON:
2123 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
2124 (bfd_get_section_flags (abfd,
2125 hdr->bfd_section)
2126 | SEC_IS_COMMON)))
2127 return FALSE;
2128 }
2129
2130 return TRUE;
2131 }
2132
2133 /* Set the correct type for a V850 ELF section. We do this
2134 by the section name, which is a hack, but ought to work. */
2135
2136 static bfd_boolean
2137 v850_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2138 Elf_Internal_Shdr *hdr,
2139 asection *sec)
2140 {
2141 const char * name;
2142
2143 name = bfd_get_section_name (abfd, sec);
2144
2145 if (strcmp (name, ".scommon") == 0)
2146 hdr->sh_type = SHT_V850_SCOMMON;
2147 else if (strcmp (name, ".tcommon") == 0)
2148 hdr->sh_type = SHT_V850_TCOMMON;
2149 else if (strcmp (name, ".zcommon") == 0)
2150 hdr->sh_type = SHT_V850_ZCOMMON;
2151
2152 return TRUE;
2153 }
2154
2155 /* Delete some bytes from a section while relaxing. */
2156
2157 static bfd_boolean
2158 v850_elf_relax_delete_bytes (bfd *abfd,
2159 asection *sec,
2160 bfd_vma addr,
2161 bfd_vma toaddr,
2162 int count)
2163 {
2164 Elf_Internal_Shdr *symtab_hdr;
2165 Elf32_External_Sym *extsyms;
2166 Elf32_External_Sym *esym;
2167 Elf32_External_Sym *esymend;
2168 int index;
2169 unsigned int sec_shndx;
2170 bfd_byte *contents;
2171 Elf_Internal_Rela *irel;
2172 Elf_Internal_Rela *irelend;
2173 struct elf_link_hash_entry *sym_hash;
2174 Elf_Internal_Shdr *shndx_hdr;
2175 Elf_External_Sym_Shndx *shndx;
2176
2177 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2178 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
2179
2180 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2181
2182 contents = elf_section_data (sec)->this_hdr.contents;
2183
2184 /* The deletion must stop at the next ALIGN reloc for an alignment
2185 power larger than the number of bytes we are deleting. */
2186
2187 /* Actually delete the bytes. */
2188 #if (DEBUG_RELAX & 2)
2189 fprintf (stderr, "relax_delete: contents: sec: %s %p .. %p %x\n",
2190 sec->name, addr, toaddr, count );
2191 #endif
2192 memmove (contents + addr, contents + addr + count,
2193 toaddr - addr - count);
2194 memset (contents + toaddr-count, 0, count);
2195
2196 /* Adjust all the relocs. */
2197 irel = elf_section_data (sec)->relocs;
2198 irelend = irel + sec->reloc_count;
2199 shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
2200 shndx = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
2201
2202 for (; irel < irelend; irel++)
2203 {
2204 bfd_vma raddr, paddr, symval;
2205 Elf_Internal_Sym isym;
2206
2207 /* Get the new reloc address. */
2208 raddr = irel->r_offset;
2209 if ((raddr >= (addr + count) && raddr < toaddr))
2210 irel->r_offset -= count;
2211
2212 if (raddr >= addr && raddr < addr + count)
2213 {
2214 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2215 (int) R_V850_NONE);
2216 continue;
2217 }
2218
2219 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN)
2220 continue;
2221
2222 bfd_elf32_swap_symbol_in (abfd,
2223 extsyms + ELF32_R_SYM (irel->r_info),
2224 shndx ? shndx + ELF32_R_SYM (irel->r_info) : NULL,
2225 & isym);
2226
2227 if (isym.st_shndx != sec_shndx)
2228 continue;
2229
2230 /* Get the value of the symbol referred to by the reloc. */
2231 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2232 {
2233 symval = isym.st_value;
2234 #if (DEBUG_RELAX & 2)
2235 {
2236 char * name = bfd_elf_string_from_elf_section
2237 (abfd, symtab_hdr->sh_link, isym.st_name);
2238 fprintf (stderr,
2239 "relax_delete: local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2240 sec->name, name, isym.st_name,
2241 sec->output_section->vma, sec->output_offset,
2242 isym.st_value, irel->r_addend);
2243 }
2244 #endif
2245 }
2246 else
2247 {
2248 unsigned long indx;
2249 struct elf_link_hash_entry * h;
2250
2251 /* An external symbol. */
2252 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2253
2254 h = elf_sym_hashes (abfd) [indx];
2255 BFD_ASSERT (h != NULL);
2256
2257 symval = h->root.u.def.value;
2258 #if (DEBUG_RELAX & 2)
2259 fprintf (stderr,
2260 "relax_delete: defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2261 sec->name, h->root.root.string, h->root.u.def.value,
2262 sec->output_section->vma, sec->output_offset, irel->r_addend);
2263 #endif
2264 }
2265
2266 paddr = symval + irel->r_addend;
2267
2268 if ( (symval >= addr + count && symval < toaddr)
2269 && (paddr < addr + count || paddr >= toaddr))
2270 irel->r_addend += count;
2271 else if ( (symval < addr + count || symval >= toaddr)
2272 && (paddr >= addr + count && paddr < toaddr))
2273 irel->r_addend -= count;
2274 }
2275
2276 /* Adjust the local symbols defined in this section. */
2277 esym = extsyms;
2278 esymend = esym + symtab_hdr->sh_info;
2279
2280 for (; esym < esymend; esym++, shndx = (shndx ? shndx + 1 : NULL))
2281 {
2282 Elf_Internal_Sym isym;
2283
2284 bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2285
2286 if (isym.st_shndx == sec_shndx
2287 && isym.st_value >= addr + count
2288 && isym.st_value < toaddr)
2289 {
2290 isym.st_value -= count;
2291
2292 if (isym.st_value + isym.st_size >= toaddr)
2293 isym.st_size += count;
2294
2295 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2296 }
2297 else if (isym.st_shndx == sec_shndx
2298 && isym.st_value < addr + count)
2299 {
2300 if (isym.st_value+isym.st_size >= addr + count
2301 && isym.st_value+isym.st_size < toaddr)
2302 isym.st_size -= count;
2303
2304 if (isym.st_value >= addr
2305 && isym.st_value < addr + count)
2306 isym.st_value = addr;
2307
2308 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2309 }
2310 }
2311
2312 /* Now adjust the global symbols defined in this section. */
2313 esym = extsyms + symtab_hdr->sh_info;
2314 esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
2315
2316 for (index = 0; esym < esymend; esym ++, index ++)
2317 {
2318 Elf_Internal_Sym isym;
2319
2320 bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2321 sym_hash = elf_sym_hashes (abfd) [index];
2322
2323 if (isym.st_shndx == sec_shndx
2324 && ((sym_hash)->root.type == bfd_link_hash_defined
2325 || (sym_hash)->root.type == bfd_link_hash_defweak)
2326 && (sym_hash)->root.u.def.section == sec
2327 && (sym_hash)->root.u.def.value >= addr + count
2328 && (sym_hash)->root.u.def.value < toaddr)
2329 {
2330 if ((sym_hash)->root.u.def.value + isym.st_size >= toaddr)
2331 {
2332 isym.st_size += count;
2333 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2334 }
2335
2336 (sym_hash)->root.u.def.value -= count;
2337 }
2338 else if (isym.st_shndx == sec_shndx
2339 && ((sym_hash)->root.type == bfd_link_hash_defined
2340 || (sym_hash)->root.type == bfd_link_hash_defweak)
2341 && (sym_hash)->root.u.def.section == sec
2342 && (sym_hash)->root.u.def.value < addr + count)
2343 {
2344 if ((sym_hash)->root.u.def.value+isym.st_size >= addr + count
2345 && (sym_hash)->root.u.def.value+isym.st_size < toaddr)
2346 isym.st_size -= count;
2347
2348 if ((sym_hash)->root.u.def.value >= addr
2349 && (sym_hash)->root.u.def.value < addr + count)
2350 (sym_hash)->root.u.def.value = addr;
2351
2352 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2353 }
2354
2355 if (shndx)
2356 ++ shndx;
2357 }
2358
2359 return TRUE;
2360 }
2361
2362 #define NOP_OPCODE (0x0000)
2363 #define MOVHI 0x0640 /* 4byte */
2364 #define MOVHI_MASK 0x07e0
2365 #define MOVHI_R1(insn) ((insn) & 0x1f) /* 4byte */
2366 #define MOVHI_R2(insn) ((insn) >> 11)
2367 #define MOVEA 0x0620 /* 2byte */
2368 #define MOVEA_MASK 0x07e0
2369 #define MOVEA_R1(insn) ((insn) & 0x1f)
2370 #define MOVEA_R2(insn) ((insn) >> 11)
2371 #define JARL_4 0x00040780 /* 4byte */
2372 #define JARL_4_MASK 0xFFFF07FF
2373 #define JARL_R2(insn) (int)(((insn) & (~JARL_4_MASK)) >> 11)
2374 #define ADD_I 0x0240 /* 2byte */
2375 #define ADD_I_MASK 0x07e0
2376 #define ADD_I5(insn) ((((insn) & 0x001f) << 11) >> 11) /* 2byte */
2377 #define ADD_R2(insn) ((insn) >> 11)
2378 #define JMP_R 0x0060 /* 2byte */
2379 #define JMP_R_MASK 0xFFE0
2380 #define JMP_R1(insn) ((insn) & 0x1f)
2381
2382 static bfd_boolean
2383 v850_elf_relax_section (bfd *abfd,
2384 asection *sec,
2385 struct bfd_link_info *link_info,
2386 bfd_boolean *again)
2387 {
2388 Elf_Internal_Shdr *symtab_hdr;
2389 Elf_Internal_Rela *internal_relocs;
2390 Elf_Internal_Rela *irel;
2391 Elf_Internal_Rela *irelend;
2392 Elf_Internal_Rela *irelalign = NULL;
2393 Elf_Internal_Sym *isymbuf = NULL;
2394 bfd_byte *contents = NULL;
2395 bfd_vma addr = 0;
2396 bfd_vma toaddr;
2397 int align_pad_size = 0;
2398 bfd_boolean result = TRUE;
2399
2400 *again = FALSE;
2401
2402 if (link_info->relocatable
2403 || (sec->flags & SEC_RELOC) == 0
2404 || sec->reloc_count == 0)
2405 return TRUE;
2406
2407 symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
2408
2409 internal_relocs = (_bfd_elf_link_read_relocs
2410 (abfd, sec, NULL, NULL, link_info->keep_memory));
2411 if (internal_relocs == NULL)
2412 goto error_return;
2413
2414 irelend = internal_relocs + sec->reloc_count;
2415
2416 while (addr < sec->size)
2417 {
2418 toaddr = sec->size;
2419
2420 for (irel = internal_relocs; irel < irelend; irel ++)
2421 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
2422 && irel->r_offset > addr
2423 && irel->r_offset < toaddr)
2424 toaddr = irel->r_offset;
2425
2426 #ifdef DEBUG_RELAX
2427 fprintf (stderr, "relax region 0x%x to 0x%x align pad %d\n",
2428 addr, toaddr, align_pad_size);
2429 #endif
2430 if (irelalign)
2431 {
2432 bfd_vma alignto;
2433 bfd_vma alignmoveto;
2434
2435 alignmoveto = BFD_ALIGN (addr - align_pad_size, 1 << irelalign->r_addend);
2436 alignto = BFD_ALIGN (addr, 1 << irelalign->r_addend);
2437
2438 if (alignmoveto < alignto)
2439 {
2440 unsigned int i;
2441
2442 align_pad_size = alignto - alignmoveto;
2443 #ifdef DEBUG_RELAX
2444 fprintf (stderr, "relax move region 0x%x to 0x%x delete size 0x%x\n",
2445 alignmoveto, toaddr, align_pad_size);
2446 #endif
2447 if (!v850_elf_relax_delete_bytes (abfd, sec, alignmoveto,
2448 toaddr, align_pad_size))
2449 goto error_return;
2450
2451 for (i = BFD_ALIGN (toaddr - align_pad_size, 1);
2452 (i + 1) < toaddr; i += 2)
2453 bfd_put_16 (abfd, NOP_OPCODE, contents + i);
2454
2455 addr = alignmoveto;
2456 }
2457 else
2458 align_pad_size = 0;
2459 }
2460
2461 for (irel = internal_relocs; irel < irelend; irel++)
2462 {
2463 bfd_vma laddr;
2464 bfd_vma addend;
2465 bfd_vma symval;
2466 int insn[5];
2467 int no_match = -1;
2468 Elf_Internal_Rela *hi_irelfn;
2469 Elf_Internal_Rela *lo_irelfn;
2470 Elf_Internal_Rela *irelcall;
2471 bfd_signed_vma foff;
2472
2473 if (! (irel->r_offset >= addr && irel->r_offset < toaddr
2474 && (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL
2475 || ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)))
2476 continue;
2477
2478 #ifdef DEBUG_RELAX
2479 fprintf (stderr, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
2480 irel->r_info,
2481 irel->r_offset,
2482 irel->r_addend );
2483 #endif
2484
2485 /* Get the section contents. */
2486 if (contents == NULL)
2487 {
2488 if (elf_section_data (sec)->this_hdr.contents != NULL)
2489 contents = elf_section_data (sec)->this_hdr.contents;
2490 else
2491 {
2492 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2493 goto error_return;
2494 }
2495 }
2496
2497 /* Read this BFD's local symbols if we haven't done so already. */
2498 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2499 {
2500 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2501 if (isymbuf == NULL)
2502 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2503 symtab_hdr->sh_info, 0,
2504 NULL, NULL, NULL);
2505 if (isymbuf == NULL)
2506 goto error_return;
2507 }
2508
2509 laddr = irel->r_offset;
2510
2511 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL)
2512 {
2513 /* Check code for -mlong-calls output. */
2514 if (laddr + 16 <= (bfd_vma) sec->size)
2515 {
2516 insn[0] = bfd_get_16 (abfd, contents + laddr);
2517 insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
2518 insn[2] = bfd_get_32 (abfd, contents + laddr + 8);
2519 insn[3] = bfd_get_16 (abfd, contents + laddr + 12);
2520 insn[4] = bfd_get_16 (abfd, contents + laddr + 14);
2521
2522 if ((insn[0] & MOVHI_MASK) != MOVHI
2523 || MOVHI_R1 (insn[0]) != 0)
2524 no_match = 0;
2525
2526 if (no_match < 0
2527 && ((insn[1] & MOVEA_MASK) != MOVEA
2528 || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
2529 no_match = 1;
2530
2531 if (no_match < 0
2532 && (insn[2] & JARL_4_MASK) != JARL_4)
2533 no_match = 2;
2534
2535 if (no_match < 0
2536 && ((insn[3] & ADD_I_MASK) != ADD_I
2537 || ADD_I5 (insn[3]) != 4
2538 || JARL_R2 (insn[2]) != ADD_R2 (insn[3])))
2539 no_match = 3;
2540
2541 if (no_match < 0
2542 && ((insn[4] & JMP_R_MASK) != JMP_R
2543 || MOVEA_R2 (insn[1]) != JMP_R1 (insn[4])))
2544 no_match = 4;
2545 }
2546 else
2547 {
2548 ((*_bfd_error_handler)
2549 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insns",
2550 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2551
2552 continue;
2553 }
2554
2555 if (no_match >= 0)
2556 {
2557 ((*_bfd_error_handler)
2558 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insn 0x%x",
2559 bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
2560
2561 continue;
2562 }
2563
2564 /* Get the reloc for the address from which the register is
2565 being loaded. This reloc will tell us which function is
2566 actually being called. */
2567 for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
2568 if (hi_irelfn->r_offset == laddr + 2
2569 && ELF32_R_TYPE (hi_irelfn->r_info)
2570 == (int) R_V850_HI16_S)
2571 break;
2572
2573 for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
2574 if (lo_irelfn->r_offset == laddr + 6
2575 && ELF32_R_TYPE (lo_irelfn->r_info)
2576 == (int) R_V850_LO16)
2577 break;
2578
2579 for (irelcall = internal_relocs; irelcall < irelend; irelcall ++)
2580 if (irelcall->r_offset == laddr + 8
2581 && ELF32_R_TYPE (irelcall->r_info)
2582 == (int) R_V850_22_PCREL)
2583 break;
2584
2585 if ( hi_irelfn == irelend
2586 || lo_irelfn == irelend
2587 || irelcall == irelend)
2588 {
2589 ((*_bfd_error_handler)
2590 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc",
2591 bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
2592
2593 continue;
2594 }
2595
2596 if (ELF32_R_SYM (irelcall->r_info) < symtab_hdr->sh_info)
2597 {
2598 Elf_Internal_Sym * isym;
2599
2600 /* A local symbol. */
2601 isym = isymbuf + ELF32_R_SYM (irelcall->r_info);
2602
2603 symval = isym->st_value;
2604 }
2605 else
2606 {
2607 unsigned long indx;
2608 struct elf_link_hash_entry * h;
2609
2610 /* An external symbol. */
2611 indx = ELF32_R_SYM (irelcall->r_info) - symtab_hdr->sh_info;
2612 h = elf_sym_hashes (abfd)[indx];
2613 BFD_ASSERT (h != NULL);
2614
2615 if ( h->root.type != bfd_link_hash_defined
2616 && h->root.type != bfd_link_hash_defweak)
2617 /* This appears to be a reference to an undefined
2618 symbol. Just ignore it--it will be caught by the
2619 regular reloc processing. */
2620 continue;
2621
2622 symval = h->root.u.def.value;
2623 }
2624
2625 if (symval + irelcall->r_addend != irelcall->r_offset + 4)
2626 {
2627 ((*_bfd_error_handler)
2628 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc 0x%lx",
2629 bfd_get_filename (abfd), (unsigned long) irel->r_offset, irelcall->r_offset ));
2630
2631 continue;
2632 }
2633
2634 /* Get the value of the symbol referred to by the reloc. */
2635 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2636 {
2637 Elf_Internal_Sym *isym;
2638 asection *sym_sec;
2639
2640 /* A local symbol. */
2641 isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
2642
2643 if (isym->st_shndx == SHN_UNDEF)
2644 sym_sec = bfd_und_section_ptr;
2645 else if (isym->st_shndx == SHN_ABS)
2646 sym_sec = bfd_abs_section_ptr;
2647 else if (isym->st_shndx == SHN_COMMON)
2648 sym_sec = bfd_com_section_ptr;
2649 else
2650 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2651 symval = (isym->st_value
2652 + sym_sec->output_section->vma
2653 + sym_sec->output_offset);
2654 }
2655 else
2656 {
2657 unsigned long indx;
2658 struct elf_link_hash_entry *h;
2659
2660 /* An external symbol. */
2661 indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
2662 h = elf_sym_hashes (abfd)[indx];
2663 BFD_ASSERT (h != NULL);
2664
2665 if ( h->root.type != bfd_link_hash_defined
2666 && h->root.type != bfd_link_hash_defweak)
2667 /* This appears to be a reference to an undefined
2668 symbol. Just ignore it--it will be caught by the
2669 regular reloc processing. */
2670 continue;
2671
2672 symval = (h->root.u.def.value
2673 + h->root.u.def.section->output_section->vma
2674 + h->root.u.def.section->output_offset);
2675 }
2676
2677 addend = irel->r_addend;
2678
2679 foff = (symval + addend
2680 - (irel->r_offset
2681 + sec->output_section->vma
2682 + sec->output_offset
2683 + 4));
2684 #ifdef DEBUG_RELAX
2685 fprintf (stderr, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2686 irel->r_offset,
2687 (irel->r_offset
2688 + sec->output_section->vma
2689 + sec->output_offset),
2690 symval, addend, foff);
2691 #endif
2692
2693 if (foff < -0x100000 || foff >= 0x100000)
2694 /* After all that work, we can't shorten this function call. */
2695 continue;
2696
2697 /* For simplicity of coding, we are going to modify the section
2698 contents, the section relocs, and the BFD symbol table. We
2699 must tell the rest of the code not to free up this
2700 information. It would be possible to instead create a table
2701 of changes which have to be made, as is done in coff-mips.c;
2702 that would be more work, but would require less memory when
2703 the linker is run. */
2704 elf_section_data (sec)->relocs = internal_relocs;
2705 elf_section_data (sec)->this_hdr.contents = contents;
2706 symtab_hdr->contents = (bfd_byte *) isymbuf;
2707
2708 /* Replace the long call with a jarl. */
2709 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_22_PCREL);
2710
2711 addend = 0;
2712
2713 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2714 /* If this needs to be changed because of future relaxing,
2715 it will be handled here like other internal IND12W
2716 relocs. */
2717 bfd_put_32 (abfd,
2718 0x00000780 | (JARL_R2 (insn[2])<<11) | ((addend << 16) & 0xffff) | ((addend >> 16) & 0xf),
2719 contents + irel->r_offset);
2720 else
2721 /* We can't fully resolve this yet, because the external
2722 symbol value may be changed by future relaxing.
2723 We let the final link phase handle it. */
2724 bfd_put_32 (abfd, 0x00000780 | (JARL_R2 (insn[2])<<11),
2725 contents + irel->r_offset);
2726
2727 hi_irelfn->r_info =
2728 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2729 lo_irelfn->r_info =
2730 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2731 irelcall->r_info =
2732 ELF32_R_INFO (ELF32_R_SYM (irelcall->r_info), R_V850_NONE);
2733
2734 if (! v850_elf_relax_delete_bytes (abfd, sec,
2735 irel->r_offset + 4, toaddr, 12))
2736 goto error_return;
2737
2738 align_pad_size += 12;
2739 }
2740 else if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)
2741 {
2742 /* Check code for -mlong-jumps output. */
2743 if (laddr + 10 <= (bfd_vma) sec->size)
2744 {
2745 insn[0] = bfd_get_16 (abfd, contents + laddr);
2746 insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
2747 insn[2] = bfd_get_16 (abfd, contents + laddr + 8);
2748
2749 if ((insn[0] & MOVHI_MASK) != MOVHI
2750 || MOVHI_R1 (insn[0]) != 0)
2751 no_match = 0;
2752
2753 if (no_match < 0
2754 && ((insn[1] & MOVEA_MASK) != MOVEA
2755 || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
2756 no_match = 1;
2757
2758 if (no_match < 0
2759 && ((insn[2] & JMP_R_MASK) != JMP_R
2760 || MOVEA_R2 (insn[1]) != JMP_R1 (insn[2])))
2761 no_match = 4;
2762 }
2763 else
2764 {
2765 ((*_bfd_error_handler)
2766 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insns",
2767 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2768
2769 continue;
2770 }
2771
2772 if (no_match >= 0)
2773 {
2774 ((*_bfd_error_handler)
2775 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insn 0x%x",
2776 bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
2777
2778 continue;
2779 }
2780
2781 /* Get the reloc for the address from which the register is
2782 being loaded. This reloc will tell us which function is
2783 actually being called. */
2784 for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
2785 if (hi_irelfn->r_offset == laddr + 2
2786 && ELF32_R_TYPE (hi_irelfn->r_info) == (int) R_V850_HI16_S)
2787 break;
2788
2789 for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
2790 if (lo_irelfn->r_offset == laddr + 6
2791 && ELF32_R_TYPE (lo_irelfn->r_info) == (int) R_V850_LO16)
2792 break;
2793
2794 if ( hi_irelfn == irelend
2795 || lo_irelfn == irelend)
2796 {
2797 ((*_bfd_error_handler)
2798 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized reloc",
2799 bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
2800
2801 continue;
2802 }
2803
2804 /* Get the value of the symbol referred to by the reloc. */
2805 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2806 {
2807 Elf_Internal_Sym * isym;
2808 asection * sym_sec;
2809
2810 /* A local symbol. */
2811 isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
2812
2813 if (isym->st_shndx == SHN_UNDEF)
2814 sym_sec = bfd_und_section_ptr;
2815 else if (isym->st_shndx == SHN_ABS)
2816 sym_sec = bfd_abs_section_ptr;
2817 else if (isym->st_shndx == SHN_COMMON)
2818 sym_sec = bfd_com_section_ptr;
2819 else
2820 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2821 symval = (isym->st_value
2822 + sym_sec->output_section->vma
2823 + sym_sec->output_offset);
2824 #ifdef DEBUG_RELAX
2825 {
2826 char * name = bfd_elf_string_from_elf_section
2827 (abfd, symtab_hdr->sh_link, isym->st_name);
2828
2829 fprintf (stderr, "relax long jump local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2830 sym_sec->name, name, isym->st_name,
2831 sym_sec->output_section->vma,
2832 sym_sec->output_offset,
2833 isym->st_value, irel->r_addend);
2834 }
2835 #endif
2836 }
2837 else
2838 {
2839 unsigned long indx;
2840 struct elf_link_hash_entry * h;
2841
2842 /* An external symbol. */
2843 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2844 h = elf_sym_hashes (abfd)[indx];
2845 BFD_ASSERT (h != NULL);
2846
2847 if ( h->root.type != bfd_link_hash_defined
2848 && h->root.type != bfd_link_hash_defweak)
2849 /* This appears to be a reference to an undefined
2850 symbol. Just ignore it--it will be caught by the
2851 regular reloc processing. */
2852 continue;
2853
2854 symval = (h->root.u.def.value
2855 + h->root.u.def.section->output_section->vma
2856 + h->root.u.def.section->output_offset);
2857 #ifdef DEBUG_RELAX
2858 fprintf (stderr,
2859 "relax longjump defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2860 sec->name, h->root.root.string, h->root.u.def.value,
2861 sec->output_section->vma, sec->output_offset, irel->r_addend);
2862 #endif
2863 }
2864
2865 addend = irel->r_addend;
2866
2867 foff = (symval + addend
2868 - (irel->r_offset
2869 + sec->output_section->vma
2870 + sec->output_offset
2871 + 4));
2872 #ifdef DEBUG_RELAX
2873 fprintf (stderr, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2874 irel->r_offset,
2875 (irel->r_offset
2876 + sec->output_section->vma
2877 + sec->output_offset),
2878 symval, addend, foff);
2879 #endif
2880 if (foff < -0x100000 || foff >= 0x100000)
2881 /* After all that work, we can't shorten this function call. */
2882 continue;
2883
2884 /* For simplicity of coding, we are going to modify the section
2885 contents, the section relocs, and the BFD symbol table. We
2886 must tell the rest of the code not to free up this
2887 information. It would be possible to instead create a table
2888 of changes which have to be made, as is done in coff-mips.c;
2889 that would be more work, but would require less memory when
2890 the linker is run. */
2891 elf_section_data (sec)->relocs = internal_relocs;
2892 elf_section_data (sec)->this_hdr.contents = contents;
2893 symtab_hdr->contents = (bfd_byte *) isymbuf;
2894
2895 if (foff < -0x100 || foff >= 0x100)
2896 {
2897 /* Replace the long jump with a jr. */
2898
2899 irel->r_info =
2900 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_22_PCREL);
2901
2902 irel->r_addend = addend;
2903 addend = 0;
2904
2905 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2906 /* If this needs to be changed because of future relaxing,
2907 it will be handled here like other internal IND12W
2908 relocs. */
2909 bfd_put_32 (abfd,
2910 0x00000780 | ((addend << 15) & 0xffff0000) | ((addend >> 17) & 0xf),
2911 contents + irel->r_offset);
2912 else
2913 /* We can't fully resolve this yet, because the external
2914 symbol value may be changed by future relaxing.
2915 We let the final link phase handle it. */
2916 bfd_put_32 (abfd, 0x00000780, contents + irel->r_offset);
2917
2918 hi_irelfn->r_info =
2919 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2920 lo_irelfn->r_info =
2921 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2922 if (!v850_elf_relax_delete_bytes (abfd, sec,
2923 irel->r_offset + 4, toaddr, 6))
2924 goto error_return;
2925
2926 align_pad_size += 6;
2927 }
2928 else
2929 {
2930 /* Replace the long jump with a br. */
2931
2932 irel->r_info =
2933 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_9_PCREL);
2934
2935 irel->r_addend = addend;
2936 addend = 0;
2937
2938 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2939 /* If this needs to be changed because of future relaxing,
2940 it will be handled here like other internal IND12W
2941 relocs. */
2942 bfd_put_16 (abfd,
2943 0x0585 | ((addend << 10) & 0xf800) | ((addend << 3) & 0x0070),
2944 contents + irel->r_offset);
2945 else
2946 /* We can't fully resolve this yet, because the external
2947 symbol value may be changed by future relaxing.
2948 We let the final link phase handle it. */
2949 bfd_put_16 (abfd, 0x0585, contents + irel->r_offset);
2950
2951 hi_irelfn->r_info =
2952 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2953 lo_irelfn->r_info =
2954 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2955 if (!v850_elf_relax_delete_bytes (abfd, sec,
2956 irel->r_offset + 2, toaddr, 8))
2957 goto error_return;
2958
2959 align_pad_size += 8;
2960 }
2961 }
2962 }
2963
2964 irelalign = NULL;
2965 for (irel = internal_relocs; irel < irelend; irel++)
2966 {
2967 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
2968 && irel->r_offset == toaddr)
2969 {
2970 irel->r_offset -= align_pad_size;
2971
2972 if (irelalign == NULL || irelalign->r_addend > irel->r_addend)
2973 irelalign = irel;
2974 }
2975 }
2976
2977 addr = toaddr;
2978 }
2979
2980 if (!irelalign)
2981 {
2982 #ifdef DEBUG_RELAX
2983 fprintf (stderr, "relax pad %d shorten %d -> %d\n",
2984 align_pad_size,
2985 sec->size,
2986 sec->size - align_pad_size);
2987 #endif
2988 sec->size -= align_pad_size;
2989 }
2990
2991 finish:
2992 if (internal_relocs != NULL
2993 && elf_section_data (sec)->relocs != internal_relocs)
2994 free (internal_relocs);
2995
2996 if (contents != NULL
2997 && elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents)
2998 free (contents);
2999
3000 if (isymbuf != NULL
3001 && symtab_hdr->contents != (bfd_byte *) isymbuf)
3002 free (isymbuf);
3003
3004 return result;
3005
3006 error_return:
3007 result = FALSE;
3008 goto finish;
3009 }
3010
3011 static const struct bfd_elf_special_section v850_elf_special_sections[] =
3012 {
3013 { STRING_COMMA_LEN (".call_table_data"), 0, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE) },
3014 { STRING_COMMA_LEN (".call_table_text"), 0, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3015 + SHF_EXECINSTR) },
3016 { STRING_COMMA_LEN (".rosdata"), -2, SHT_PROGBITS, (SHF_ALLOC
3017 + SHF_V850_GPREL) },
3018 { STRING_COMMA_LEN (".rozdata"), -2, SHT_PROGBITS, (SHF_ALLOC
3019 + SHF_V850_R0REL) },
3020 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, (SHF_ALLOC + SHF_WRITE
3021 + SHF_V850_GPREL) },
3022 { STRING_COMMA_LEN (".scommon"), -2, SHT_V850_SCOMMON, (SHF_ALLOC + SHF_WRITE
3023 + SHF_V850_GPREL) },
3024 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3025 + SHF_V850_GPREL) },
3026 { STRING_COMMA_LEN (".tbss"), -2, SHT_NOBITS, (SHF_ALLOC + SHF_WRITE
3027 + SHF_V850_EPREL) },
3028 { STRING_COMMA_LEN (".tcommon"), -2, SHT_V850_TCOMMON, (SHF_ALLOC + SHF_WRITE
3029 + SHF_V850_R0REL) },
3030 { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3031 + SHF_V850_EPREL) },
3032 { STRING_COMMA_LEN (".zbss"), -2, SHT_NOBITS, (SHF_ALLOC + SHF_WRITE
3033 + SHF_V850_R0REL) },
3034 { STRING_COMMA_LEN (".zcommon"), -2, SHT_V850_ZCOMMON, (SHF_ALLOC + SHF_WRITE
3035 + SHF_V850_R0REL) },
3036 { STRING_COMMA_LEN (".zdata"), -2, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3037 + SHF_V850_R0REL) },
3038 { NULL, 0, 0, 0, 0 }
3039 };
3040 \f
3041 #define TARGET_LITTLE_SYM bfd_elf32_v850_vec
3042 #define TARGET_LITTLE_NAME "elf32-v850"
3043 #define ELF_ARCH bfd_arch_v850
3044 #define ELF_MACHINE_CODE EM_V850
3045 #define ELF_MACHINE_ALT1 EM_CYGNUS_V850
3046 #define ELF_MACHINE_ALT2 EM_V800 /* This is the value used by the GreenHills toolchain. */
3047 #define ELF_MAXPAGESIZE 0x1000
3048
3049 #define elf_info_to_howto v850_elf_info_to_howto_rela
3050 #define elf_info_to_howto_rel v850_elf_info_to_howto_rel
3051
3052 #define elf_backend_check_relocs v850_elf_check_relocs
3053 #define elf_backend_relocate_section v850_elf_relocate_section
3054 #define elf_backend_object_p v850_elf_object_p
3055 #define elf_backend_final_write_processing v850_elf_final_write_processing
3056 #define elf_backend_section_from_bfd_section v850_elf_section_from_bfd_section
3057 #define elf_backend_symbol_processing v850_elf_symbol_processing
3058 #define elf_backend_add_symbol_hook v850_elf_add_symbol_hook
3059 #define elf_backend_link_output_symbol_hook v850_elf_link_output_symbol_hook
3060 #define elf_backend_section_from_shdr v850_elf_section_from_shdr
3061 #define elf_backend_fake_sections v850_elf_fake_sections
3062 #define elf_backend_gc_mark_hook v850_elf_gc_mark_hook
3063 #define elf_backend_special_sections v850_elf_special_sections
3064
3065 #define elf_backend_can_gc_sections 1
3066 #define elf_backend_rela_normal 1
3067
3068 #define bfd_elf32_bfd_is_local_label_name v850_elf_is_local_label_name
3069 #define bfd_elf32_bfd_reloc_type_lookup v850_elf_reloc_type_lookup
3070 #define bfd_elf32_bfd_merge_private_bfd_data v850_elf_merge_private_bfd_data
3071 #define bfd_elf32_bfd_set_private_flags v850_elf_set_private_flags
3072 #define bfd_elf32_bfd_print_private_bfd_data v850_elf_print_private_bfd_data
3073 #define bfd_elf32_bfd_relax_section v850_elf_relax_section
3074
3075 #define elf_symbol_leading_char '_'
3076
3077 #include "elf32-target.h"