1 /* V850-specific support for 32-bit ELF
2 Copyright (C) 1996, 1997 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
23 dependencies. As is the gas & simulator code or the v850. */
33 static reloc_howto_type
*v850_elf_reloc_type_lookup
34 PARAMS ((bfd
*abfd
, bfd_reloc_code_real_type code
));
35 static void v850_elf_info_to_howto_rel
36 PARAMS ((bfd
*, arelent
*, Elf32_Internal_Rel
*));
37 static bfd_reloc_status_type v850_elf_reloc
38 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
39 static boolean v850_elf_is_local_label_name
PARAMS ((bfd
*, const char *));
40 static boolean v850_elf_relocate_section
PARAMS((bfd
*,
41 struct bfd_link_info
*,
48 /* Try to minimize the amount of space occupied by relocation tables
49 on the ROM (not that the ROM won't be swamped by other ELF overhead). */
52 /* Note: It is REQUIRED that the 'type' value of each entry in this array
53 match the index of the entry in the array. */
54 static reloc_howto_type v850_elf_howto_table
[] =
56 /* This reloc does nothing. */
57 HOWTO (R_V850_NONE
, /* type */
59 2, /* size (0 = byte, 1 = short, 2 = long) */
61 false, /* pc_relative */
63 complain_overflow_bitfield
, /* complain_on_overflow */
64 bfd_elf_generic_reloc
, /* special_function */
65 "R_V850_NONE", /* name */
66 false, /* partial_inplace */
69 false), /* pcrel_offset */
71 /* A PC relative 9 bit branch. */
72 HOWTO (R_V850_9_PCREL
, /* type */
74 2, /* size (0 = byte, 1 = short, 2 = long) */
76 true, /* pc_relative */
78 complain_overflow_bitfield
, /* complain_on_overflow */
79 v850_elf_reloc
, /* special_function */
80 "R_V850_9_PCREL", /* name */
81 false, /* partial_inplace */
82 0x00ffffff, /* src_mask */
83 0x00ffffff, /* dst_mask */
84 true), /* pcrel_offset */
86 /* A PC relative 22 bit branch. */
87 HOWTO (R_V850_22_PCREL
, /* type */
89 2, /* size (0 = byte, 1 = short, 2 = long) */
91 true, /* pc_relative */
93 complain_overflow_signed
, /* complain_on_overflow */
94 v850_elf_reloc
, /* special_function */
95 "R_V850_22_PCREL", /* name */
96 false, /* partial_inplace */
97 0x07ffff80, /* src_mask */
98 0x07ffff80, /* dst_mask */
99 true), /* pcrel_offset */
101 /* High 16 bits of symbol value. */
102 HOWTO (R_V850_HI16_S
, /* type */
104 1, /* size (0 = byte, 1 = short, 2 = long) */
106 false, /* pc_relative */
108 complain_overflow_dont
, /* complain_on_overflow */
109 v850_elf_reloc
, /* special_function */
110 "R_V850_HI16_S", /* name */
111 true, /* partial_inplace */
112 0xffff, /* src_mask */
113 0xffff, /* dst_mask */
114 false), /* pcrel_offset */
116 /* High 16 bits of symbol value. */
117 HOWTO (R_V850_HI16
, /* type */
119 1, /* size (0 = byte, 1 = short, 2 = long) */
121 false, /* pc_relative */
123 complain_overflow_dont
, /* complain_on_overflow */
124 v850_elf_reloc
, /* special_function */
125 "R_V850_HI16", /* name */
126 true, /* partial_inplace */
127 0xffff, /* src_mask */
128 0xffff, /* dst_mask */
129 false), /* pcrel_offset */
131 /* Low 16 bits of symbol value. */
132 HOWTO (R_V850_LO16
, /* type */
134 1, /* size (0 = byte, 1 = short, 2 = long) */
136 false, /* pc_relative */
138 complain_overflow_dont
, /* complain_on_overflow */
139 v850_elf_reloc
, /* special_function */
140 "R_V850_LO16", /* name */
141 true, /* partial_inplace */
142 0xffff, /* src_mask */
143 0xffff, /* dst_mask */
144 false), /* pcrel_offset */
146 /* Simple 32bit reloc. */
147 HOWTO (R_V850_32
, /* type */
149 2, /* size (0 = byte, 1 = short, 2 = long) */
151 false, /* pc_relative */
153 complain_overflow_dont
, /* complain_on_overflow */
154 bfd_elf_generic_reloc
, /* special_function */
155 "R_V850_32", /* name */
156 true, /* partial_inplace */
157 0xffffffff, /* src_mask */
158 0xffffffff, /* dst_mask */
159 false), /* pcrel_offset */
161 /* Simple 16bit reloc. */
162 HOWTO (R_V850_16
, /* type */
164 1, /* size (0 = byte, 1 = short, 2 = long) */
166 false, /* pc_relative */
168 complain_overflow_dont
, /* complain_on_overflow */
169 bfd_elf_generic_reloc
, /* special_function */
170 "R_V850_16", /* name */
171 true, /* partial_inplace */
172 0xffff, /* src_mask */
173 0xffff, /* dst_mask */
174 false), /* pcrel_offset */
176 /* Simple 8bit reloc. */
177 HOWTO (R_V850_8
, /* type */
179 0, /* size (0 = byte, 1 = short, 2 = long) */
181 false, /* pc_relative */
183 complain_overflow_dont
, /* complain_on_overflow */
184 bfd_elf_generic_reloc
, /* special_function */
185 "R_V850_8", /* name */
186 true, /* partial_inplace */
189 false), /* pcrel_offset */
191 /* 16 bit offset from the short data area pointer. */
192 HOWTO (R_V850_SDA_16_16_OFFSET
, /* type */
194 1, /* size (0 = byte, 1 = short, 2 = long) */
196 false, /* pc_relative */
198 complain_overflow_dont
, /* complain_on_overflow */
199 v850_elf_reloc
, /* special_function */
200 "R_V850_SDA_16_16_OFFSET", /* name */
201 false, /* partial_inplace */
202 0xffff, /* src_mask */
203 0xffff, /* dst_mask */
204 false), /* pcrel_offset */
206 /* 15 bit offset from the short data area pointer. */
207 HOWTO (R_V850_SDA_15_16_OFFSET
, /* type */
209 1, /* size (0 = byte, 1 = short, 2 = long) */
211 false, /* pc_relative */
213 complain_overflow_dont
, /* complain_on_overflow */
214 v850_elf_reloc
, /* special_function */
215 "R_V850_SDA_15_16_OFFSET", /* name */
216 false, /* partial_inplace */
217 0xfffe, /* src_mask */
218 0xfffe, /* dst_mask */
219 false), /* pcrel_offset */
221 /* 16 bit offset from the zero data area pointer. */
222 HOWTO (R_V850_ZDA_16_16_OFFSET
, /* type */
224 1, /* size (0 = byte, 1 = short, 2 = long) */
226 false, /* pc_relative */
228 complain_overflow_dont
, /* complain_on_overflow */
229 v850_elf_reloc
, /* special_function */
230 "R_V850_ZDA_16_16_OFFSET", /* name */
231 false, /* partial_inplace */
232 0xffff, /* src_mask */
233 0xffff, /* dst_mask */
234 false), /* pcrel_offset */
236 /* 15 bit offset from the zero data area pointer. */
237 HOWTO (R_V850_ZDA_15_16_OFFSET
, /* type */
239 1, /* size (0 = byte, 1 = short, 2 = long) */
241 false, /* pc_relative */
243 complain_overflow_dont
, /* complain_on_overflow */
244 v850_elf_reloc
, /* special_function */
245 "R_V850_ZDA_15_16_OFFSET", /* name */
246 false, /* partial_inplace */
247 0xfffe, /* src_mask */
248 0xfffe, /* dst_mask */
249 false), /* pcrel_offset */
251 /* 6 bit offset from the tiny data area pointer. */
252 HOWTO (R_V850_TDA_6_8_OFFSET
, /* type */
254 1, /* size (0 = byte, 1 = short, 2 = long) */
256 false, /* pc_relative */
258 complain_overflow_dont
, /* complain_on_overflow */
259 v850_elf_reloc
, /* special_function */
260 "R_V850_TDA_6_8_OFFSET", /* name */
261 false, /* partial_inplace */
264 false), /* pcrel_offset */
266 /* 8 bit offset from the tiny data area pointer. */
267 HOWTO (R_V850_TDA_7_8_OFFSET
, /* type */
269 1, /* size (0 = byte, 1 = short, 2 = long) */
271 false, /* pc_relative */
273 complain_overflow_dont
, /* complain_on_overflow */
274 v850_elf_reloc
, /* special_function */
275 "R_V850_TDA_7_8_OFFSET", /* name */
276 false, /* partial_inplace */
279 false), /* pcrel_offset */
281 /* 7 bit offset from the tiny data area pointer. */
282 HOWTO (R_V850_TDA_7_7_OFFSET
, /* type */
284 1, /* size (0 = byte, 1 = short, 2 = long) */
286 false, /* pc_relative */
288 complain_overflow_dont
, /* complain_on_overflow */
289 v850_elf_reloc
, /* special_function */
290 "R_V850_TDA_7_7_OFFSET", /* name */
291 false, /* partial_inplace */
294 false), /* pcrel_offset */
296 /* 16 bit offset from the tiny data area pointer! */
297 HOWTO (R_V850_TDA_16_16_OFFSET
, /* type */
299 1, /* size (0 = byte, 1 = short, 2 = long) */
301 false, /* pc_relative */
303 complain_overflow_dont
, /* complain_on_overflow */
304 v850_elf_reloc
, /* special_function */
305 "R_V850_TDA_16_16_OFFSET", /* name */
306 false, /* partial_inplace */
307 0xffff, /* src_mask */
308 0xfff, /* dst_mask */
309 false), /* pcrel_offset */
311 /* start-sanitize-v850e */
313 /* 5 bit offset from the tiny data area pointer. */
314 HOWTO (R_V850_TDA_4_5_OFFSET
, /* type */
316 1, /* size (0 = byte, 1 = short, 2 = long) */
318 false, /* pc_relative */
320 complain_overflow_dont
, /* complain_on_overflow */
321 v850_elf_reloc
, /* special_function */
322 "R_V850_TDA_4_5_OFFSET", /* name */
323 false, /* partial_inplace */
326 false), /* pcrel_offset */
328 /* 4 bit offset from the tiny data area pointer. */
329 HOWTO (R_V850_TDA_4_4_OFFSET
, /* type */
331 1, /* size (0 = byte, 1 = short, 2 = long) */
333 false, /* pc_relative */
335 complain_overflow_dont
, /* complain_on_overflow */
336 v850_elf_reloc
, /* special_function */
337 "R_V850_TDA_4_4_OFFSET", /* name */
338 false, /* partial_inplace */
341 false), /* pcrel_offset */
343 /* 16 bit offset from the short data area pointer. */
344 HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET
, /* type */
346 2, /* size (0 = byte, 1 = short, 2 = long) */
348 false, /* pc_relative */
350 complain_overflow_dont
, /* complain_on_overflow */
351 v850_elf_reloc
, /* special_function */
352 "R_V850_SDA_16_16_SPLIT_OFFSET",/* name */
353 false, /* partial_inplace */
354 0xfffe0020, /* src_mask */
355 0xfffe0020, /* dst_mask */
356 false), /* pcrel_offset */
358 /* 16 bit offset from the zero data area pointer. */
359 HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET
, /* type */
361 2, /* size (0 = byte, 1 = short, 2 = long) */
363 false, /* pc_relative */
365 complain_overflow_dont
, /* complain_on_overflow */
366 v850_elf_reloc
, /* special_function */
367 "R_V850_ZDA_16_16_SPLIT_OFFSET",/* name */
368 false, /* partial_inplace */
369 0xfffe0020, /* src_mask */
370 0xfffe0020, /* dst_mask */
371 false), /* pcrel_offset */
373 /* end-sanitize-v850e */
376 /* Map BFD reloc types to V850 ELF reloc types. */
378 struct v850_elf_reloc_map
380 unsigned char bfd_reloc_val
;
381 unsigned char elf_reloc_val
;
384 static const struct v850_elf_reloc_map v850_elf_reloc_map
[] =
386 { BFD_RELOC_NONE
, R_V850_NONE
},
387 { BFD_RELOC_V850_9_PCREL
, R_V850_9_PCREL
},
388 { BFD_RELOC_V850_22_PCREL
, R_V850_22_PCREL
},
389 { BFD_RELOC_HI16_S
, R_V850_HI16_S
},
390 { BFD_RELOC_HI16
, R_V850_HI16
},
391 { BFD_RELOC_LO16
, R_V850_LO16
},
392 { BFD_RELOC_32
, R_V850_32
},
393 { BFD_RELOC_16
, R_V850_16
},
394 { BFD_RELOC_8
, R_V850_8
},
395 { BFD_RELOC_V850_SDA_16_16_OFFSET
, R_V850_SDA_16_16_OFFSET
},
396 { BFD_RELOC_V850_SDA_15_16_OFFSET
, R_V850_SDA_15_16_OFFSET
},
397 { BFD_RELOC_V850_ZDA_16_16_OFFSET
, R_V850_ZDA_16_16_OFFSET
},
398 { BFD_RELOC_V850_ZDA_15_16_OFFSET
, R_V850_ZDA_15_16_OFFSET
},
399 { BFD_RELOC_V850_TDA_6_8_OFFSET
, R_V850_TDA_6_8_OFFSET
},
400 { BFD_RELOC_V850_TDA_7_8_OFFSET
, R_V850_TDA_7_8_OFFSET
},
401 { BFD_RELOC_V850_TDA_7_7_OFFSET
, R_V850_TDA_7_7_OFFSET
},
402 { BFD_RELOC_V850_TDA_16_16_OFFSET
, R_V850_TDA_16_16_OFFSET
},
403 /* start-sanitize-v850e */
404 { BFD_RELOC_V850_TDA_4_5_OFFSET
, R_V850_TDA_4_5_OFFSET
},
405 { BFD_RELOC_V850_TDA_4_4_OFFSET
, R_V850_TDA_4_4_OFFSET
},
406 { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET
, R_V850_SDA_16_16_SPLIT_OFFSET
},
407 { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET
, R_V850_ZDA_16_16_SPLIT_OFFSET
},
408 /* end-sanitize-v850e */
412 /* Map a bfd relocation into the appropriate howto structure */
413 static reloc_howto_type
*
414 v850_elf_reloc_type_lookup (abfd
, code
)
416 bfd_reloc_code_real_type code
;
421 i
< sizeof (v850_elf_reloc_map
) / sizeof (struct v850_elf_reloc_map
);
424 if (v850_elf_reloc_map
[i
].bfd_reloc_val
== code
)
426 BFD_ASSERT (v850_elf_howto_table
[v850_elf_reloc_map
[i
].elf_reloc_val
].type
== v850_elf_reloc_map
[i
].elf_reloc_val
);
428 return & v850_elf_howto_table
[v850_elf_reloc_map
[i
].elf_reloc_val
];
436 /* Set the howto pointer for an V850 ELF reloc. */
438 v850_elf_info_to_howto_rel (abfd
, cache_ptr
, dst
)
441 Elf32_Internal_Rel
*dst
;
445 r_type
= ELF32_R_TYPE (dst
->r_info
);
446 BFD_ASSERT (r_type
< (unsigned int) R_V850_max
);
447 cache_ptr
->howto
= &v850_elf_howto_table
[r_type
];
451 /* Look through the relocs for a section during the first phase, and
452 allocate space in the global offset table or procedure linkage
456 v850_elf_check_relocs (abfd
, info
, sec
, relocs
)
458 struct bfd_link_info
*info
;
460 const Elf_Internal_Rela
*relocs
;
464 Elf_Internal_Shdr
*symtab_hdr
;
465 struct elf_link_hash_entry
**sym_hashes
;
466 const Elf_Internal_Rela
*rel
;
467 const Elf_Internal_Rela
*rel_end
;
469 enum reloc_type r_type
;
471 const char *common
= (const char *)0;
473 if (info
->relocateable
)
477 fprintf (stderr
, "v850_elf_check_relocs called for section %s in %s\n",
478 bfd_get_section_name (abfd
, sec
),
479 bfd_get_filename (abfd
));
482 dynobj
= elf_hash_table (info
)->dynobj
;
483 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
484 sym_hashes
= elf_sym_hashes (abfd
);
487 rel_end
= relocs
+ sec
->reloc_count
;
488 for (rel
= relocs
; rel
< rel_end
; rel
++)
490 unsigned long r_symndx
;
491 struct elf_link_hash_entry
*h
;
493 r_symndx
= ELF32_R_SYM (rel
->r_info
);
494 if (r_symndx
< symtab_hdr
->sh_info
)
497 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
499 r_type
= (enum reloc_type
) ELF32_R_TYPE (rel
->r_info
);
505 case R_V850_22_PCREL
:
514 /* start-sanitize-v850e */
515 case R_V850_SDA_16_16_SPLIT_OFFSET
:
516 /* end-sanitize-v850e */
517 case R_V850_SDA_16_16_OFFSET
:
518 case R_V850_SDA_15_16_OFFSET
:
519 other
= V850_OTHER_SDA
;
521 goto small_data_common
;
523 /* start-sanitize-v850e */
524 case R_V850_ZDA_16_16_SPLIT_OFFSET
:
525 /* end-sanitize-v850e */
526 case R_V850_ZDA_16_16_OFFSET
:
527 case R_V850_ZDA_15_16_OFFSET
:
528 other
= V850_OTHER_ZDA
;
530 goto small_data_common
;
532 /* start-sanitize-v850e */
533 case R_V850_TDA_4_5_OFFSET
:
534 case R_V850_TDA_4_4_OFFSET
:
535 /* end-sanitize-v850e */
536 case R_V850_TDA_6_8_OFFSET
:
537 case R_V850_TDA_7_8_OFFSET
:
538 case R_V850_TDA_7_7_OFFSET
:
539 case R_V850_TDA_16_16_OFFSET
:
540 other
= V850_OTHER_TDA
;
544 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
549 h
->other
|= other
; /* flag which type of relocation was used */
550 if ((h
->other
& V850_OTHER_MASK
) != (other
& V850_OTHER_MASK
)
551 && (h
->other
& V850_OTHER_ERROR
) == 0)
555 switch (h
->other
& V850_OTHER_MASK
)
558 msg
= "Variable cannot occupy in multiple small data regions";
560 case V850_OTHER_SDA
| V850_OTHER_ZDA
| V850_OTHER_TDA
:
561 msg
= "Variable can only be in one of the small, zero, and tiny data regions";
563 case V850_OTHER_SDA
| V850_OTHER_ZDA
:
564 msg
= "Variable cannot be in both small and zero data regions simultaneously";
566 case V850_OTHER_SDA
| V850_OTHER_TDA
:
567 msg
= "Variable cannot be in both small and tiny data regions simultaneously";
569 case V850_OTHER_ZDA
| V850_OTHER_TDA
:
570 msg
= "Variable cannot be in both zero and tiny data regions simultaneously";
574 (*info
->callbacks
->warning
) (info
, msg
, h
->root
.root
.string
,
575 abfd
, h
->root
.u
.def
.section
, 0);
577 bfd_set_error (bfd_error_bad_value
);
578 h
->other
|= V850_OTHER_ERROR
;
583 if (h
&& h
->root
.type
== bfd_link_hash_common
585 && !strcmp (bfd_get_section_name (abfd
, h
->root
.u
.c
.p
->section
), "COMMON"))
587 asection
*section
= h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
, common
);
588 section
->flags
|= SEC_IS_COMMON
;
592 fprintf (stderr
, "v850_elf_check_relocs, found %s relocation for %s%s\n",
593 v850_elf_howto_table
[ (int)r_type
].name
,
594 (h
&& h
->root
.root
.string
) ? h
->root
.root
.string
: "<unknown>",
595 (h
->root
.type
== bfd_link_hash_common
) ? ", symbol is common" : "");
605 /* Insert the addend into the instruction. */
606 static bfd_reloc_status_type
607 v850_elf_reloc (abfd
, reloc
, symbol
, data
, isection
, obfd
, err
)
620 /* If there is an output BFD,
621 and the symbol is not a section name (which is only defined at final link time),
622 and either we are not putting the addend into the instruction
623 or the addend is zero, so there is nothing to add into the instruction
624 then just fixup the address and return. */
625 if (obfd
!= (bfd
*) NULL
626 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
627 && (! reloc
->howto
->partial_inplace
628 || reloc
->addend
== 0))
630 reloc
->address
+= isection
->output_offset
;
634 else if (obfd
!= NULL
)
636 return bfd_reloc_continue
;
640 /* Catch relocs involving undefined symbols. */
641 if (bfd_is_und_section (symbol
->section
)
642 && (symbol
->flags
& BSF_WEAK
) == 0
644 return bfd_reloc_undefined
;
646 /* We handle final linking of some relocs ourselves. */
648 /* Is the address of the relocation really within the section? */
649 if (reloc
->address
> isection
->_cooked_size
)
650 return bfd_reloc_outofrange
;
652 /* Work out which section the relocation is targetted at and the
653 initial relocation command value. */
655 /* Get symbol value. (Common symbols are special.) */
656 if (bfd_is_com_section (symbol
->section
))
659 relocation
= symbol
->value
;
661 /* Convert input-section-relative symbol value to absolute + addend. */
662 relocation
+= symbol
->section
->output_section
->vma
;
663 relocation
+= symbol
->section
->output_offset
;
664 relocation
+= reloc
->addend
;
666 if (reloc
->howto
->pc_relative
== true)
668 /* Here the variable relocation holds the final address of the
669 symbol we are relocating against, plus any addend. */
670 relocation
-= isection
->output_section
->vma
+ isection
->output_offset
;
672 /* Deal with pcrel_offset */
673 relocation
-= reloc
->address
;
676 /* I've got no clue... */
679 switch (reloc
->howto
->type
)
682 /* fprintf (stderr, "reloc type %d not SUPPORTED\n", reloc->howto->type ); */
683 return bfd_reloc_notsupported
;
685 case R_V850_22_PCREL
:
686 if (relocation
> 0x1ffff || relocation
< -0x200000)
687 return bfd_reloc_overflow
;
689 if ((relocation
% 2) != 0)
690 return bfd_reloc_dangerous
;
692 insn
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
694 insn
|= (((relocation
& 0xfffe) << 16)
695 | ((relocation
& 0x3f0000) >> 16));
696 bfd_put_32 (abfd
, insn
, (bfd_byte
*)data
+ reloc
->address
);
700 if (relocation
> 0xff || relocation
< -0x100)
701 return bfd_reloc_overflow
;
703 if ((relocation
% 2) != 0)
704 return bfd_reloc_dangerous
;
706 insn
= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
708 insn
|= ((relocation
& 0x1f0) << 7) | ((relocation
& 0x0e) << 3);
709 bfd_put_16 (abfd
, insn
, (bfd_byte
*)data
+ reloc
->address
);
713 relocation
+= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
714 relocation
= (relocation
>> 16) + ((relocation
& 0x8000) != 0);
715 bfd_put_16 (abfd
, relocation
, (bfd_byte
*)data
+ reloc
->address
);
719 relocation
+= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
720 relocation
= (relocation
>> 16);
721 bfd_put_16 (abfd
, relocation
, (bfd_byte
*)data
+ reloc
->address
);
725 relocation
+= (short)bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
726 /* Do not complain if value has top bit set, as this has been anticipated. */
727 bfd_put_16 (abfd
, relocation
, (bfd_byte
*)data
+ reloc
->address
);
731 relocation
+= (short)bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
734 case R_V850_SDA_16_16_OFFSET
:
735 case R_V850_ZDA_16_16_OFFSET
:
736 case R_V850_TDA_16_16_OFFSET
:
737 if ((long)relocation
> 0x7fff || (long)relocation
< -0x8000)
738 return bfd_reloc_overflow
;
739 bfd_put_16 (abfd
, relocation
, (bfd_byte
*)data
+ reloc
->address
);
742 case R_V850_SDA_15_16_OFFSET
:
743 case R_V850_ZDA_15_16_OFFSET
:
744 if ((long)relocation
> 0x7ffe || (long)relocation
< -0x8000)
745 return bfd_reloc_overflow
;
748 return bfd_reloc_dangerous
;
750 insn
= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
752 insn
|= (relocation
>> 1) & ~1;
754 bfd_put_16 (abfd
, insn
, (bfd_byte
*)data
+ reloc
->address
);
757 case R_V850_TDA_6_8_OFFSET
:
758 if ((long) relocation
> 0xfc || (long) relocation
< 0)
759 return bfd_reloc_overflow
;
762 return bfd_reloc_dangerous
;
764 insn
= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
766 insn
|= (relocation
>> 1);
768 bfd_put_16 (abfd
, insn
, (bfd_byte
*)data
+ reloc
->address
);
771 case R_V850_TDA_7_8_OFFSET
:
772 if ((long) relocation
> 0xfe || (long) relocation
< 0)
773 return bfd_reloc_overflow
;
776 return bfd_reloc_dangerous
;
778 insn
= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
780 insn
|= (relocation
>> 1);
782 bfd_put_16 (abfd
, insn
, (bfd_byte
*)data
+ reloc
->address
);
785 case R_V850_TDA_7_7_OFFSET
:
786 if ((long) relocation
> 0x7f || (long) relocation
< 0)
787 return bfd_reloc_overflow
;
789 insn
= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
793 bfd_put_16 (abfd
, insn
, (bfd_byte
*)data
+ reloc
->address
);
796 /* start-sanitize-v850e */
797 case R_V850_TDA_4_5_OFFSET
:
798 if ((long) relocation
> 0x1e || (long) relocation
< 0)
799 return bfd_reloc_overflow
;
802 return bfd_reloc_dangerous
;
804 insn
= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
806 insn
|= (relocation
>> 1);
808 bfd_put_16 (abfd
, insn
, (bfd_byte
*)data
+ reloc
->address
);
811 case R_V850_TDA_4_4_OFFSET
:
812 if ((long) relocation
> 0xf || (long) relocation
< 0)
813 return bfd_reloc_overflow
;
815 insn
= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
819 bfd_put_16 (abfd
, insn
, (bfd_byte
*)data
+ reloc
->address
);
822 case R_V850_ZDA_16_16_SPLIT_OFFSET
:
823 case R_V850_SDA_16_16_SPLIT_OFFSET
:
824 if ((long) relocation
> 0xffff || (long) relocation
< 0)
825 return bfd_reloc_overflow
;
827 insn
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ reloc
->address
);
830 insn
|= (relocation
& 1) << 5;
831 insn
|= (relocation
& ~1) << 16;
833 bfd_put_32 (abfd
, insn
, (bfd_byte
*)data
+ reloc
->address
);
835 /* end-sanitize-v850e */
838 return bfd_reloc_continue
;
844 v850_elf_is_local_label_name (abfd
, name
)
848 return ((name
[0] == '.' && (name
[1] == 'L' || name
[1] == '.'))
849 || (name
[0] == '_' && name
[1] == '.' && name
[2] == 'L'
854 /* Perform a relocation as part of a final link. */
855 static bfd_reloc_status_type
856 v850_elf_final_link_relocate (howto
, input_bfd
, output_bfd
,
857 input_section
, contents
, offset
, value
,
858 addend
, info
, sym_sec
, is_local
)
859 reloc_howto_type
* howto
;
862 asection
* input_section
;
867 struct bfd_link_info
* info
;
872 unsigned long r_type
= howto
->type
;
873 bfd_byte
* hit_data
= contents
+ offset
;
878 value
-= (input_section
->output_section
->vma
879 + input_section
->output_offset
);
882 if ((long)value
> 0xff || (long)value
< -0x100)
883 return bfd_reloc_overflow
;
885 if ((value
% 2) != 0)
886 return bfd_reloc_dangerous
;
888 insn
= bfd_get_16 (input_bfd
, hit_data
);
890 insn
|= ((value
& 0x1f0) << 7) | ((value
& 0x0e) << 3);
891 bfd_put_16 (input_bfd
, insn
, hit_data
);
894 case R_V850_22_PCREL
:
895 value
-= (input_section
->output_section
->vma
896 + input_section
->output_offset
);
899 if ((long)value
> 0x1ffff || (long)value
< -0x200000)
900 return bfd_reloc_overflow
;
902 if ((value
% 2) != 0)
903 return bfd_reloc_dangerous
;
905 insn
= bfd_get_32 (input_bfd
, hit_data
);
907 insn
|= (((value
& 0xfffe) << 16) | ((value
& 0x3f0000) >> 16));
908 bfd_put_32 (input_bfd
, insn
, hit_data
);
912 value
+= (short)bfd_get_16 (input_bfd
, hit_data
);
913 value
= (value
>> 16) + ((value
& 0x8000) != 0);
915 if ((long)value
> 0x7fff || (long)value
< -0x8000)
916 return bfd_reloc_overflow
;
918 bfd_put_16 (input_bfd
, value
, hit_data
);
922 value
+= (short)bfd_get_16 (input_bfd
, hit_data
);
925 if ((long)value
> 0x7fff || (long)value
< -0x8000)
926 return bfd_reloc_overflow
;
928 bfd_put_16 (input_bfd
, value
, hit_data
);
932 value
+= (short)bfd_get_16 (input_bfd
, hit_data
);
935 bfd_put_16 (input_bfd
, value
, hit_data
);
939 value
+= (short) bfd_get_16 (input_bfd
, hit_data
);
941 if ((long) value
> 0x7fff || (long) value
< -0x8000)
942 return bfd_reloc_overflow
;
944 bfd_put_16 (input_bfd
, value
, hit_data
);
947 case R_V850_ZDA_16_16_OFFSET
:
949 return bfd_reloc_undefined
;
951 value
-= sym_sec
->output_section
->vma
;
952 value
+= (short) bfd_get_16 (input_bfd
, hit_data
);
954 if ((long) value
> 0x7fff || (long) value
< -0x8000)
955 return bfd_reloc_overflow
;
957 bfd_put_16 (input_bfd
, value
, hit_data
);
960 case R_V850_ZDA_15_16_OFFSET
:
962 return bfd_reloc_undefined
;
964 insn
= bfd_get_16 (input_bfd
, hit_data
);
966 value
-= sym_sec
->output_section
->vma
;
967 value
+= ((insn
& 0xfffe) << 1);
969 if ((long) value
> 0x7ffe || (long) value
< -0x8000)
970 return bfd_reloc_overflow
;
975 bfd_put_16 (input_bfd
, value
, hit_data
);
979 value
+= bfd_get_32 (input_bfd
, hit_data
);
980 bfd_put_32 (input_bfd
, value
, hit_data
);
984 value
+= (char)bfd_get_8 (input_bfd
, hit_data
);
986 if ((long)value
> 0x7f || (long)value
< -0x80)
987 return bfd_reloc_overflow
;
989 bfd_put_8 (input_bfd
, value
, hit_data
);
992 case R_V850_SDA_16_16_OFFSET
:
994 return bfd_reloc_undefined
;
998 struct bfd_link_hash_entry
* h
;
1000 /* Get the value of __gp. */
1001 h
= bfd_link_hash_lookup (info
->hash
, "__gp", false, false, true);
1002 if (h
== (struct bfd_link_hash_entry
*) NULL
1003 || h
->type
!= bfd_link_hash_defined
)
1004 return bfd_reloc_other
;
1006 gp
= (h
->u
.def
.value
1007 + h
->u
.def
.section
->output_section
->vma
1008 + h
->u
.def
.section
->output_offset
);
1010 value
-= sym_sec
->output_section
->vma
;
1011 value
-= (gp
- sym_sec
->output_section
->vma
);
1012 value
+= (short) bfd_get_16 (input_bfd
, hit_data
);
1014 if ((long)value
> 0x7fff || (long)value
< -0x8000)
1015 return bfd_reloc_overflow
;
1017 bfd_put_16 (input_bfd
, value
, hit_data
);
1018 return bfd_reloc_ok
;
1021 case R_V850_SDA_15_16_OFFSET
:
1022 if (sym_sec
== NULL
)
1023 return bfd_reloc_undefined
;
1027 struct bfd_link_hash_entry
* h
;
1029 /* Get the value of __gp. */
1030 h
= bfd_link_hash_lookup (info
->hash
, "__gp", false, false, true);
1031 if (h
== (struct bfd_link_hash_entry
*) NULL
1032 || h
->type
!= bfd_link_hash_defined
)
1033 return bfd_reloc_other
;
1035 gp
= (h
->u
.def
.value
1036 + h
->u
.def
.section
->output_section
->vma
1037 + h
->u
.def
.section
->output_offset
);
1039 value
-= sym_sec
->output_section
->vma
;
1040 value
-= (gp
- sym_sec
->output_section
->vma
);
1042 insn
= bfd_get_16 (input_bfd
, hit_data
);
1044 value
+= ((insn
& 0xfffe) << 1);
1046 if ((long)value
> 0x7ffe || (long)value
< -0x8000)
1047 return bfd_reloc_overflow
;
1050 value
|= (insn
& 1);
1052 bfd_put_16 (input_bfd
, value
, hit_data
);
1053 return bfd_reloc_ok
;
1056 case R_V850_TDA_6_8_OFFSET
:
1059 struct bfd_link_hash_entry
* h
;
1061 insn
= bfd_get_16 (input_bfd
, hit_data
);
1063 /* Get the value of __ep. */
1064 h
= bfd_link_hash_lookup (info
->hash
, "__ep", false, false, true);
1065 if (h
== (struct bfd_link_hash_entry
*) NULL
1066 || h
->type
!= bfd_link_hash_defined
)
1067 return bfd_reloc_continue
; /* Actually this indicates that __ep could not be found. */
1069 ep
= (h
->u
.def
.value
1070 + h
->u
.def
.section
->output_section
->vma
1071 + h
->u
.def
.section
->output_offset
);
1074 value
+= ((insn
& 0x7e) << 2);
1076 if ((long) value
> 0xfc || (long) value
< 0)
1077 return bfd_reloc_overflow
;
1079 if ((value
% 2) != 0)
1080 return bfd_reloc_dangerous
;
1083 insn
|= (value
>> 1);
1085 bfd_put_16 (input_bfd
, insn
, hit_data
);
1086 return bfd_reloc_ok
;
1089 case R_V850_TDA_7_8_OFFSET
:
1092 struct bfd_link_hash_entry
* h
;
1094 insn
= bfd_get_16 (input_bfd
, hit_data
);
1096 /* Get the value of __ep. */
1097 h
= bfd_link_hash_lookup (info
->hash
, "__ep", false, false, true);
1098 if (h
== (struct bfd_link_hash_entry
*) NULL
1099 || h
->type
!= bfd_link_hash_defined
)
1100 return bfd_reloc_continue
; /* Actually this indicates that __ep could not be found. */
1102 ep
= (h
->u
.def
.value
1103 + h
->u
.def
.section
->output_section
->vma
1104 + h
->u
.def
.section
->output_offset
);
1107 value
+= ((insn
& 0x7f) << 1);
1109 if ((long) value
> 0xfe || (long) value
< 0)
1110 return bfd_reloc_overflow
;
1113 insn
|= (value
>> 1);
1115 bfd_put_16 (input_bfd
, insn
, hit_data
);
1116 return bfd_reloc_ok
;
1119 case R_V850_TDA_7_7_OFFSET
:
1122 struct bfd_link_hash_entry
* h
;
1124 insn
= bfd_get_16 (input_bfd
, hit_data
);
1126 /* Get the value of __ep. */
1127 h
= bfd_link_hash_lookup (info
->hash
, "__ep", false, false, true);
1128 if (h
== (struct bfd_link_hash_entry
*) NULL
1129 || h
->type
!= bfd_link_hash_defined
)
1130 return bfd_reloc_continue
; /* Actually this indicates that __ep could not be found. */
1132 ep
= (h
->u
.def
.value
1133 + h
->u
.def
.section
->output_section
->vma
1134 + h
->u
.def
.section
->output_offset
);
1137 value
+= insn
& 0x7f;
1139 if ((long) value
> 0x7f || (long) value
< 0)
1140 return bfd_reloc_overflow
;
1144 bfd_put_16 (input_bfd
, insn
, hit_data
);
1145 return bfd_reloc_ok
;
1148 case R_V850_TDA_16_16_OFFSET
:
1151 struct bfd_link_hash_entry
* h
;
1153 /* Get the value of __ep. */
1154 h
= bfd_link_hash_lookup (info
->hash
, "__ep", false, false, true);
1155 if (h
== (struct bfd_link_hash_entry
*) NULL
1156 || h
->type
!= bfd_link_hash_defined
)
1157 return bfd_reloc_other
;
1159 ep
= (h
->u
.def
.value
1160 + h
->u
.def
.section
->output_section
->vma
1161 + h
->u
.def
.section
->output_offset
);
1164 value
+= (short) bfd_get_16 (input_bfd
, hit_data
);
1166 if ((long)value
> 0x7fff || (long)value
< -0x8000)
1167 return bfd_reloc_overflow
;
1169 bfd_put_16 (input_bfd
, value
, hit_data
);
1170 return bfd_reloc_ok
;
1173 /* start-sanitize-v850e */
1174 case R_V850_TDA_4_5_OFFSET
:
1177 struct bfd_link_hash_entry
* h
;
1179 /* Get the value of __ep. */
1180 h
= bfd_link_hash_lookup (info
->hash
, "__ep", false, false, true);
1181 if (h
== (struct bfd_link_hash_entry
*) NULL
1182 || h
->type
!= bfd_link_hash_defined
)
1183 return bfd_reloc_continue
; /* Actually this indicates that __ep could not be found. */
1185 ep
= (h
->u
.def
.value
1186 + h
->u
.def
.section
->output_section
->vma
1187 + h
->u
.def
.section
->output_offset
);
1190 insn
= bfd_get_16 (input_bfd
, hit_data
);
1192 value
+= ((insn
& 0xf) << 1);
1194 if ((long) value
> 0x1e || (long) value
< 0)
1195 return bfd_reloc_overflow
;
1198 insn
|= (value
>> 1);
1199 bfd_put_16 (input_bfd
, insn
, hit_data
);
1200 return bfd_reloc_ok
;
1203 case R_V850_TDA_4_4_OFFSET
:
1206 struct bfd_link_hash_entry
* h
;
1208 /* Get the value of __ep. */
1209 h
= bfd_link_hash_lookup (info
->hash
, "__ep", false, false, true);
1210 if (h
== (struct bfd_link_hash_entry
*) NULL
1211 || h
->type
!= bfd_link_hash_defined
)
1212 return bfd_reloc_continue
; /* Actually this indicates that __ep could not be found. */
1214 ep
= (h
->u
.def
.value
1215 + h
->u
.def
.section
->output_section
->vma
1216 + h
->u
.def
.section
->output_offset
);
1219 insn
= bfd_get_16 (input_bfd
, hit_data
);
1221 value
+= insn
& 0xf;
1223 if ((long) value
> 0xf || (long) value
< 0)
1224 return bfd_reloc_overflow
;
1228 bfd_put_16 (input_bfd
, insn
, hit_data
);
1229 return bfd_reloc_ok
;
1232 case R_V850_SDA_16_16_SPLIT_OFFSET
:
1233 if (sym_sec
== NULL
)
1234 return bfd_reloc_undefined
;
1238 struct bfd_link_hash_entry
* h
;
1240 /* Get the value of __gp. */
1241 h
= bfd_link_hash_lookup (info
->hash
, "__gp", false, false, true);
1242 if (h
== (struct bfd_link_hash_entry
*) NULL
1243 || h
->type
!= bfd_link_hash_defined
)
1244 return bfd_reloc_other
;
1246 gp
= (h
->u
.def
.value
1247 + h
->u
.def
.section
->output_section
->vma
1248 + h
->u
.def
.section
->output_offset
);
1250 value
-= sym_sec
->output_section
->vma
;
1251 value
-= (gp
- sym_sec
->output_section
->vma
);
1253 insn
= bfd_get_32 (input_bfd
, hit_data
);
1255 value
+= ((insn
& 0xfffe0000) >> 16);
1256 value
+= ((insn
& 0x20) >> 5);
1258 if ((long)value
> 0x7fff || (long)value
< -0x8000)
1259 return bfd_reloc_overflow
;
1262 insn
|= (value
& 1) << 5;
1263 insn
|= (value
& ~1) << 16;
1265 bfd_put_32 (input_bfd
, insn
, hit_data
);
1266 return bfd_reloc_ok
;
1269 case R_V850_ZDA_16_16_SPLIT_OFFSET
:
1270 if (sym_sec
== NULL
)
1271 return bfd_reloc_undefined
;
1273 insn
= bfd_get_32 (input_bfd
, hit_data
);
1275 value
-= sym_sec
->output_section
->vma
;
1276 value
+= ((insn
& 0xfffe0000) >> 16);
1277 value
+= ((insn
& 0x20) >> 5);
1279 if ((long)value
> 0x7fff || (long)value
< -0x8000)
1280 return bfd_reloc_overflow
;
1283 insn
|= (value
& 1) << 5;
1284 insn
|= (value
& ~1) << 16;
1286 bfd_put_32 (input_bfd
, insn
, hit_data
);
1287 return bfd_reloc_ok
;
1289 /* end-sanitize-v850e */
1293 return bfd_reloc_ok
;
1296 return bfd_reloc_notsupported
;
1301 /* Relocate an V850 ELF section. */
1303 v850_elf_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
1304 contents
, relocs
, local_syms
, local_sections
)
1306 struct bfd_link_info
* info
;
1308 asection
* input_section
;
1309 bfd_byte
* contents
;
1310 Elf_Internal_Rela
* relocs
;
1311 Elf_Internal_Sym
* local_syms
;
1312 asection
** local_sections
;
1314 Elf_Internal_Shdr
* symtab_hdr
;
1315 struct elf_link_hash_entry
** sym_hashes
;
1316 Elf_Internal_Rela
* rel
;
1317 Elf_Internal_Rela
* relend
;
1319 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
1320 sym_hashes
= elf_sym_hashes (input_bfd
);
1323 relend
= relocs
+ input_section
->reloc_count
;
1324 for (; rel
< relend
; rel
++)
1327 reloc_howto_type
* howto
;
1328 unsigned long r_symndx
;
1329 Elf_Internal_Sym
* sym
;
1331 struct elf_link_hash_entry
* h
;
1333 bfd_reloc_status_type r
;
1335 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1336 r_type
= ELF32_R_TYPE (rel
->r_info
);
1337 howto
= v850_elf_howto_table
+ r_type
;
1339 if (info
->relocateable
)
1341 /* This is a relocateable link. We don't have to change
1342 anything, unless the reloc is against a section symbol,
1343 in which case we have to adjust according to where the
1344 section symbol winds up in the output section. */
1345 if (r_symndx
< symtab_hdr
->sh_info
)
1347 sym
= local_syms
+ r_symndx
;
1348 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
1350 sec
= local_sections
[r_symndx
];
1351 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
1358 /* This is a final link. */
1362 if (r_symndx
< symtab_hdr
->sh_info
)
1364 sym
= local_syms
+ r_symndx
;
1365 sec
= local_sections
[r_symndx
];
1366 relocation
= (sec
->output_section
->vma
1367 + sec
->output_offset
1372 name
= bfd_elf_string_from_elf_section (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
1373 name
= (name
== NULL
) ? "<none>" : name
;
1374 fprintf (stderr
, "local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x rel %x\n", sec
->name
, name
, sym
->st_name
,
1375 sec
->output_section
->vma
, sec
->output_offset
, sym
->st_value
, rel
->r_addend
, rel
);
1381 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1383 while (h
->root
.type
== bfd_link_hash_indirect
1384 || h
->root
.type
== bfd_link_hash_warning
)
1385 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1387 if (h
->root
.type
== bfd_link_hash_defined
1388 || h
->root
.type
== bfd_link_hash_defweak
)
1390 sec
= h
->root
.u
.def
.section
;
1391 relocation
= (h
->root
.u
.def
.value
1392 + sec
->output_section
->vma
1393 + sec
->output_offset
);
1395 else if (h
->root
.type
== bfd_link_hash_undefweak
)
1399 if (! ((*info
->callbacks
->undefined_symbol
)
1400 (info
, h
->root
.root
.string
, input_bfd
,
1401 input_section
, rel
->r_offset
)))
1407 /* FIXME: We should use the addend, but the COFF relocations
1409 r
= v850_elf_final_link_relocate (howto
, input_bfd
, output_bfd
,
1411 contents
, rel
->r_offset
,
1412 relocation
, rel
->r_addend
,
1413 info
, sec
, h
== NULL
);
1415 if (r
!= bfd_reloc_ok
)
1418 const char * msg
= (const char *)0;
1421 name
= h
->root
.root
.string
;
1424 name
= (bfd_elf_string_from_elf_section
1425 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
1426 if (name
== NULL
|| *name
== '\0')
1427 name
= bfd_section_name (input_bfd
, sec
);
1432 case bfd_reloc_overflow
:
1433 if (! ((*info
->callbacks
->reloc_overflow
)
1434 (info
, name
, howto
->name
, (bfd_vma
) 0,
1435 input_bfd
, input_section
, rel
->r_offset
)))
1439 case bfd_reloc_undefined
:
1440 fprintf (stderr
, "undef2 %s\n", name
);
1441 if (! ((*info
->callbacks
->undefined_symbol
)
1442 (info
, name
, input_bfd
, input_section
,
1447 case bfd_reloc_outofrange
:
1448 msg
= "internal error: out of range error";
1451 case bfd_reloc_notsupported
:
1452 msg
= "internal error: unsupported relocation error";
1455 case bfd_reloc_dangerous
:
1456 msg
= "internal error: dangerous relocation";
1459 case bfd_reloc_other
:
1460 msg
= "could not locate special linker symbol __gp";
1463 case bfd_reloc_continue
:
1464 msg
= "could not locate special linker symbol __ep";
1468 msg
= "internal error: unknown error";
1472 if (!((*info
->callbacks
->warning
)
1473 (info
, msg
, name
, input_bfd
, input_section
,
1484 /* Set the right machine number. */
1486 v850_elf_object_p (abfd
)
1489 switch (elf_elfheader (abfd
)->e_flags
& EF_V850_ARCH
)
1492 case E_V850_ARCH
: (void) bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, 0); break;
1493 /* start-sanitize-v850e */
1494 case E_V850E_ARCH
: (void) bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850e
); break;
1495 /* end-sanitize-v850e */
1496 /* start-sanitize-v850eq */
1497 case E_V850EQ_ARCH
: (void) bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850eq
); break;
1498 /* end-sanitize-v850eq */
1502 /* Store the machine number in the flags field. */
1504 v850_elf_final_write_processing (abfd
, linker
)
1510 switch (bfd_get_mach (abfd
))
1513 case 0: val
= E_V850_ARCH
; break;
1514 /* start-sanitize-v850e */
1515 case bfd_mach_v850e
: val
= E_V850E_ARCH
; break;
1516 /* end-sanitize-v850e */
1517 /* start-sanitize-v850eq */
1518 case bfd_mach_v850eq
: val
= E_V850EQ_ARCH
; break;
1519 /* end-sanitize-v850eq */
1522 elf_elfheader (abfd
)->e_flags
&=~ EF_V850_ARCH
;
1523 elf_elfheader (abfd
)->e_flags
|= val
;
1526 /* Function to keep V850 specific file flags. */
1528 v850_elf_set_private_flags (abfd
, flags
)
1532 BFD_ASSERT (!elf_flags_init (abfd
)
1533 || elf_elfheader (abfd
)->e_flags
== flags
);
1535 elf_elfheader (abfd
)->e_flags
= flags
;
1536 elf_flags_init (abfd
) = true;
1540 /* Copy backend specific data from one object module to another */
1542 v850_elf_copy_private_bfd_data (ibfd
, obfd
)
1546 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1547 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
1550 BFD_ASSERT (!elf_flags_init (obfd
)
1551 || (elf_elfheader (obfd
)->e_flags
1552 == elf_elfheader (ibfd
)->e_flags
));
1554 elf_gp (obfd
) = elf_gp (ibfd
);
1555 elf_elfheader (obfd
)->e_flags
= elf_elfheader (ibfd
)->e_flags
;
1556 elf_flags_init (obfd
) = true;
1560 /* Merge backend specific data from an object file to the output
1561 object file when linking. */
1563 v850_elf_merge_private_bfd_data (ibfd
, obfd
)
1570 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1571 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
1574 new_flags
= elf_elfheader (ibfd
)->e_flags
;
1575 old_flags
= elf_elfheader (obfd
)->e_flags
;
1577 if (! elf_flags_init (obfd
))
1579 elf_flags_init (obfd
) = true;
1580 elf_elfheader (obfd
)->e_flags
= new_flags
;
1582 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
1583 && bfd_get_arch_info (obfd
)->the_default
)
1585 return bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
), bfd_get_mach (ibfd
));
1591 /* Check flag compatibility. */
1593 if (new_flags
== old_flags
)
1596 if ((new_flags
& EF_V850_ARCH
) != (old_flags
& EF_V850_ARCH
))
1598 _bfd_error_handler ("%s: Architecture mismatch with previous modules",
1599 bfd_get_filename (ibfd
));
1600 bfd_set_error (bfd_error_bad_value
);
1606 /* Display the flags field */
1609 v850_elf_print_private_bfd_data (abfd
, ptr
)
1613 FILE * file
= (FILE *) ptr
;
1615 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
)
1617 fprintf (file
, "private flags = %x", elf_elfheader (abfd
)->e_flags
);
1619 switch (elf_elfheader (abfd
)->e_flags
& EF_V850_ARCH
)
1622 case E_V850_ARCH
: fprintf (file
, ": v850 architecture"); break;
1623 /* start-sanitize-v850e */
1624 case E_V850E_ARCH
: fprintf (file
, ": v850e architecture"); break;
1625 /* end-sanitize-v850e */
1626 /* start-sanitize-v850eq */
1627 case E_V850EQ_ARCH
: fprintf (file
, ": v850eq architecture"); break;
1628 /* end-sanitize-v850eq */
1636 #define TARGET_LITTLE_SYM bfd_elf32_v850_vec
1637 #define TARGET_LITTLE_NAME "elf32-v850"
1638 #define ELF_ARCH bfd_arch_v850
1639 #define ELF_MACHINE_CODE EM_CYGNUS_V850
1640 #define ELF_MAXPAGESIZE 0x1000
1642 #define elf_info_to_howto 0
1643 #define elf_info_to_howto_rel v850_elf_info_to_howto_rel
1644 #define elf_backend_check_relocs v850_elf_check_relocs
1645 #define elf_backend_relocate_section v850_elf_relocate_section
1646 #define elf_backend_object_p v850_elf_object_p
1647 #define elf_backend_final_write_processing v850_elf_final_write_processing
1648 #define bfd_elf32_bfd_is_local_label_name v850_elf_is_local_label_name
1649 #define bfd_elf32_bfd_reloc_type_lookup v850_elf_reloc_type_lookup
1650 #define bfd_elf32_bfd_copy_private_bfd_data v850_elf_copy_private_bfd_data
1651 #define bfd_elf32_bfd_merge_private_bfd_data v850_elf_merge_private_bfd_data
1652 #define bfd_elf32_bfd_set_private_flags v850_elf_set_private_flags
1653 #define bfd_elf32_bfd_print_private_bfd_data v850_elf_print_private_bfd_data
1655 #define elf_symbol_leading_char '_'
1657 #include "elf32-target.h"