1 /* Ubicom IP2xxx specific support for 32-bit ELF
2 Copyright 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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, MA 02110-1301, USA. */
27 /* Struct used to pass miscellaneous paramaters which
28 helps to avoid overly long parameter lists. */
31 Elf_Internal_Shdr
* symtab_hdr
;
32 Elf_Internal_Rela
* irelbase
;
34 Elf_Internal_Sym
* isymbuf
;
39 unsigned short opcode
;
44 static reloc_howto_type
*ip2k_reloc_type_lookup
45 PARAMS ((bfd
*, bfd_reloc_code_real_type
));
46 static int ip2k_is_opcode
47 PARAMS ((bfd_byte
*, const struct ip2k_opcode
*));
48 static bfd_vma symbol_value
49 PARAMS ((bfd
*, Elf_Internal_Shdr
*, Elf_Internal_Sym
*,
50 Elf_Internal_Rela
*));
51 static void ip2k_get_mem
52 PARAMS ((bfd
*, bfd_byte
*, int, bfd_byte
*));
53 static bfd_vma ip2k_nominal_page_bits
54 PARAMS ((bfd
*, asection
*, bfd_vma
, bfd_byte
*));
55 static bfd_boolean ip2k_test_page_insn
56 PARAMS ((bfd
*, asection
*, Elf_Internal_Rela
*, struct misc
*));
57 static bfd_boolean ip2k_delete_page_insn
58 PARAMS ((bfd
*, asection
*, Elf_Internal_Rela
*, bfd_boolean
*, struct misc
*));
59 static int ip2k_is_switch_table_128
60 PARAMS ((bfd
*, asection
*, bfd_vma
, bfd_byte
*));
61 static bfd_boolean ip2k_relax_switch_table_128
62 PARAMS ((bfd
*, asection
*, Elf_Internal_Rela
*, bfd_boolean
*, struct misc
*));
63 static int ip2k_is_switch_table_256
64 PARAMS ((bfd
*, asection
*, bfd_vma
, bfd_byte
*));
65 static bfd_boolean ip2k_relax_switch_table_256
66 PARAMS ((bfd
*, asection
*, Elf_Internal_Rela
*, bfd_boolean
*, struct misc
*));
67 static bfd_boolean ip2k_elf_relax_section
68 PARAMS ((bfd
*, asection
*, struct bfd_link_info
*, bfd_boolean
*));
69 static bfd_boolean ip2k_elf_relax_section_page
70 PARAMS ((bfd
*, asection
*, bfd_boolean
*, struct misc
*, unsigned long, unsigned long));
71 static void adjust_all_relocations
72 PARAMS ((bfd
*, asection
*, bfd_vma
, bfd_vma
, int, int));
73 static bfd_boolean ip2k_elf_relax_delete_bytes
74 PARAMS ((bfd
*, asection
*, bfd_vma
, int));
75 static void ip2k_info_to_howto_rela
76 PARAMS ((bfd
*, arelent
*, Elf_Internal_Rela
*));
77 static bfd_reloc_status_type ip2k_final_link_relocate
78 PARAMS ((reloc_howto_type
*, bfd
*, asection
*, bfd_byte
*,
79 Elf_Internal_Rela
*, bfd_vma
));
80 static bfd_boolean ip2k_elf_relocate_section
81 PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
82 Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**));
83 static asection
*ip2k_elf_gc_mark_hook
84 PARAMS ((asection
*, struct bfd_link_info
*, Elf_Internal_Rela
*,
85 struct elf_link_hash_entry
*, Elf_Internal_Sym
*));
86 static bfd_boolean ip2k_elf_gc_sweep_hook
87 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
88 const Elf_Internal_Rela
*));
90 static bfd_boolean ip2k_relaxed
= FALSE
;
92 static const struct ip2k_opcode ip2k_page_opcode
[] =
94 {0x0010, 0xFFF8}, /* page */
98 #define IS_PAGE_OPCODE(code) \
99 ip2k_is_opcode (code, ip2k_page_opcode)
101 static const struct ip2k_opcode ip2k_jmp_opcode
[] =
103 {0xE000, 0xE000}, /* jmp */
107 #define IS_JMP_OPCODE(code) \
108 ip2k_is_opcode (code, ip2k_jmp_opcode)
110 static const struct ip2k_opcode ip2k_snc_opcode
[] =
112 {0xA00B, 0xFFFF}, /* snc */
116 #define IS_SNC_OPCODE(code) \
117 ip2k_is_opcode (code, ip2k_snc_opcode)
119 static const struct ip2k_opcode ip2k_inc_1sp_opcode
[] =
121 {0x2B81, 0xFFFF}, /* inc 1(SP) */
125 #define IS_INC_1SP_OPCODE(code) \
126 ip2k_is_opcode (code, ip2k_inc_1sp_opcode)
128 static const struct ip2k_opcode ip2k_add_2sp_w_opcode
[] =
130 {0x1F82, 0xFFFF}, /* add 2(SP),w */
134 #define IS_ADD_2SP_W_OPCODE(code) \
135 ip2k_is_opcode (code, ip2k_add_2sp_w_opcode)
137 static const struct ip2k_opcode ip2k_add_w_wreg_opcode
[] =
139 {0x1C0A, 0xFFFF}, /* add w,wreg */
140 {0x1E0A, 0xFFFF}, /* add wreg,w */
144 #define IS_ADD_W_WREG_OPCODE(code) \
145 ip2k_is_opcode (code, ip2k_add_w_wreg_opcode)
147 static const struct ip2k_opcode ip2k_add_pcl_w_opcode
[] =
149 {0x1E09, 0xFFFF}, /* add pcl,w */
153 #define IS_ADD_PCL_W_OPCODE(code) \
154 ip2k_is_opcode (code, ip2k_add_pcl_w_opcode)
156 static const struct ip2k_opcode ip2k_skip_opcodes
[] =
158 {0xB000, 0xF000}, /* sb */
159 {0xA000, 0xF000}, /* snb */
160 {0x7600, 0xFE00}, /* cse/csne #lit */
161 {0x5800, 0xFC00}, /* incsnz */
162 {0x4C00, 0xFC00}, /* decsnz */
163 {0x4000, 0xFC00}, /* cse/csne */
164 {0x3C00, 0xFC00}, /* incsz */
165 {0x2C00, 0xFC00}, /* decsz */
169 #define IS_SKIP_OPCODE(code) \
170 ip2k_is_opcode (code, ip2k_skip_opcodes)
172 /* Relocation tables. */
173 static reloc_howto_type ip2k_elf_howto_table
[] =
175 #define IP2K_HOWTO(t,rs,s,bs,pr,bp,name,sm,dm) \
176 HOWTO(t, /* type */ \
177 rs, /* rightshift */ \
178 s, /* size (0 = byte, 1 = short, 2 = long) */ \
180 pr, /* pc_relative */ \
182 complain_overflow_dont,/* complain_on_overflow */ \
183 bfd_elf_generic_reloc,/* special_function */ \
185 FALSE, /* partial_inplace */ \
188 pr) /* pcrel_offset */
190 /* This reloc does nothing. */
191 IP2K_HOWTO (R_IP2K_NONE
, 0,2,32, FALSE
, 0, "R_IP2K_NONE", 0, 0),
192 /* A 16 bit absolute relocation. */
193 IP2K_HOWTO (R_IP2K_16
, 0,1,16, FALSE
, 0, "R_IP2K_16", 0, 0xffff),
194 /* A 32 bit absolute relocation. */
195 IP2K_HOWTO (R_IP2K_32
, 0,2,32, FALSE
, 0, "R_IP2K_32", 0, 0xffffffff),
196 /* A 8-bit data relocation for the FR9 field. Ninth bit is computed specially. */
197 IP2K_HOWTO (R_IP2K_FR9
, 0,1,9, FALSE
, 0, "R_IP2K_FR9", 0, 0x00ff),
198 /* A 4-bit data relocation. */
199 IP2K_HOWTO (R_IP2K_BANK
, 8,1,4, FALSE
, 0, "R_IP2K_BANK", 0, 0x000f),
200 /* A 13-bit insn relocation - word address => right-shift 1 bit extra. */
201 IP2K_HOWTO (R_IP2K_ADDR16CJP
, 1,1,13, FALSE
, 0, "R_IP2K_ADDR16CJP", 0, 0x1fff),
202 /* A 3-bit insn relocation - word address => right-shift 1 bit extra. */
203 IP2K_HOWTO (R_IP2K_PAGE3
, 14,1,3, FALSE
, 0, "R_IP2K_PAGE3", 0, 0x0007),
204 /* Two 8-bit data relocations. */
205 IP2K_HOWTO (R_IP2K_LO8DATA
, 0,1,8, FALSE
, 0, "R_IP2K_LO8DATA", 0, 0x00ff),
206 IP2K_HOWTO (R_IP2K_HI8DATA
, 8,1,8, FALSE
, 0, "R_IP2K_HI8DATA", 0, 0x00ff),
207 /* Two 8-bit insn relocations. word address => right-shift 1 bit extra. */
208 IP2K_HOWTO (R_IP2K_LO8INSN
, 1,1,8, FALSE
, 0, "R_IP2K_LO8INSN", 0, 0x00ff),
209 IP2K_HOWTO (R_IP2K_HI8INSN
, 9,1,8, FALSE
, 0, "R_IP2K_HI8INSN", 0, 0x00ff),
211 /* Special 1 bit relocation for SKIP instructions. */
212 IP2K_HOWTO (R_IP2K_PC_SKIP
, 1,1,1, FALSE
, 12, "R_IP2K_PC_SKIP", 0xfffe, 0x1000),
213 /* 16 bit word address. */
214 IP2K_HOWTO (R_IP2K_TEXT
, 1,1,16, FALSE
, 0, "R_IP2K_TEXT", 0, 0xffff),
215 /* A 7-bit offset relocation for the FR9 field. Eigth and ninth bit comes from insn. */
216 IP2K_HOWTO (R_IP2K_FR_OFFSET
, 0,1,9, FALSE
, 0, "R_IP2K_FR_OFFSET", 0x180, 0x007f),
217 /* Bits 23:16 of an address. */
218 IP2K_HOWTO (R_IP2K_EX8DATA
, 16,1,8, FALSE
, 0, "R_IP2K_EX8DATA", 0, 0x00ff),
222 /* Map BFD reloc types to IP2K ELF reloc types. */
223 static reloc_howto_type
*
224 ip2k_reloc_type_lookup (abfd
, code
)
225 bfd
* abfd ATTRIBUTE_UNUSED
;
226 bfd_reloc_code_real_type code
;
228 /* Note that the ip2k_elf_howto_table is indxed by the R_
229 constants. Thus, the order that the howto records appear in the
230 table *must* match the order of the relocation types defined in
231 include/elf/ip2k.h. */
236 return &ip2k_elf_howto_table
[ (int) R_IP2K_NONE
];
238 return &ip2k_elf_howto_table
[ (int) R_IP2K_16
];
240 return &ip2k_elf_howto_table
[ (int) R_IP2K_32
];
241 case BFD_RELOC_IP2K_FR9
:
242 return &ip2k_elf_howto_table
[ (int) R_IP2K_FR9
];
243 case BFD_RELOC_IP2K_BANK
:
244 return &ip2k_elf_howto_table
[ (int) R_IP2K_BANK
];
245 case BFD_RELOC_IP2K_ADDR16CJP
:
246 return &ip2k_elf_howto_table
[ (int) R_IP2K_ADDR16CJP
];
247 case BFD_RELOC_IP2K_PAGE3
:
248 return &ip2k_elf_howto_table
[ (int) R_IP2K_PAGE3
];
249 case BFD_RELOC_IP2K_LO8DATA
:
250 return &ip2k_elf_howto_table
[ (int) R_IP2K_LO8DATA
];
251 case BFD_RELOC_IP2K_HI8DATA
:
252 return &ip2k_elf_howto_table
[ (int) R_IP2K_HI8DATA
];
253 case BFD_RELOC_IP2K_LO8INSN
:
254 return &ip2k_elf_howto_table
[ (int) R_IP2K_LO8INSN
];
255 case BFD_RELOC_IP2K_HI8INSN
:
256 return &ip2k_elf_howto_table
[ (int) R_IP2K_HI8INSN
];
257 case BFD_RELOC_IP2K_PC_SKIP
:
258 return &ip2k_elf_howto_table
[ (int) R_IP2K_PC_SKIP
];
259 case BFD_RELOC_IP2K_TEXT
:
260 return &ip2k_elf_howto_table
[ (int) R_IP2K_TEXT
];
261 case BFD_RELOC_IP2K_FR_OFFSET
:
262 return &ip2k_elf_howto_table
[ (int) R_IP2K_FR_OFFSET
];
263 case BFD_RELOC_IP2K_EX8DATA
:
264 return &ip2k_elf_howto_table
[ (int) R_IP2K_EX8DATA
];
266 /* Pacify gcc -Wall. */
273 ip2k_get_mem (abfd
, addr
, length
, ptr
)
274 bfd
*abfd ATTRIBUTE_UNUSED
;
280 * ptr
++ = bfd_get_8 (abfd
, addr
++);
284 ip2k_is_opcode (code
, opcodes
)
286 const struct ip2k_opcode
*opcodes
;
288 unsigned short insn
= (code
[0] << 8) | code
[1];
290 while (opcodes
->mask
!= 0)
292 if ((insn
& opcodes
->mask
) == opcodes
->opcode
)
301 #define PAGENO(ABSADDR) ((ABSADDR) & 0xFFFFC000)
302 #define BASEADDR(SEC) ((SEC)->output_section->vma + (SEC)->output_offset)
304 #define UNDEFINED_SYMBOL (~(bfd_vma)0)
306 /* Return the value of the symbol associated with the relocation IREL. */
309 symbol_value (abfd
, symtab_hdr
, isymbuf
, irel
)
311 Elf_Internal_Shdr
*symtab_hdr
;
312 Elf_Internal_Sym
*isymbuf
;
313 Elf_Internal_Rela
*irel
;
315 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
317 Elf_Internal_Sym
*isym
;
320 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
321 if (isym
->st_shndx
== SHN_UNDEF
)
322 sym_sec
= bfd_und_section_ptr
;
323 else if (isym
->st_shndx
== SHN_ABS
)
324 sym_sec
= bfd_abs_section_ptr
;
325 else if (isym
->st_shndx
== SHN_COMMON
)
326 sym_sec
= bfd_com_section_ptr
;
328 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
330 return isym
->st_value
+ BASEADDR (sym_sec
);
335 struct elf_link_hash_entry
*h
;
337 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
338 h
= elf_sym_hashes (abfd
)[indx
];
339 BFD_ASSERT (h
!= NULL
);
341 if (h
->root
.type
!= bfd_link_hash_defined
342 && h
->root
.type
!= bfd_link_hash_defweak
)
343 return UNDEFINED_SYMBOL
;
345 return (h
->root
.u
.def
.value
+ BASEADDR (h
->root
.u
.def
.section
));
349 /* Returns the expected page state for the given instruction not including
350 the effect of page instructions. */
353 ip2k_nominal_page_bits (abfd
, sec
, addr
, contents
)
354 bfd
*abfd ATTRIBUTE_UNUSED
;
359 bfd_vma page
= PAGENO (BASEADDR (sec
) + addr
);
361 /* Check if section flows into this page. If not then the page
362 bits are assumed to match the PC. This will be true unless
363 the user has a page instruction without a call/jump, in which
364 case they are on their own. */
365 if (PAGENO (BASEADDR (sec
)) == page
)
368 /* Section flows across page boundary. The page bits should match
369 the PC unless there is a possible flow from the previous page,
370 in which case it is not possible to determine the value of the
372 while (PAGENO (BASEADDR (sec
) + addr
- 2) == page
)
377 ip2k_get_mem (abfd
, contents
+ addr
, 2, code
);
378 if (!IS_PAGE_OPCODE (code
))
381 /* Found a page instruction, check if jump table. */
382 if (ip2k_is_switch_table_128 (abfd
, sec
, addr
, contents
) != -1)
383 /* Jump table => page is conditional. */
386 if (ip2k_is_switch_table_256 (abfd
, sec
, addr
, contents
) != -1)
387 /* Jump table => page is conditional. */
390 /* Found a page instruction, check if conditional. */
393 ip2k_get_mem (abfd
, contents
+ addr
- 2, 2, code
);
394 if (IS_SKIP_OPCODE (code
))
395 /* Page is conditional. */
399 /* Unconditional page instruction => page bits should be correct. */
403 /* Flow from previous page => page bits are impossible to determine. */
408 ip2k_test_page_insn (abfd
, sec
, irel
, misc
)
409 bfd
*abfd ATTRIBUTE_UNUSED
;
411 Elf_Internal_Rela
*irel
;
416 /* Get the value of the symbol referred to by the reloc. */
417 symval
= symbol_value (abfd
, misc
->symtab_hdr
, misc
->isymbuf
, irel
);
418 if (symval
== UNDEFINED_SYMBOL
)
419 /* This appears to be a reference to an undefined
420 symbol. Just ignore it--it will be caught by the
421 regular reloc processing. */
424 /* Test if we can delete this page instruction. */
425 if (PAGENO (symval
+ irel
->r_addend
) !=
426 ip2k_nominal_page_bits (abfd
, sec
, irel
->r_offset
, misc
->contents
))
433 ip2k_delete_page_insn (abfd
, sec
, irel
, again
, misc
)
434 bfd
*abfd ATTRIBUTE_UNUSED
;
436 Elf_Internal_Rela
*irel
;
440 /* Note that we've changed the relocs, section contents, etc. */
441 elf_section_data (sec
)->relocs
= misc
->irelbase
;
442 elf_section_data (sec
)->this_hdr
.contents
= misc
->contents
;
443 misc
->symtab_hdr
->contents
= (bfd_byte
*) misc
->isymbuf
;
445 /* Fix the relocation's type. */
446 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_IP2K_NONE
);
448 /* Delete the PAGE insn. */
449 if (!ip2k_elf_relax_delete_bytes (abfd
, sec
, irel
->r_offset
, 2))
452 /* Modified => will need to iterate relaxation again. */
458 /* Determine if the instruction sequence matches that for
459 the prologue of a switch dispatch table with fewer than
488 ip2k_is_switch_table_128 (abfd
, sec
, addr
, contents
)
489 bfd
*abfd ATTRIBUTE_UNUSED
;
497 /* Check current page-jmp. */
498 if (addr
+ 4 > sec
->size
)
501 ip2k_get_mem (abfd
, contents
+ addr
, 4, code
);
503 if ((! IS_PAGE_OPCODE (code
+ 0))
504 || (! IS_JMP_OPCODE (code
+ 2)))
513 /* Check previous 2 instructions. */
514 ip2k_get_mem (abfd
, contents
+ addr
- 4, 4, code
);
515 if ((IS_ADD_W_WREG_OPCODE (code
+ 0))
516 && (IS_ADD_PCL_W_OPCODE (code
+ 2)))
519 if ((! IS_PAGE_OPCODE (code
+ 0))
520 || (! IS_JMP_OPCODE (code
+ 2)))
529 ip2k_relax_switch_table_128 (abfd
, sec
, irel
, again
, misc
)
530 bfd
*abfd ATTRIBUTE_UNUSED
;
532 Elf_Internal_Rela
*irel
;
536 Elf_Internal_Rela
*irelend
= misc
->irelbase
+ sec
->reloc_count
;
537 Elf_Internal_Rela
*ireltest
= irel
;
541 /* Test all page instructions. */
542 addr
= irel
->r_offset
;
545 if (addr
+ 4 > sec
->size
)
548 ip2k_get_mem (abfd
, misc
->contents
+ addr
, 4, code
);
549 if ((! IS_PAGE_OPCODE (code
+ 0))
550 || (! IS_JMP_OPCODE (code
+ 2)))
553 /* Validate relocation entry (every entry should have a matching
554 relocation entry). */
555 if (ireltest
>= irelend
)
557 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
561 if (ireltest
->r_offset
!= addr
)
563 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
567 if (! ip2k_test_page_insn (abfd
, sec
, ireltest
, misc
))
568 /* Un-removable page insn => nothing can be done. */
575 /* Relaxable. Adjust table header. */
576 ip2k_get_mem (abfd
, misc
->contents
+ irel
->r_offset
- 4, 4, code
);
577 if ((! IS_ADD_W_WREG_OPCODE (code
+ 0))
578 || (! IS_ADD_PCL_W_OPCODE (code
+ 2)))
580 _bfd_error_handler (_("ip2k relaxer: switch table header corrupt."));
584 if (!ip2k_elf_relax_delete_bytes (abfd
, sec
, irel
->r_offset
- 4, 2))
589 /* Delete all page instructions in table. */
590 while (irel
< ireltest
)
592 if (!ip2k_delete_page_insn (abfd
, sec
, irel
, again
, misc
))
600 /* Determine if the instruction sequence matches that for
601 the prologue switch dispatch table with fewer than
602 256 entries but more than 127.
605 push %lo8insn(label) ; Push address of table
607 add w,wreg ; index*2 => offset
609 inc 1(sp) ; Propagate MSB into table address
610 add 2(sp),w ; Add low bits of offset to table address
611 snc ; and handle any carry-out
614 page __indjmp ; Do an indirect jump to that location
616 label: ; case dispatch table starts here
626 push %lo8insn(label) ; Push address of table
628 add 2(sp),w ; Add low bits of offset to table address
629 snc ; and handle any carry-out
632 page __indjmp ; Do an indirect jump to that location
634 label: ; case dispatch table starts here
641 ip2k_is_switch_table_256 (abfd
, sec
, addr
, contents
)
642 bfd
*abfd ATTRIBUTE_UNUSED
;
650 /* Check current page-jmp. */
651 if (addr
+ 4 > sec
->size
)
654 ip2k_get_mem (abfd
, contents
+ addr
, 4, code
);
655 if ((! IS_PAGE_OPCODE (code
+ 0))
656 || (! IS_JMP_OPCODE (code
+ 2)))
665 /* Check previous 8 instructions. */
666 ip2k_get_mem (abfd
, contents
+ addr
- 16, 16, code
);
667 if ((IS_ADD_W_WREG_OPCODE (code
+ 0))
668 && (IS_SNC_OPCODE (code
+ 2))
669 && (IS_INC_1SP_OPCODE (code
+ 4))
670 && (IS_ADD_2SP_W_OPCODE (code
+ 6))
671 && (IS_SNC_OPCODE (code
+ 8))
672 && (IS_INC_1SP_OPCODE (code
+ 10))
673 && (IS_PAGE_OPCODE (code
+ 12))
674 && (IS_JMP_OPCODE (code
+ 14)))
677 if ((IS_ADD_W_WREG_OPCODE (code
+ 2))
678 && (IS_SNC_OPCODE (code
+ 4))
679 && (IS_INC_1SP_OPCODE (code
+ 6))
680 && (IS_ADD_2SP_W_OPCODE (code
+ 8))
681 && (IS_SNC_OPCODE (code
+ 10))
682 && (IS_INC_1SP_OPCODE (code
+ 12))
683 && (IS_JMP_OPCODE (code
+ 14)))
686 if ((! IS_PAGE_OPCODE (code
+ 0))
687 || (! IS_JMP_OPCODE (code
+ 2)))
696 ip2k_relax_switch_table_256 (abfd
, sec
, irel
, again
, misc
)
697 bfd
*abfd ATTRIBUTE_UNUSED
;
699 Elf_Internal_Rela
*irel
;
703 Elf_Internal_Rela
*irelend
= misc
->irelbase
+ sec
->reloc_count
;
704 Elf_Internal_Rela
*ireltest
= irel
;
708 /* Test all page instructions. */
709 addr
= irel
->r_offset
;
713 if (addr
+ 4 > sec
->size
)
716 ip2k_get_mem (abfd
, misc
->contents
+ addr
, 4, code
);
718 if ((! IS_PAGE_OPCODE (code
+ 0))
719 || (! IS_JMP_OPCODE (code
+ 2)))
722 /* Validate relocation entry (every entry should have a matching
723 relocation entry). */
724 if (ireltest
>= irelend
)
726 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
730 if (ireltest
->r_offset
!= addr
)
732 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
736 if (!ip2k_test_page_insn (abfd
, sec
, ireltest
, misc
))
737 /* Un-removable page insn => nothing can be done. */
744 /* Relaxable. Adjust table header. */
745 ip2k_get_mem (abfd
, misc
->contents
+ irel
->r_offset
- 4, 2, code
);
746 if (IS_PAGE_OPCODE (code
))
747 addr
= irel
->r_offset
- 16;
749 addr
= irel
->r_offset
- 14;
751 ip2k_get_mem (abfd
, misc
->contents
+ addr
, 12, code
);
752 if ((!IS_ADD_W_WREG_OPCODE (code
+ 0))
753 || (!IS_SNC_OPCODE (code
+ 2))
754 || (!IS_INC_1SP_OPCODE (code
+ 4))
755 || (!IS_ADD_2SP_W_OPCODE (code
+ 6))
756 || (!IS_SNC_OPCODE (code
+ 8))
757 || (!IS_INC_1SP_OPCODE (code
+ 10)))
759 _bfd_error_handler (_("ip2k relaxer: switch table header corrupt."));
763 /* Delete first 3 opcodes. */
764 if (!ip2k_elf_relax_delete_bytes (abfd
, sec
, addr
+ 0, 6))
769 /* Delete all page instructions in table. */
770 while (irel
< ireltest
)
772 if (!ip2k_delete_page_insn (abfd
, sec
, irel
, again
, misc
))
780 /* This function handles relaxing for the ip2k.
782 Principle: Start with the first page and remove page instructions that
783 are not require on this first page. By removing page instructions more
784 code will fit into this page - repeat until nothing more can be achieved
785 for this page. Move on to the next page.
787 Processing the pages one at a time from the lowest page allows a removal
788 only policy to be used - pages can be removed but are never reinserted. */
791 ip2k_elf_relax_section (abfd
, sec
, link_info
, again
)
794 struct bfd_link_info
*link_info
;
797 Elf_Internal_Shdr
*symtab_hdr
;
798 Elf_Internal_Rela
*internal_relocs
;
799 bfd_byte
*contents
= NULL
;
800 Elf_Internal_Sym
*isymbuf
= NULL
;
801 static asection
* first_section
= NULL
;
802 static unsigned long search_addr
;
803 static unsigned long page_start
= 0;
804 static unsigned long page_end
= 0;
805 static unsigned int pass
= 0;
806 static bfd_boolean new_pass
= FALSE
;
807 static bfd_boolean changed
= FALSE
;
811 /* Assume nothing changes. */
814 if (first_section
== NULL
)
820 if (first_section
== sec
)
826 /* We don't have to do anything for a relocatable link,
827 if this section does not have relocs, or if this is
828 not a code section. */
829 if (link_info
->relocatable
830 || (sec
->flags
& SEC_RELOC
) == 0
831 || sec
->reloc_count
== 0
832 || (sec
->flags
& SEC_CODE
) == 0)
835 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
837 internal_relocs
= _bfd_elf_link_read_relocs (abfd
, sec
, NULL
,
838 (Elf_Internal_Rela
*)NULL
,
839 link_info
->keep_memory
);
840 if (internal_relocs
== NULL
)
843 /* Make sure the stac.rela stuff gets read in. */
844 stab
= bfd_get_section_by_name (abfd
, ".stab");
848 /* So stab does exits. */
849 Elf_Internal_Rela
* irelbase
;
851 irelbase
= _bfd_elf_link_read_relocs (abfd
, stab
, NULL
,
852 (Elf_Internal_Rela
*)NULL
,
853 link_info
->keep_memory
);
856 /* Get section contents cached copy if it exists. */
857 if (contents
== NULL
)
859 /* Get cached copy if it exists. */
860 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
861 contents
= elf_section_data (sec
)->this_hdr
.contents
;
864 /* Go get them off disk. */
865 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
870 /* Read this BFD's symbols cached copy if it exists. */
871 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
873 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
875 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
876 symtab_hdr
->sh_info
, 0,
882 misc
.symtab_hdr
= symtab_hdr
;
883 misc
.isymbuf
= isymbuf
;
884 misc
.irelbase
= internal_relocs
;
885 misc
.contents
= contents
;
887 /* This is where all the relaxation actually get done. */
888 if ((pass
== 1) || (new_pass
&& !changed
))
890 /* On the first pass we simply search for the lowest page that
891 we havn't relaxed yet. Note that the pass count is reset
892 each time a page is complete in order to move on to the next page.
893 If we can't find any more pages then we are finished. */
898 changed
= TRUE
; /* Pre-initialize to break out of pass 1. */
899 search_addr
= 0xFFFFFFFF;
902 if ((BASEADDR (sec
) + sec
->size
< search_addr
)
903 && (BASEADDR (sec
) + sec
->size
> page_end
))
905 if (BASEADDR (sec
) <= page_end
)
906 search_addr
= page_end
+ 1;
908 search_addr
= BASEADDR (sec
);
910 /* Found a page => more work to do. */
920 page_start
= PAGENO (search_addr
);
921 page_end
= page_start
| 0x00003FFF;
924 /* Only process sections in range. */
925 if ((BASEADDR (sec
) + sec
->size
>= page_start
)
926 && (BASEADDR (sec
) <= page_end
))
928 if (!ip2k_elf_relax_section_page (abfd
, sec
, &changed
, &misc
, page_start
, page_end
))
934 /* Perform some house keeping after relaxing the section. */
937 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
939 if (! link_info
->keep_memory
)
942 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
946 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
948 if (! link_info
->keep_memory
)
952 /* Cache the section contents for elf_link_input_bfd. */
953 elf_section_data (sec
)->this_hdr
.contents
= contents
;
957 if (internal_relocs
!= NULL
958 && elf_section_data (sec
)->relocs
!= internal_relocs
)
959 free (internal_relocs
);
965 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
968 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
970 if (internal_relocs
!= NULL
971 && elf_section_data (sec
)->relocs
!= internal_relocs
)
972 free (internal_relocs
);
976 /* This function handles relaxation of a section in a specific page. */
979 ip2k_elf_relax_section_page (abfd
, sec
, again
, misc
, page_start
, page_end
)
984 unsigned long page_start
;
985 unsigned long page_end
;
987 Elf_Internal_Rela
*irelend
= misc
->irelbase
+ sec
->reloc_count
;
988 Elf_Internal_Rela
*irel
;
989 int switch_table_128
;
990 int switch_table_256
;
992 /* Walk thru the section looking for relaxation opportunities. */
993 for (irel
= misc
->irelbase
; irel
< irelend
; irel
++)
995 if (ELF32_R_TYPE (irel
->r_info
) != (int) R_IP2K_PAGE3
)
996 /* Ignore non page instructions. */
999 if (BASEADDR (sec
) + irel
->r_offset
< page_start
)
1000 /* Ignore page instructions on earlier page - they have
1001 already been processed. Remember that there is code flow
1002 that crosses a page boundary. */
1005 if (BASEADDR (sec
) + irel
->r_offset
> page_end
)
1006 /* Flow beyond end of page => nothing more to do for this page. */
1009 /* Detect switch tables. */
1010 switch_table_128
= ip2k_is_switch_table_128 (abfd
, sec
, irel
->r_offset
, misc
->contents
);
1011 switch_table_256
= ip2k_is_switch_table_256 (abfd
, sec
, irel
->r_offset
, misc
->contents
);
1013 if ((switch_table_128
> 0) || (switch_table_256
> 0))
1014 /* If the index is greater than 0 then it has already been processed. */
1017 if (switch_table_128
== 0)
1019 if (!ip2k_relax_switch_table_128 (abfd
, sec
, irel
, again
, misc
))
1025 if (switch_table_256
== 0)
1027 if (!ip2k_relax_switch_table_256 (abfd
, sec
, irel
, again
, misc
))
1034 if (ip2k_test_page_insn (abfd
, sec
, irel
, misc
))
1036 if (!ip2k_delete_page_insn (abfd
, sec
, irel
, again
, misc
))
1046 /* Parts of a Stabs entry. */
1048 #define STRDXOFF (0)
1050 #define OTHEROFF (5)
1053 #define STABSIZE (12)
1055 /* Adjust all the relocations entries after adding or inserting instructions. */
1058 adjust_all_relocations (abfd
, sec
, addr
, endaddr
, count
, noadj
)
1066 Elf_Internal_Shdr
*symtab_hdr
;
1067 Elf_Internal_Sym
*isymbuf
, *isym
, *isymend
;
1070 Elf_Internal_Rela
*irel
, *irelend
, *irelbase
;
1071 struct elf_link_hash_entry
**sym_hashes
;
1072 struct elf_link_hash_entry
**end_hashes
;
1073 unsigned int symcount
;
1076 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1077 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1079 shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1081 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1083 irelbase
= elf_section_data (sec
)->relocs
;
1084 irelend
= irelbase
+ sec
->reloc_count
;
1086 for (irel
= irelbase
; irel
< irelend
; irel
++)
1088 if (ELF32_R_TYPE (irel
->r_info
) != R_IP2K_NONE
)
1090 /* Get the value of the symbol referred to by the reloc. */
1091 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
1095 /* A local symbol. */
1096 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
1097 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1099 if (isym
->st_shndx
== shndx
)
1101 bfd_vma baseaddr
= BASEADDR (sec
);
1102 bfd_vma symval
= BASEADDR (sym_sec
) + isym
->st_value
1105 if ((baseaddr
+ addr
+ noadj
) <= symval
1106 && symval
< (baseaddr
+ endaddr
))
1107 irel
->r_addend
+= count
;
1112 /* Do this only for PC space relocations. */
1113 if (addr
<= irel
->r_offset
&& irel
->r_offset
< endaddr
)
1114 irel
->r_offset
+= count
;
1117 /* Now fix the stab relocations. */
1118 stab
= bfd_get_section_by_name (abfd
, ".stab");
1121 bfd_byte
*stabcontents
, *stabend
, *stabp
;
1122 bfd_size_type stab_size
= stab
->rawsize
? stab
->rawsize
: stab
->size
;
1124 irelbase
= elf_section_data (stab
)->relocs
;
1125 irelend
= irelbase
+ stab
->reloc_count
;
1127 /* Pull out the contents of the stab section. */
1128 if (elf_section_data (stab
)->this_hdr
.contents
!= NULL
)
1129 stabcontents
= elf_section_data (stab
)->this_hdr
.contents
;
1132 if (!bfd_malloc_and_get_section (abfd
, stab
, &stabcontents
))
1134 if (stabcontents
!= NULL
)
1135 free (stabcontents
);
1139 /* We need to remember this. */
1140 elf_section_data (stab
)->this_hdr
.contents
= stabcontents
;
1143 stabend
= stabcontents
+ stab_size
;
1145 for (irel
= irelbase
; irel
< irelend
; irel
++)
1147 if (ELF32_R_TYPE (irel
->r_info
) != R_IP2K_NONE
)
1149 /* Get the value of the symbol referred to by the reloc. */
1150 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
1154 /* A local symbol. */
1155 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
1156 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1162 unsigned char type
, other
;
1163 unsigned short desc
;
1165 bfd_vma baseaddr
= BASEADDR (sec
);
1166 bfd_vma symval
= BASEADDR (sym_sec
) + isym
->st_value
1169 if ((baseaddr
+ addr
) <= symval
1170 && symval
<= (baseaddr
+ endaddr
))
1171 irel
->r_addend
+= count
;
1173 /* Go hunt up a function and fix its line info if needed. */
1174 stabp
= stabcontents
+ irel
->r_offset
- 8;
1176 /* Go pullout the stab entry. */
1177 strx
= bfd_h_get_32 (abfd
, stabp
+ STRDXOFF
);
1178 type
= bfd_h_get_8 (abfd
, stabp
+ TYPEOFF
);
1179 other
= bfd_h_get_8 (abfd
, stabp
+ OTHEROFF
);
1180 desc
= bfd_h_get_16 (abfd
, stabp
+ DESCOFF
);
1181 value
= bfd_h_get_32 (abfd
, stabp
+ VALOFF
);
1183 name
= bfd_get_stab_name (type
);
1185 if (strcmp (name
, "FUN") == 0)
1187 int function_adjusted
= 0;
1189 if (symval
> (baseaddr
+ addr
))
1190 /* Not in this function. */
1193 /* Hey we got a function hit. */
1195 for (;stabp
< stabend
; stabp
+= STABSIZE
)
1197 /* Go pullout the stab entry. */
1198 strx
= bfd_h_get_32 (abfd
, stabp
+ STRDXOFF
);
1199 type
= bfd_h_get_8 (abfd
, stabp
+ TYPEOFF
);
1200 other
= bfd_h_get_8 (abfd
, stabp
+ OTHEROFF
);
1201 desc
= bfd_h_get_16 (abfd
, stabp
+ DESCOFF
);
1202 value
= bfd_h_get_32 (abfd
, stabp
+ VALOFF
);
1204 name
= bfd_get_stab_name (type
);
1206 if (strcmp (name
, "FUN") == 0)
1208 /* Hit another function entry. */
1209 if (function_adjusted
)
1211 /* Adjust the value. */
1214 /* We need to put it back. */
1215 bfd_h_put_32 (abfd
, value
,stabp
+ VALOFF
);
1218 /* And then bale out. */
1222 if (strcmp (name
, "SLINE") == 0)
1224 /* Got a line entry. */
1225 if ((baseaddr
+ addr
) <= (symval
+ value
))
1227 /* Adjust the line entry. */
1230 /* We need to put it back. */
1231 bfd_h_put_32 (abfd
, value
,stabp
+ VALOFF
);
1232 function_adjusted
= 1;
1243 /* When adding an instruction back it is sometimes necessary to move any
1244 global or local symbol that was referencing the first instruction of
1245 the moved block to refer to the first instruction of the inserted block.
1247 For example adding a PAGE instruction before a CALL or JMP requires
1248 that any label on the CALL or JMP is moved to the PAGE insn. */
1251 /* Adjust the local symbols defined in this section. */
1252 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
1253 for (isym
= isymbuf
; isym
< isymend
; isym
++)
1255 if (isym
->st_shndx
== shndx
1256 && addr
<= isym
->st_value
1257 && isym
->st_value
< endaddr
)
1258 isym
->st_value
+= count
;
1261 /* Now adjust the global symbols defined in this section. */
1262 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1263 - symtab_hdr
->sh_info
);
1264 sym_hashes
= elf_sym_hashes (abfd
);
1265 end_hashes
= sym_hashes
+ symcount
;
1266 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1268 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1270 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1271 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1272 && sym_hash
->root
.u
.def
.section
== sec
)
1274 if (addr
<= sym_hash
->root
.u
.def
.value
1275 && sym_hash
->root
.u
.def
.value
< endaddr
)
1276 sym_hash
->root
.u
.def
.value
+= count
;
1283 /* Delete some bytes from a section while relaxing. */
1286 ip2k_elf_relax_delete_bytes (abfd
, sec
, addr
, count
)
1292 bfd_byte
*contents
= elf_section_data (sec
)->this_hdr
.contents
;
1293 bfd_vma endaddr
= sec
->size
;
1295 /* Actually delete the bytes. */
1296 memmove (contents
+ addr
, contents
+ addr
+ count
,
1297 endaddr
- addr
- count
);
1301 adjust_all_relocations (abfd
, sec
, addr
+ count
, endaddr
, -count
, 0);
1305 /* -------------------------------------------------------------------- */
1307 /* XXX: The following code is the result of a cut&paste. This unfortunate
1308 practice is very widespread in the various target back-end files. */
1310 /* Set the howto pointer for a IP2K ELF reloc. */
1313 ip2k_info_to_howto_rela (abfd
, cache_ptr
, dst
)
1314 bfd
* abfd ATTRIBUTE_UNUSED
;
1315 arelent
* cache_ptr
;
1316 Elf_Internal_Rela
* dst
;
1318 unsigned int r_type
;
1320 r_type
= ELF32_R_TYPE (dst
->r_info
);
1324 cache_ptr
->howto
= & ip2k_elf_howto_table
[r_type
];
1329 /* Perform a single relocation.
1330 By default we use the standard BFD routines. */
1332 static bfd_reloc_status_type
1333 ip2k_final_link_relocate (howto
, input_bfd
, input_section
, contents
, rel
,
1335 reloc_howto_type
* howto
;
1337 asection
* input_section
;
1338 bfd_byte
* contents
;
1339 Elf_Internal_Rela
* rel
;
1342 static bfd_vma page_addr
= 0;
1344 bfd_reloc_status_type r
= bfd_reloc_ok
;
1345 switch (howto
->type
)
1347 /* Handle data space relocations. */
1350 if ((relocation
& IP2K_DATA_MASK
) == IP2K_DATA_VALUE
)
1351 relocation
&= ~IP2K_DATA_MASK
;
1353 r
= bfd_reloc_notsupported
;
1356 case R_IP2K_LO8DATA
:
1357 case R_IP2K_HI8DATA
:
1358 case R_IP2K_EX8DATA
:
1361 /* Handle insn space relocations. */
1363 page_addr
= BASEADDR (input_section
) + rel
->r_offset
;
1364 if ((relocation
& IP2K_INSN_MASK
) == IP2K_INSN_VALUE
)
1365 relocation
&= ~IP2K_INSN_MASK
;
1367 r
= bfd_reloc_notsupported
;
1370 case R_IP2K_ADDR16CJP
:
1371 if (BASEADDR (input_section
) + rel
->r_offset
!= page_addr
+ 2)
1373 /* No preceding page instruction, verify that it isn't needed. */
1374 if (PAGENO (relocation
+ rel
->r_addend
) !=
1375 ip2k_nominal_page_bits (input_bfd
, input_section
,
1376 rel
->r_offset
, contents
))
1377 _bfd_error_handler (_("ip2k linker: missing page instruction at 0x%08lx (dest = 0x%08lx)."),
1378 BASEADDR (input_section
) + rel
->r_offset
,
1379 relocation
+ rel
->r_addend
);
1381 else if (ip2k_relaxed
)
1383 /* Preceding page instruction. Verify that the page instruction is
1384 really needed. One reason for the relaxation to miss a page is if
1385 the section is not marked as executable. */
1386 if (!ip2k_is_switch_table_128 (input_bfd
, input_section
, rel
->r_offset
- 2, contents
) &&
1387 !ip2k_is_switch_table_256 (input_bfd
, input_section
, rel
->r_offset
- 2, contents
) &&
1388 (PAGENO (relocation
+ rel
->r_addend
) ==
1389 ip2k_nominal_page_bits (input_bfd
, input_section
,
1390 rel
->r_offset
- 2, contents
)))
1391 _bfd_error_handler (_("ip2k linker: redundant page instruction at 0x%08lx (dest = 0x%08lx)."),
1393 relocation
+ rel
->r_addend
);
1395 if ((relocation
& IP2K_INSN_MASK
) == IP2K_INSN_VALUE
)
1396 relocation
&= ~IP2K_INSN_MASK
;
1398 r
= bfd_reloc_notsupported
;
1401 case R_IP2K_LO8INSN
:
1402 case R_IP2K_HI8INSN
:
1403 case R_IP2K_PC_SKIP
:
1404 if ((relocation
& IP2K_INSN_MASK
) == IP2K_INSN_VALUE
)
1405 relocation
&= ~IP2K_INSN_MASK
;
1407 r
= bfd_reloc_notsupported
;
1411 /* If this is a relocation involving a TEXT
1412 symbol, reduce it to a word address. */
1413 if ((relocation
& IP2K_INSN_MASK
) == IP2K_INSN_VALUE
)
1414 howto
= &ip2k_elf_howto_table
[ (int) R_IP2K_TEXT
];
1417 /* Pass others through. */
1422 /* Only install relocation if above tests did not disqualify it. */
1423 if (r
== bfd_reloc_ok
)
1424 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1425 contents
, rel
->r_offset
,
1426 relocation
, rel
->r_addend
);
1431 /* Relocate a IP2K ELF section.
1433 The RELOCATE_SECTION function is called by the new ELF backend linker
1434 to handle the relocations for a section.
1436 The relocs are always passed as Rela structures; if the section
1437 actually uses Rel structures, the r_addend field will always be
1440 This function is responsible for adjusting the section contents as
1441 necessary, and (if using Rela relocs and generating a relocatable
1442 output file) adjusting the reloc addend as necessary.
1444 This function does not have to worry about setting the reloc
1445 address or the reloc symbol index.
1447 LOCAL_SYMS is a pointer to the swapped in local symbols.
1449 LOCAL_SECTIONS is an array giving the section in the input file
1450 corresponding to the st_shndx field of each local symbol.
1452 The global hash table entry for the global symbols can be found
1453 via elf_sym_hashes (input_bfd).
1455 When generating relocatable output, this function must handle
1456 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
1457 going to be the section symbol corresponding to the output
1458 section, which means that the addend must be adjusted
1462 ip2k_elf_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
1463 contents
, relocs
, local_syms
, local_sections
)
1464 bfd
*output_bfd ATTRIBUTE_UNUSED
;
1465 struct bfd_link_info
*info
;
1467 asection
*input_section
;
1469 Elf_Internal_Rela
*relocs
;
1470 Elf_Internal_Sym
*local_syms
;
1471 asection
**local_sections
;
1473 Elf_Internal_Shdr
*symtab_hdr
;
1474 struct elf_link_hash_entry
**sym_hashes
;
1475 Elf_Internal_Rela
*rel
;
1476 Elf_Internal_Rela
*relend
;
1478 if (info
->relocatable
)
1481 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
1482 sym_hashes
= elf_sym_hashes (input_bfd
);
1483 relend
= relocs
+ input_section
->reloc_count
;
1485 for (rel
= relocs
; rel
< relend
; rel
++)
1487 reloc_howto_type
* howto
;
1488 unsigned long r_symndx
;
1489 Elf_Internal_Sym
* sym
;
1491 struct elf_link_hash_entry
* h
;
1493 bfd_reloc_status_type r
;
1494 const char * name
= NULL
;
1497 /* This is a final link. */
1498 r_type
= ELF32_R_TYPE (rel
->r_info
);
1499 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1500 howto
= ip2k_elf_howto_table
+ ELF32_R_TYPE (rel
->r_info
);
1505 if (r_symndx
< symtab_hdr
->sh_info
)
1507 sym
= local_syms
+ r_symndx
;
1508 sec
= local_sections
[r_symndx
];
1509 relocation
= BASEADDR (sec
) + sym
->st_value
;
1511 name
= bfd_elf_string_from_elf_section
1512 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
1513 name
= (name
== NULL
) ? bfd_section_name (input_bfd
, sec
) : name
;
1518 bfd_boolean unresolved_reloc
;
1520 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
1521 r_symndx
, symtab_hdr
, sym_hashes
,
1523 unresolved_reloc
, warned
);
1525 name
= h
->root
.root
.string
;
1528 /* Finally, the sole IP2K-specific part. */
1529 r
= ip2k_final_link_relocate (howto
, input_bfd
, input_section
,
1530 contents
, rel
, relocation
);
1532 if (r
!= bfd_reloc_ok
)
1534 const char * msg
= (const char *) NULL
;
1538 case bfd_reloc_overflow
:
1539 r
= info
->callbacks
->reloc_overflow
1540 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
1541 (bfd_vma
) 0, input_bfd
, input_section
, rel
->r_offset
);
1544 case bfd_reloc_undefined
:
1545 r
= info
->callbacks
->undefined_symbol
1546 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, TRUE
);
1549 case bfd_reloc_outofrange
:
1550 msg
= _("internal error: out of range error");
1553 /* This is how ip2k_final_link_relocate tells us of a non-kosher
1554 reference between insn & data address spaces. */
1555 case bfd_reloc_notsupported
:
1556 if (sym
!= NULL
) /* Only if it's not an unresolved symbol. */
1557 msg
= _("unsupported relocation between data/insn address spaces");
1560 case bfd_reloc_dangerous
:
1561 msg
= _("internal error: dangerous relocation");
1565 msg
= _("internal error: unknown error");
1570 r
= info
->callbacks
->warning
1571 (info
, msg
, name
, input_bfd
, input_section
, rel
->r_offset
);
1582 ip2k_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
)
1584 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
1585 Elf_Internal_Rela
*rel
;
1586 struct elf_link_hash_entry
*h
;
1587 Elf_Internal_Sym
*sym
;
1591 switch (ELF32_R_TYPE (rel
->r_info
))
1594 switch (h
->root
.type
)
1596 case bfd_link_hash_defined
:
1597 case bfd_link_hash_defweak
:
1598 return h
->root
.u
.def
.section
;
1600 case bfd_link_hash_common
:
1601 return h
->root
.u
.c
.p
->section
;
1610 if (!(elf_bad_symtab (sec
->owner
)
1611 && ELF_ST_BIND (sym
->st_info
) != STB_LOCAL
)
1612 && ! ((sym
->st_shndx
<= 0 || sym
->st_shndx
>= SHN_LORESERVE
)
1613 && sym
->st_shndx
!= SHN_COMMON
))
1614 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
1620 ip2k_elf_gc_sweep_hook (abfd
, info
, sec
, relocs
)
1621 bfd
*abfd ATTRIBUTE_UNUSED
;
1622 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
1623 asection
*sec ATTRIBUTE_UNUSED
;
1624 const Elf_Internal_Rela
*relocs ATTRIBUTE_UNUSED
;
1626 /* We don't use got and plt entries for ip2k. */
1630 #define TARGET_BIG_SYM bfd_elf32_ip2k_vec
1631 #define TARGET_BIG_NAME "elf32-ip2k"
1633 #define ELF_ARCH bfd_arch_ip2k
1634 #define ELF_MACHINE_CODE EM_IP2K
1635 #define ELF_MACHINE_ALT1 EM_IP2K_OLD
1636 #define ELF_MAXPAGESIZE 1 /* No pages on the IP2K. */
1638 #define elf_info_to_howto_rel NULL
1639 #define elf_info_to_howto ip2k_info_to_howto_rela
1641 #define elf_backend_can_gc_sections 1
1642 #define elf_backend_rela_normal 1
1643 #define elf_backend_gc_mark_hook ip2k_elf_gc_mark_hook
1644 #define elf_backend_gc_sweep_hook ip2k_elf_gc_sweep_hook
1645 #define elf_backend_relocate_section ip2k_elf_relocate_section
1647 #define elf_symbol_leading_char '_'
1648 #define bfd_elf32_bfd_reloc_type_lookup ip2k_reloc_type_lookup
1649 #define bfd_elf32_bfd_relax_section ip2k_elf_relax_section
1651 #include "elf32-target.h"