1 /* SPU specific support for 32-bit ELF
3 Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012
4 Free Software Foundation, Inc.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
23 #include "libiberty.h"
29 #include "elf32-spu.h"
31 /* We use RELA style relocs. Don't define USE_REL. */
33 static bfd_reloc_status_type
spu_elf_rel9 (bfd
*, arelent
*, asymbol
*,
37 /* Values of type 'enum elf_spu_reloc_type' are used to index this
38 array, so it must be declared in the order of that type. */
40 static reloc_howto_type elf_howto_table
[] = {
41 HOWTO (R_SPU_NONE
, 0, 0, 0, FALSE
, 0, complain_overflow_dont
,
42 bfd_elf_generic_reloc
, "SPU_NONE",
43 FALSE
, 0, 0x00000000, FALSE
),
44 HOWTO (R_SPU_ADDR10
, 4, 2, 10, FALSE
, 14, complain_overflow_bitfield
,
45 bfd_elf_generic_reloc
, "SPU_ADDR10",
46 FALSE
, 0, 0x00ffc000, FALSE
),
47 HOWTO (R_SPU_ADDR16
, 2, 2, 16, FALSE
, 7, complain_overflow_bitfield
,
48 bfd_elf_generic_reloc
, "SPU_ADDR16",
49 FALSE
, 0, 0x007fff80, FALSE
),
50 HOWTO (R_SPU_ADDR16_HI
, 16, 2, 16, FALSE
, 7, complain_overflow_bitfield
,
51 bfd_elf_generic_reloc
, "SPU_ADDR16_HI",
52 FALSE
, 0, 0x007fff80, FALSE
),
53 HOWTO (R_SPU_ADDR16_LO
, 0, 2, 16, FALSE
, 7, complain_overflow_dont
,
54 bfd_elf_generic_reloc
, "SPU_ADDR16_LO",
55 FALSE
, 0, 0x007fff80, FALSE
),
56 HOWTO (R_SPU_ADDR18
, 0, 2, 18, FALSE
, 7, complain_overflow_bitfield
,
57 bfd_elf_generic_reloc
, "SPU_ADDR18",
58 FALSE
, 0, 0x01ffff80, FALSE
),
59 HOWTO (R_SPU_ADDR32
, 0, 2, 32, FALSE
, 0, complain_overflow_dont
,
60 bfd_elf_generic_reloc
, "SPU_ADDR32",
61 FALSE
, 0, 0xffffffff, FALSE
),
62 HOWTO (R_SPU_REL16
, 2, 2, 16, TRUE
, 7, complain_overflow_bitfield
,
63 bfd_elf_generic_reloc
, "SPU_REL16",
64 FALSE
, 0, 0x007fff80, TRUE
),
65 HOWTO (R_SPU_ADDR7
, 0, 2, 7, FALSE
, 14, complain_overflow_dont
,
66 bfd_elf_generic_reloc
, "SPU_ADDR7",
67 FALSE
, 0, 0x001fc000, FALSE
),
68 HOWTO (R_SPU_REL9
, 2, 2, 9, TRUE
, 0, complain_overflow_signed
,
69 spu_elf_rel9
, "SPU_REL9",
70 FALSE
, 0, 0x0180007f, TRUE
),
71 HOWTO (R_SPU_REL9I
, 2, 2, 9, TRUE
, 0, complain_overflow_signed
,
72 spu_elf_rel9
, "SPU_REL9I",
73 FALSE
, 0, 0x0000c07f, TRUE
),
74 HOWTO (R_SPU_ADDR10I
, 0, 2, 10, FALSE
, 14, complain_overflow_signed
,
75 bfd_elf_generic_reloc
, "SPU_ADDR10I",
76 FALSE
, 0, 0x00ffc000, FALSE
),
77 HOWTO (R_SPU_ADDR16I
, 0, 2, 16, FALSE
, 7, complain_overflow_signed
,
78 bfd_elf_generic_reloc
, "SPU_ADDR16I",
79 FALSE
, 0, 0x007fff80, FALSE
),
80 HOWTO (R_SPU_REL32
, 0, 2, 32, TRUE
, 0, complain_overflow_dont
,
81 bfd_elf_generic_reloc
, "SPU_REL32",
82 FALSE
, 0, 0xffffffff, TRUE
),
83 HOWTO (R_SPU_ADDR16X
, 0, 2, 16, FALSE
, 7, complain_overflow_bitfield
,
84 bfd_elf_generic_reloc
, "SPU_ADDR16X",
85 FALSE
, 0, 0x007fff80, FALSE
),
86 HOWTO (R_SPU_PPU32
, 0, 2, 32, FALSE
, 0, complain_overflow_dont
,
87 bfd_elf_generic_reloc
, "SPU_PPU32",
88 FALSE
, 0, 0xffffffff, FALSE
),
89 HOWTO (R_SPU_PPU64
, 0, 4, 64, FALSE
, 0, complain_overflow_dont
,
90 bfd_elf_generic_reloc
, "SPU_PPU64",
92 HOWTO (R_SPU_ADD_PIC
, 0, 0, 0, FALSE
, 0, complain_overflow_dont
,
93 bfd_elf_generic_reloc
, "SPU_ADD_PIC",
94 FALSE
, 0, 0x00000000, FALSE
),
97 static struct bfd_elf_special_section
const spu_elf_special_sections
[] = {
98 { "._ea", 4, 0, SHT_PROGBITS
, SHF_WRITE
},
99 { ".toe", 4, 0, SHT_NOBITS
, SHF_ALLOC
},
103 static enum elf_spu_reloc_type
104 spu_elf_bfd_to_reloc_type (bfd_reloc_code_real_type code
)
110 case BFD_RELOC_SPU_IMM10W
:
112 case BFD_RELOC_SPU_IMM16W
:
114 case BFD_RELOC_SPU_LO16
:
115 return R_SPU_ADDR16_LO
;
116 case BFD_RELOC_SPU_HI16
:
117 return R_SPU_ADDR16_HI
;
118 case BFD_RELOC_SPU_IMM18
:
120 case BFD_RELOC_SPU_PCREL16
:
122 case BFD_RELOC_SPU_IMM7
:
124 case BFD_RELOC_SPU_IMM8
:
126 case BFD_RELOC_SPU_PCREL9a
:
128 case BFD_RELOC_SPU_PCREL9b
:
130 case BFD_RELOC_SPU_IMM10
:
131 return R_SPU_ADDR10I
;
132 case BFD_RELOC_SPU_IMM16
:
133 return R_SPU_ADDR16I
;
136 case BFD_RELOC_32_PCREL
:
138 case BFD_RELOC_SPU_PPU32
:
140 case BFD_RELOC_SPU_PPU64
:
142 case BFD_RELOC_SPU_ADD_PIC
:
143 return R_SPU_ADD_PIC
;
148 spu_elf_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
,
150 Elf_Internal_Rela
*dst
)
152 enum elf_spu_reloc_type r_type
;
154 r_type
= (enum elf_spu_reloc_type
) ELF32_R_TYPE (dst
->r_info
);
155 BFD_ASSERT (r_type
< R_SPU_max
);
156 cache_ptr
->howto
= &elf_howto_table
[(int) r_type
];
159 static reloc_howto_type
*
160 spu_elf_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
161 bfd_reloc_code_real_type code
)
163 enum elf_spu_reloc_type r_type
= spu_elf_bfd_to_reloc_type (code
);
165 if (r_type
== R_SPU_NONE
)
168 return elf_howto_table
+ r_type
;
171 static reloc_howto_type
*
172 spu_elf_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
177 for (i
= 0; i
< sizeof (elf_howto_table
) / sizeof (elf_howto_table
[0]); i
++)
178 if (elf_howto_table
[i
].name
!= NULL
179 && strcasecmp (elf_howto_table
[i
].name
, r_name
) == 0)
180 return &elf_howto_table
[i
];
185 /* Apply R_SPU_REL9 and R_SPU_REL9I relocs. */
187 static bfd_reloc_status_type
188 spu_elf_rel9 (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
189 void *data
, asection
*input_section
,
190 bfd
*output_bfd
, char **error_message
)
192 bfd_size_type octets
;
196 /* If this is a relocatable link (output_bfd test tells us), just
197 call the generic function. Any adjustment will be done at final
199 if (output_bfd
!= NULL
)
200 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
201 input_section
, output_bfd
, error_message
);
203 if (reloc_entry
->address
> bfd_get_section_limit (abfd
, input_section
))
204 return bfd_reloc_outofrange
;
205 octets
= reloc_entry
->address
* bfd_octets_per_byte (abfd
);
207 /* Get symbol value. */
209 if (!bfd_is_com_section (symbol
->section
))
211 if (symbol
->section
->output_section
)
212 val
+= symbol
->section
->output_section
->vma
;
214 val
+= reloc_entry
->addend
;
216 /* Make it pc-relative. */
217 val
-= input_section
->output_section
->vma
+ input_section
->output_offset
;
220 if (val
+ 256 >= 512)
221 return bfd_reloc_overflow
;
223 insn
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ octets
);
225 /* Move two high bits of value to REL9I and REL9 position.
226 The mask will take care of selecting the right field. */
227 val
= (val
& 0x7f) | ((val
& 0x180) << 7) | ((val
& 0x180) << 16);
228 insn
&= ~reloc_entry
->howto
->dst_mask
;
229 insn
|= val
& reloc_entry
->howto
->dst_mask
;
230 bfd_put_32 (abfd
, insn
, (bfd_byte
*) data
+ octets
);
235 spu_elf_new_section_hook (bfd
*abfd
, asection
*sec
)
237 if (!sec
->used_by_bfd
)
239 struct _spu_elf_section_data
*sdata
;
241 sdata
= bfd_zalloc (abfd
, sizeof (*sdata
));
244 sec
->used_by_bfd
= sdata
;
247 return _bfd_elf_new_section_hook (abfd
, sec
);
250 /* Set up overlay info for executables. */
253 spu_elf_object_p (bfd
*abfd
)
255 if ((abfd
->flags
& (EXEC_P
| DYNAMIC
)) != 0)
257 unsigned int i
, num_ovl
, num_buf
;
258 Elf_Internal_Phdr
*phdr
= elf_tdata (abfd
)->phdr
;
259 Elf_Internal_Ehdr
*ehdr
= elf_elfheader (abfd
);
260 Elf_Internal_Phdr
*last_phdr
= NULL
;
262 for (num_buf
= 0, num_ovl
= 0, i
= 0; i
< ehdr
->e_phnum
; i
++, phdr
++)
263 if (phdr
->p_type
== PT_LOAD
&& (phdr
->p_flags
& PF_OVERLAY
) != 0)
268 if (last_phdr
== NULL
269 || ((last_phdr
->p_vaddr
^ phdr
->p_vaddr
) & 0x3ffff) != 0)
272 for (j
= 1; j
< elf_numsections (abfd
); j
++)
274 Elf_Internal_Shdr
*shdr
= elf_elfsections (abfd
)[j
];
276 if (ELF_SECTION_SIZE (shdr
, phdr
) != 0
277 && ELF_SECTION_IN_SEGMENT (shdr
, phdr
))
279 asection
*sec
= shdr
->bfd_section
;
280 spu_elf_section_data (sec
)->u
.o
.ovl_index
= num_ovl
;
281 spu_elf_section_data (sec
)->u
.o
.ovl_buf
= num_buf
;
289 /* Specially mark defined symbols named _EAR_* with BSF_KEEP so that
290 strip --strip-unneeded will not remove them. */
293 spu_elf_backend_symbol_processing (bfd
*abfd ATTRIBUTE_UNUSED
, asymbol
*sym
)
295 if (sym
->name
!= NULL
296 && sym
->section
!= bfd_abs_section_ptr
297 && strncmp (sym
->name
, "_EAR_", 5) == 0)
298 sym
->flags
|= BSF_KEEP
;
301 /* SPU ELF linker hash table. */
303 struct spu_link_hash_table
305 struct elf_link_hash_table elf
;
307 struct spu_elf_params
*params
;
309 /* Shortcuts to overlay sections. */
315 /* Count of stubs in each overlay section. */
316 unsigned int *stub_count
;
318 /* The stub section for each overlay section. */
321 struct elf_link_hash_entry
*ovly_entry
[2];
323 /* Number of overlay buffers. */
324 unsigned int num_buf
;
326 /* Total number of overlays. */
327 unsigned int num_overlays
;
329 /* For soft icache. */
330 unsigned int line_size_log2
;
331 unsigned int num_lines_log2
;
332 unsigned int fromelem_size_log2
;
334 /* How much memory we have. */
335 unsigned int local_store
;
337 /* Count of overlay stubs needed in non-overlay area. */
338 unsigned int non_ovly_stub
;
340 /* Pointer to the fixup section */
344 unsigned int stub_err
: 1;
347 /* Hijack the generic got fields for overlay stub accounting. */
351 struct got_entry
*next
;
360 #define spu_hash_table(p) \
361 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
362 == SPU_ELF_DATA ? ((struct spu_link_hash_table *) ((p)->hash)) : NULL)
366 struct function_info
*fun
;
367 struct call_info
*next
;
369 unsigned int max_depth
;
370 unsigned int is_tail
: 1;
371 unsigned int is_pasted
: 1;
372 unsigned int broken_cycle
: 1;
373 unsigned int priority
: 13;
378 /* List of functions called. Also branches to hot/cold part of
380 struct call_info
*call_list
;
381 /* For hot/cold part of function, point to owner. */
382 struct function_info
*start
;
383 /* Symbol at start of function. */
385 Elf_Internal_Sym
*sym
;
386 struct elf_link_hash_entry
*h
;
388 /* Function section. */
391 /* Where last called from, and number of sections called from. */
392 asection
*last_caller
;
393 unsigned int call_count
;
394 /* Address range of (this part of) function. */
396 /* Offset where we found a store of lr, or -1 if none found. */
398 /* Offset where we found the stack adjustment insn. */
402 /* Distance from root of call tree. Tail and hot/cold branches
403 count as one deeper. We aren't counting stack frames here. */
405 /* Set if global symbol. */
406 unsigned int global
: 1;
407 /* Set if known to be start of function (as distinct from a hunk
408 in hot/cold section. */
409 unsigned int is_func
: 1;
410 /* Set if not a root node. */
411 unsigned int non_root
: 1;
412 /* Flags used during call tree traversal. It's cheaper to replicate
413 the visit flags than have one which needs clearing after a traversal. */
414 unsigned int visit1
: 1;
415 unsigned int visit2
: 1;
416 unsigned int marking
: 1;
417 unsigned int visit3
: 1;
418 unsigned int visit4
: 1;
419 unsigned int visit5
: 1;
420 unsigned int visit6
: 1;
421 unsigned int visit7
: 1;
424 struct spu_elf_stack_info
428 /* Variable size array describing functions, one per contiguous
429 address range belonging to a function. */
430 struct function_info fun
[1];
433 static struct function_info
*find_function (asection
*, bfd_vma
,
434 struct bfd_link_info
*);
436 /* Create a spu ELF linker hash table. */
438 static struct bfd_link_hash_table
*
439 spu_elf_link_hash_table_create (bfd
*abfd
)
441 struct spu_link_hash_table
*htab
;
443 htab
= bfd_zmalloc (sizeof (*htab
));
447 if (!_bfd_elf_link_hash_table_init (&htab
->elf
, abfd
,
448 _bfd_elf_link_hash_newfunc
,
449 sizeof (struct elf_link_hash_entry
),
456 htab
->elf
.init_got_refcount
.refcount
= 0;
457 htab
->elf
.init_got_refcount
.glist
= NULL
;
458 htab
->elf
.init_got_offset
.offset
= 0;
459 htab
->elf
.init_got_offset
.glist
= NULL
;
460 return &htab
->elf
.root
;
464 spu_elf_setup (struct bfd_link_info
*info
, struct spu_elf_params
*params
)
466 bfd_vma max_branch_log2
;
468 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
469 htab
->params
= params
;
470 htab
->line_size_log2
= bfd_log2 (htab
->params
->line_size
);
471 htab
->num_lines_log2
= bfd_log2 (htab
->params
->num_lines
);
473 /* For the software i-cache, we provide a "from" list whose size
474 is a power-of-two number of quadwords, big enough to hold one
475 byte per outgoing branch. Compute this number here. */
476 max_branch_log2
= bfd_log2 (htab
->params
->max_branch
);
477 htab
->fromelem_size_log2
= max_branch_log2
> 4 ? max_branch_log2
- 4 : 0;
480 /* Find the symbol for the given R_SYMNDX in IBFD and set *HP and *SYMP
481 to (hash, NULL) for global symbols, and (NULL, sym) for locals. Set
482 *SYMSECP to the symbol's section. *LOCSYMSP caches local syms. */
485 get_sym_h (struct elf_link_hash_entry
**hp
,
486 Elf_Internal_Sym
**symp
,
488 Elf_Internal_Sym
**locsymsp
,
489 unsigned long r_symndx
,
492 Elf_Internal_Shdr
*symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
494 if (r_symndx
>= symtab_hdr
->sh_info
)
496 struct elf_link_hash_entry
**sym_hashes
= elf_sym_hashes (ibfd
);
497 struct elf_link_hash_entry
*h
;
499 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
500 while (h
->root
.type
== bfd_link_hash_indirect
501 || h
->root
.type
== bfd_link_hash_warning
)
502 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
512 asection
*symsec
= NULL
;
513 if (h
->root
.type
== bfd_link_hash_defined
514 || h
->root
.type
== bfd_link_hash_defweak
)
515 symsec
= h
->root
.u
.def
.section
;
521 Elf_Internal_Sym
*sym
;
522 Elf_Internal_Sym
*locsyms
= *locsymsp
;
526 locsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
528 locsyms
= bfd_elf_get_elf_syms (ibfd
, symtab_hdr
,
530 0, NULL
, NULL
, NULL
);
535 sym
= locsyms
+ r_symndx
;
544 *symsecp
= bfd_section_from_elf_index (ibfd
, sym
->st_shndx
);
550 /* Create the note section if not already present. This is done early so
551 that the linker maps the sections to the right place in the output. */
554 spu_elf_create_sections (struct bfd_link_info
*info
)
556 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
559 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
560 if (bfd_get_section_by_name (ibfd
, SPU_PTNOTE_SPUNAME
) != NULL
)
565 /* Make SPU_PTNOTE_SPUNAME section. */
572 ibfd
= info
->input_bfds
;
573 flags
= SEC_LOAD
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
;
574 s
= bfd_make_section_anyway_with_flags (ibfd
, SPU_PTNOTE_SPUNAME
, flags
);
576 || !bfd_set_section_alignment (ibfd
, s
, 4))
579 name_len
= strlen (bfd_get_filename (info
->output_bfd
)) + 1;
580 size
= 12 + ((sizeof (SPU_PLUGIN_NAME
) + 3) & -4);
581 size
+= (name_len
+ 3) & -4;
583 if (!bfd_set_section_size (ibfd
, s
, size
))
586 data
= bfd_zalloc (ibfd
, size
);
590 bfd_put_32 (ibfd
, sizeof (SPU_PLUGIN_NAME
), data
+ 0);
591 bfd_put_32 (ibfd
, name_len
, data
+ 4);
592 bfd_put_32 (ibfd
, 1, data
+ 8);
593 memcpy (data
+ 12, SPU_PLUGIN_NAME
, sizeof (SPU_PLUGIN_NAME
));
594 memcpy (data
+ 12 + ((sizeof (SPU_PLUGIN_NAME
) + 3) & -4),
595 bfd_get_filename (info
->output_bfd
), name_len
);
599 if (htab
->params
->emit_fixups
)
604 if (htab
->elf
.dynobj
== NULL
)
605 htab
->elf
.dynobj
= ibfd
;
606 ibfd
= htab
->elf
.dynobj
;
607 flags
= (SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
| SEC_HAS_CONTENTS
608 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
609 s
= bfd_make_section_anyway_with_flags (ibfd
, ".fixup", flags
);
610 if (s
== NULL
|| !bfd_set_section_alignment (ibfd
, s
, 2))
618 /* qsort predicate to sort sections by vma. */
621 sort_sections (const void *a
, const void *b
)
623 const asection
*const *s1
= a
;
624 const asection
*const *s2
= b
;
625 bfd_signed_vma delta
= (*s1
)->vma
- (*s2
)->vma
;
628 return delta
< 0 ? -1 : 1;
630 return (*s1
)->index
- (*s2
)->index
;
633 /* Identify overlays in the output bfd, and number them.
634 Returns 0 on error, 1 if no overlays, 2 if overlays. */
637 spu_elf_find_overlays (struct bfd_link_info
*info
)
639 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
640 asection
**alloc_sec
;
641 unsigned int i
, n
, ovl_index
, num_buf
;
644 static const char *const entry_names
[2][2] = {
645 { "__ovly_load", "__icache_br_handler" },
646 { "__ovly_return", "__icache_call_handler" }
649 if (info
->output_bfd
->section_count
< 2)
653 = bfd_malloc (info
->output_bfd
->section_count
* sizeof (*alloc_sec
));
654 if (alloc_sec
== NULL
)
657 /* Pick out all the alloced sections. */
658 for (n
= 0, s
= info
->output_bfd
->sections
; s
!= NULL
; s
= s
->next
)
659 if ((s
->flags
& SEC_ALLOC
) != 0
660 && (s
->flags
& (SEC_LOAD
| SEC_THREAD_LOCAL
)) != SEC_THREAD_LOCAL
670 /* Sort them by vma. */
671 qsort (alloc_sec
, n
, sizeof (*alloc_sec
), sort_sections
);
673 ovl_end
= alloc_sec
[0]->vma
+ alloc_sec
[0]->size
;
674 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
676 unsigned int prev_buf
= 0, set_id
= 0;
678 /* Look for an overlapping vma to find the first overlay section. */
679 bfd_vma vma_start
= 0;
681 for (i
= 1; i
< n
; i
++)
684 if (s
->vma
< ovl_end
)
686 asection
*s0
= alloc_sec
[i
- 1];
690 << (htab
->num_lines_log2
+ htab
->line_size_log2
)));
695 ovl_end
= s
->vma
+ s
->size
;
698 /* Now find any sections within the cache area. */
699 for (ovl_index
= 0, num_buf
= 0; i
< n
; i
++)
702 if (s
->vma
>= ovl_end
)
705 /* A section in an overlay area called .ovl.init is not
706 an overlay, in the sense that it might be loaded in
707 by the overlay manager, but rather the initial
708 section contents for the overlay buffer. */
709 if (strncmp (s
->name
, ".ovl.init", 9) != 0)
711 num_buf
= ((s
->vma
- vma_start
) >> htab
->line_size_log2
) + 1;
712 set_id
= (num_buf
== prev_buf
)? set_id
+ 1 : 0;
715 if ((s
->vma
- vma_start
) & (htab
->params
->line_size
- 1))
717 info
->callbacks
->einfo (_("%X%P: overlay section %A "
718 "does not start on a cache line.\n"),
720 bfd_set_error (bfd_error_bad_value
);
723 else if (s
->size
> htab
->params
->line_size
)
725 info
->callbacks
->einfo (_("%X%P: overlay section %A "
726 "is larger than a cache line.\n"),
728 bfd_set_error (bfd_error_bad_value
);
732 alloc_sec
[ovl_index
++] = s
;
733 spu_elf_section_data (s
)->u
.o
.ovl_index
734 = (set_id
<< htab
->num_lines_log2
) + num_buf
;
735 spu_elf_section_data (s
)->u
.o
.ovl_buf
= num_buf
;
739 /* Ensure there are no more overlay sections. */
743 if (s
->vma
< ovl_end
)
745 info
->callbacks
->einfo (_("%X%P: overlay section %A "
746 "is not in cache area.\n"),
748 bfd_set_error (bfd_error_bad_value
);
752 ovl_end
= s
->vma
+ s
->size
;
757 /* Look for overlapping vmas. Any with overlap must be overlays.
758 Count them. Also count the number of overlay regions. */
759 for (ovl_index
= 0, num_buf
= 0, i
= 1; i
< n
; i
++)
762 if (s
->vma
< ovl_end
)
764 asection
*s0
= alloc_sec
[i
- 1];
766 if (spu_elf_section_data (s0
)->u
.o
.ovl_index
== 0)
769 if (strncmp (s0
->name
, ".ovl.init", 9) != 0)
771 alloc_sec
[ovl_index
] = s0
;
772 spu_elf_section_data (s0
)->u
.o
.ovl_index
= ++ovl_index
;
773 spu_elf_section_data (s0
)->u
.o
.ovl_buf
= num_buf
;
776 ovl_end
= s
->vma
+ s
->size
;
778 if (strncmp (s
->name
, ".ovl.init", 9) != 0)
780 alloc_sec
[ovl_index
] = s
;
781 spu_elf_section_data (s
)->u
.o
.ovl_index
= ++ovl_index
;
782 spu_elf_section_data (s
)->u
.o
.ovl_buf
= num_buf
;
783 if (s0
->vma
!= s
->vma
)
785 info
->callbacks
->einfo (_("%X%P: overlay sections %A "
786 "and %A do not start at the "
789 bfd_set_error (bfd_error_bad_value
);
792 if (ovl_end
< s
->vma
+ s
->size
)
793 ovl_end
= s
->vma
+ s
->size
;
797 ovl_end
= s
->vma
+ s
->size
;
801 htab
->num_overlays
= ovl_index
;
802 htab
->num_buf
= num_buf
;
803 htab
->ovl_sec
= alloc_sec
;
808 for (i
= 0; i
< 2; i
++)
811 struct elf_link_hash_entry
*h
;
813 name
= entry_names
[i
][htab
->params
->ovly_flavour
];
814 h
= elf_link_hash_lookup (&htab
->elf
, name
, TRUE
, FALSE
, FALSE
);
818 if (h
->root
.type
== bfd_link_hash_new
)
820 h
->root
.type
= bfd_link_hash_undefined
;
822 h
->ref_regular_nonweak
= 1;
825 htab
->ovly_entry
[i
] = h
;
831 /* Non-zero to use bra in overlay stubs rather than br. */
834 #define BRA 0x30000000
835 #define BRASL 0x31000000
836 #define BR 0x32000000
837 #define BRSL 0x33000000
838 #define NOP 0x40200000
839 #define LNOP 0x00200000
840 #define ILA 0x42000000
842 /* Return true for all relative and absolute branch instructions.
850 brhnz 00100011 0.. */
853 is_branch (const unsigned char *insn
)
855 return (insn
[0] & 0xec) == 0x20 && (insn
[1] & 0x80) == 0;
858 /* Return true for all indirect branch instructions.
866 bihnz 00100101 011 */
869 is_indirect_branch (const unsigned char *insn
)
871 return (insn
[0] & 0xef) == 0x25 && (insn
[1] & 0x80) == 0;
874 /* Return true for branch hint instructions.
879 is_hint (const unsigned char *insn
)
881 return (insn
[0] & 0xfc) == 0x10;
884 /* True if INPUT_SECTION might need overlay stubs. */
887 maybe_needs_stubs (asection
*input_section
)
889 /* No stubs for debug sections and suchlike. */
890 if ((input_section
->flags
& SEC_ALLOC
) == 0)
893 /* No stubs for link-once sections that will be discarded. */
894 if (input_section
->output_section
== bfd_abs_section_ptr
)
897 /* Don't create stubs for .eh_frame references. */
898 if (strcmp (input_section
->name
, ".eh_frame") == 0)
920 /* Return non-zero if this reloc symbol should go via an overlay stub.
921 Return 2 if the stub must be in non-overlay area. */
923 static enum _stub_type
924 needs_ovl_stub (struct elf_link_hash_entry
*h
,
925 Elf_Internal_Sym
*sym
,
927 asection
*input_section
,
928 Elf_Internal_Rela
*irela
,
930 struct bfd_link_info
*info
)
932 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
933 enum elf_spu_reloc_type r_type
;
934 unsigned int sym_type
;
935 bfd_boolean branch
, hint
, call
;
936 enum _stub_type ret
= no_stub
;
940 || sym_sec
->output_section
== bfd_abs_section_ptr
941 || spu_elf_section_data (sym_sec
->output_section
) == NULL
)
946 /* Ensure no stubs for user supplied overlay manager syms. */
947 if (h
== htab
->ovly_entry
[0] || h
== htab
->ovly_entry
[1])
950 /* setjmp always goes via an overlay stub, because then the return
951 and hence the longjmp goes via __ovly_return. That magically
952 makes setjmp/longjmp between overlays work. */
953 if (strncmp (h
->root
.root
.string
, "setjmp", 6) == 0
954 && (h
->root
.root
.string
[6] == '\0' || h
->root
.root
.string
[6] == '@'))
961 sym_type
= ELF_ST_TYPE (sym
->st_info
);
963 r_type
= ELF32_R_TYPE (irela
->r_info
);
967 if (r_type
== R_SPU_REL16
|| r_type
== R_SPU_ADDR16
)
969 if (contents
== NULL
)
972 if (!bfd_get_section_contents (input_section
->owner
,
979 contents
+= irela
->r_offset
;
981 branch
= is_branch (contents
);
982 hint
= is_hint (contents
);
985 call
= (contents
[0] & 0xfd) == 0x31;
987 && sym_type
!= STT_FUNC
990 /* It's common for people to write assembly and forget
991 to give function symbols the right type. Handle
992 calls to such symbols, but warn so that (hopefully)
993 people will fix their code. We need the symbol
994 type to be correct to distinguish function pointer
995 initialisation from other pointer initialisations. */
996 const char *sym_name
;
999 sym_name
= h
->root
.root
.string
;
1002 Elf_Internal_Shdr
*symtab_hdr
;
1003 symtab_hdr
= &elf_tdata (input_section
->owner
)->symtab_hdr
;
1004 sym_name
= bfd_elf_sym_name (input_section
->owner
,
1009 (*_bfd_error_handler
) (_("warning: call to non-function"
1010 " symbol %s defined in %B"),
1011 sym_sec
->owner
, sym_name
);
1017 if ((!branch
&& htab
->params
->ovly_flavour
== ovly_soft_icache
)
1018 || (sym_type
!= STT_FUNC
1019 && !(branch
|| hint
)
1020 && (sym_sec
->flags
& SEC_CODE
) == 0))
1023 /* Usually, symbols in non-overlay sections don't need stubs. */
1024 if (spu_elf_section_data (sym_sec
->output_section
)->u
.o
.ovl_index
== 0
1025 && !htab
->params
->non_overlay_stubs
)
1028 /* A reference from some other section to a symbol in an overlay
1029 section needs a stub. */
1030 if (spu_elf_section_data (sym_sec
->output_section
)->u
.o
.ovl_index
1031 != spu_elf_section_data (input_section
->output_section
)->u
.o
.ovl_index
)
1033 unsigned int lrlive
= 0;
1035 lrlive
= (contents
[1] & 0x70) >> 4;
1037 if (!lrlive
&& (call
|| sym_type
== STT_FUNC
))
1038 ret
= call_ovl_stub
;
1040 ret
= br000_ovl_stub
+ lrlive
;
1043 /* If this insn isn't a branch then we are possibly taking the
1044 address of a function and passing it out somehow. Soft-icache code
1045 always generates inline code to do indirect branches. */
1046 if (!(branch
|| hint
)
1047 && sym_type
== STT_FUNC
1048 && htab
->params
->ovly_flavour
!= ovly_soft_icache
)
1055 count_stub (struct spu_link_hash_table
*htab
,
1058 enum _stub_type stub_type
,
1059 struct elf_link_hash_entry
*h
,
1060 const Elf_Internal_Rela
*irela
)
1062 unsigned int ovl
= 0;
1063 struct got_entry
*g
, **head
;
1066 /* If this instruction is a branch or call, we need a stub
1067 for it. One stub per function per overlay.
1068 If it isn't a branch, then we are taking the address of
1069 this function so need a stub in the non-overlay area
1070 for it. One stub per function. */
1071 if (stub_type
!= nonovl_stub
)
1072 ovl
= spu_elf_section_data (isec
->output_section
)->u
.o
.ovl_index
;
1075 head
= &h
->got
.glist
;
1078 if (elf_local_got_ents (ibfd
) == NULL
)
1080 bfd_size_type amt
= (elf_tdata (ibfd
)->symtab_hdr
.sh_info
1081 * sizeof (*elf_local_got_ents (ibfd
)));
1082 elf_local_got_ents (ibfd
) = bfd_zmalloc (amt
);
1083 if (elf_local_got_ents (ibfd
) == NULL
)
1086 head
= elf_local_got_ents (ibfd
) + ELF32_R_SYM (irela
->r_info
);
1089 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1091 htab
->stub_count
[ovl
] += 1;
1097 addend
= irela
->r_addend
;
1101 struct got_entry
*gnext
;
1103 for (g
= *head
; g
!= NULL
; g
= g
->next
)
1104 if (g
->addend
== addend
&& g
->ovl
== 0)
1109 /* Need a new non-overlay area stub. Zap other stubs. */
1110 for (g
= *head
; g
!= NULL
; g
= gnext
)
1113 if (g
->addend
== addend
)
1115 htab
->stub_count
[g
->ovl
] -= 1;
1123 for (g
= *head
; g
!= NULL
; g
= g
->next
)
1124 if (g
->addend
== addend
&& (g
->ovl
== ovl
|| g
->ovl
== 0))
1130 g
= bfd_malloc (sizeof *g
);
1135 g
->stub_addr
= (bfd_vma
) -1;
1139 htab
->stub_count
[ovl
] += 1;
1145 /* Support two sizes of overlay stubs, a slower more compact stub of two
1146 intructions, and a faster stub of four instructions.
1147 Soft-icache stubs are four or eight words. */
1150 ovl_stub_size (struct spu_elf_params
*params
)
1152 return 16 << params
->ovly_flavour
>> params
->compact_stub
;
1156 ovl_stub_size_log2 (struct spu_elf_params
*params
)
1158 return 4 + params
->ovly_flavour
- params
->compact_stub
;
1161 /* Two instruction overlay stubs look like:
1163 brsl $75,__ovly_load
1164 .word target_ovl_and_address
1166 ovl_and_address is a word with the overlay number in the top 14 bits
1167 and local store address in the bottom 18 bits.
1169 Four instruction overlay stubs look like:
1173 ila $79,target_address
1176 Software icache stubs are:
1180 .word lrlive_branchlocalstoreaddr;
1181 brasl $75,__icache_br_handler
1186 build_stub (struct bfd_link_info
*info
,
1189 enum _stub_type stub_type
,
1190 struct elf_link_hash_entry
*h
,
1191 const Elf_Internal_Rela
*irela
,
1195 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1196 unsigned int ovl
, dest_ovl
, set_id
;
1197 struct got_entry
*g
, **head
;
1199 bfd_vma addend
, from
, to
, br_dest
, patt
;
1200 unsigned int lrlive
;
1203 if (stub_type
!= nonovl_stub
)
1204 ovl
= spu_elf_section_data (isec
->output_section
)->u
.o
.ovl_index
;
1207 head
= &h
->got
.glist
;
1209 head
= elf_local_got_ents (ibfd
) + ELF32_R_SYM (irela
->r_info
);
1213 addend
= irela
->r_addend
;
1215 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1217 g
= bfd_malloc (sizeof *g
);
1223 g
->br_addr
= (irela
->r_offset
1224 + isec
->output_offset
1225 + isec
->output_section
->vma
);
1231 for (g
= *head
; g
!= NULL
; g
= g
->next
)
1232 if (g
->addend
== addend
&& (g
->ovl
== ovl
|| g
->ovl
== 0))
1237 if (g
->ovl
== 0 && ovl
!= 0)
1240 if (g
->stub_addr
!= (bfd_vma
) -1)
1244 sec
= htab
->stub_sec
[ovl
];
1245 dest
+= dest_sec
->output_offset
+ dest_sec
->output_section
->vma
;
1246 from
= sec
->size
+ sec
->output_offset
+ sec
->output_section
->vma
;
1247 g
->stub_addr
= from
;
1248 to
= (htab
->ovly_entry
[0]->root
.u
.def
.value
1249 + htab
->ovly_entry
[0]->root
.u
.def
.section
->output_offset
1250 + htab
->ovly_entry
[0]->root
.u
.def
.section
->output_section
->vma
);
1252 if (((dest
| to
| from
) & 3) != 0)
1257 dest_ovl
= spu_elf_section_data (dest_sec
->output_section
)->u
.o
.ovl_index
;
1259 if (htab
->params
->ovly_flavour
== ovly_normal
1260 && !htab
->params
->compact_stub
)
1262 bfd_put_32 (sec
->owner
, ILA
+ ((dest_ovl
<< 7) & 0x01ffff80) + 78,
1263 sec
->contents
+ sec
->size
);
1264 bfd_put_32 (sec
->owner
, LNOP
,
1265 sec
->contents
+ sec
->size
+ 4);
1266 bfd_put_32 (sec
->owner
, ILA
+ ((dest
<< 7) & 0x01ffff80) + 79,
1267 sec
->contents
+ sec
->size
+ 8);
1269 bfd_put_32 (sec
->owner
, BR
+ (((to
- (from
+ 12)) << 5) & 0x007fff80),
1270 sec
->contents
+ sec
->size
+ 12);
1272 bfd_put_32 (sec
->owner
, BRA
+ ((to
<< 5) & 0x007fff80),
1273 sec
->contents
+ sec
->size
+ 12);
1275 else if (htab
->params
->ovly_flavour
== ovly_normal
1276 && htab
->params
->compact_stub
)
1279 bfd_put_32 (sec
->owner
, BRSL
+ (((to
- from
) << 5) & 0x007fff80) + 75,
1280 sec
->contents
+ sec
->size
);
1282 bfd_put_32 (sec
->owner
, BRASL
+ ((to
<< 5) & 0x007fff80) + 75,
1283 sec
->contents
+ sec
->size
);
1284 bfd_put_32 (sec
->owner
, (dest
& 0x3ffff) | (dest_ovl
<< 18),
1285 sec
->contents
+ sec
->size
+ 4);
1287 else if (htab
->params
->ovly_flavour
== ovly_soft_icache
1288 && htab
->params
->compact_stub
)
1291 if (stub_type
== nonovl_stub
)
1293 else if (stub_type
== call_ovl_stub
)
1294 /* A brsl makes lr live and *(*sp+16) is live.
1295 Tail calls have the same liveness. */
1297 else if (!htab
->params
->lrlive_analysis
)
1298 /* Assume stack frame and lr save. */
1300 else if (irela
!= NULL
)
1302 /* Analyse branch instructions. */
1303 struct function_info
*caller
;
1306 caller
= find_function (isec
, irela
->r_offset
, info
);
1307 if (caller
->start
== NULL
)
1308 off
= irela
->r_offset
;
1311 struct function_info
*found
= NULL
;
1313 /* Find the earliest piece of this function that
1314 has frame adjusting instructions. We might
1315 see dynamic frame adjustment (eg. for alloca)
1316 in some later piece, but functions using
1317 alloca always set up a frame earlier. Frame
1318 setup instructions are always in one piece. */
1319 if (caller
->lr_store
!= (bfd_vma
) -1
1320 || caller
->sp_adjust
!= (bfd_vma
) -1)
1322 while (caller
->start
!= NULL
)
1324 caller
= caller
->start
;
1325 if (caller
->lr_store
!= (bfd_vma
) -1
1326 || caller
->sp_adjust
!= (bfd_vma
) -1)
1334 if (off
> caller
->sp_adjust
)
1336 if (off
> caller
->lr_store
)
1337 /* Only *(*sp+16) is live. */
1340 /* If no lr save, then we must be in a
1341 leaf function with a frame.
1342 lr is still live. */
1345 else if (off
> caller
->lr_store
)
1347 /* Between lr save and stack adjust. */
1349 /* This should never happen since prologues won't
1354 /* On entry to function. */
1357 if (stub_type
!= br000_ovl_stub
1358 && lrlive
!= stub_type
- br000_ovl_stub
)
1359 info
->callbacks
->einfo (_("%A:0x%v lrlive .brinfo (%u) differs "
1360 "from analysis (%u)\n"),
1361 isec
, irela
->r_offset
, lrlive
,
1362 stub_type
- br000_ovl_stub
);
1365 /* If given lrlive info via .brinfo, use it. */
1366 if (stub_type
> br000_ovl_stub
)
1367 lrlive
= stub_type
- br000_ovl_stub
;
1370 to
= (htab
->ovly_entry
[1]->root
.u
.def
.value
1371 + htab
->ovly_entry
[1]->root
.u
.def
.section
->output_offset
1372 + htab
->ovly_entry
[1]->root
.u
.def
.section
->output_section
->vma
);
1374 /* The branch that uses this stub goes to stub_addr + 4. We'll
1375 set up an xor pattern that can be used by the icache manager
1376 to modify this branch to go directly to its destination. */
1378 br_dest
= g
->stub_addr
;
1381 /* Except in the case of _SPUEAR_ stubs, the branch in
1382 question is the one in the stub itself. */
1383 BFD_ASSERT (stub_type
== nonovl_stub
);
1384 g
->br_addr
= g
->stub_addr
;
1388 set_id
= ((dest_ovl
- 1) >> htab
->num_lines_log2
) + 1;
1389 bfd_put_32 (sec
->owner
, (set_id
<< 18) | (dest
& 0x3ffff),
1390 sec
->contents
+ sec
->size
);
1391 bfd_put_32 (sec
->owner
, BRASL
+ ((to
<< 5) & 0x007fff80) + 75,
1392 sec
->contents
+ sec
->size
+ 4);
1393 bfd_put_32 (sec
->owner
, (lrlive
<< 29) | (g
->br_addr
& 0x3ffff),
1394 sec
->contents
+ sec
->size
+ 8);
1395 patt
= dest
^ br_dest
;
1396 if (irela
!= NULL
&& ELF32_R_TYPE (irela
->r_info
) == R_SPU_REL16
)
1397 patt
= (dest
- g
->br_addr
) ^ (br_dest
- g
->br_addr
);
1398 bfd_put_32 (sec
->owner
, (patt
<< 5) & 0x007fff80,
1399 sec
->contents
+ sec
->size
+ 12);
1402 /* Extra space for linked list entries. */
1408 sec
->size
+= ovl_stub_size (htab
->params
);
1410 if (htab
->params
->emit_stub_syms
)
1416 len
= 8 + sizeof (".ovl_call.") - 1;
1418 len
+= strlen (h
->root
.root
.string
);
1423 add
= (int) irela
->r_addend
& 0xffffffff;
1426 name
= bfd_malloc (len
+ 1);
1430 sprintf (name
, "%08x.ovl_call.", g
->ovl
);
1432 strcpy (name
+ 8 + sizeof (".ovl_call.") - 1, h
->root
.root
.string
);
1434 sprintf (name
+ 8 + sizeof (".ovl_call.") - 1, "%x:%x",
1435 dest_sec
->id
& 0xffffffff,
1436 (int) ELF32_R_SYM (irela
->r_info
) & 0xffffffff);
1438 sprintf (name
+ len
- 9, "+%x", add
);
1440 h
= elf_link_hash_lookup (&htab
->elf
, name
, TRUE
, TRUE
, FALSE
);
1444 if (h
->root
.type
== bfd_link_hash_new
)
1446 h
->root
.type
= bfd_link_hash_defined
;
1447 h
->root
.u
.def
.section
= sec
;
1448 h
->size
= ovl_stub_size (htab
->params
);
1449 h
->root
.u
.def
.value
= sec
->size
- h
->size
;
1453 h
->ref_regular_nonweak
= 1;
1454 h
->forced_local
= 1;
1462 /* Called via elf_link_hash_traverse to allocate stubs for any _SPUEAR_
1466 allocate_spuear_stubs (struct elf_link_hash_entry
*h
, void *inf
)
1468 /* Symbols starting with _SPUEAR_ need a stub because they may be
1469 invoked by the PPU. */
1470 struct bfd_link_info
*info
= inf
;
1471 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1474 if ((h
->root
.type
== bfd_link_hash_defined
1475 || h
->root
.type
== bfd_link_hash_defweak
)
1477 && strncmp (h
->root
.root
.string
, "_SPUEAR_", 8) == 0
1478 && (sym_sec
= h
->root
.u
.def
.section
) != NULL
1479 && sym_sec
->output_section
!= bfd_abs_section_ptr
1480 && spu_elf_section_data (sym_sec
->output_section
) != NULL
1481 && (spu_elf_section_data (sym_sec
->output_section
)->u
.o
.ovl_index
!= 0
1482 || htab
->params
->non_overlay_stubs
))
1484 return count_stub (htab
, NULL
, NULL
, nonovl_stub
, h
, NULL
);
1491 build_spuear_stubs (struct elf_link_hash_entry
*h
, void *inf
)
1493 /* Symbols starting with _SPUEAR_ need a stub because they may be
1494 invoked by the PPU. */
1495 struct bfd_link_info
*info
= inf
;
1496 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1499 if ((h
->root
.type
== bfd_link_hash_defined
1500 || h
->root
.type
== bfd_link_hash_defweak
)
1502 && strncmp (h
->root
.root
.string
, "_SPUEAR_", 8) == 0
1503 && (sym_sec
= h
->root
.u
.def
.section
) != NULL
1504 && sym_sec
->output_section
!= bfd_abs_section_ptr
1505 && spu_elf_section_data (sym_sec
->output_section
) != NULL
1506 && (spu_elf_section_data (sym_sec
->output_section
)->u
.o
.ovl_index
!= 0
1507 || htab
->params
->non_overlay_stubs
))
1509 return build_stub (info
, NULL
, NULL
, nonovl_stub
, h
, NULL
,
1510 h
->root
.u
.def
.value
, sym_sec
);
1516 /* Size or build stubs. */
1519 process_stubs (struct bfd_link_info
*info
, bfd_boolean build
)
1521 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1524 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
1526 extern const bfd_target bfd_elf32_spu_vec
;
1527 Elf_Internal_Shdr
*symtab_hdr
;
1529 Elf_Internal_Sym
*local_syms
= NULL
;
1531 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
1534 /* We'll need the symbol table in a second. */
1535 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
1536 if (symtab_hdr
->sh_info
== 0)
1539 /* Walk over each section attached to the input bfd. */
1540 for (isec
= ibfd
->sections
; isec
!= NULL
; isec
= isec
->next
)
1542 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
1544 /* If there aren't any relocs, then there's nothing more to do. */
1545 if ((isec
->flags
& SEC_RELOC
) == 0
1546 || isec
->reloc_count
== 0)
1549 if (!maybe_needs_stubs (isec
))
1552 /* Get the relocs. */
1553 internal_relocs
= _bfd_elf_link_read_relocs (ibfd
, isec
, NULL
, NULL
,
1555 if (internal_relocs
== NULL
)
1556 goto error_ret_free_local
;
1558 /* Now examine each relocation. */
1559 irela
= internal_relocs
;
1560 irelaend
= irela
+ isec
->reloc_count
;
1561 for (; irela
< irelaend
; irela
++)
1563 enum elf_spu_reloc_type r_type
;
1564 unsigned int r_indx
;
1566 Elf_Internal_Sym
*sym
;
1567 struct elf_link_hash_entry
*h
;
1568 enum _stub_type stub_type
;
1570 r_type
= ELF32_R_TYPE (irela
->r_info
);
1571 r_indx
= ELF32_R_SYM (irela
->r_info
);
1573 if (r_type
>= R_SPU_max
)
1575 bfd_set_error (bfd_error_bad_value
);
1576 error_ret_free_internal
:
1577 if (elf_section_data (isec
)->relocs
!= internal_relocs
)
1578 free (internal_relocs
);
1579 error_ret_free_local
:
1580 if (local_syms
!= NULL
1581 && (symtab_hdr
->contents
1582 != (unsigned char *) local_syms
))
1587 /* Determine the reloc target section. */
1588 if (!get_sym_h (&h
, &sym
, &sym_sec
, &local_syms
, r_indx
, ibfd
))
1589 goto error_ret_free_internal
;
1591 stub_type
= needs_ovl_stub (h
, sym
, sym_sec
, isec
, irela
,
1593 if (stub_type
== no_stub
)
1595 else if (stub_type
== stub_error
)
1596 goto error_ret_free_internal
;
1598 if (htab
->stub_count
== NULL
)
1601 amt
= (htab
->num_overlays
+ 1) * sizeof (*htab
->stub_count
);
1602 htab
->stub_count
= bfd_zmalloc (amt
);
1603 if (htab
->stub_count
== NULL
)
1604 goto error_ret_free_internal
;
1609 if (!count_stub (htab
, ibfd
, isec
, stub_type
, h
, irela
))
1610 goto error_ret_free_internal
;
1617 dest
= h
->root
.u
.def
.value
;
1619 dest
= sym
->st_value
;
1620 dest
+= irela
->r_addend
;
1621 if (!build_stub (info
, ibfd
, isec
, stub_type
, h
, irela
,
1623 goto error_ret_free_internal
;
1627 /* We're done with the internal relocs, free them. */
1628 if (elf_section_data (isec
)->relocs
!= internal_relocs
)
1629 free (internal_relocs
);
1632 if (local_syms
!= NULL
1633 && symtab_hdr
->contents
!= (unsigned char *) local_syms
)
1635 if (!info
->keep_memory
)
1638 symtab_hdr
->contents
= (unsigned char *) local_syms
;
1645 /* Allocate space for overlay call and return stubs.
1646 Return 0 on error, 1 if no overlays, 2 otherwise. */
1649 spu_elf_size_stubs (struct bfd_link_info
*info
)
1651 struct spu_link_hash_table
*htab
;
1658 if (!process_stubs (info
, FALSE
))
1661 htab
= spu_hash_table (info
);
1662 elf_link_hash_traverse (&htab
->elf
, allocate_spuear_stubs
, info
);
1666 ibfd
= info
->input_bfds
;
1667 if (htab
->stub_count
!= NULL
)
1669 amt
= (htab
->num_overlays
+ 1) * sizeof (*htab
->stub_sec
);
1670 htab
->stub_sec
= bfd_zmalloc (amt
);
1671 if (htab
->stub_sec
== NULL
)
1674 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_READONLY
1675 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
);
1676 stub
= bfd_make_section_anyway_with_flags (ibfd
, ".stub", flags
);
1677 htab
->stub_sec
[0] = stub
;
1679 || !bfd_set_section_alignment (ibfd
, stub
,
1680 ovl_stub_size_log2 (htab
->params
)))
1682 stub
->size
= htab
->stub_count
[0] * ovl_stub_size (htab
->params
);
1683 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1684 /* Extra space for linked list entries. */
1685 stub
->size
+= htab
->stub_count
[0] * 16;
1687 for (i
= 0; i
< htab
->num_overlays
; ++i
)
1689 asection
*osec
= htab
->ovl_sec
[i
];
1690 unsigned int ovl
= spu_elf_section_data (osec
)->u
.o
.ovl_index
;
1691 stub
= bfd_make_section_anyway_with_flags (ibfd
, ".stub", flags
);
1692 htab
->stub_sec
[ovl
] = stub
;
1694 || !bfd_set_section_alignment (ibfd
, stub
,
1695 ovl_stub_size_log2 (htab
->params
)))
1697 stub
->size
= htab
->stub_count
[ovl
] * ovl_stub_size (htab
->params
);
1701 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1703 /* Space for icache manager tables.
1704 a) Tag array, one quadword per cache line.
1705 b) Rewrite "to" list, one quadword per cache line.
1706 c) Rewrite "from" list, one byte per outgoing branch (rounded up to
1707 a power-of-two number of full quadwords) per cache line. */
1710 htab
->ovtab
= bfd_make_section_anyway_with_flags (ibfd
, ".ovtab", flags
);
1711 if (htab
->ovtab
== NULL
1712 || !bfd_set_section_alignment (ibfd
, htab
->ovtab
, 4))
1715 htab
->ovtab
->size
= (16 + 16 + (16 << htab
->fromelem_size_log2
))
1716 << htab
->num_lines_log2
;
1718 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
;
1719 htab
->init
= bfd_make_section_anyway_with_flags (ibfd
, ".ovini", flags
);
1720 if (htab
->init
== NULL
1721 || !bfd_set_section_alignment (ibfd
, htab
->init
, 4))
1724 htab
->init
->size
= 16;
1726 else if (htab
->stub_count
== NULL
)
1730 /* htab->ovtab consists of two arrays.
1740 . } _ovly_buf_table[];
1743 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
;
1744 htab
->ovtab
= bfd_make_section_anyway_with_flags (ibfd
, ".ovtab", flags
);
1745 if (htab
->ovtab
== NULL
1746 || !bfd_set_section_alignment (ibfd
, htab
->ovtab
, 4))
1749 htab
->ovtab
->size
= htab
->num_overlays
* 16 + 16 + htab
->num_buf
* 4;
1752 htab
->toe
= bfd_make_section_anyway_with_flags (ibfd
, ".toe", SEC_ALLOC
);
1753 if (htab
->toe
== NULL
1754 || !bfd_set_section_alignment (ibfd
, htab
->toe
, 4))
1756 htab
->toe
->size
= 16;
1761 /* Called from ld to place overlay manager data sections. This is done
1762 after the overlay manager itself is loaded, mainly so that the
1763 linker's htab->init section is placed after any other .ovl.init
1767 spu_elf_place_overlay_data (struct bfd_link_info
*info
)
1769 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1772 if (htab
->stub_sec
!= NULL
)
1774 (*htab
->params
->place_spu_section
) (htab
->stub_sec
[0], NULL
, ".text");
1776 for (i
= 0; i
< htab
->num_overlays
; ++i
)
1778 asection
*osec
= htab
->ovl_sec
[i
];
1779 unsigned int ovl
= spu_elf_section_data (osec
)->u
.o
.ovl_index
;
1780 (*htab
->params
->place_spu_section
) (htab
->stub_sec
[ovl
], osec
, NULL
);
1784 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1785 (*htab
->params
->place_spu_section
) (htab
->init
, NULL
, ".ovl.init");
1787 if (htab
->ovtab
!= NULL
)
1789 const char *ovout
= ".data";
1790 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1792 (*htab
->params
->place_spu_section
) (htab
->ovtab
, NULL
, ovout
);
1795 if (htab
->toe
!= NULL
)
1796 (*htab
->params
->place_spu_section
) (htab
->toe
, NULL
, ".toe");
1799 /* Functions to handle embedded spu_ovl.o object. */
1802 ovl_mgr_open (struct bfd
*nbfd ATTRIBUTE_UNUSED
, void *stream
)
1808 ovl_mgr_pread (struct bfd
*abfd ATTRIBUTE_UNUSED
,
1814 struct _ovl_stream
*os
;
1818 os
= (struct _ovl_stream
*) stream
;
1819 max
= (const char *) os
->end
- (const char *) os
->start
;
1821 if ((ufile_ptr
) offset
>= max
)
1825 if (count
> max
- offset
)
1826 count
= max
- offset
;
1828 memcpy (buf
, (const char *) os
->start
+ offset
, count
);
1833 spu_elf_open_builtin_lib (bfd
**ovl_bfd
, const struct _ovl_stream
*stream
)
1835 *ovl_bfd
= bfd_openr_iovec ("builtin ovl_mgr",
1842 return *ovl_bfd
!= NULL
;
1846 overlay_index (asection
*sec
)
1849 || sec
->output_section
== bfd_abs_section_ptr
)
1851 return spu_elf_section_data (sec
->output_section
)->u
.o
.ovl_index
;
1854 /* Define an STT_OBJECT symbol. */
1856 static struct elf_link_hash_entry
*
1857 define_ovtab_symbol (struct spu_link_hash_table
*htab
, const char *name
)
1859 struct elf_link_hash_entry
*h
;
1861 h
= elf_link_hash_lookup (&htab
->elf
, name
, TRUE
, FALSE
, FALSE
);
1865 if (h
->root
.type
!= bfd_link_hash_defined
1868 h
->root
.type
= bfd_link_hash_defined
;
1869 h
->root
.u
.def
.section
= htab
->ovtab
;
1870 h
->type
= STT_OBJECT
;
1873 h
->ref_regular_nonweak
= 1;
1876 else if (h
->root
.u
.def
.section
->owner
!= NULL
)
1878 (*_bfd_error_handler
) (_("%B is not allowed to define %s"),
1879 h
->root
.u
.def
.section
->owner
,
1880 h
->root
.root
.string
);
1881 bfd_set_error (bfd_error_bad_value
);
1886 (*_bfd_error_handler
) (_("you are not allowed to define %s in a script"),
1887 h
->root
.root
.string
);
1888 bfd_set_error (bfd_error_bad_value
);
1895 /* Fill in all stubs and the overlay tables. */
1898 spu_elf_build_stubs (struct bfd_link_info
*info
)
1900 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1901 struct elf_link_hash_entry
*h
;
1907 if (htab
->num_overlays
!= 0)
1909 for (i
= 0; i
< 2; i
++)
1911 h
= htab
->ovly_entry
[i
];
1913 && (h
->root
.type
== bfd_link_hash_defined
1914 || h
->root
.type
== bfd_link_hash_defweak
)
1917 s
= h
->root
.u
.def
.section
->output_section
;
1918 if (spu_elf_section_data (s
)->u
.o
.ovl_index
)
1920 (*_bfd_error_handler
) (_("%s in overlay section"),
1921 h
->root
.root
.string
);
1922 bfd_set_error (bfd_error_bad_value
);
1929 if (htab
->stub_sec
!= NULL
)
1931 for (i
= 0; i
<= htab
->num_overlays
; i
++)
1932 if (htab
->stub_sec
[i
]->size
!= 0)
1934 htab
->stub_sec
[i
]->contents
= bfd_zalloc (htab
->stub_sec
[i
]->owner
,
1935 htab
->stub_sec
[i
]->size
);
1936 if (htab
->stub_sec
[i
]->contents
== NULL
)
1938 htab
->stub_sec
[i
]->rawsize
= htab
->stub_sec
[i
]->size
;
1939 htab
->stub_sec
[i
]->size
= 0;
1942 /* Fill in all the stubs. */
1943 process_stubs (info
, TRUE
);
1944 if (!htab
->stub_err
)
1945 elf_link_hash_traverse (&htab
->elf
, build_spuear_stubs
, info
);
1949 (*_bfd_error_handler
) (_("overlay stub relocation overflow"));
1950 bfd_set_error (bfd_error_bad_value
);
1954 for (i
= 0; i
<= htab
->num_overlays
; i
++)
1956 if (htab
->stub_sec
[i
]->size
!= htab
->stub_sec
[i
]->rawsize
)
1958 (*_bfd_error_handler
) (_("stubs don't match calculated size"));
1959 bfd_set_error (bfd_error_bad_value
);
1962 htab
->stub_sec
[i
]->rawsize
= 0;
1966 if (htab
->ovtab
== NULL
|| htab
->ovtab
->size
== 0)
1969 htab
->ovtab
->contents
= bfd_zalloc (htab
->ovtab
->owner
, htab
->ovtab
->size
);
1970 if (htab
->ovtab
->contents
== NULL
)
1973 p
= htab
->ovtab
->contents
;
1974 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1978 h
= define_ovtab_symbol (htab
, "__icache_tag_array");
1981 h
->root
.u
.def
.value
= 0;
1982 h
->size
= 16 << htab
->num_lines_log2
;
1985 h
= define_ovtab_symbol (htab
, "__icache_tag_array_size");
1988 h
->root
.u
.def
.value
= 16 << htab
->num_lines_log2
;
1989 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
1991 h
= define_ovtab_symbol (htab
, "__icache_rewrite_to");
1994 h
->root
.u
.def
.value
= off
;
1995 h
->size
= 16 << htab
->num_lines_log2
;
1998 h
= define_ovtab_symbol (htab
, "__icache_rewrite_to_size");
2001 h
->root
.u
.def
.value
= 16 << htab
->num_lines_log2
;
2002 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2004 h
= define_ovtab_symbol (htab
, "__icache_rewrite_from");
2007 h
->root
.u
.def
.value
= off
;
2008 h
->size
= 16 << (htab
->fromelem_size_log2
+ htab
->num_lines_log2
);
2011 h
= define_ovtab_symbol (htab
, "__icache_rewrite_from_size");
2014 h
->root
.u
.def
.value
= 16 << (htab
->fromelem_size_log2
2015 + htab
->num_lines_log2
);
2016 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2018 h
= define_ovtab_symbol (htab
, "__icache_log2_fromelemsize");
2021 h
->root
.u
.def
.value
= htab
->fromelem_size_log2
;
2022 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2024 h
= define_ovtab_symbol (htab
, "__icache_base");
2027 h
->root
.u
.def
.value
= htab
->ovl_sec
[0]->vma
;
2028 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2029 h
->size
= htab
->num_buf
<< htab
->line_size_log2
;
2031 h
= define_ovtab_symbol (htab
, "__icache_linesize");
2034 h
->root
.u
.def
.value
= 1 << htab
->line_size_log2
;
2035 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2037 h
= define_ovtab_symbol (htab
, "__icache_log2_linesize");
2040 h
->root
.u
.def
.value
= htab
->line_size_log2
;
2041 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2043 h
= define_ovtab_symbol (htab
, "__icache_neg_log2_linesize");
2046 h
->root
.u
.def
.value
= -htab
->line_size_log2
;
2047 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2049 h
= define_ovtab_symbol (htab
, "__icache_cachesize");
2052 h
->root
.u
.def
.value
= 1 << (htab
->num_lines_log2
+ htab
->line_size_log2
);
2053 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2055 h
= define_ovtab_symbol (htab
, "__icache_log2_cachesize");
2058 h
->root
.u
.def
.value
= htab
->num_lines_log2
+ htab
->line_size_log2
;
2059 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2061 h
= define_ovtab_symbol (htab
, "__icache_neg_log2_cachesize");
2064 h
->root
.u
.def
.value
= -(htab
->num_lines_log2
+ htab
->line_size_log2
);
2065 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2067 if (htab
->init
!= NULL
&& htab
->init
->size
!= 0)
2069 htab
->init
->contents
= bfd_zalloc (htab
->init
->owner
,
2071 if (htab
->init
->contents
== NULL
)
2074 h
= define_ovtab_symbol (htab
, "__icache_fileoff");
2077 h
->root
.u
.def
.value
= 0;
2078 h
->root
.u
.def
.section
= htab
->init
;
2084 /* Write out _ovly_table. */
2085 /* set low bit of .size to mark non-overlay area as present. */
2087 obfd
= htab
->ovtab
->output_section
->owner
;
2088 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
2090 unsigned int ovl_index
= spu_elf_section_data (s
)->u
.o
.ovl_index
;
2094 unsigned long off
= ovl_index
* 16;
2095 unsigned int ovl_buf
= spu_elf_section_data (s
)->u
.o
.ovl_buf
;
2097 bfd_put_32 (htab
->ovtab
->owner
, s
->vma
, p
+ off
);
2098 bfd_put_32 (htab
->ovtab
->owner
, (s
->size
+ 15) & -16,
2100 /* file_off written later in spu_elf_modify_program_headers. */
2101 bfd_put_32 (htab
->ovtab
->owner
, ovl_buf
, p
+ off
+ 12);
2105 h
= define_ovtab_symbol (htab
, "_ovly_table");
2108 h
->root
.u
.def
.value
= 16;
2109 h
->size
= htab
->num_overlays
* 16;
2111 h
= define_ovtab_symbol (htab
, "_ovly_table_end");
2114 h
->root
.u
.def
.value
= htab
->num_overlays
* 16 + 16;
2117 h
= define_ovtab_symbol (htab
, "_ovly_buf_table");
2120 h
->root
.u
.def
.value
= htab
->num_overlays
* 16 + 16;
2121 h
->size
= htab
->num_buf
* 4;
2123 h
= define_ovtab_symbol (htab
, "_ovly_buf_table_end");
2126 h
->root
.u
.def
.value
= htab
->num_overlays
* 16 + 16 + htab
->num_buf
* 4;
2130 h
= define_ovtab_symbol (htab
, "_EAR_");
2133 h
->root
.u
.def
.section
= htab
->toe
;
2134 h
->root
.u
.def
.value
= 0;
2140 /* Check that all loadable section VMAs lie in the range
2141 LO .. HI inclusive, and stash some parameters for --auto-overlay. */
2144 spu_elf_check_vma (struct bfd_link_info
*info
)
2146 struct elf_segment_map
*m
;
2148 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
2149 bfd
*abfd
= info
->output_bfd
;
2150 bfd_vma hi
= htab
->params
->local_store_hi
;
2151 bfd_vma lo
= htab
->params
->local_store_lo
;
2153 htab
->local_store
= hi
+ 1 - lo
;
2155 for (m
= elf_seg_map (abfd
); m
!= NULL
; m
= m
->next
)
2156 if (m
->p_type
== PT_LOAD
)
2157 for (i
= 0; i
< m
->count
; i
++)
2158 if (m
->sections
[i
]->size
!= 0
2159 && (m
->sections
[i
]->vma
< lo
2160 || m
->sections
[i
]->vma
> hi
2161 || m
->sections
[i
]->vma
+ m
->sections
[i
]->size
- 1 > hi
))
2162 return m
->sections
[i
];
2167 /* OFFSET in SEC (presumably) is the beginning of a function prologue.
2168 Search for stack adjusting insns, and return the sp delta.
2169 If a store of lr is found save the instruction offset to *LR_STORE.
2170 If a stack adjusting instruction is found, save that offset to
2174 find_function_stack_adjust (asection
*sec
,
2181 memset (reg
, 0, sizeof (reg
));
2182 for ( ; offset
+ 4 <= sec
->size
; offset
+= 4)
2184 unsigned char buf
[4];
2188 /* Assume no relocs on stack adjusing insns. */
2189 if (!bfd_get_section_contents (sec
->owner
, sec
, buf
, offset
, 4))
2193 ra
= ((buf
[2] & 0x3f) << 1) | (buf
[3] >> 7);
2195 if (buf
[0] == 0x24 /* stqd */)
2197 if (rt
== 0 /* lr */ && ra
== 1 /* sp */)
2202 /* Partly decoded immediate field. */
2203 imm
= (buf
[1] << 9) | (buf
[2] << 1) | (buf
[3] >> 7);
2205 if (buf
[0] == 0x1c /* ai */)
2208 imm
= (imm
^ 0x200) - 0x200;
2209 reg
[rt
] = reg
[ra
] + imm
;
2211 if (rt
== 1 /* sp */)
2215 *sp_adjust
= offset
;
2219 else if (buf
[0] == 0x18 && (buf
[1] & 0xe0) == 0 /* a */)
2221 int rb
= ((buf
[1] & 0x1f) << 2) | ((buf
[2] & 0xc0) >> 6);
2223 reg
[rt
] = reg
[ra
] + reg
[rb
];
2228 *sp_adjust
= offset
;
2232 else if (buf
[0] == 0x08 && (buf
[1] & 0xe0) == 0 /* sf */)
2234 int rb
= ((buf
[1] & 0x1f) << 2) | ((buf
[2] & 0xc0) >> 6);
2236 reg
[rt
] = reg
[rb
] - reg
[ra
];
2241 *sp_adjust
= offset
;
2245 else if ((buf
[0] & 0xfc) == 0x40 /* il, ilh, ilhu, ila */)
2247 if (buf
[0] >= 0x42 /* ila */)
2248 imm
|= (buf
[0] & 1) << 17;
2253 if (buf
[0] == 0x40 /* il */)
2255 if ((buf
[1] & 0x80) == 0)
2257 imm
= (imm
^ 0x8000) - 0x8000;
2259 else if ((buf
[1] & 0x80) == 0 /* ilhu */)
2265 else if (buf
[0] == 0x60 && (buf
[1] & 0x80) != 0 /* iohl */)
2267 reg
[rt
] |= imm
& 0xffff;
2270 else if (buf
[0] == 0x04 /* ori */)
2273 imm
= (imm
^ 0x200) - 0x200;
2274 reg
[rt
] = reg
[ra
] | imm
;
2277 else if (buf
[0] == 0x32 && (buf
[1] & 0x80) != 0 /* fsmbi */)
2279 reg
[rt
] = ( ((imm
& 0x8000) ? 0xff000000 : 0)
2280 | ((imm
& 0x4000) ? 0x00ff0000 : 0)
2281 | ((imm
& 0x2000) ? 0x0000ff00 : 0)
2282 | ((imm
& 0x1000) ? 0x000000ff : 0));
2285 else if (buf
[0] == 0x16 /* andbi */)
2291 reg
[rt
] = reg
[ra
] & imm
;
2294 else if (buf
[0] == 0x33 && imm
== 1 /* brsl .+4 */)
2296 /* Used in pic reg load. Say rt is trashed. Won't be used
2297 in stack adjust, but we need to continue past this branch. */
2301 else if (is_branch (buf
) || is_indirect_branch (buf
))
2302 /* If we hit a branch then we must be out of the prologue. */
2309 /* qsort predicate to sort symbols by section and value. */
2311 static Elf_Internal_Sym
*sort_syms_syms
;
2312 static asection
**sort_syms_psecs
;
2315 sort_syms (const void *a
, const void *b
)
2317 Elf_Internal_Sym
*const *s1
= a
;
2318 Elf_Internal_Sym
*const *s2
= b
;
2319 asection
*sec1
,*sec2
;
2320 bfd_signed_vma delta
;
2322 sec1
= sort_syms_psecs
[*s1
- sort_syms_syms
];
2323 sec2
= sort_syms_psecs
[*s2
- sort_syms_syms
];
2326 return sec1
->index
- sec2
->index
;
2328 delta
= (*s1
)->st_value
- (*s2
)->st_value
;
2330 return delta
< 0 ? -1 : 1;
2332 delta
= (*s2
)->st_size
- (*s1
)->st_size
;
2334 return delta
< 0 ? -1 : 1;
2336 return *s1
< *s2
? -1 : 1;
2339 /* Allocate a struct spu_elf_stack_info with MAX_FUN struct function_info
2340 entries for section SEC. */
2342 static struct spu_elf_stack_info
*
2343 alloc_stack_info (asection
*sec
, int max_fun
)
2345 struct _spu_elf_section_data
*sec_data
= spu_elf_section_data (sec
);
2348 amt
= sizeof (struct spu_elf_stack_info
);
2349 amt
+= (max_fun
- 1) * sizeof (struct function_info
);
2350 sec_data
->u
.i
.stack_info
= bfd_zmalloc (amt
);
2351 if (sec_data
->u
.i
.stack_info
!= NULL
)
2352 sec_data
->u
.i
.stack_info
->max_fun
= max_fun
;
2353 return sec_data
->u
.i
.stack_info
;
2356 /* Add a new struct function_info describing a (part of a) function
2357 starting at SYM_H. Keep the array sorted by address. */
2359 static struct function_info
*
2360 maybe_insert_function (asection
*sec
,
2363 bfd_boolean is_func
)
2365 struct _spu_elf_section_data
*sec_data
= spu_elf_section_data (sec
);
2366 struct spu_elf_stack_info
*sinfo
= sec_data
->u
.i
.stack_info
;
2372 sinfo
= alloc_stack_info (sec
, 20);
2379 Elf_Internal_Sym
*sym
= sym_h
;
2380 off
= sym
->st_value
;
2381 size
= sym
->st_size
;
2385 struct elf_link_hash_entry
*h
= sym_h
;
2386 off
= h
->root
.u
.def
.value
;
2390 for (i
= sinfo
->num_fun
; --i
>= 0; )
2391 if (sinfo
->fun
[i
].lo
<= off
)
2396 /* Don't add another entry for an alias, but do update some
2398 if (sinfo
->fun
[i
].lo
== off
)
2400 /* Prefer globals over local syms. */
2401 if (global
&& !sinfo
->fun
[i
].global
)
2403 sinfo
->fun
[i
].global
= TRUE
;
2404 sinfo
->fun
[i
].u
.h
= sym_h
;
2407 sinfo
->fun
[i
].is_func
= TRUE
;
2408 return &sinfo
->fun
[i
];
2410 /* Ignore a zero-size symbol inside an existing function. */
2411 else if (sinfo
->fun
[i
].hi
> off
&& size
== 0)
2412 return &sinfo
->fun
[i
];
2415 if (sinfo
->num_fun
>= sinfo
->max_fun
)
2417 bfd_size_type amt
= sizeof (struct spu_elf_stack_info
);
2418 bfd_size_type old
= amt
;
2420 old
+= (sinfo
->max_fun
- 1) * sizeof (struct function_info
);
2421 sinfo
->max_fun
+= 20 + (sinfo
->max_fun
>> 1);
2422 amt
+= (sinfo
->max_fun
- 1) * sizeof (struct function_info
);
2423 sinfo
= bfd_realloc (sinfo
, amt
);
2426 memset ((char *) sinfo
+ old
, 0, amt
- old
);
2427 sec_data
->u
.i
.stack_info
= sinfo
;
2430 if (++i
< sinfo
->num_fun
)
2431 memmove (&sinfo
->fun
[i
+ 1], &sinfo
->fun
[i
],
2432 (sinfo
->num_fun
- i
) * sizeof (sinfo
->fun
[i
]));
2433 sinfo
->fun
[i
].is_func
= is_func
;
2434 sinfo
->fun
[i
].global
= global
;
2435 sinfo
->fun
[i
].sec
= sec
;
2437 sinfo
->fun
[i
].u
.h
= sym_h
;
2439 sinfo
->fun
[i
].u
.sym
= sym_h
;
2440 sinfo
->fun
[i
].lo
= off
;
2441 sinfo
->fun
[i
].hi
= off
+ size
;
2442 sinfo
->fun
[i
].lr_store
= -1;
2443 sinfo
->fun
[i
].sp_adjust
= -1;
2444 sinfo
->fun
[i
].stack
= -find_function_stack_adjust (sec
, off
,
2445 &sinfo
->fun
[i
].lr_store
,
2446 &sinfo
->fun
[i
].sp_adjust
);
2447 sinfo
->num_fun
+= 1;
2448 return &sinfo
->fun
[i
];
2451 /* Return the name of FUN. */
2454 func_name (struct function_info
*fun
)
2458 Elf_Internal_Shdr
*symtab_hdr
;
2460 while (fun
->start
!= NULL
)
2464 return fun
->u
.h
->root
.root
.string
;
2467 if (fun
->u
.sym
->st_name
== 0)
2469 size_t len
= strlen (sec
->name
);
2470 char *name
= bfd_malloc (len
+ 10);
2473 sprintf (name
, "%s+%lx", sec
->name
,
2474 (unsigned long) fun
->u
.sym
->st_value
& 0xffffffff);
2478 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
2479 return bfd_elf_sym_name (ibfd
, symtab_hdr
, fun
->u
.sym
, sec
);
2482 /* Read the instruction at OFF in SEC. Return true iff the instruction
2483 is a nop, lnop, or stop 0 (all zero insn). */
2486 is_nop (asection
*sec
, bfd_vma off
)
2488 unsigned char insn
[4];
2490 if (off
+ 4 > sec
->size
2491 || !bfd_get_section_contents (sec
->owner
, sec
, insn
, off
, 4))
2493 if ((insn
[0] & 0xbf) == 0 && (insn
[1] & 0xe0) == 0x20)
2495 if (insn
[0] == 0 && insn
[1] == 0 && insn
[2] == 0 && insn
[3] == 0)
2500 /* Extend the range of FUN to cover nop padding up to LIMIT.
2501 Return TRUE iff some instruction other than a NOP was found. */
2504 insns_at_end (struct function_info
*fun
, bfd_vma limit
)
2506 bfd_vma off
= (fun
->hi
+ 3) & -4;
2508 while (off
< limit
&& is_nop (fun
->sec
, off
))
2519 /* Check and fix overlapping function ranges. Return TRUE iff there
2520 are gaps in the current info we have about functions in SEC. */
2523 check_function_ranges (asection
*sec
, struct bfd_link_info
*info
)
2525 struct _spu_elf_section_data
*sec_data
= spu_elf_section_data (sec
);
2526 struct spu_elf_stack_info
*sinfo
= sec_data
->u
.i
.stack_info
;
2528 bfd_boolean gaps
= FALSE
;
2533 for (i
= 1; i
< sinfo
->num_fun
; i
++)
2534 if (sinfo
->fun
[i
- 1].hi
> sinfo
->fun
[i
].lo
)
2536 /* Fix overlapping symbols. */
2537 const char *f1
= func_name (&sinfo
->fun
[i
- 1]);
2538 const char *f2
= func_name (&sinfo
->fun
[i
]);
2540 info
->callbacks
->einfo (_("warning: %s overlaps %s\n"), f1
, f2
);
2541 sinfo
->fun
[i
- 1].hi
= sinfo
->fun
[i
].lo
;
2543 else if (insns_at_end (&sinfo
->fun
[i
- 1], sinfo
->fun
[i
].lo
))
2546 if (sinfo
->num_fun
== 0)
2550 if (sinfo
->fun
[0].lo
!= 0)
2552 if (sinfo
->fun
[sinfo
->num_fun
- 1].hi
> sec
->size
)
2554 const char *f1
= func_name (&sinfo
->fun
[sinfo
->num_fun
- 1]);
2556 info
->callbacks
->einfo (_("warning: %s exceeds section size\n"), f1
);
2557 sinfo
->fun
[sinfo
->num_fun
- 1].hi
= sec
->size
;
2559 else if (insns_at_end (&sinfo
->fun
[sinfo
->num_fun
- 1], sec
->size
))
2565 /* Search current function info for a function that contains address
2566 OFFSET in section SEC. */
2568 static struct function_info
*
2569 find_function (asection
*sec
, bfd_vma offset
, struct bfd_link_info
*info
)
2571 struct _spu_elf_section_data
*sec_data
= spu_elf_section_data (sec
);
2572 struct spu_elf_stack_info
*sinfo
= sec_data
->u
.i
.stack_info
;
2576 hi
= sinfo
->num_fun
;
2579 mid
= (lo
+ hi
) / 2;
2580 if (offset
< sinfo
->fun
[mid
].lo
)
2582 else if (offset
>= sinfo
->fun
[mid
].hi
)
2585 return &sinfo
->fun
[mid
];
2587 info
->callbacks
->einfo (_("%A:0x%v not found in function table\n"),
2589 bfd_set_error (bfd_error_bad_value
);
2593 /* Add CALLEE to CALLER call list if not already present. Return TRUE
2594 if CALLEE was new. If this function return FALSE, CALLEE should
2598 insert_callee (struct function_info
*caller
, struct call_info
*callee
)
2600 struct call_info
**pp
, *p
;
2602 for (pp
= &caller
->call_list
; (p
= *pp
) != NULL
; pp
= &p
->next
)
2603 if (p
->fun
== callee
->fun
)
2605 /* Tail calls use less stack than normal calls. Retain entry
2606 for normal call over one for tail call. */
2607 p
->is_tail
&= callee
->is_tail
;
2610 p
->fun
->start
= NULL
;
2611 p
->fun
->is_func
= TRUE
;
2613 p
->count
+= callee
->count
;
2614 /* Reorder list so most recent call is first. */
2616 p
->next
= caller
->call_list
;
2617 caller
->call_list
= p
;
2620 callee
->next
= caller
->call_list
;
2621 caller
->call_list
= callee
;
2625 /* Copy CALL and insert the copy into CALLER. */
2628 copy_callee (struct function_info
*caller
, const struct call_info
*call
)
2630 struct call_info
*callee
;
2631 callee
= bfd_malloc (sizeof (*callee
));
2635 if (!insert_callee (caller
, callee
))
2640 /* We're only interested in code sections. Testing SEC_IN_MEMORY excludes
2641 overlay stub sections. */
2644 interesting_section (asection
*s
)
2646 return (s
->output_section
!= bfd_abs_section_ptr
2647 && ((s
->flags
& (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_IN_MEMORY
))
2648 == (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
))
2652 /* Rummage through the relocs for SEC, looking for function calls.
2653 If CALL_TREE is true, fill in call graph. If CALL_TREE is false,
2654 mark destination symbols on calls as being functions. Also
2655 look at branches, which may be tail calls or go to hot/cold
2656 section part of same function. */
2659 mark_functions_via_relocs (asection
*sec
,
2660 struct bfd_link_info
*info
,
2663 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
2664 Elf_Internal_Shdr
*symtab_hdr
;
2666 unsigned int priority
= 0;
2667 static bfd_boolean warned
;
2669 if (!interesting_section (sec
)
2670 || sec
->reloc_count
== 0)
2673 internal_relocs
= _bfd_elf_link_read_relocs (sec
->owner
, sec
, NULL
, NULL
,
2675 if (internal_relocs
== NULL
)
2678 symtab_hdr
= &elf_tdata (sec
->owner
)->symtab_hdr
;
2679 psyms
= &symtab_hdr
->contents
;
2680 irela
= internal_relocs
;
2681 irelaend
= irela
+ sec
->reloc_count
;
2682 for (; irela
< irelaend
; irela
++)
2684 enum elf_spu_reloc_type r_type
;
2685 unsigned int r_indx
;
2687 Elf_Internal_Sym
*sym
;
2688 struct elf_link_hash_entry
*h
;
2690 bfd_boolean nonbranch
, is_call
;
2691 struct function_info
*caller
;
2692 struct call_info
*callee
;
2694 r_type
= ELF32_R_TYPE (irela
->r_info
);
2695 nonbranch
= r_type
!= R_SPU_REL16
&& r_type
!= R_SPU_ADDR16
;
2697 r_indx
= ELF32_R_SYM (irela
->r_info
);
2698 if (!get_sym_h (&h
, &sym
, &sym_sec
, psyms
, r_indx
, sec
->owner
))
2702 || sym_sec
->output_section
== bfd_abs_section_ptr
)
2708 unsigned char insn
[4];
2710 if (!bfd_get_section_contents (sec
->owner
, sec
, insn
,
2711 irela
->r_offset
, 4))
2713 if (is_branch (insn
))
2715 is_call
= (insn
[0] & 0xfd) == 0x31;
2716 priority
= insn
[1] & 0x0f;
2718 priority
|= insn
[2];
2720 priority
|= insn
[3];
2722 if ((sym_sec
->flags
& (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
))
2723 != (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
))
2726 info
->callbacks
->einfo
2727 (_("%B(%A+0x%v): call to non-code section"
2728 " %B(%A), analysis incomplete\n"),
2729 sec
->owner
, sec
, irela
->r_offset
,
2730 sym_sec
->owner
, sym_sec
);
2745 /* For --auto-overlay, count possible stubs we need for
2746 function pointer references. */
2747 unsigned int sym_type
;
2751 sym_type
= ELF_ST_TYPE (sym
->st_info
);
2752 if (sym_type
== STT_FUNC
)
2754 if (call_tree
&& spu_hash_table (info
)->params
->auto_overlay
)
2755 spu_hash_table (info
)->non_ovly_stub
+= 1;
2756 /* If the symbol type is STT_FUNC then this must be a
2757 function pointer initialisation. */
2760 /* Ignore data references. */
2761 if ((sym_sec
->flags
& (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
))
2762 != (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
))
2764 /* Otherwise we probably have a jump table reloc for
2765 a switch statement or some other reference to a
2770 val
= h
->root
.u
.def
.value
;
2772 val
= sym
->st_value
;
2773 val
+= irela
->r_addend
;
2777 struct function_info
*fun
;
2779 if (irela
->r_addend
!= 0)
2781 Elf_Internal_Sym
*fake
= bfd_zmalloc (sizeof (*fake
));
2784 fake
->st_value
= val
;
2786 = _bfd_elf_section_from_bfd_section (sym_sec
->owner
, sym_sec
);
2790 fun
= maybe_insert_function (sym_sec
, sym
, FALSE
, is_call
);
2792 fun
= maybe_insert_function (sym_sec
, h
, TRUE
, is_call
);
2795 if (irela
->r_addend
!= 0
2796 && fun
->u
.sym
!= sym
)
2801 caller
= find_function (sec
, irela
->r_offset
, info
);
2804 callee
= bfd_malloc (sizeof *callee
);
2808 callee
->fun
= find_function (sym_sec
, val
, info
);
2809 if (callee
->fun
== NULL
)
2811 callee
->is_tail
= !is_call
;
2812 callee
->is_pasted
= FALSE
;
2813 callee
->broken_cycle
= FALSE
;
2814 callee
->priority
= priority
;
2815 callee
->count
= nonbranch
? 0 : 1;
2816 if (callee
->fun
->last_caller
!= sec
)
2818 callee
->fun
->last_caller
= sec
;
2819 callee
->fun
->call_count
+= 1;
2821 if (!insert_callee (caller
, callee
))
2824 && !callee
->fun
->is_func
2825 && callee
->fun
->stack
== 0)
2827 /* This is either a tail call or a branch from one part of
2828 the function to another, ie. hot/cold section. If the
2829 destination has been called by some other function then
2830 it is a separate function. We also assume that functions
2831 are not split across input files. */
2832 if (sec
->owner
!= sym_sec
->owner
)
2834 callee
->fun
->start
= NULL
;
2835 callee
->fun
->is_func
= TRUE
;
2837 else if (callee
->fun
->start
== NULL
)
2839 struct function_info
*caller_start
= caller
;
2840 while (caller_start
->start
)
2841 caller_start
= caller_start
->start
;
2843 if (caller_start
!= callee
->fun
)
2844 callee
->fun
->start
= caller_start
;
2848 struct function_info
*callee_start
;
2849 struct function_info
*caller_start
;
2850 callee_start
= callee
->fun
;
2851 while (callee_start
->start
)
2852 callee_start
= callee_start
->start
;
2853 caller_start
= caller
;
2854 while (caller_start
->start
)
2855 caller_start
= caller_start
->start
;
2856 if (caller_start
!= callee_start
)
2858 callee
->fun
->start
= NULL
;
2859 callee
->fun
->is_func
= TRUE
;
2868 /* Handle something like .init or .fini, which has a piece of a function.
2869 These sections are pasted together to form a single function. */
2872 pasted_function (asection
*sec
)
2874 struct bfd_link_order
*l
;
2875 struct _spu_elf_section_data
*sec_data
;
2876 struct spu_elf_stack_info
*sinfo
;
2877 Elf_Internal_Sym
*fake
;
2878 struct function_info
*fun
, *fun_start
;
2880 fake
= bfd_zmalloc (sizeof (*fake
));
2884 fake
->st_size
= sec
->size
;
2886 = _bfd_elf_section_from_bfd_section (sec
->owner
, sec
);
2887 fun
= maybe_insert_function (sec
, fake
, FALSE
, FALSE
);
2891 /* Find a function immediately preceding this section. */
2893 for (l
= sec
->output_section
->map_head
.link_order
; l
!= NULL
; l
= l
->next
)
2895 if (l
->u
.indirect
.section
== sec
)
2897 if (fun_start
!= NULL
)
2899 struct call_info
*callee
= bfd_malloc (sizeof *callee
);
2903 fun
->start
= fun_start
;
2905 callee
->is_tail
= TRUE
;
2906 callee
->is_pasted
= TRUE
;
2907 callee
->broken_cycle
= FALSE
;
2908 callee
->priority
= 0;
2910 if (!insert_callee (fun_start
, callee
))
2916 if (l
->type
== bfd_indirect_link_order
2917 && (sec_data
= spu_elf_section_data (l
->u
.indirect
.section
)) != NULL
2918 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
2919 && sinfo
->num_fun
!= 0)
2920 fun_start
= &sinfo
->fun
[sinfo
->num_fun
- 1];
2923 /* Don't return an error if we did not find a function preceding this
2924 section. The section may have incorrect flags. */
2928 /* Map address ranges in code sections to functions. */
2931 discover_functions (struct bfd_link_info
*info
)
2935 Elf_Internal_Sym
***psym_arr
;
2936 asection
***sec_arr
;
2937 bfd_boolean gaps
= FALSE
;
2940 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
2943 psym_arr
= bfd_zmalloc (bfd_idx
* sizeof (*psym_arr
));
2944 if (psym_arr
== NULL
)
2946 sec_arr
= bfd_zmalloc (bfd_idx
* sizeof (*sec_arr
));
2947 if (sec_arr
== NULL
)
2950 for (ibfd
= info
->input_bfds
, bfd_idx
= 0;
2952 ibfd
= ibfd
->link_next
, bfd_idx
++)
2954 extern const bfd_target bfd_elf32_spu_vec
;
2955 Elf_Internal_Shdr
*symtab_hdr
;
2958 Elf_Internal_Sym
*syms
, *sy
, **psyms
, **psy
;
2959 asection
**psecs
, **p
;
2961 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
2964 /* Read all the symbols. */
2965 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
2966 symcount
= symtab_hdr
->sh_size
/ symtab_hdr
->sh_entsize
;
2970 for (sec
= ibfd
->sections
; sec
!= NULL
&& !gaps
; sec
= sec
->next
)
2971 if (interesting_section (sec
))
2979 if (symtab_hdr
->contents
!= NULL
)
2981 /* Don't use cached symbols since the generic ELF linker
2982 code only reads local symbols, and we need globals too. */
2983 free (symtab_hdr
->contents
);
2984 symtab_hdr
->contents
= NULL
;
2986 syms
= bfd_elf_get_elf_syms (ibfd
, symtab_hdr
, symcount
, 0,
2988 symtab_hdr
->contents
= (void *) syms
;
2992 /* Select defined function symbols that are going to be output. */
2993 psyms
= bfd_malloc ((symcount
+ 1) * sizeof (*psyms
));
2996 psym_arr
[bfd_idx
] = psyms
;
2997 psecs
= bfd_malloc (symcount
* sizeof (*psecs
));
3000 sec_arr
[bfd_idx
] = psecs
;
3001 for (psy
= psyms
, p
= psecs
, sy
= syms
; sy
< syms
+ symcount
; ++p
, ++sy
)
3002 if (ELF_ST_TYPE (sy
->st_info
) == STT_NOTYPE
3003 || ELF_ST_TYPE (sy
->st_info
) == STT_FUNC
)
3007 *p
= s
= bfd_section_from_elf_index (ibfd
, sy
->st_shndx
);
3008 if (s
!= NULL
&& interesting_section (s
))
3011 symcount
= psy
- psyms
;
3014 /* Sort them by section and offset within section. */
3015 sort_syms_syms
= syms
;
3016 sort_syms_psecs
= psecs
;
3017 qsort (psyms
, symcount
, sizeof (*psyms
), sort_syms
);
3019 /* Now inspect the function symbols. */
3020 for (psy
= psyms
; psy
< psyms
+ symcount
; )
3022 asection
*s
= psecs
[*psy
- syms
];
3023 Elf_Internal_Sym
**psy2
;
3025 for (psy2
= psy
; ++psy2
< psyms
+ symcount
; )
3026 if (psecs
[*psy2
- syms
] != s
)
3029 if (!alloc_stack_info (s
, psy2
- psy
))
3034 /* First install info about properly typed and sized functions.
3035 In an ideal world this will cover all code sections, except
3036 when partitioning functions into hot and cold sections,
3037 and the horrible pasted together .init and .fini functions. */
3038 for (psy
= psyms
; psy
< psyms
+ symcount
; ++psy
)
3041 if (ELF_ST_TYPE (sy
->st_info
) == STT_FUNC
)
3043 asection
*s
= psecs
[sy
- syms
];
3044 if (!maybe_insert_function (s
, sy
, FALSE
, TRUE
))
3049 for (sec
= ibfd
->sections
; sec
!= NULL
&& !gaps
; sec
= sec
->next
)
3050 if (interesting_section (sec
))
3051 gaps
|= check_function_ranges (sec
, info
);
3056 /* See if we can discover more function symbols by looking at
3058 for (ibfd
= info
->input_bfds
, bfd_idx
= 0;
3060 ibfd
= ibfd
->link_next
, bfd_idx
++)
3064 if (psym_arr
[bfd_idx
] == NULL
)
3067 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3068 if (!mark_functions_via_relocs (sec
, info
, FALSE
))
3072 for (ibfd
= info
->input_bfds
, bfd_idx
= 0;
3074 ibfd
= ibfd
->link_next
, bfd_idx
++)
3076 Elf_Internal_Shdr
*symtab_hdr
;
3078 Elf_Internal_Sym
*syms
, *sy
, **psyms
, **psy
;
3081 if ((psyms
= psym_arr
[bfd_idx
]) == NULL
)
3084 psecs
= sec_arr
[bfd_idx
];
3086 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
3087 syms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
3090 for (sec
= ibfd
->sections
; sec
!= NULL
&& !gaps
; sec
= sec
->next
)
3091 if (interesting_section (sec
))
3092 gaps
|= check_function_ranges (sec
, info
);
3096 /* Finally, install all globals. */
3097 for (psy
= psyms
; (sy
= *psy
) != NULL
; ++psy
)
3101 s
= psecs
[sy
- syms
];
3103 /* Global syms might be improperly typed functions. */
3104 if (ELF_ST_TYPE (sy
->st_info
) != STT_FUNC
3105 && ELF_ST_BIND (sy
->st_info
) == STB_GLOBAL
)
3107 if (!maybe_insert_function (s
, sy
, FALSE
, FALSE
))
3113 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
3115 extern const bfd_target bfd_elf32_spu_vec
;
3118 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
3121 /* Some of the symbols we've installed as marking the
3122 beginning of functions may have a size of zero. Extend
3123 the range of such functions to the beginning of the
3124 next symbol of interest. */
3125 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3126 if (interesting_section (sec
))
3128 struct _spu_elf_section_data
*sec_data
;
3129 struct spu_elf_stack_info
*sinfo
;
3131 sec_data
= spu_elf_section_data (sec
);
3132 sinfo
= sec_data
->u
.i
.stack_info
;
3133 if (sinfo
!= NULL
&& sinfo
->num_fun
!= 0)
3136 bfd_vma hi
= sec
->size
;
3138 for (fun_idx
= sinfo
->num_fun
; --fun_idx
>= 0; )
3140 sinfo
->fun
[fun_idx
].hi
= hi
;
3141 hi
= sinfo
->fun
[fun_idx
].lo
;
3144 sinfo
->fun
[0].lo
= 0;
3146 /* No symbols in this section. Must be .init or .fini
3147 or something similar. */
3148 else if (!pasted_function (sec
))
3154 for (ibfd
= info
->input_bfds
, bfd_idx
= 0;
3156 ibfd
= ibfd
->link_next
, bfd_idx
++)
3158 if (psym_arr
[bfd_idx
] == NULL
)
3161 free (psym_arr
[bfd_idx
]);
3162 free (sec_arr
[bfd_idx
]);
3171 /* Iterate over all function_info we have collected, calling DOIT on
3172 each node if ROOT_ONLY is false. Only call DOIT on root nodes
3176 for_each_node (bfd_boolean (*doit
) (struct function_info
*,
3177 struct bfd_link_info
*,
3179 struct bfd_link_info
*info
,
3185 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
3187 extern const bfd_target bfd_elf32_spu_vec
;
3190 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
3193 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3195 struct _spu_elf_section_data
*sec_data
;
3196 struct spu_elf_stack_info
*sinfo
;
3198 if ((sec_data
= spu_elf_section_data (sec
)) != NULL
3199 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3202 for (i
= 0; i
< sinfo
->num_fun
; ++i
)
3203 if (!root_only
|| !sinfo
->fun
[i
].non_root
)
3204 if (!doit (&sinfo
->fun
[i
], info
, param
))
3212 /* Transfer call info attached to struct function_info entries for
3213 all of a given function's sections to the first entry. */
3216 transfer_calls (struct function_info
*fun
,
3217 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
3218 void *param ATTRIBUTE_UNUSED
)
3220 struct function_info
*start
= fun
->start
;
3224 struct call_info
*call
, *call_next
;
3226 while (start
->start
!= NULL
)
3227 start
= start
->start
;
3228 for (call
= fun
->call_list
; call
!= NULL
; call
= call_next
)
3230 call_next
= call
->next
;
3231 if (!insert_callee (start
, call
))
3234 fun
->call_list
= NULL
;
3239 /* Mark nodes in the call graph that are called by some other node. */
3242 mark_non_root (struct function_info
*fun
,
3243 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
3244 void *param ATTRIBUTE_UNUSED
)
3246 struct call_info
*call
;
3251 for (call
= fun
->call_list
; call
; call
= call
->next
)
3253 call
->fun
->non_root
= TRUE
;
3254 mark_non_root (call
->fun
, 0, 0);
3259 /* Remove cycles from the call graph. Set depth of nodes. */
3262 remove_cycles (struct function_info
*fun
,
3263 struct bfd_link_info
*info
,
3266 struct call_info
**callp
, *call
;
3267 unsigned int depth
= *(unsigned int *) param
;
3268 unsigned int max_depth
= depth
;
3272 fun
->marking
= TRUE
;
3274 callp
= &fun
->call_list
;
3275 while ((call
= *callp
) != NULL
)
3277 call
->max_depth
= depth
+ !call
->is_pasted
;
3278 if (!call
->fun
->visit2
)
3280 if (!remove_cycles (call
->fun
, info
, &call
->max_depth
))
3282 if (max_depth
< call
->max_depth
)
3283 max_depth
= call
->max_depth
;
3285 else if (call
->fun
->marking
)
3287 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
3289 if (!htab
->params
->auto_overlay
3290 && htab
->params
->stack_analysis
)
3292 const char *f1
= func_name (fun
);
3293 const char *f2
= func_name (call
->fun
);
3295 info
->callbacks
->info (_("Stack analysis will ignore the call "
3300 call
->broken_cycle
= TRUE
;
3302 callp
= &call
->next
;
3304 fun
->marking
= FALSE
;
3305 *(unsigned int *) param
= max_depth
;
3309 /* Check that we actually visited all nodes in remove_cycles. If we
3310 didn't, then there is some cycle in the call graph not attached to
3311 any root node. Arbitrarily choose a node in the cycle as a new
3312 root and break the cycle. */
3315 mark_detached_root (struct function_info
*fun
,
3316 struct bfd_link_info
*info
,
3321 fun
->non_root
= FALSE
;
3322 *(unsigned int *) param
= 0;
3323 return remove_cycles (fun
, info
, param
);
3326 /* Populate call_list for each function. */
3329 build_call_tree (struct bfd_link_info
*info
)
3334 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
3336 extern const bfd_target bfd_elf32_spu_vec
;
3339 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
3342 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3343 if (!mark_functions_via_relocs (sec
, info
, TRUE
))
3347 /* Transfer call info from hot/cold section part of function
3349 if (!spu_hash_table (info
)->params
->auto_overlay
3350 && !for_each_node (transfer_calls
, info
, 0, FALSE
))
3353 /* Find the call graph root(s). */
3354 if (!for_each_node (mark_non_root
, info
, 0, FALSE
))
3357 /* Remove cycles from the call graph. We start from the root node(s)
3358 so that we break cycles in a reasonable place. */
3360 if (!for_each_node (remove_cycles
, info
, &depth
, TRUE
))
3363 return for_each_node (mark_detached_root
, info
, &depth
, FALSE
);
3366 /* qsort predicate to sort calls by priority, max_depth then count. */
3369 sort_calls (const void *a
, const void *b
)
3371 struct call_info
*const *c1
= a
;
3372 struct call_info
*const *c2
= b
;
3375 delta
= (*c2
)->priority
- (*c1
)->priority
;
3379 delta
= (*c2
)->max_depth
- (*c1
)->max_depth
;
3383 delta
= (*c2
)->count
- (*c1
)->count
;
3387 return (char *) c1
- (char *) c2
;
3391 unsigned int max_overlay_size
;
3394 /* Set linker_mark and gc_mark on any sections that we will put in
3395 overlays. These flags are used by the generic ELF linker, but we
3396 won't be continuing on to bfd_elf_final_link so it is OK to use
3397 them. linker_mark is clear before we get here. Set segment_mark
3398 on sections that are part of a pasted function (excluding the last
3401 Set up function rodata section if --overlay-rodata. We don't
3402 currently include merged string constant rodata sections since
3404 Sort the call graph so that the deepest nodes will be visited
3408 mark_overlay_section (struct function_info
*fun
,
3409 struct bfd_link_info
*info
,
3412 struct call_info
*call
;
3414 struct _mos_param
*mos_param
= param
;
3415 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
3421 if (!fun
->sec
->linker_mark
3422 && (htab
->params
->ovly_flavour
!= ovly_soft_icache
3423 || htab
->params
->non_ia_text
3424 || strncmp (fun
->sec
->name
, ".text.ia.", 9) == 0
3425 || strcmp (fun
->sec
->name
, ".init") == 0
3426 || strcmp (fun
->sec
->name
, ".fini") == 0))
3430 fun
->sec
->linker_mark
= 1;
3431 fun
->sec
->gc_mark
= 1;
3432 fun
->sec
->segment_mark
= 0;
3433 /* Ensure SEC_CODE is set on this text section (it ought to
3434 be!), and SEC_CODE is clear on rodata sections. We use
3435 this flag to differentiate the two overlay section types. */
3436 fun
->sec
->flags
|= SEC_CODE
;
3438 size
= fun
->sec
->size
;
3439 if (htab
->params
->auto_overlay
& OVERLAY_RODATA
)
3443 /* Find the rodata section corresponding to this function's
3445 if (strcmp (fun
->sec
->name
, ".text") == 0)
3447 name
= bfd_malloc (sizeof (".rodata"));
3450 memcpy (name
, ".rodata", sizeof (".rodata"));
3452 else if (strncmp (fun
->sec
->name
, ".text.", 6) == 0)
3454 size_t len
= strlen (fun
->sec
->name
);
3455 name
= bfd_malloc (len
+ 3);
3458 memcpy (name
, ".rodata", sizeof (".rodata"));
3459 memcpy (name
+ 7, fun
->sec
->name
+ 5, len
- 4);
3461 else if (strncmp (fun
->sec
->name
, ".gnu.linkonce.t.", 16) == 0)
3463 size_t len
= strlen (fun
->sec
->name
) + 1;
3464 name
= bfd_malloc (len
);
3467 memcpy (name
, fun
->sec
->name
, len
);
3473 asection
*rodata
= NULL
;
3474 asection
*group_sec
= elf_section_data (fun
->sec
)->next_in_group
;
3475 if (group_sec
== NULL
)
3476 rodata
= bfd_get_section_by_name (fun
->sec
->owner
, name
);
3478 while (group_sec
!= NULL
&& group_sec
!= fun
->sec
)
3480 if (strcmp (group_sec
->name
, name
) == 0)
3485 group_sec
= elf_section_data (group_sec
)->next_in_group
;
3487 fun
->rodata
= rodata
;
3490 size
+= fun
->rodata
->size
;
3491 if (htab
->params
->line_size
!= 0
3492 && size
> htab
->params
->line_size
)
3494 size
-= fun
->rodata
->size
;
3499 fun
->rodata
->linker_mark
= 1;
3500 fun
->rodata
->gc_mark
= 1;
3501 fun
->rodata
->flags
&= ~SEC_CODE
;
3507 if (mos_param
->max_overlay_size
< size
)
3508 mos_param
->max_overlay_size
= size
;
3511 for (count
= 0, call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3516 struct call_info
**calls
= bfd_malloc (count
* sizeof (*calls
));
3520 for (count
= 0, call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3521 calls
[count
++] = call
;
3523 qsort (calls
, count
, sizeof (*calls
), sort_calls
);
3525 fun
->call_list
= NULL
;
3529 calls
[count
]->next
= fun
->call_list
;
3530 fun
->call_list
= calls
[count
];
3535 for (call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3537 if (call
->is_pasted
)
3539 /* There can only be one is_pasted call per function_info. */
3540 BFD_ASSERT (!fun
->sec
->segment_mark
);
3541 fun
->sec
->segment_mark
= 1;
3543 if (!call
->broken_cycle
3544 && !mark_overlay_section (call
->fun
, info
, param
))
3548 /* Don't put entry code into an overlay. The overlay manager needs
3549 a stack! Also, don't mark .ovl.init as an overlay. */
3550 if (fun
->lo
+ fun
->sec
->output_offset
+ fun
->sec
->output_section
->vma
3551 == info
->output_bfd
->start_address
3552 || strncmp (fun
->sec
->output_section
->name
, ".ovl.init", 9) == 0)
3554 fun
->sec
->linker_mark
= 0;
3555 if (fun
->rodata
!= NULL
)
3556 fun
->rodata
->linker_mark
= 0;
3561 /* If non-zero then unmark functions called from those within sections
3562 that we need to unmark. Unfortunately this isn't reliable since the
3563 call graph cannot know the destination of function pointer calls. */
3564 #define RECURSE_UNMARK 0
3567 asection
*exclude_input_section
;
3568 asection
*exclude_output_section
;
3569 unsigned long clearing
;
3572 /* Undo some of mark_overlay_section's work. */
3575 unmark_overlay_section (struct function_info
*fun
,
3576 struct bfd_link_info
*info
,
3579 struct call_info
*call
;
3580 struct _uos_param
*uos_param
= param
;
3581 unsigned int excluded
= 0;
3589 if (fun
->sec
== uos_param
->exclude_input_section
3590 || fun
->sec
->output_section
== uos_param
->exclude_output_section
)
3594 uos_param
->clearing
+= excluded
;
3596 if (RECURSE_UNMARK
? uos_param
->clearing
: excluded
)
3598 fun
->sec
->linker_mark
= 0;
3600 fun
->rodata
->linker_mark
= 0;
3603 for (call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3604 if (!call
->broken_cycle
3605 && !unmark_overlay_section (call
->fun
, info
, param
))
3609 uos_param
->clearing
-= excluded
;
3614 unsigned int lib_size
;
3615 asection
**lib_sections
;
3618 /* Add sections we have marked as belonging to overlays to an array
3619 for consideration as non-overlay sections. The array consist of
3620 pairs of sections, (text,rodata), for functions in the call graph. */
3623 collect_lib_sections (struct function_info
*fun
,
3624 struct bfd_link_info
*info
,
3627 struct _cl_param
*lib_param
= param
;
3628 struct call_info
*call
;
3635 if (!fun
->sec
->linker_mark
|| !fun
->sec
->gc_mark
|| fun
->sec
->segment_mark
)
3638 size
= fun
->sec
->size
;
3640 size
+= fun
->rodata
->size
;
3642 if (size
<= lib_param
->lib_size
)
3644 *lib_param
->lib_sections
++ = fun
->sec
;
3645 fun
->sec
->gc_mark
= 0;
3646 if (fun
->rodata
&& fun
->rodata
->linker_mark
&& fun
->rodata
->gc_mark
)
3648 *lib_param
->lib_sections
++ = fun
->rodata
;
3649 fun
->rodata
->gc_mark
= 0;
3652 *lib_param
->lib_sections
++ = NULL
;
3655 for (call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3656 if (!call
->broken_cycle
)
3657 collect_lib_sections (call
->fun
, info
, param
);
3662 /* qsort predicate to sort sections by call count. */
3665 sort_lib (const void *a
, const void *b
)
3667 asection
*const *s1
= a
;
3668 asection
*const *s2
= b
;
3669 struct _spu_elf_section_data
*sec_data
;
3670 struct spu_elf_stack_info
*sinfo
;
3674 if ((sec_data
= spu_elf_section_data (*s1
)) != NULL
3675 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3678 for (i
= 0; i
< sinfo
->num_fun
; ++i
)
3679 delta
-= sinfo
->fun
[i
].call_count
;
3682 if ((sec_data
= spu_elf_section_data (*s2
)) != NULL
3683 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3686 for (i
= 0; i
< sinfo
->num_fun
; ++i
)
3687 delta
+= sinfo
->fun
[i
].call_count
;
3696 /* Remove some sections from those marked to be in overlays. Choose
3697 those that are called from many places, likely library functions. */
3700 auto_ovl_lib_functions (struct bfd_link_info
*info
, unsigned int lib_size
)
3703 asection
**lib_sections
;
3704 unsigned int i
, lib_count
;
3705 struct _cl_param collect_lib_param
;
3706 struct function_info dummy_caller
;
3707 struct spu_link_hash_table
*htab
;
3709 memset (&dummy_caller
, 0, sizeof (dummy_caller
));
3711 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
3713 extern const bfd_target bfd_elf32_spu_vec
;
3716 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
3719 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3720 if (sec
->linker_mark
3721 && sec
->size
< lib_size
3722 && (sec
->flags
& SEC_CODE
) != 0)
3725 lib_sections
= bfd_malloc (lib_count
* 2 * sizeof (*lib_sections
));
3726 if (lib_sections
== NULL
)
3727 return (unsigned int) -1;
3728 collect_lib_param
.lib_size
= lib_size
;
3729 collect_lib_param
.lib_sections
= lib_sections
;
3730 if (!for_each_node (collect_lib_sections
, info
, &collect_lib_param
,
3732 return (unsigned int) -1;
3733 lib_count
= (collect_lib_param
.lib_sections
- lib_sections
) / 2;
3735 /* Sort sections so that those with the most calls are first. */
3737 qsort (lib_sections
, lib_count
, 2 * sizeof (*lib_sections
), sort_lib
);
3739 htab
= spu_hash_table (info
);
3740 for (i
= 0; i
< lib_count
; i
++)
3742 unsigned int tmp
, stub_size
;
3744 struct _spu_elf_section_data
*sec_data
;
3745 struct spu_elf_stack_info
*sinfo
;
3747 sec
= lib_sections
[2 * i
];
3748 /* If this section is OK, its size must be less than lib_size. */
3750 /* If it has a rodata section, then add that too. */
3751 if (lib_sections
[2 * i
+ 1])
3752 tmp
+= lib_sections
[2 * i
+ 1]->size
;
3753 /* Add any new overlay call stubs needed by the section. */
3756 && (sec_data
= spu_elf_section_data (sec
)) != NULL
3757 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3760 struct call_info
*call
;
3762 for (k
= 0; k
< sinfo
->num_fun
; ++k
)
3763 for (call
= sinfo
->fun
[k
].call_list
; call
; call
= call
->next
)
3764 if (call
->fun
->sec
->linker_mark
)
3766 struct call_info
*p
;
3767 for (p
= dummy_caller
.call_list
; p
; p
= p
->next
)
3768 if (p
->fun
== call
->fun
)
3771 stub_size
+= ovl_stub_size (htab
->params
);
3774 if (tmp
+ stub_size
< lib_size
)
3776 struct call_info
**pp
, *p
;
3778 /* This section fits. Mark it as non-overlay. */
3779 lib_sections
[2 * i
]->linker_mark
= 0;
3780 if (lib_sections
[2 * i
+ 1])
3781 lib_sections
[2 * i
+ 1]->linker_mark
= 0;
3782 lib_size
-= tmp
+ stub_size
;
3783 /* Call stubs to the section we just added are no longer
3785 pp
= &dummy_caller
.call_list
;
3786 while ((p
= *pp
) != NULL
)
3787 if (!p
->fun
->sec
->linker_mark
)
3789 lib_size
+= ovl_stub_size (htab
->params
);
3795 /* Add new call stubs to dummy_caller. */
3796 if ((sec_data
= spu_elf_section_data (sec
)) != NULL
3797 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3800 struct call_info
*call
;
3802 for (k
= 0; k
< sinfo
->num_fun
; ++k
)
3803 for (call
= sinfo
->fun
[k
].call_list
;
3806 if (call
->fun
->sec
->linker_mark
)
3808 struct call_info
*callee
;
3809 callee
= bfd_malloc (sizeof (*callee
));
3811 return (unsigned int) -1;
3813 if (!insert_callee (&dummy_caller
, callee
))
3819 while (dummy_caller
.call_list
!= NULL
)
3821 struct call_info
*call
= dummy_caller
.call_list
;
3822 dummy_caller
.call_list
= call
->next
;
3825 for (i
= 0; i
< 2 * lib_count
; i
++)
3826 if (lib_sections
[i
])
3827 lib_sections
[i
]->gc_mark
= 1;
3828 free (lib_sections
);
3832 /* Build an array of overlay sections. The deepest node's section is
3833 added first, then its parent node's section, then everything called
3834 from the parent section. The idea being to group sections to
3835 minimise calls between different overlays. */
3838 collect_overlays (struct function_info
*fun
,
3839 struct bfd_link_info
*info
,
3842 struct call_info
*call
;
3843 bfd_boolean added_fun
;
3844 asection
***ovly_sections
= param
;
3850 for (call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3851 if (!call
->is_pasted
&& !call
->broken_cycle
)
3853 if (!collect_overlays (call
->fun
, info
, ovly_sections
))
3859 if (fun
->sec
->linker_mark
&& fun
->sec
->gc_mark
)
3861 fun
->sec
->gc_mark
= 0;
3862 *(*ovly_sections
)++ = fun
->sec
;
3863 if (fun
->rodata
&& fun
->rodata
->linker_mark
&& fun
->rodata
->gc_mark
)
3865 fun
->rodata
->gc_mark
= 0;
3866 *(*ovly_sections
)++ = fun
->rodata
;
3869 *(*ovly_sections
)++ = NULL
;
3872 /* Pasted sections must stay with the first section. We don't
3873 put pasted sections in the array, just the first section.
3874 Mark subsequent sections as already considered. */
3875 if (fun
->sec
->segment_mark
)
3877 struct function_info
*call_fun
= fun
;
3880 for (call
= call_fun
->call_list
; call
!= NULL
; call
= call
->next
)
3881 if (call
->is_pasted
)
3883 call_fun
= call
->fun
;
3884 call_fun
->sec
->gc_mark
= 0;
3885 if (call_fun
->rodata
)
3886 call_fun
->rodata
->gc_mark
= 0;
3892 while (call_fun
->sec
->segment_mark
);
3896 for (call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3897 if (!call
->broken_cycle
3898 && !collect_overlays (call
->fun
, info
, ovly_sections
))
3903 struct _spu_elf_section_data
*sec_data
;
3904 struct spu_elf_stack_info
*sinfo
;
3906 if ((sec_data
= spu_elf_section_data (fun
->sec
)) != NULL
3907 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3910 for (i
= 0; i
< sinfo
->num_fun
; ++i
)
3911 if (!collect_overlays (&sinfo
->fun
[i
], info
, ovly_sections
))
3919 struct _sum_stack_param
{
3921 size_t overall_stack
;
3922 bfd_boolean emit_stack_syms
;
3925 /* Descend the call graph for FUN, accumulating total stack required. */
3928 sum_stack (struct function_info
*fun
,
3929 struct bfd_link_info
*info
,
3932 struct call_info
*call
;
3933 struct function_info
*max
;
3934 size_t stack
, cum_stack
;
3936 bfd_boolean has_call
;
3937 struct _sum_stack_param
*sum_stack_param
= param
;
3938 struct spu_link_hash_table
*htab
;
3940 cum_stack
= fun
->stack
;
3941 sum_stack_param
->cum_stack
= cum_stack
;
3947 for (call
= fun
->call_list
; call
; call
= call
->next
)
3949 if (call
->broken_cycle
)
3951 if (!call
->is_pasted
)
3953 if (!sum_stack (call
->fun
, info
, sum_stack_param
))
3955 stack
= sum_stack_param
->cum_stack
;
3956 /* Include caller stack for normal calls, don't do so for
3957 tail calls. fun->stack here is local stack usage for
3959 if (!call
->is_tail
|| call
->is_pasted
|| call
->fun
->start
!= NULL
)
3960 stack
+= fun
->stack
;
3961 if (cum_stack
< stack
)
3968 sum_stack_param
->cum_stack
= cum_stack
;
3970 /* Now fun->stack holds cumulative stack. */
3971 fun
->stack
= cum_stack
;
3975 && sum_stack_param
->overall_stack
< cum_stack
)
3976 sum_stack_param
->overall_stack
= cum_stack
;
3978 htab
= spu_hash_table (info
);
3979 if (htab
->params
->auto_overlay
)
3982 f1
= func_name (fun
);
3983 if (htab
->params
->stack_analysis
)
3986 info
->callbacks
->info (_(" %s: 0x%v\n"), f1
, (bfd_vma
) cum_stack
);
3987 info
->callbacks
->minfo (_("%s: 0x%v 0x%v\n"),
3988 f1
, (bfd_vma
) stack
, (bfd_vma
) cum_stack
);
3992 info
->callbacks
->minfo (_(" calls:\n"));
3993 for (call
= fun
->call_list
; call
; call
= call
->next
)
3994 if (!call
->is_pasted
&& !call
->broken_cycle
)
3996 const char *f2
= func_name (call
->fun
);
3997 const char *ann1
= call
->fun
== max
? "*" : " ";
3998 const char *ann2
= call
->is_tail
? "t" : " ";
4000 info
->callbacks
->minfo (_(" %s%s %s\n"), ann1
, ann2
, f2
);
4005 if (sum_stack_param
->emit_stack_syms
)
4007 char *name
= bfd_malloc (18 + strlen (f1
));
4008 struct elf_link_hash_entry
*h
;
4013 if (fun
->global
|| ELF_ST_BIND (fun
->u
.sym
->st_info
) == STB_GLOBAL
)
4014 sprintf (name
, "__stack_%s", f1
);
4016 sprintf (name
, "__stack_%x_%s", fun
->sec
->id
& 0xffffffff, f1
);
4018 h
= elf_link_hash_lookup (&htab
->elf
, name
, TRUE
, TRUE
, FALSE
);
4021 && (h
->root
.type
== bfd_link_hash_new
4022 || h
->root
.type
== bfd_link_hash_undefined
4023 || h
->root
.type
== bfd_link_hash_undefweak
))
4025 h
->root
.type
= bfd_link_hash_defined
;
4026 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
4027 h
->root
.u
.def
.value
= cum_stack
;
4032 h
->ref_regular_nonweak
= 1;
4033 h
->forced_local
= 1;
4041 /* SEC is part of a pasted function. Return the call_info for the
4042 next section of this function. */
4044 static struct call_info
*
4045 find_pasted_call (asection
*sec
)
4047 struct _spu_elf_section_data
*sec_data
= spu_elf_section_data (sec
);
4048 struct spu_elf_stack_info
*sinfo
= sec_data
->u
.i
.stack_info
;
4049 struct call_info
*call
;
4052 for (k
= 0; k
< sinfo
->num_fun
; ++k
)
4053 for (call
= sinfo
->fun
[k
].call_list
; call
!= NULL
; call
= call
->next
)
4054 if (call
->is_pasted
)
4060 /* qsort predicate to sort bfds by file name. */
4063 sort_bfds (const void *a
, const void *b
)
4065 bfd
*const *abfd1
= a
;
4066 bfd
*const *abfd2
= b
;
4068 return filename_cmp ((*abfd1
)->filename
, (*abfd2
)->filename
);
4072 print_one_overlay_section (FILE *script
,
4075 unsigned int ovlynum
,
4076 unsigned int *ovly_map
,
4077 asection
**ovly_sections
,
4078 struct bfd_link_info
*info
)
4082 for (j
= base
; j
< count
&& ovly_map
[j
] == ovlynum
; j
++)
4084 asection
*sec
= ovly_sections
[2 * j
];
4086 if (fprintf (script
, " %s%c%s (%s)\n",
4087 (sec
->owner
->my_archive
!= NULL
4088 ? sec
->owner
->my_archive
->filename
: ""),
4089 info
->path_separator
,
4090 sec
->owner
->filename
,
4093 if (sec
->segment_mark
)
4095 struct call_info
*call
= find_pasted_call (sec
);
4096 while (call
!= NULL
)
4098 struct function_info
*call_fun
= call
->fun
;
4099 sec
= call_fun
->sec
;
4100 if (fprintf (script
, " %s%c%s (%s)\n",
4101 (sec
->owner
->my_archive
!= NULL
4102 ? sec
->owner
->my_archive
->filename
: ""),
4103 info
->path_separator
,
4104 sec
->owner
->filename
,
4107 for (call
= call_fun
->call_list
; call
; call
= call
->next
)
4108 if (call
->is_pasted
)
4114 for (j
= base
; j
< count
&& ovly_map
[j
] == ovlynum
; j
++)
4116 asection
*sec
= ovly_sections
[2 * j
+ 1];
4118 && fprintf (script
, " %s%c%s (%s)\n",
4119 (sec
->owner
->my_archive
!= NULL
4120 ? sec
->owner
->my_archive
->filename
: ""),
4121 info
->path_separator
,
4122 sec
->owner
->filename
,
4126 sec
= ovly_sections
[2 * j
];
4127 if (sec
->segment_mark
)
4129 struct call_info
*call
= find_pasted_call (sec
);
4130 while (call
!= NULL
)
4132 struct function_info
*call_fun
= call
->fun
;
4133 sec
= call_fun
->rodata
;
4135 && fprintf (script
, " %s%c%s (%s)\n",
4136 (sec
->owner
->my_archive
!= NULL
4137 ? sec
->owner
->my_archive
->filename
: ""),
4138 info
->path_separator
,
4139 sec
->owner
->filename
,
4142 for (call
= call_fun
->call_list
; call
; call
= call
->next
)
4143 if (call
->is_pasted
)
4152 /* Handle --auto-overlay. */
4155 spu_elf_auto_overlay (struct bfd_link_info
*info
)
4159 struct elf_segment_map
*m
;
4160 unsigned int fixed_size
, lo
, hi
;
4161 unsigned int reserved
;
4162 struct spu_link_hash_table
*htab
;
4163 unsigned int base
, i
, count
, bfd_count
;
4164 unsigned int region
, ovlynum
;
4165 asection
**ovly_sections
, **ovly_p
;
4166 unsigned int *ovly_map
;
4168 unsigned int total_overlay_size
, overlay_size
;
4169 const char *ovly_mgr_entry
;
4170 struct elf_link_hash_entry
*h
;
4171 struct _mos_param mos_param
;
4172 struct _uos_param uos_param
;
4173 struct function_info dummy_caller
;
4175 /* Find the extents of our loadable image. */
4176 lo
= (unsigned int) -1;
4178 for (m
= elf_seg_map (info
->output_bfd
); m
!= NULL
; m
= m
->next
)
4179 if (m
->p_type
== PT_LOAD
)
4180 for (i
= 0; i
< m
->count
; i
++)
4181 if (m
->sections
[i
]->size
!= 0)
4183 if (m
->sections
[i
]->vma
< lo
)
4184 lo
= m
->sections
[i
]->vma
;
4185 if (m
->sections
[i
]->vma
+ m
->sections
[i
]->size
- 1 > hi
)
4186 hi
= m
->sections
[i
]->vma
+ m
->sections
[i
]->size
- 1;
4188 fixed_size
= hi
+ 1 - lo
;
4190 if (!discover_functions (info
))
4193 if (!build_call_tree (info
))
4196 htab
= spu_hash_table (info
);
4197 reserved
= htab
->params
->auto_overlay_reserved
;
4200 struct _sum_stack_param sum_stack_param
;
4202 sum_stack_param
.emit_stack_syms
= 0;
4203 sum_stack_param
.overall_stack
= 0;
4204 if (!for_each_node (sum_stack
, info
, &sum_stack_param
, TRUE
))
4206 reserved
= (sum_stack_param
.overall_stack
4207 + htab
->params
->extra_stack_space
);
4210 /* No need for overlays if everything already fits. */
4211 if (fixed_size
+ reserved
<= htab
->local_store
4212 && htab
->params
->ovly_flavour
!= ovly_soft_icache
)
4214 htab
->params
->auto_overlay
= 0;
4218 uos_param
.exclude_input_section
= 0;
4219 uos_param
.exclude_output_section
4220 = bfd_get_section_by_name (info
->output_bfd
, ".interrupt");
4222 ovly_mgr_entry
= "__ovly_load";
4223 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
4224 ovly_mgr_entry
= "__icache_br_handler";
4225 h
= elf_link_hash_lookup (&htab
->elf
, ovly_mgr_entry
,
4226 FALSE
, FALSE
, FALSE
);
4228 && (h
->root
.type
== bfd_link_hash_defined
4229 || h
->root
.type
== bfd_link_hash_defweak
)
4232 /* We have a user supplied overlay manager. */
4233 uos_param
.exclude_input_section
= h
->root
.u
.def
.section
;
4237 /* If no user overlay manager, spu_elf_load_ovl_mgr will add our
4238 builtin version to .text, and will adjust .text size. */
4239 fixed_size
+= (*htab
->params
->spu_elf_load_ovl_mgr
) ();
4242 /* Mark overlay sections, and find max overlay section size. */
4243 mos_param
.max_overlay_size
= 0;
4244 if (!for_each_node (mark_overlay_section
, info
, &mos_param
, TRUE
))
4247 /* We can't put the overlay manager or interrupt routines in
4249 uos_param
.clearing
= 0;
4250 if ((uos_param
.exclude_input_section
4251 || uos_param
.exclude_output_section
)
4252 && !for_each_node (unmark_overlay_section
, info
, &uos_param
, TRUE
))
4256 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
4258 bfd_arr
= bfd_malloc (bfd_count
* sizeof (*bfd_arr
));
4259 if (bfd_arr
== NULL
)
4262 /* Count overlay sections, and subtract their sizes from "fixed_size". */
4265 total_overlay_size
= 0;
4266 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
4268 extern const bfd_target bfd_elf32_spu_vec
;
4270 unsigned int old_count
;
4272 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
4276 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
4277 if (sec
->linker_mark
)
4279 if ((sec
->flags
& SEC_CODE
) != 0)
4281 fixed_size
-= sec
->size
;
4282 total_overlay_size
+= sec
->size
;
4284 else if ((sec
->flags
& (SEC_ALLOC
| SEC_LOAD
)) == (SEC_ALLOC
| SEC_LOAD
)
4285 && sec
->output_section
->owner
== info
->output_bfd
4286 && strncmp (sec
->output_section
->name
, ".ovl.init", 9) == 0)
4287 fixed_size
-= sec
->size
;
4288 if (count
!= old_count
)
4289 bfd_arr
[bfd_count
++] = ibfd
;
4292 /* Since the overlay link script selects sections by file name and
4293 section name, ensure that file names are unique. */
4296 bfd_boolean ok
= TRUE
;
4298 qsort (bfd_arr
, bfd_count
, sizeof (*bfd_arr
), sort_bfds
);
4299 for (i
= 1; i
< bfd_count
; ++i
)
4300 if (filename_cmp (bfd_arr
[i
- 1]->filename
, bfd_arr
[i
]->filename
) == 0)
4302 if (bfd_arr
[i
- 1]->my_archive
== bfd_arr
[i
]->my_archive
)
4304 if (bfd_arr
[i
- 1]->my_archive
&& bfd_arr
[i
]->my_archive
)
4305 info
->callbacks
->einfo (_("%s duplicated in %s\n"),
4306 bfd_arr
[i
]->filename
,
4307 bfd_arr
[i
]->my_archive
->filename
);
4309 info
->callbacks
->einfo (_("%s duplicated\n"),
4310 bfd_arr
[i
]->filename
);
4316 info
->callbacks
->einfo (_("sorry, no support for duplicate "
4317 "object files in auto-overlay script\n"));
4318 bfd_set_error (bfd_error_bad_value
);
4324 fixed_size
+= reserved
;
4325 fixed_size
+= htab
->non_ovly_stub
* ovl_stub_size (htab
->params
);
4326 if (fixed_size
+ mos_param
.max_overlay_size
<= htab
->local_store
)
4328 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
4330 /* Stubs in the non-icache area are bigger. */
4331 fixed_size
+= htab
->non_ovly_stub
* 16;
4332 /* Space for icache manager tables.
4333 a) Tag array, one quadword per cache line.
4334 - word 0: ia address of present line, init to zero. */
4335 fixed_size
+= 16 << htab
->num_lines_log2
;
4336 /* b) Rewrite "to" list, one quadword per cache line. */
4337 fixed_size
+= 16 << htab
->num_lines_log2
;
4338 /* c) Rewrite "from" list, one byte per outgoing branch (rounded up
4339 to a power-of-two number of full quadwords) per cache line. */
4340 fixed_size
+= 16 << (htab
->fromelem_size_log2
4341 + htab
->num_lines_log2
);
4342 /* d) Pointer to __ea backing store (toe), 1 quadword. */
4347 /* Guess number of overlays. Assuming overlay buffer is on
4348 average only half full should be conservative. */
4349 ovlynum
= (total_overlay_size
* 2 * htab
->params
->num_lines
4350 / (htab
->local_store
- fixed_size
));
4351 /* Space for _ovly_table[], _ovly_buf_table[] and toe. */
4352 fixed_size
+= ovlynum
* 16 + 16 + 4 + 16;
4356 if (fixed_size
+ mos_param
.max_overlay_size
> htab
->local_store
)
4357 info
->callbacks
->einfo (_("non-overlay size of 0x%v plus maximum overlay "
4358 "size of 0x%v exceeds local store\n"),
4359 (bfd_vma
) fixed_size
,
4360 (bfd_vma
) mos_param
.max_overlay_size
);
4362 /* Now see if we should put some functions in the non-overlay area. */
4363 else if (fixed_size
< htab
->params
->auto_overlay_fixed
)
4365 unsigned int max_fixed
, lib_size
;
4367 max_fixed
= htab
->local_store
- mos_param
.max_overlay_size
;
4368 if (max_fixed
> htab
->params
->auto_overlay_fixed
)
4369 max_fixed
= htab
->params
->auto_overlay_fixed
;
4370 lib_size
= max_fixed
- fixed_size
;
4371 lib_size
= auto_ovl_lib_functions (info
, lib_size
);
4372 if (lib_size
== (unsigned int) -1)
4374 fixed_size
= max_fixed
- lib_size
;
4377 /* Build an array of sections, suitably sorted to place into
4379 ovly_sections
= bfd_malloc (2 * count
* sizeof (*ovly_sections
));
4380 if (ovly_sections
== NULL
)
4382 ovly_p
= ovly_sections
;
4383 if (!for_each_node (collect_overlays
, info
, &ovly_p
, TRUE
))
4385 count
= (size_t) (ovly_p
- ovly_sections
) / 2;
4386 ovly_map
= bfd_malloc (count
* sizeof (*ovly_map
));
4387 if (ovly_map
== NULL
)
4390 memset (&dummy_caller
, 0, sizeof (dummy_caller
));
4391 overlay_size
= (htab
->local_store
- fixed_size
) / htab
->params
->num_lines
;
4392 if (htab
->params
->line_size
!= 0)
4393 overlay_size
= htab
->params
->line_size
;
4396 while (base
< count
)
4398 unsigned int size
= 0, rosize
= 0, roalign
= 0;
4400 for (i
= base
; i
< count
; i
++)
4402 asection
*sec
, *rosec
;
4403 unsigned int tmp
, rotmp
;
4404 unsigned int num_stubs
;
4405 struct call_info
*call
, *pasty
;
4406 struct _spu_elf_section_data
*sec_data
;
4407 struct spu_elf_stack_info
*sinfo
;
4410 /* See whether we can add this section to the current
4411 overlay without overflowing our overlay buffer. */
4412 sec
= ovly_sections
[2 * i
];
4413 tmp
= align_power (size
, sec
->alignment_power
) + sec
->size
;
4415 rosec
= ovly_sections
[2 * i
+ 1];
4418 rotmp
= align_power (rotmp
, rosec
->alignment_power
) + rosec
->size
;
4419 if (roalign
< rosec
->alignment_power
)
4420 roalign
= rosec
->alignment_power
;
4422 if (align_power (tmp
, roalign
) + rotmp
> overlay_size
)
4424 if (sec
->segment_mark
)
4426 /* Pasted sections must stay together, so add their
4428 pasty
= find_pasted_call (sec
);
4429 while (pasty
!= NULL
)
4431 struct function_info
*call_fun
= pasty
->fun
;
4432 tmp
= (align_power (tmp
, call_fun
->sec
->alignment_power
)
4433 + call_fun
->sec
->size
);
4434 if (call_fun
->rodata
)
4436 rotmp
= (align_power (rotmp
,
4437 call_fun
->rodata
->alignment_power
)
4438 + call_fun
->rodata
->size
);
4439 if (roalign
< rosec
->alignment_power
)
4440 roalign
= rosec
->alignment_power
;
4442 for (pasty
= call_fun
->call_list
; pasty
; pasty
= pasty
->next
)
4443 if (pasty
->is_pasted
)
4447 if (align_power (tmp
, roalign
) + rotmp
> overlay_size
)
4450 /* If we add this section, we might need new overlay call
4451 stubs. Add any overlay section calls to dummy_call. */
4453 sec_data
= spu_elf_section_data (sec
);
4454 sinfo
= sec_data
->u
.i
.stack_info
;
4455 for (k
= 0; k
< (unsigned) sinfo
->num_fun
; ++k
)
4456 for (call
= sinfo
->fun
[k
].call_list
; call
; call
= call
->next
)
4457 if (call
->is_pasted
)
4459 BFD_ASSERT (pasty
== NULL
);
4462 else if (call
->fun
->sec
->linker_mark
)
4464 if (!copy_callee (&dummy_caller
, call
))
4467 while (pasty
!= NULL
)
4469 struct function_info
*call_fun
= pasty
->fun
;
4471 for (call
= call_fun
->call_list
; call
; call
= call
->next
)
4472 if (call
->is_pasted
)
4474 BFD_ASSERT (pasty
== NULL
);
4477 else if (!copy_callee (&dummy_caller
, call
))
4481 /* Calculate call stub size. */
4483 for (call
= dummy_caller
.call_list
; call
; call
= call
->next
)
4485 unsigned int stub_delta
= 1;
4487 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
4488 stub_delta
= call
->count
;
4489 num_stubs
+= stub_delta
;
4491 /* If the call is within this overlay, we won't need a
4493 for (k
= base
; k
< i
+ 1; k
++)
4494 if (call
->fun
->sec
== ovly_sections
[2 * k
])
4496 num_stubs
-= stub_delta
;
4500 if (htab
->params
->ovly_flavour
== ovly_soft_icache
4501 && num_stubs
> htab
->params
->max_branch
)
4503 if (align_power (tmp
, roalign
) + rotmp
4504 + num_stubs
* ovl_stub_size (htab
->params
) > overlay_size
)
4512 info
->callbacks
->einfo (_("%B:%A%s exceeds overlay size\n"),
4513 ovly_sections
[2 * i
]->owner
,
4514 ovly_sections
[2 * i
],
4515 ovly_sections
[2 * i
+ 1] ? " + rodata" : "");
4516 bfd_set_error (bfd_error_bad_value
);
4520 while (dummy_caller
.call_list
!= NULL
)
4522 struct call_info
*call
= dummy_caller
.call_list
;
4523 dummy_caller
.call_list
= call
->next
;
4529 ovly_map
[base
++] = ovlynum
;
4532 script
= htab
->params
->spu_elf_open_overlay_script ();
4534 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
4536 if (fprintf (script
, "SECTIONS\n{\n") <= 0)
4539 if (fprintf (script
,
4540 " . = ALIGN (%u);\n"
4541 " .ovl.init : { *(.ovl.init) }\n"
4542 " . = ABSOLUTE (ADDR (.ovl.init));\n",
4543 htab
->params
->line_size
) <= 0)
4548 while (base
< count
)
4550 unsigned int indx
= ovlynum
- 1;
4551 unsigned int vma
, lma
;
4553 vma
= (indx
& (htab
->params
->num_lines
- 1)) << htab
->line_size_log2
;
4554 lma
= vma
+ (((indx
>> htab
->num_lines_log2
) + 1) << 18);
4556 if (fprintf (script
, " .ovly%u ABSOLUTE (ADDR (.ovl.init)) + %u "
4557 ": AT (LOADADDR (.ovl.init) + %u) {\n",
4558 ovlynum
, vma
, lma
) <= 0)
4561 base
= print_one_overlay_section (script
, base
, count
, ovlynum
,
4562 ovly_map
, ovly_sections
, info
);
4563 if (base
== (unsigned) -1)
4566 if (fprintf (script
, " }\n") <= 0)
4572 if (fprintf (script
, " . = ABSOLUTE (ADDR (.ovl.init)) + %u;\n",
4573 1 << (htab
->num_lines_log2
+ htab
->line_size_log2
)) <= 0)
4576 if (fprintf (script
, "}\nINSERT AFTER .toe;\n") <= 0)
4581 if (fprintf (script
, "SECTIONS\n{\n") <= 0)
4584 if (fprintf (script
,
4585 " . = ALIGN (16);\n"
4586 " .ovl.init : { *(.ovl.init) }\n"
4587 " . = ABSOLUTE (ADDR (.ovl.init));\n") <= 0)
4590 for (region
= 1; region
<= htab
->params
->num_lines
; region
++)
4594 while (base
< count
&& ovly_map
[base
] < ovlynum
)
4602 /* We need to set lma since we are overlaying .ovl.init. */
4603 if (fprintf (script
,
4604 " OVERLAY : AT (ALIGN (LOADADDR (.ovl.init) + SIZEOF (.ovl.init), 16))\n {\n") <= 0)
4609 if (fprintf (script
, " OVERLAY :\n {\n") <= 0)
4613 while (base
< count
)
4615 if (fprintf (script
, " .ovly%u {\n", ovlynum
) <= 0)
4618 base
= print_one_overlay_section (script
, base
, count
, ovlynum
,
4619 ovly_map
, ovly_sections
, info
);
4620 if (base
== (unsigned) -1)
4623 if (fprintf (script
, " }\n") <= 0)
4626 ovlynum
+= htab
->params
->num_lines
;
4627 while (base
< count
&& ovly_map
[base
] < ovlynum
)
4631 if (fprintf (script
, " }\n") <= 0)
4635 if (fprintf (script
, "}\nINSERT BEFORE .text;\n") <= 0)
4640 free (ovly_sections
);
4642 if (fclose (script
) != 0)
4645 if (htab
->params
->auto_overlay
& AUTO_RELINK
)
4646 (*htab
->params
->spu_elf_relink
) ();
4651 bfd_set_error (bfd_error_system_call
);
4653 info
->callbacks
->einfo ("%F%P: auto overlay error: %E\n");
4657 /* Provide an estimate of total stack required. */
4660 spu_elf_stack_analysis (struct bfd_link_info
*info
)
4662 struct spu_link_hash_table
*htab
;
4663 struct _sum_stack_param sum_stack_param
;
4665 if (!discover_functions (info
))
4668 if (!build_call_tree (info
))
4671 htab
= spu_hash_table (info
);
4672 if (htab
->params
->stack_analysis
)
4674 info
->callbacks
->info (_("Stack size for call graph root nodes.\n"));
4675 info
->callbacks
->minfo (_("\nStack size for functions. "
4676 "Annotations: '*' max stack, 't' tail call\n"));
4679 sum_stack_param
.emit_stack_syms
= htab
->params
->emit_stack_syms
;
4680 sum_stack_param
.overall_stack
= 0;
4681 if (!for_each_node (sum_stack
, info
, &sum_stack_param
, TRUE
))
4684 if (htab
->params
->stack_analysis
)
4685 info
->callbacks
->info (_("Maximum stack required is 0x%v\n"),
4686 (bfd_vma
) sum_stack_param
.overall_stack
);
4690 /* Perform a final link. */
4693 spu_elf_final_link (bfd
*output_bfd
, struct bfd_link_info
*info
)
4695 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
4697 if (htab
->params
->auto_overlay
)
4698 spu_elf_auto_overlay (info
);
4700 if ((htab
->params
->stack_analysis
4701 || (htab
->params
->ovly_flavour
== ovly_soft_icache
4702 && htab
->params
->lrlive_analysis
))
4703 && !spu_elf_stack_analysis (info
))
4704 info
->callbacks
->einfo ("%X%P: stack/lrlive analysis error: %E\n");
4706 if (!spu_elf_build_stubs (info
))
4707 info
->callbacks
->einfo ("%F%P: can not build overlay stubs: %E\n");
4709 return bfd_elf_final_link (output_bfd
, info
);
4712 /* Called when not normally emitting relocs, ie. !info->relocatable
4713 and !info->emitrelocations. Returns a count of special relocs
4714 that need to be emitted. */
4717 spu_elf_count_relocs (struct bfd_link_info
*info
, asection
*sec
)
4719 Elf_Internal_Rela
*relocs
;
4720 unsigned int count
= 0;
4722 relocs
= _bfd_elf_link_read_relocs (sec
->owner
, sec
, NULL
, NULL
,
4726 Elf_Internal_Rela
*rel
;
4727 Elf_Internal_Rela
*relend
= relocs
+ sec
->reloc_count
;
4729 for (rel
= relocs
; rel
< relend
; rel
++)
4731 int r_type
= ELF32_R_TYPE (rel
->r_info
);
4732 if (r_type
== R_SPU_PPU32
|| r_type
== R_SPU_PPU64
)
4736 if (elf_section_data (sec
)->relocs
!= relocs
)
4743 /* Functions for adding fixup records to .fixup */
4745 #define FIXUP_RECORD_SIZE 4
4747 #define FIXUP_PUT(output_bfd,htab,index,addr) \
4748 bfd_put_32 (output_bfd, addr, \
4749 htab->sfixup->contents + FIXUP_RECORD_SIZE * (index))
4750 #define FIXUP_GET(output_bfd,htab,index) \
4751 bfd_get_32 (output_bfd, \
4752 htab->sfixup->contents + FIXUP_RECORD_SIZE * (index))
4754 /* Store OFFSET in .fixup. This assumes it will be called with an
4755 increasing OFFSET. When this OFFSET fits with the last base offset,
4756 it just sets a bit, otherwise it adds a new fixup record. */
4758 spu_elf_emit_fixup (bfd
* output_bfd
, struct bfd_link_info
*info
,
4761 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
4762 asection
*sfixup
= htab
->sfixup
;
4763 bfd_vma qaddr
= offset
& ~(bfd_vma
) 15;
4764 bfd_vma bit
= ((bfd_vma
) 8) >> ((offset
& 15) >> 2);
4765 if (sfixup
->reloc_count
== 0)
4767 FIXUP_PUT (output_bfd
, htab
, 0, qaddr
| bit
);
4768 sfixup
->reloc_count
++;
4772 bfd_vma base
= FIXUP_GET (output_bfd
, htab
, sfixup
->reloc_count
- 1);
4773 if (qaddr
!= (base
& ~(bfd_vma
) 15))
4775 if ((sfixup
->reloc_count
+ 1) * FIXUP_RECORD_SIZE
> sfixup
->size
)
4776 (*_bfd_error_handler
) (_("fatal error while creating .fixup"));
4777 FIXUP_PUT (output_bfd
, htab
, sfixup
->reloc_count
, qaddr
| bit
);
4778 sfixup
->reloc_count
++;
4781 FIXUP_PUT (output_bfd
, htab
, sfixup
->reloc_count
- 1, base
| bit
);
4785 /* Apply RELOCS to CONTENTS of INPUT_SECTION from INPUT_BFD. */
4788 spu_elf_relocate_section (bfd
*output_bfd
,
4789 struct bfd_link_info
*info
,
4791 asection
*input_section
,
4793 Elf_Internal_Rela
*relocs
,
4794 Elf_Internal_Sym
*local_syms
,
4795 asection
**local_sections
)
4797 Elf_Internal_Shdr
*symtab_hdr
;
4798 struct elf_link_hash_entry
**sym_hashes
;
4799 Elf_Internal_Rela
*rel
, *relend
;
4800 struct spu_link_hash_table
*htab
;
4803 bfd_boolean emit_these_relocs
= FALSE
;
4804 bfd_boolean is_ea_sym
;
4806 unsigned int iovl
= 0;
4808 htab
= spu_hash_table (info
);
4809 stubs
= (htab
->stub_sec
!= NULL
4810 && maybe_needs_stubs (input_section
));
4811 iovl
= overlay_index (input_section
);
4812 ea
= bfd_get_section_by_name (output_bfd
, "._ea");
4813 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
4814 sym_hashes
= (struct elf_link_hash_entry
**) (elf_sym_hashes (input_bfd
));
4817 relend
= relocs
+ input_section
->reloc_count
;
4818 for (; rel
< relend
; rel
++)
4821 reloc_howto_type
*howto
;
4822 unsigned int r_symndx
;
4823 Elf_Internal_Sym
*sym
;
4825 struct elf_link_hash_entry
*h
;
4826 const char *sym_name
;
4829 bfd_reloc_status_type r
;
4830 bfd_boolean unresolved_reloc
;
4831 enum _stub_type stub_type
;
4833 r_symndx
= ELF32_R_SYM (rel
->r_info
);
4834 r_type
= ELF32_R_TYPE (rel
->r_info
);
4835 howto
= elf_howto_table
+ r_type
;
4836 unresolved_reloc
= FALSE
;
4840 if (r_symndx
< symtab_hdr
->sh_info
)
4842 sym
= local_syms
+ r_symndx
;
4843 sec
= local_sections
[r_symndx
];
4844 sym_name
= bfd_elf_sym_name (input_bfd
, symtab_hdr
, sym
, sec
);
4845 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
4849 if (sym_hashes
== NULL
)
4852 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
4854 while (h
->root
.type
== bfd_link_hash_indirect
4855 || h
->root
.type
== bfd_link_hash_warning
)
4856 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4859 if (h
->root
.type
== bfd_link_hash_defined
4860 || h
->root
.type
== bfd_link_hash_defweak
)
4862 sec
= h
->root
.u
.def
.section
;
4864 || sec
->output_section
== NULL
)
4865 /* Set a flag that will be cleared later if we find a
4866 relocation value for this symbol. output_section
4867 is typically NULL for symbols satisfied by a shared
4869 unresolved_reloc
= TRUE
;
4871 relocation
= (h
->root
.u
.def
.value
4872 + sec
->output_section
->vma
4873 + sec
->output_offset
);
4875 else if (h
->root
.type
== bfd_link_hash_undefweak
)
4877 else if (info
->unresolved_syms_in_objects
== RM_IGNORE
4878 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
4880 else if (!info
->relocatable
4881 && !(r_type
== R_SPU_PPU32
|| r_type
== R_SPU_PPU64
))
4884 err
= (info
->unresolved_syms_in_objects
== RM_GENERATE_ERROR
4885 || ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
);
4886 if (!info
->callbacks
->undefined_symbol (info
,
4887 h
->root
.root
.string
,
4890 rel
->r_offset
, err
))
4893 sym_name
= h
->root
.root
.string
;
4896 if (sec
!= NULL
&& discarded_section (sec
))
4897 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
4898 rel
, 1, relend
, howto
, 0, contents
);
4900 if (info
->relocatable
)
4903 /* Change "a rt,ra,rb" to "ai rt,ra,0". */
4904 if (r_type
== R_SPU_ADD_PIC
4906 && !(h
->def_regular
|| ELF_COMMON_DEF_P (h
)))
4908 bfd_byte
*loc
= contents
+ rel
->r_offset
;
4914 is_ea_sym
= (ea
!= NULL
4916 && sec
->output_section
== ea
);
4918 /* If this symbol is in an overlay area, we may need to relocate
4919 to the overlay stub. */
4920 addend
= rel
->r_addend
;
4923 && (stub_type
= needs_ovl_stub (h
, sym
, sec
, input_section
, rel
,
4924 contents
, info
)) != no_stub
)
4926 unsigned int ovl
= 0;
4927 struct got_entry
*g
, **head
;
4929 if (stub_type
!= nonovl_stub
)
4933 head
= &h
->got
.glist
;
4935 head
= elf_local_got_ents (input_bfd
) + r_symndx
;
4937 for (g
= *head
; g
!= NULL
; g
= g
->next
)
4938 if (htab
->params
->ovly_flavour
== ovly_soft_icache
4940 && g
->br_addr
== (rel
->r_offset
4941 + input_section
->output_offset
4942 + input_section
->output_section
->vma
))
4943 : g
->addend
== addend
&& (g
->ovl
== ovl
|| g
->ovl
== 0))
4948 relocation
= g
->stub_addr
;
4953 /* For soft icache, encode the overlay index into addresses. */
4954 if (htab
->params
->ovly_flavour
== ovly_soft_icache
4955 && (r_type
== R_SPU_ADDR16_HI
4956 || r_type
== R_SPU_ADDR32
|| r_type
== R_SPU_REL32
)
4959 unsigned int ovl
= overlay_index (sec
);
4962 unsigned int set_id
= ((ovl
- 1) >> htab
->num_lines_log2
) + 1;
4963 relocation
+= set_id
<< 18;
4968 if (htab
->params
->emit_fixups
&& !info
->relocatable
4969 && (input_section
->flags
& SEC_ALLOC
) != 0
4970 && r_type
== R_SPU_ADDR32
)
4973 offset
= rel
->r_offset
+ input_section
->output_section
->vma
4974 + input_section
->output_offset
;
4975 spu_elf_emit_fixup (output_bfd
, info
, offset
);
4978 if (unresolved_reloc
)
4980 else if (r_type
== R_SPU_PPU32
|| r_type
== R_SPU_PPU64
)
4984 /* ._ea is a special section that isn't allocated in SPU
4985 memory, but rather occupies space in PPU memory as
4986 part of an embedded ELF image. If this reloc is
4987 against a symbol defined in ._ea, then transform the
4988 reloc into an equivalent one without a symbol
4989 relative to the start of the ELF image. */
4990 rel
->r_addend
+= (relocation
4992 + elf_section_data (ea
)->this_hdr
.sh_offset
);
4993 rel
->r_info
= ELF32_R_INFO (0, r_type
);
4995 emit_these_relocs
= TRUE
;
4999 unresolved_reloc
= TRUE
;
5001 if (unresolved_reloc
5002 && _bfd_elf_section_offset (output_bfd
, info
, input_section
,
5003 rel
->r_offset
) != (bfd_vma
) -1)
5005 (*_bfd_error_handler
)
5006 (_("%B(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
5008 bfd_get_section_name (input_bfd
, input_section
),
5009 (long) rel
->r_offset
,
5015 r
= _bfd_final_link_relocate (howto
,
5019 rel
->r_offset
, relocation
, addend
);
5021 if (r
!= bfd_reloc_ok
)
5023 const char *msg
= (const char *) 0;
5027 case bfd_reloc_overflow
:
5028 if (!((*info
->callbacks
->reloc_overflow
)
5029 (info
, (h
? &h
->root
: NULL
), sym_name
, howto
->name
,
5030 (bfd_vma
) 0, input_bfd
, input_section
, rel
->r_offset
)))
5034 case bfd_reloc_undefined
:
5035 if (!((*info
->callbacks
->undefined_symbol
)
5036 (info
, sym_name
, input_bfd
, input_section
,
5037 rel
->r_offset
, TRUE
)))
5041 case bfd_reloc_outofrange
:
5042 msg
= _("internal error: out of range error");
5045 case bfd_reloc_notsupported
:
5046 msg
= _("internal error: unsupported relocation error");
5049 case bfd_reloc_dangerous
:
5050 msg
= _("internal error: dangerous error");
5054 msg
= _("internal error: unknown error");
5059 if (!((*info
->callbacks
->warning
)
5060 (info
, msg
, sym_name
, input_bfd
, input_section
,
5069 && emit_these_relocs
5070 && !info
->emitrelocations
)
5072 Elf_Internal_Rela
*wrel
;
5073 Elf_Internal_Shdr
*rel_hdr
;
5075 wrel
= rel
= relocs
;
5076 relend
= relocs
+ input_section
->reloc_count
;
5077 for (; rel
< relend
; rel
++)
5081 r_type
= ELF32_R_TYPE (rel
->r_info
);
5082 if (r_type
== R_SPU_PPU32
|| r_type
== R_SPU_PPU64
)
5085 input_section
->reloc_count
= wrel
- relocs
;
5086 /* Backflips for _bfd_elf_link_output_relocs. */
5087 rel_hdr
= _bfd_elf_single_rel_hdr (input_section
);
5088 rel_hdr
->sh_size
= input_section
->reloc_count
* rel_hdr
->sh_entsize
;
5096 spu_elf_finish_dynamic_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
5097 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
5102 /* Adjust _SPUEAR_ syms to point at their overlay stubs. */
5105 spu_elf_output_symbol_hook (struct bfd_link_info
*info
,
5106 const char *sym_name ATTRIBUTE_UNUSED
,
5107 Elf_Internal_Sym
*sym
,
5108 asection
*sym_sec ATTRIBUTE_UNUSED
,
5109 struct elf_link_hash_entry
*h
)
5111 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
5113 if (!info
->relocatable
5114 && htab
->stub_sec
!= NULL
5116 && (h
->root
.type
== bfd_link_hash_defined
5117 || h
->root
.type
== bfd_link_hash_defweak
)
5119 && strncmp (h
->root
.root
.string
, "_SPUEAR_", 8) == 0)
5121 struct got_entry
*g
;
5123 for (g
= h
->got
.glist
; g
!= NULL
; g
= g
->next
)
5124 if (htab
->params
->ovly_flavour
== ovly_soft_icache
5125 ? g
->br_addr
== g
->stub_addr
5126 : g
->addend
== 0 && g
->ovl
== 0)
5128 sym
->st_shndx
= (_bfd_elf_section_from_bfd_section
5129 (htab
->stub_sec
[0]->output_section
->owner
,
5130 htab
->stub_sec
[0]->output_section
));
5131 sym
->st_value
= g
->stub_addr
;
5139 static int spu_plugin
= 0;
5142 spu_elf_plugin (int val
)
5147 /* Set ELF header e_type for plugins. */
5150 spu_elf_post_process_headers (bfd
*abfd
,
5151 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
5155 Elf_Internal_Ehdr
*i_ehdrp
= elf_elfheader (abfd
);
5157 i_ehdrp
->e_type
= ET_DYN
;
5161 /* We may add an extra PT_LOAD segment for .toe. We also need extra
5162 segments for overlays. */
5165 spu_elf_additional_program_headers (bfd
*abfd
, struct bfd_link_info
*info
)
5172 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
5173 extra
= htab
->num_overlays
;
5179 sec
= bfd_get_section_by_name (abfd
, ".toe");
5180 if (sec
!= NULL
&& (sec
->flags
& SEC_LOAD
) != 0)
5186 /* Remove .toe section from other PT_LOAD segments and put it in
5187 a segment of its own. Put overlays in separate segments too. */
5190 spu_elf_modify_segment_map (bfd
*abfd
, struct bfd_link_info
*info
)
5193 struct elf_segment_map
*m
, *m_overlay
;
5194 struct elf_segment_map
**p
, **p_overlay
;
5200 toe
= bfd_get_section_by_name (abfd
, ".toe");
5201 for (m
= elf_seg_map (abfd
); m
!= NULL
; m
= m
->next
)
5202 if (m
->p_type
== PT_LOAD
&& m
->count
> 1)
5203 for (i
= 0; i
< m
->count
; i
++)
5204 if ((s
= m
->sections
[i
]) == toe
5205 || spu_elf_section_data (s
)->u
.o
.ovl_index
!= 0)
5207 struct elf_segment_map
*m2
;
5210 if (i
+ 1 < m
->count
)
5212 amt
= sizeof (struct elf_segment_map
);
5213 amt
+= (m
->count
- (i
+ 2)) * sizeof (m
->sections
[0]);
5214 m2
= bfd_zalloc (abfd
, amt
);
5217 m2
->count
= m
->count
- (i
+ 1);
5218 memcpy (m2
->sections
, m
->sections
+ i
+ 1,
5219 m2
->count
* sizeof (m
->sections
[0]));
5220 m2
->p_type
= PT_LOAD
;
5228 amt
= sizeof (struct elf_segment_map
);
5229 m2
= bfd_zalloc (abfd
, amt
);
5232 m2
->p_type
= PT_LOAD
;
5234 m2
->sections
[0] = s
;
5242 /* Some SPU ELF loaders ignore the PF_OVERLAY flag and just load all
5243 PT_LOAD segments. This can cause the .ovl.init section to be
5244 overwritten with the contents of some overlay segment. To work
5245 around this issue, we ensure that all PF_OVERLAY segments are
5246 sorted first amongst the program headers; this ensures that even
5247 with a broken loader, the .ovl.init section (which is not marked
5248 as PF_OVERLAY) will be placed into SPU local store on startup. */
5250 /* Move all overlay segments onto a separate list. */
5251 p
= &elf_seg_map (abfd
);
5252 p_overlay
= &m_overlay
;
5255 if ((*p
)->p_type
== PT_LOAD
&& (*p
)->count
== 1
5256 && spu_elf_section_data ((*p
)->sections
[0])->u
.o
.ovl_index
!= 0)
5261 p_overlay
= &m
->next
;
5268 /* Re-insert overlay segments at the head of the segment map. */
5269 *p_overlay
= elf_seg_map (abfd
);
5270 elf_seg_map (abfd
) = m_overlay
;
5275 /* Tweak the section type of .note.spu_name. */
5278 spu_elf_fake_sections (bfd
*obfd ATTRIBUTE_UNUSED
,
5279 Elf_Internal_Shdr
*hdr
,
5282 if (strcmp (sec
->name
, SPU_PTNOTE_SPUNAME
) == 0)
5283 hdr
->sh_type
= SHT_NOTE
;
5287 /* Tweak phdrs before writing them out. */
5290 spu_elf_modify_program_headers (bfd
*abfd
, struct bfd_link_info
*info
)
5292 const struct elf_backend_data
*bed
;
5293 struct elf_obj_tdata
*tdata
;
5294 Elf_Internal_Phdr
*phdr
, *last
;
5295 struct spu_link_hash_table
*htab
;
5302 bed
= get_elf_backend_data (abfd
);
5303 tdata
= elf_tdata (abfd
);
5305 count
= elf_program_header_size (abfd
) / bed
->s
->sizeof_phdr
;
5306 htab
= spu_hash_table (info
);
5307 if (htab
->num_overlays
!= 0)
5309 struct elf_segment_map
*m
;
5312 for (i
= 0, m
= elf_seg_map (abfd
); m
; ++i
, m
= m
->next
)
5314 && (o
= spu_elf_section_data (m
->sections
[0])->u
.o
.ovl_index
) != 0)
5316 /* Mark this as an overlay header. */
5317 phdr
[i
].p_flags
|= PF_OVERLAY
;
5319 if (htab
->ovtab
!= NULL
&& htab
->ovtab
->size
!= 0
5320 && htab
->params
->ovly_flavour
!= ovly_soft_icache
)
5322 bfd_byte
*p
= htab
->ovtab
->contents
;
5323 unsigned int off
= o
* 16 + 8;
5325 /* Write file_off into _ovly_table. */
5326 bfd_put_32 (htab
->ovtab
->owner
, phdr
[i
].p_offset
, p
+ off
);
5329 /* Soft-icache has its file offset put in .ovl.init. */
5330 if (htab
->init
!= NULL
&& htab
->init
->size
!= 0)
5332 bfd_vma val
= elf_section_data (htab
->ovl_sec
[0])->this_hdr
.sh_offset
;
5334 bfd_put_32 (htab
->init
->owner
, val
, htab
->init
->contents
+ 4);
5338 /* Round up p_filesz and p_memsz of PT_LOAD segments to multiples
5339 of 16. This should always be possible when using the standard
5340 linker scripts, but don't create overlapping segments if
5341 someone is playing games with linker scripts. */
5343 for (i
= count
; i
-- != 0; )
5344 if (phdr
[i
].p_type
== PT_LOAD
)
5348 adjust
= -phdr
[i
].p_filesz
& 15;
5351 && phdr
[i
].p_offset
+ phdr
[i
].p_filesz
> last
->p_offset
- adjust
)
5354 adjust
= -phdr
[i
].p_memsz
& 15;
5357 && phdr
[i
].p_filesz
!= 0
5358 && phdr
[i
].p_vaddr
+ phdr
[i
].p_memsz
> last
->p_vaddr
- adjust
5359 && phdr
[i
].p_vaddr
+ phdr
[i
].p_memsz
<= last
->p_vaddr
)
5362 if (phdr
[i
].p_filesz
!= 0)
5366 if (i
== (unsigned int) -1)
5367 for (i
= count
; i
-- != 0; )
5368 if (phdr
[i
].p_type
== PT_LOAD
)
5372 adjust
= -phdr
[i
].p_filesz
& 15;
5373 phdr
[i
].p_filesz
+= adjust
;
5375 adjust
= -phdr
[i
].p_memsz
& 15;
5376 phdr
[i
].p_memsz
+= adjust
;
5383 spu_elf_size_sections (bfd
* output_bfd
, struct bfd_link_info
*info
)
5385 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
5386 if (htab
->params
->emit_fixups
)
5388 asection
*sfixup
= htab
->sfixup
;
5389 int fixup_count
= 0;
5393 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
5397 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
5400 /* Walk over each section attached to the input bfd. */
5401 for (isec
= ibfd
->sections
; isec
!= NULL
; isec
= isec
->next
)
5403 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
5406 /* If there aren't any relocs, then there's nothing more
5408 if ((isec
->flags
& SEC_ALLOC
) == 0
5409 || (isec
->flags
& SEC_RELOC
) == 0
5410 || isec
->reloc_count
== 0)
5413 /* Get the relocs. */
5415 _bfd_elf_link_read_relocs (ibfd
, isec
, NULL
, NULL
,
5417 if (internal_relocs
== NULL
)
5420 /* 1 quadword can contain up to 4 R_SPU_ADDR32
5421 relocations. They are stored in a single word by
5422 saving the upper 28 bits of the address and setting the
5423 lower 4 bits to a bit mask of the words that have the
5424 relocation. BASE_END keeps track of the next quadword. */
5425 irela
= internal_relocs
;
5426 irelaend
= irela
+ isec
->reloc_count
;
5428 for (; irela
< irelaend
; irela
++)
5429 if (ELF32_R_TYPE (irela
->r_info
) == R_SPU_ADDR32
5430 && irela
->r_offset
>= base_end
)
5432 base_end
= (irela
->r_offset
& ~(bfd_vma
) 15) + 16;
5438 /* We always have a NULL fixup as a sentinel */
5439 size
= (fixup_count
+ 1) * FIXUP_RECORD_SIZE
;
5440 if (!bfd_set_section_size (output_bfd
, sfixup
, size
))
5442 sfixup
->contents
= (bfd_byte
*) bfd_zalloc (info
->input_bfds
, size
);
5443 if (sfixup
->contents
== NULL
)
5449 #define TARGET_BIG_SYM bfd_elf32_spu_vec
5450 #define TARGET_BIG_NAME "elf32-spu"
5451 #define ELF_ARCH bfd_arch_spu
5452 #define ELF_TARGET_ID SPU_ELF_DATA
5453 #define ELF_MACHINE_CODE EM_SPU
5454 /* This matches the alignment need for DMA. */
5455 #define ELF_MAXPAGESIZE 0x80
5456 #define elf_backend_rela_normal 1
5457 #define elf_backend_can_gc_sections 1
5459 #define bfd_elf32_bfd_reloc_type_lookup spu_elf_reloc_type_lookup
5460 #define bfd_elf32_bfd_reloc_name_lookup spu_elf_reloc_name_lookup
5461 #define elf_info_to_howto spu_elf_info_to_howto
5462 #define elf_backend_count_relocs spu_elf_count_relocs
5463 #define elf_backend_relocate_section spu_elf_relocate_section
5464 #define elf_backend_finish_dynamic_sections spu_elf_finish_dynamic_sections
5465 #define elf_backend_symbol_processing spu_elf_backend_symbol_processing
5466 #define elf_backend_link_output_symbol_hook spu_elf_output_symbol_hook
5467 #define elf_backend_object_p spu_elf_object_p
5468 #define bfd_elf32_new_section_hook spu_elf_new_section_hook
5469 #define bfd_elf32_bfd_link_hash_table_create spu_elf_link_hash_table_create
5471 #define elf_backend_additional_program_headers spu_elf_additional_program_headers
5472 #define elf_backend_modify_segment_map spu_elf_modify_segment_map
5473 #define elf_backend_modify_program_headers spu_elf_modify_program_headers
5474 #define elf_backend_post_process_headers spu_elf_post_process_headers
5475 #define elf_backend_fake_sections spu_elf_fake_sections
5476 #define elf_backend_special_sections spu_elf_special_sections
5477 #define bfd_elf32_bfd_final_link spu_elf_final_link
5479 #include "elf32-target.h"