1 /* SPU specific support for 32-bit ELF
3 Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
22 #include "libiberty.h"
28 #include "elf32-spu.h"
30 /* We use RELA style relocs. Don't define USE_REL. */
32 static bfd_reloc_status_type
spu_elf_rel9 (bfd
*, arelent
*, asymbol
*,
36 /* Values of type 'enum elf_spu_reloc_type' are used to index this
37 array, so it must be declared in the order of that type. */
39 static reloc_howto_type elf_howto_table
[] = {
40 HOWTO (R_SPU_NONE
, 0, 0, 0, FALSE
, 0, complain_overflow_dont
,
41 bfd_elf_generic_reloc
, "SPU_NONE",
42 FALSE
, 0, 0x00000000, FALSE
),
43 HOWTO (R_SPU_ADDR10
, 4, 2, 10, FALSE
, 14, complain_overflow_bitfield
,
44 bfd_elf_generic_reloc
, "SPU_ADDR10",
45 FALSE
, 0, 0x00ffc000, FALSE
),
46 HOWTO (R_SPU_ADDR16
, 2, 2, 16, FALSE
, 7, complain_overflow_bitfield
,
47 bfd_elf_generic_reloc
, "SPU_ADDR16",
48 FALSE
, 0, 0x007fff80, FALSE
),
49 HOWTO (R_SPU_ADDR16_HI
, 16, 2, 16, FALSE
, 7, complain_overflow_bitfield
,
50 bfd_elf_generic_reloc
, "SPU_ADDR16_HI",
51 FALSE
, 0, 0x007fff80, FALSE
),
52 HOWTO (R_SPU_ADDR16_LO
, 0, 2, 16, FALSE
, 7, complain_overflow_dont
,
53 bfd_elf_generic_reloc
, "SPU_ADDR16_LO",
54 FALSE
, 0, 0x007fff80, FALSE
),
55 HOWTO (R_SPU_ADDR18
, 0, 2, 18, FALSE
, 7, complain_overflow_bitfield
,
56 bfd_elf_generic_reloc
, "SPU_ADDR18",
57 FALSE
, 0, 0x01ffff80, FALSE
),
58 HOWTO (R_SPU_ADDR32
, 0, 2, 32, FALSE
, 0, complain_overflow_dont
,
59 bfd_elf_generic_reloc
, "SPU_ADDR32",
60 FALSE
, 0, 0xffffffff, FALSE
),
61 HOWTO (R_SPU_REL16
, 2, 2, 16, TRUE
, 7, complain_overflow_bitfield
,
62 bfd_elf_generic_reloc
, "SPU_REL16",
63 FALSE
, 0, 0x007fff80, TRUE
),
64 HOWTO (R_SPU_ADDR7
, 0, 2, 7, FALSE
, 14, complain_overflow_dont
,
65 bfd_elf_generic_reloc
, "SPU_ADDR7",
66 FALSE
, 0, 0x001fc000, FALSE
),
67 HOWTO (R_SPU_REL9
, 2, 2, 9, TRUE
, 0, complain_overflow_signed
,
68 spu_elf_rel9
, "SPU_REL9",
69 FALSE
, 0, 0x0180007f, TRUE
),
70 HOWTO (R_SPU_REL9I
, 2, 2, 9, TRUE
, 0, complain_overflow_signed
,
71 spu_elf_rel9
, "SPU_REL9I",
72 FALSE
, 0, 0x0000c07f, TRUE
),
73 HOWTO (R_SPU_ADDR10I
, 0, 2, 10, FALSE
, 14, complain_overflow_signed
,
74 bfd_elf_generic_reloc
, "SPU_ADDR10I",
75 FALSE
, 0, 0x00ffc000, FALSE
),
76 HOWTO (R_SPU_ADDR16I
, 0, 2, 16, FALSE
, 7, complain_overflow_signed
,
77 bfd_elf_generic_reloc
, "SPU_ADDR16I",
78 FALSE
, 0, 0x007fff80, FALSE
),
79 HOWTO (R_SPU_REL32
, 0, 2, 32, TRUE
, 0, complain_overflow_dont
,
80 bfd_elf_generic_reloc
, "SPU_REL32",
81 FALSE
, 0, 0xffffffff, TRUE
),
82 HOWTO (R_SPU_ADDR16X
, 0, 2, 16, FALSE
, 7, complain_overflow_bitfield
,
83 bfd_elf_generic_reloc
, "SPU_ADDR16X",
84 FALSE
, 0, 0x007fff80, FALSE
),
85 HOWTO (R_SPU_PPU32
, 0, 2, 32, FALSE
, 0, complain_overflow_dont
,
86 bfd_elf_generic_reloc
, "SPU_PPU32",
87 FALSE
, 0, 0xffffffff, FALSE
),
88 HOWTO (R_SPU_PPU64
, 0, 4, 64, FALSE
, 0, complain_overflow_dont
,
89 bfd_elf_generic_reloc
, "SPU_PPU64",
93 static struct bfd_elf_special_section
const spu_elf_special_sections
[] = {
94 { "._ea", 4, 0, SHT_PROGBITS
, SHF_WRITE
},
95 { ".toe", 4, 0, SHT_NOBITS
, SHF_ALLOC
},
99 static enum elf_spu_reloc_type
100 spu_elf_bfd_to_reloc_type (bfd_reloc_code_real_type code
)
106 case BFD_RELOC_SPU_IMM10W
:
108 case BFD_RELOC_SPU_IMM16W
:
110 case BFD_RELOC_SPU_LO16
:
111 return R_SPU_ADDR16_LO
;
112 case BFD_RELOC_SPU_HI16
:
113 return R_SPU_ADDR16_HI
;
114 case BFD_RELOC_SPU_IMM18
:
116 case BFD_RELOC_SPU_PCREL16
:
118 case BFD_RELOC_SPU_IMM7
:
120 case BFD_RELOC_SPU_IMM8
:
122 case BFD_RELOC_SPU_PCREL9a
:
124 case BFD_RELOC_SPU_PCREL9b
:
126 case BFD_RELOC_SPU_IMM10
:
127 return R_SPU_ADDR10I
;
128 case BFD_RELOC_SPU_IMM16
:
129 return R_SPU_ADDR16I
;
132 case BFD_RELOC_32_PCREL
:
134 case BFD_RELOC_SPU_PPU32
:
136 case BFD_RELOC_SPU_PPU64
:
142 spu_elf_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
,
144 Elf_Internal_Rela
*dst
)
146 enum elf_spu_reloc_type r_type
;
148 r_type
= (enum elf_spu_reloc_type
) ELF32_R_TYPE (dst
->r_info
);
149 BFD_ASSERT (r_type
< R_SPU_max
);
150 cache_ptr
->howto
= &elf_howto_table
[(int) r_type
];
153 static reloc_howto_type
*
154 spu_elf_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
155 bfd_reloc_code_real_type code
)
157 enum elf_spu_reloc_type r_type
= spu_elf_bfd_to_reloc_type (code
);
159 if (r_type
== R_SPU_NONE
)
162 return elf_howto_table
+ r_type
;
165 static reloc_howto_type
*
166 spu_elf_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
171 for (i
= 0; i
< sizeof (elf_howto_table
) / sizeof (elf_howto_table
[0]); i
++)
172 if (elf_howto_table
[i
].name
!= NULL
173 && strcasecmp (elf_howto_table
[i
].name
, r_name
) == 0)
174 return &elf_howto_table
[i
];
179 /* Apply R_SPU_REL9 and R_SPU_REL9I relocs. */
181 static bfd_reloc_status_type
182 spu_elf_rel9 (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
183 void *data
, asection
*input_section
,
184 bfd
*output_bfd
, char **error_message
)
186 bfd_size_type octets
;
190 /* If this is a relocatable link (output_bfd test tells us), just
191 call the generic function. Any adjustment will be done at final
193 if (output_bfd
!= NULL
)
194 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
195 input_section
, output_bfd
, error_message
);
197 if (reloc_entry
->address
> bfd_get_section_limit (abfd
, input_section
))
198 return bfd_reloc_outofrange
;
199 octets
= reloc_entry
->address
* bfd_octets_per_byte (abfd
);
201 /* Get symbol value. */
203 if (!bfd_is_com_section (symbol
->section
))
205 if (symbol
->section
->output_section
)
206 val
+= symbol
->section
->output_section
->vma
;
208 val
+= reloc_entry
->addend
;
210 /* Make it pc-relative. */
211 val
-= input_section
->output_section
->vma
+ input_section
->output_offset
;
214 if (val
+ 256 >= 512)
215 return bfd_reloc_overflow
;
217 insn
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ octets
);
219 /* Move two high bits of value to REL9I and REL9 position.
220 The mask will take care of selecting the right field. */
221 val
= (val
& 0x7f) | ((val
& 0x180) << 7) | ((val
& 0x180) << 16);
222 insn
&= ~reloc_entry
->howto
->dst_mask
;
223 insn
|= val
& reloc_entry
->howto
->dst_mask
;
224 bfd_put_32 (abfd
, insn
, (bfd_byte
*) data
+ octets
);
229 spu_elf_new_section_hook (bfd
*abfd
, asection
*sec
)
231 if (!sec
->used_by_bfd
)
233 struct _spu_elf_section_data
*sdata
;
235 sdata
= bfd_zalloc (abfd
, sizeof (*sdata
));
238 sec
->used_by_bfd
= sdata
;
241 return _bfd_elf_new_section_hook (abfd
, sec
);
244 /* Set up overlay info for executables. */
247 spu_elf_object_p (bfd
*abfd
)
249 if ((abfd
->flags
& (EXEC_P
| DYNAMIC
)) != 0)
251 unsigned int i
, num_ovl
, num_buf
;
252 Elf_Internal_Phdr
*phdr
= elf_tdata (abfd
)->phdr
;
253 Elf_Internal_Ehdr
*ehdr
= elf_elfheader (abfd
);
254 Elf_Internal_Phdr
*last_phdr
= NULL
;
256 for (num_buf
= 0, num_ovl
= 0, i
= 0; i
< ehdr
->e_phnum
; i
++, phdr
++)
257 if (phdr
->p_type
== PT_LOAD
&& (phdr
->p_flags
& PF_OVERLAY
) != 0)
262 if (last_phdr
== NULL
263 || ((last_phdr
->p_vaddr
^ phdr
->p_vaddr
) & 0x3ffff) != 0)
266 for (j
= 1; j
< elf_numsections (abfd
); j
++)
268 Elf_Internal_Shdr
*shdr
= elf_elfsections (abfd
)[j
];
270 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY (shdr
, phdr
))
272 asection
*sec
= shdr
->bfd_section
;
273 spu_elf_section_data (sec
)->u
.o
.ovl_index
= num_ovl
;
274 spu_elf_section_data (sec
)->u
.o
.ovl_buf
= num_buf
;
282 /* Specially mark defined symbols named _EAR_* with BSF_KEEP so that
283 strip --strip-unneeded will not remove them. */
286 spu_elf_backend_symbol_processing (bfd
*abfd ATTRIBUTE_UNUSED
, asymbol
*sym
)
288 if (sym
->name
!= NULL
289 && sym
->section
!= bfd_abs_section_ptr
290 && strncmp (sym
->name
, "_EAR_", 5) == 0)
291 sym
->flags
|= BSF_KEEP
;
294 /* SPU ELF linker hash table. */
296 struct spu_link_hash_table
298 struct elf_link_hash_table elf
;
300 struct spu_elf_params
*params
;
302 /* Shortcuts to overlay sections. */
308 /* Count of stubs in each overlay section. */
309 unsigned int *stub_count
;
311 /* The stub section for each overlay section. */
314 struct elf_link_hash_entry
*ovly_entry
[2];
316 /* Number of overlay buffers. */
317 unsigned int num_buf
;
319 /* Total number of overlays. */
320 unsigned int num_overlays
;
322 /* For soft icache. */
323 unsigned int line_size_log2
;
324 unsigned int num_lines_log2
;
325 unsigned int fromelem_size_log2
;
327 /* How much memory we have. */
328 unsigned int local_store
;
329 /* Local store --auto-overlay should reserve for non-overlay
330 functions and data. */
331 unsigned int overlay_fixed
;
332 /* Local store --auto-overlay should reserve for stack and heap. */
333 unsigned int reserved
;
334 /* If reserved is not specified, stack analysis will calculate a value
335 for the stack. This parameter adjusts that value to allow for
336 negative sp access (the ABI says 2000 bytes below sp are valid,
337 and the overlay manager uses some of this area). */
338 int extra_stack_space
;
339 /* Count of overlay stubs needed in non-overlay area. */
340 unsigned int non_ovly_stub
;
343 unsigned int stub_err
: 1;
346 /* Hijack the generic got fields for overlay stub accounting. */
350 struct got_entry
*next
;
359 #define spu_hash_table(p) \
360 ((struct spu_link_hash_table *) ((p)->hash))
364 struct function_info
*fun
;
365 struct call_info
*next
;
367 unsigned int max_depth
;
368 unsigned int is_tail
: 1;
369 unsigned int is_pasted
: 1;
370 unsigned int broken_cycle
: 1;
371 unsigned int priority
: 13;
376 /* List of functions called. Also branches to hot/cold part of
378 struct call_info
*call_list
;
379 /* For hot/cold part of function, point to owner. */
380 struct function_info
*start
;
381 /* Symbol at start of function. */
383 Elf_Internal_Sym
*sym
;
384 struct elf_link_hash_entry
*h
;
386 /* Function section. */
389 /* Where last called from, and number of sections called from. */
390 asection
*last_caller
;
391 unsigned int call_count
;
392 /* Address range of (this part of) function. */
394 /* Offset where we found a store of lr, or -1 if none found. */
396 /* Offset where we found the stack adjustment insn. */
400 /* Distance from root of call tree. Tail and hot/cold branches
401 count as one deeper. We aren't counting stack frames here. */
403 /* Set if global symbol. */
404 unsigned int global
: 1;
405 /* Set if known to be start of function (as distinct from a hunk
406 in hot/cold section. */
407 unsigned int is_func
: 1;
408 /* Set if not a root node. */
409 unsigned int non_root
: 1;
410 /* Flags used during call tree traversal. It's cheaper to replicate
411 the visit flags than have one which needs clearing after a traversal. */
412 unsigned int visit1
: 1;
413 unsigned int visit2
: 1;
414 unsigned int marking
: 1;
415 unsigned int visit3
: 1;
416 unsigned int visit4
: 1;
417 unsigned int visit5
: 1;
418 unsigned int visit6
: 1;
419 unsigned int visit7
: 1;
422 struct spu_elf_stack_info
426 /* Variable size array describing functions, one per contiguous
427 address range belonging to a function. */
428 struct function_info fun
[1];
431 static struct function_info
*find_function (asection
*, bfd_vma
,
432 struct bfd_link_info
*);
434 /* Create a spu ELF linker hash table. */
436 static struct bfd_link_hash_table
*
437 spu_elf_link_hash_table_create (bfd
*abfd
)
439 struct spu_link_hash_table
*htab
;
441 htab
= bfd_malloc (sizeof (*htab
));
445 if (!_bfd_elf_link_hash_table_init (&htab
->elf
, abfd
,
446 _bfd_elf_link_hash_newfunc
,
447 sizeof (struct elf_link_hash_entry
)))
453 memset (&htab
->ovtab
, 0,
454 sizeof (*htab
) - offsetof (struct spu_link_hash_table
, ovtab
));
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
)
558 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
559 if (bfd_get_section_by_name (ibfd
, SPU_PTNOTE_SPUNAME
) != NULL
)
564 /* Make SPU_PTNOTE_SPUNAME section. */
571 ibfd
= info
->input_bfds
;
572 flags
= SEC_LOAD
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
;
573 s
= bfd_make_section_anyway_with_flags (ibfd
, SPU_PTNOTE_SPUNAME
, flags
);
575 || !bfd_set_section_alignment (ibfd
, s
, 4))
578 name_len
= strlen (bfd_get_filename (info
->output_bfd
)) + 1;
579 size
= 12 + ((sizeof (SPU_PLUGIN_NAME
) + 3) & -4);
580 size
+= (name_len
+ 3) & -4;
582 if (!bfd_set_section_size (ibfd
, s
, size
))
585 data
= bfd_zalloc (ibfd
, size
);
589 bfd_put_32 (ibfd
, sizeof (SPU_PLUGIN_NAME
), data
+ 0);
590 bfd_put_32 (ibfd
, name_len
, data
+ 4);
591 bfd_put_32 (ibfd
, 1, data
+ 8);
592 memcpy (data
+ 12, SPU_PLUGIN_NAME
, sizeof (SPU_PLUGIN_NAME
));
593 memcpy (data
+ 12 + ((sizeof (SPU_PLUGIN_NAME
) + 3) & -4),
594 bfd_get_filename (info
->output_bfd
), name_len
);
601 /* qsort predicate to sort sections by vma. */
604 sort_sections (const void *a
, const void *b
)
606 const asection
*const *s1
= a
;
607 const asection
*const *s2
= b
;
608 bfd_signed_vma delta
= (*s1
)->vma
- (*s2
)->vma
;
611 return delta
< 0 ? -1 : 1;
613 return (*s1
)->index
- (*s2
)->index
;
616 /* Identify overlays in the output bfd, and number them.
617 Returns 0 on error, 1 if no overlays, 2 if overlays. */
620 spu_elf_find_overlays (struct bfd_link_info
*info
)
622 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
623 asection
**alloc_sec
;
624 unsigned int i
, n
, ovl_index
, num_buf
;
627 static const char *const entry_names
[2][2] = {
628 { "__ovly_load", "__icache_br_handler" },
629 { "__ovly_return", "__icache_call_handler" }
632 if (info
->output_bfd
->section_count
< 2)
636 = bfd_malloc (info
->output_bfd
->section_count
* sizeof (*alloc_sec
));
637 if (alloc_sec
== NULL
)
640 /* Pick out all the alloced sections. */
641 for (n
= 0, s
= info
->output_bfd
->sections
; s
!= NULL
; s
= s
->next
)
642 if ((s
->flags
& SEC_ALLOC
) != 0
643 && (s
->flags
& (SEC_LOAD
| SEC_THREAD_LOCAL
)) != SEC_THREAD_LOCAL
653 /* Sort them by vma. */
654 qsort (alloc_sec
, n
, sizeof (*alloc_sec
), sort_sections
);
656 ovl_end
= alloc_sec
[0]->vma
+ alloc_sec
[0]->size
;
657 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
659 /* Look for an overlapping vma to find the first overlay section. */
660 bfd_vma vma_start
= 0;
661 bfd_vma lma_start
= 0;
663 for (i
= 1; i
< n
; i
++)
666 if (s
->vma
< ovl_end
)
668 asection
*s0
= alloc_sec
[i
- 1];
670 if (strncmp (s0
->name
, ".ovl.init", 9) != 0)
676 << (htab
->num_lines_log2
+ htab
->line_size_log2
)));
681 ovl_end
= s
->vma
+ s
->size
;
684 /* Now find any sections within the cache area. */
685 for (ovl_index
= 0, num_buf
= 0; i
< n
; i
++)
688 if (s
->vma
>= ovl_end
)
691 /* A section in an overlay area called .ovl.init is not
692 an overlay, in the sense that it might be loaded in
693 by the overlay manager, but rather the initial
694 section contents for the overlay buffer. */
695 if (strncmp (s
->name
, ".ovl.init", 9) != 0)
697 num_buf
= ((s
->vma
- vma_start
) >> htab
->line_size_log2
) + 1;
698 if (((s
->vma
- vma_start
) & (htab
->params
->line_size
- 1))
699 || ((s
->lma
- lma_start
) & (htab
->params
->line_size
- 1)))
701 info
->callbacks
->einfo (_("%X%P: overlay section %A "
702 "does not start on a cache line.\n"),
704 bfd_set_error (bfd_error_bad_value
);
707 else if (s
->size
> htab
->params
->line_size
)
709 info
->callbacks
->einfo (_("%X%P: overlay section %A "
710 "is larger than a cache line.\n"),
712 bfd_set_error (bfd_error_bad_value
);
716 alloc_sec
[ovl_index
++] = s
;
717 spu_elf_section_data (s
)->u
.o
.ovl_index
718 = ((s
->lma
- lma_start
) >> htab
->line_size_log2
) + 1;
719 spu_elf_section_data (s
)->u
.o
.ovl_buf
= num_buf
;
723 /* Ensure there are no more overlay sections. */
727 if (s
->vma
< ovl_end
)
729 info
->callbacks
->einfo (_("%X%P: overlay section %A "
730 "is not in cache area.\n"),
732 bfd_set_error (bfd_error_bad_value
);
736 ovl_end
= s
->vma
+ s
->size
;
741 /* Look for overlapping vmas. Any with overlap must be overlays.
742 Count them. Also count the number of overlay regions. */
743 for (ovl_index
= 0, num_buf
= 0, i
= 1; i
< n
; i
++)
746 if (s
->vma
< ovl_end
)
748 asection
*s0
= alloc_sec
[i
- 1];
750 if (spu_elf_section_data (s0
)->u
.o
.ovl_index
== 0)
753 if (strncmp (s0
->name
, ".ovl.init", 9) != 0)
755 alloc_sec
[ovl_index
] = s0
;
756 spu_elf_section_data (s0
)->u
.o
.ovl_index
= ++ovl_index
;
757 spu_elf_section_data (s0
)->u
.o
.ovl_buf
= num_buf
;
760 ovl_end
= s
->vma
+ s
->size
;
762 if (strncmp (s
->name
, ".ovl.init", 9) != 0)
764 alloc_sec
[ovl_index
] = s
;
765 spu_elf_section_data (s
)->u
.o
.ovl_index
= ++ovl_index
;
766 spu_elf_section_data (s
)->u
.o
.ovl_buf
= num_buf
;
767 if (s0
->vma
!= s
->vma
)
769 info
->callbacks
->einfo (_("%X%P: overlay sections %A "
770 "and %A do not start at the "
773 bfd_set_error (bfd_error_bad_value
);
776 if (ovl_end
< s
->vma
+ s
->size
)
777 ovl_end
= s
->vma
+ s
->size
;
781 ovl_end
= s
->vma
+ s
->size
;
785 htab
->num_overlays
= ovl_index
;
786 htab
->num_buf
= num_buf
;
787 htab
->ovl_sec
= alloc_sec
;
792 for (i
= 0; i
< 2; i
++)
795 struct elf_link_hash_entry
*h
;
797 name
= entry_names
[i
][htab
->params
->ovly_flavour
];
798 h
= elf_link_hash_lookup (&htab
->elf
, name
, TRUE
, FALSE
, FALSE
);
802 if (h
->root
.type
== bfd_link_hash_new
)
804 h
->root
.type
= bfd_link_hash_undefined
;
806 h
->ref_regular_nonweak
= 1;
809 htab
->ovly_entry
[i
] = h
;
815 /* Non-zero to use bra in overlay stubs rather than br. */
818 #define BRA 0x30000000
819 #define BRASL 0x31000000
820 #define BR 0x32000000
821 #define BRSL 0x33000000
822 #define NOP 0x40200000
823 #define LNOP 0x00200000
824 #define ILA 0x42000000
826 /* Return true for all relative and absolute branch instructions.
834 brhnz 00100011 0.. */
837 is_branch (const unsigned char *insn
)
839 return (insn
[0] & 0xec) == 0x20 && (insn
[1] & 0x80) == 0;
842 /* Return true for all indirect branch instructions.
850 bihnz 00100101 011 */
853 is_indirect_branch (const unsigned char *insn
)
855 return (insn
[0] & 0xef) == 0x25 && (insn
[1] & 0x80) == 0;
858 /* Return true for branch hint instructions.
863 is_hint (const unsigned char *insn
)
865 return (insn
[0] & 0xfc) == 0x10;
868 /* True if INPUT_SECTION might need overlay stubs. */
871 maybe_needs_stubs (asection
*input_section
)
873 /* No stubs for debug sections and suchlike. */
874 if ((input_section
->flags
& SEC_ALLOC
) == 0)
877 /* No stubs for link-once sections that will be discarded. */
878 if (input_section
->output_section
== bfd_abs_section_ptr
)
881 /* Don't create stubs for .eh_frame references. */
882 if (strcmp (input_section
->name
, ".eh_frame") == 0)
904 /* Return non-zero if this reloc symbol should go via an overlay stub.
905 Return 2 if the stub must be in non-overlay area. */
907 static enum _stub_type
908 needs_ovl_stub (struct elf_link_hash_entry
*h
,
909 Elf_Internal_Sym
*sym
,
911 asection
*input_section
,
912 Elf_Internal_Rela
*irela
,
914 struct bfd_link_info
*info
)
916 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
917 enum elf_spu_reloc_type r_type
;
918 unsigned int sym_type
;
919 bfd_boolean branch
, hint
, call
;
920 enum _stub_type ret
= no_stub
;
924 || sym_sec
->output_section
== bfd_abs_section_ptr
925 || spu_elf_section_data (sym_sec
->output_section
) == NULL
)
930 /* Ensure no stubs for user supplied overlay manager syms. */
931 if (h
== htab
->ovly_entry
[0] || h
== htab
->ovly_entry
[1])
934 /* setjmp always goes via an overlay stub, because then the return
935 and hence the longjmp goes via __ovly_return. That magically
936 makes setjmp/longjmp between overlays work. */
937 if (strncmp (h
->root
.root
.string
, "setjmp", 6) == 0
938 && (h
->root
.root
.string
[6] == '\0' || h
->root
.root
.string
[6] == '@'))
945 sym_type
= ELF_ST_TYPE (sym
->st_info
);
947 r_type
= ELF32_R_TYPE (irela
->r_info
);
951 if (r_type
== R_SPU_REL16
|| r_type
== R_SPU_ADDR16
)
953 if (contents
== NULL
)
956 if (!bfd_get_section_contents (input_section
->owner
,
963 contents
+= irela
->r_offset
;
965 branch
= is_branch (contents
);
966 hint
= is_hint (contents
);
969 call
= (contents
[0] & 0xfd) == 0x31;
971 && sym_type
!= STT_FUNC
974 /* It's common for people to write assembly and forget
975 to give function symbols the right type. Handle
976 calls to such symbols, but warn so that (hopefully)
977 people will fix their code. We need the symbol
978 type to be correct to distinguish function pointer
979 initialisation from other pointer initialisations. */
980 const char *sym_name
;
983 sym_name
= h
->root
.root
.string
;
986 Elf_Internal_Shdr
*symtab_hdr
;
987 symtab_hdr
= &elf_tdata (input_section
->owner
)->symtab_hdr
;
988 sym_name
= bfd_elf_sym_name (input_section
->owner
,
993 (*_bfd_error_handler
) (_("warning: call to non-function"
994 " symbol %s defined in %B"),
995 sym_sec
->owner
, sym_name
);
1001 if ((!branch
&& htab
->params
->ovly_flavour
== ovly_soft_icache
)
1002 || (sym_type
!= STT_FUNC
1003 && !(branch
|| hint
)
1004 && (sym_sec
->flags
& SEC_CODE
) == 0))
1007 /* Usually, symbols in non-overlay sections don't need stubs. */
1008 if (spu_elf_section_data (sym_sec
->output_section
)->u
.o
.ovl_index
== 0
1009 && !htab
->params
->non_overlay_stubs
)
1012 /* A reference from some other section to a symbol in an overlay
1013 section needs a stub. */
1014 if (spu_elf_section_data (sym_sec
->output_section
)->u
.o
.ovl_index
1015 != spu_elf_section_data (input_section
->output_section
)->u
.o
.ovl_index
)
1017 if (call
|| sym_type
== STT_FUNC
)
1018 ret
= call_ovl_stub
;
1021 ret
= br000_ovl_stub
;
1025 unsigned int lrlive
= (contents
[1] & 0x70) >> 4;
1031 /* If this insn isn't a branch then we are possibly taking the
1032 address of a function and passing it out somehow. Soft-icache code
1033 always generates inline code to do indirect branches. */
1034 if (!(branch
|| hint
)
1035 && sym_type
== STT_FUNC
1036 && htab
->params
->ovly_flavour
!= ovly_soft_icache
)
1043 count_stub (struct spu_link_hash_table
*htab
,
1046 enum _stub_type stub_type
,
1047 struct elf_link_hash_entry
*h
,
1048 const Elf_Internal_Rela
*irela
)
1050 unsigned int ovl
= 0;
1051 struct got_entry
*g
, **head
;
1054 /* If this instruction is a branch or call, we need a stub
1055 for it. One stub per function per overlay.
1056 If it isn't a branch, then we are taking the address of
1057 this function so need a stub in the non-overlay area
1058 for it. One stub per function. */
1059 if (stub_type
!= nonovl_stub
)
1060 ovl
= spu_elf_section_data (isec
->output_section
)->u
.o
.ovl_index
;
1063 head
= &h
->got
.glist
;
1066 if (elf_local_got_ents (ibfd
) == NULL
)
1068 bfd_size_type amt
= (elf_tdata (ibfd
)->symtab_hdr
.sh_info
1069 * sizeof (*elf_local_got_ents (ibfd
)));
1070 elf_local_got_ents (ibfd
) = bfd_zmalloc (amt
);
1071 if (elf_local_got_ents (ibfd
) == NULL
)
1074 head
= elf_local_got_ents (ibfd
) + ELF32_R_SYM (irela
->r_info
);
1077 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1079 htab
->stub_count
[ovl
] += 1;
1085 addend
= irela
->r_addend
;
1089 struct got_entry
*gnext
;
1091 for (g
= *head
; g
!= NULL
; g
= g
->next
)
1092 if (g
->addend
== addend
&& g
->ovl
== 0)
1097 /* Need a new non-overlay area stub. Zap other stubs. */
1098 for (g
= *head
; g
!= NULL
; g
= gnext
)
1101 if (g
->addend
== addend
)
1103 htab
->stub_count
[g
->ovl
] -= 1;
1111 for (g
= *head
; g
!= NULL
; g
= g
->next
)
1112 if (g
->addend
== addend
&& (g
->ovl
== ovl
|| g
->ovl
== 0))
1118 g
= bfd_malloc (sizeof *g
);
1123 g
->stub_addr
= (bfd_vma
) -1;
1127 htab
->stub_count
[ovl
] += 1;
1133 /* Support two sizes of overlay stubs, a slower more compact stub of two
1134 intructions, and a faster stub of four instructions.
1135 Soft-icache stubs are four or eight words. */
1138 ovl_stub_size (struct spu_elf_params
*params
)
1140 return 16 << params
->ovly_flavour
>> params
->compact_stub
;
1144 ovl_stub_size_log2 (struct spu_elf_params
*params
)
1146 return 4 + params
->ovly_flavour
- params
->compact_stub
;
1149 /* Two instruction overlay stubs look like:
1151 brsl $75,__ovly_load
1152 .word target_ovl_and_address
1154 ovl_and_address is a word with the overlay number in the top 14 bits
1155 and local store address in the bottom 18 bits.
1157 Four instruction overlay stubs look like:
1161 ila $79,target_address
1164 Software icache stubs are:
1168 .word lrlive_branchlocalstoreaddr;
1169 brasl $75,__icache_br_handler
1174 build_stub (struct bfd_link_info
*info
,
1177 enum _stub_type stub_type
,
1178 struct elf_link_hash_entry
*h
,
1179 const Elf_Internal_Rela
*irela
,
1183 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1184 unsigned int ovl
, dest_ovl
, set_id
;
1185 struct got_entry
*g
, **head
;
1187 bfd_vma addend
, from
, to
, br_dest
, patt
;
1188 unsigned int lrlive
;
1191 if (stub_type
!= nonovl_stub
)
1192 ovl
= spu_elf_section_data (isec
->output_section
)->u
.o
.ovl_index
;
1195 head
= &h
->got
.glist
;
1197 head
= elf_local_got_ents (ibfd
) + ELF32_R_SYM (irela
->r_info
);
1201 addend
= irela
->r_addend
;
1203 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1205 g
= bfd_malloc (sizeof *g
);
1211 g
->br_addr
= (irela
->r_offset
1212 + isec
->output_offset
1213 + isec
->output_section
->vma
);
1219 for (g
= *head
; g
!= NULL
; g
= g
->next
)
1220 if (g
->addend
== addend
&& (g
->ovl
== ovl
|| g
->ovl
== 0))
1225 if (g
->ovl
== 0 && ovl
!= 0)
1228 if (g
->stub_addr
!= (bfd_vma
) -1)
1232 sec
= htab
->stub_sec
[ovl
];
1233 dest
+= dest_sec
->output_offset
+ dest_sec
->output_section
->vma
;
1234 from
= sec
->size
+ sec
->output_offset
+ sec
->output_section
->vma
;
1235 g
->stub_addr
= from
;
1236 to
= (htab
->ovly_entry
[0]->root
.u
.def
.value
1237 + htab
->ovly_entry
[0]->root
.u
.def
.section
->output_offset
1238 + htab
->ovly_entry
[0]->root
.u
.def
.section
->output_section
->vma
);
1240 if (((dest
| to
| from
) & 3) != 0)
1245 dest_ovl
= spu_elf_section_data (dest_sec
->output_section
)->u
.o
.ovl_index
;
1247 if (htab
->params
->ovly_flavour
== ovly_normal
1248 && !htab
->params
->compact_stub
)
1250 bfd_put_32 (sec
->owner
, ILA
+ ((dest_ovl
<< 7) & 0x01ffff80) + 78,
1251 sec
->contents
+ sec
->size
);
1252 bfd_put_32 (sec
->owner
, LNOP
,
1253 sec
->contents
+ sec
->size
+ 4);
1254 bfd_put_32 (sec
->owner
, ILA
+ ((dest
<< 7) & 0x01ffff80) + 79,
1255 sec
->contents
+ sec
->size
+ 8);
1257 bfd_put_32 (sec
->owner
, BR
+ (((to
- (from
+ 12)) << 5) & 0x007fff80),
1258 sec
->contents
+ sec
->size
+ 12);
1260 bfd_put_32 (sec
->owner
, BRA
+ ((to
<< 5) & 0x007fff80),
1261 sec
->contents
+ sec
->size
+ 12);
1263 else if (htab
->params
->ovly_flavour
== ovly_normal
1264 && htab
->params
->compact_stub
)
1267 bfd_put_32 (sec
->owner
, BRSL
+ (((to
- from
) << 5) & 0x007fff80) + 75,
1268 sec
->contents
+ sec
->size
);
1270 bfd_put_32 (sec
->owner
, BRASL
+ ((to
<< 5) & 0x007fff80) + 75,
1271 sec
->contents
+ sec
->size
);
1272 bfd_put_32 (sec
->owner
, (dest
& 0x3ffff) | (dest_ovl
<< 18),
1273 sec
->contents
+ sec
->size
+ 4);
1275 else if (htab
->params
->ovly_flavour
== ovly_soft_icache
1276 && htab
->params
->compact_stub
)
1279 if (stub_type
== nonovl_stub
)
1281 else if (stub_type
== call_ovl_stub
)
1282 /* A brsl makes lr live and *(*sp+16) is live.
1283 Tail calls have the same liveness. */
1285 else if (!htab
->params
->lrlive_analysis
)
1286 /* Assume stack frame and lr save. */
1288 else if (irela
!= NULL
)
1290 /* Analyse branch instructions. */
1291 struct function_info
*caller
;
1294 caller
= find_function (isec
, irela
->r_offset
, info
);
1295 if (caller
->start
== NULL
)
1296 off
= irela
->r_offset
;
1299 struct function_info
*found
= NULL
;
1301 /* Find the earliest piece of this function that
1302 has frame adjusting instructions. We might
1303 see dynamic frame adjustment (eg. for alloca)
1304 in some later piece, but functions using
1305 alloca always set up a frame earlier. Frame
1306 setup instructions are always in one piece. */
1307 if (caller
->lr_store
!= (bfd_vma
) -1
1308 || caller
->sp_adjust
!= (bfd_vma
) -1)
1310 while (caller
->start
!= NULL
)
1312 caller
= caller
->start
;
1313 if (caller
->lr_store
!= (bfd_vma
) -1
1314 || caller
->sp_adjust
!= (bfd_vma
) -1)
1322 if (off
> caller
->sp_adjust
)
1324 if (off
> caller
->lr_store
)
1325 /* Only *(*sp+16) is live. */
1328 /* If no lr save, then we must be in a
1329 leaf function with a frame.
1330 lr is still live. */
1333 else if (off
> caller
->lr_store
)
1335 /* Between lr save and stack adjust. */
1337 /* This should never happen since prologues won't
1342 /* On entry to function. */
1345 if (stub_type
!= br000_ovl_stub
1346 && lrlive
!= stub_type
- br000_ovl_stub
)
1347 info
->callbacks
->einfo (_("%A:0x%v lrlive .brinfo (%u) differs "
1348 "from analysis (%u)\n"),
1349 isec
, irela
->r_offset
, lrlive
,
1350 stub_type
- br000_ovl_stub
);
1353 /* If given lrlive info via .brinfo, use it. */
1354 if (stub_type
> br000_ovl_stub
)
1355 lrlive
= stub_type
- br000_ovl_stub
;
1358 to
= (htab
->ovly_entry
[1]->root
.u
.def
.value
1359 + htab
->ovly_entry
[1]->root
.u
.def
.section
->output_offset
1360 + htab
->ovly_entry
[1]->root
.u
.def
.section
->output_section
->vma
);
1362 /* The branch that uses this stub goes to stub_addr + 4. We'll
1363 set up an xor pattern that can be used by the icache manager
1364 to modify this branch to go directly to its destination. */
1366 br_dest
= g
->stub_addr
;
1369 /* Except in the case of _SPUEAR_ stubs, the branch in
1370 question is the one in the stub itself. */
1371 BFD_ASSERT (stub_type
== nonovl_stub
);
1372 g
->br_addr
= g
->stub_addr
;
1376 set_id
= ((dest_ovl
- 1) >> htab
->num_lines_log2
) + 1;
1377 bfd_put_32 (sec
->owner
, (set_id
<< 18) | (dest
& 0x3ffff),
1378 sec
->contents
+ sec
->size
);
1379 bfd_put_32 (sec
->owner
, BRASL
+ ((to
<< 5) & 0x007fff80) + 75,
1380 sec
->contents
+ sec
->size
+ 4);
1381 bfd_put_32 (sec
->owner
, (lrlive
<< 29) | (g
->br_addr
& 0x3ffff),
1382 sec
->contents
+ sec
->size
+ 8);
1383 patt
= dest
^ br_dest
;
1384 if (irela
!= NULL
&& ELF32_R_TYPE (irela
->r_info
) == R_SPU_REL16
)
1385 patt
= (dest
- g
->br_addr
) ^ (br_dest
- g
->br_addr
);
1386 bfd_put_32 (sec
->owner
, (patt
<< 5) & 0x007fff80,
1387 sec
->contents
+ sec
->size
+ 12);
1390 /* Extra space for linked list entries. */
1396 sec
->size
+= ovl_stub_size (htab
->params
);
1398 if (htab
->params
->emit_stub_syms
)
1404 len
= 8 + sizeof (".ovl_call.") - 1;
1406 len
+= strlen (h
->root
.root
.string
);
1411 add
= (int) irela
->r_addend
& 0xffffffff;
1414 name
= bfd_malloc (len
);
1418 sprintf (name
, "%08x.ovl_call.", g
->ovl
);
1420 strcpy (name
+ 8 + sizeof (".ovl_call.") - 1, h
->root
.root
.string
);
1422 sprintf (name
+ 8 + sizeof (".ovl_call.") - 1, "%x:%x",
1423 dest_sec
->id
& 0xffffffff,
1424 (int) ELF32_R_SYM (irela
->r_info
) & 0xffffffff);
1426 sprintf (name
+ len
- 9, "+%x", add
);
1428 h
= elf_link_hash_lookup (&htab
->elf
, name
, TRUE
, TRUE
, FALSE
);
1432 if (h
->root
.type
== bfd_link_hash_new
)
1434 h
->root
.type
= bfd_link_hash_defined
;
1435 h
->root
.u
.def
.section
= sec
;
1436 h
->size
= ovl_stub_size (htab
->params
);
1437 h
->root
.u
.def
.value
= sec
->size
- h
->size
;
1441 h
->ref_regular_nonweak
= 1;
1442 h
->forced_local
= 1;
1450 /* Called via elf_link_hash_traverse to allocate stubs for any _SPUEAR_
1454 allocate_spuear_stubs (struct elf_link_hash_entry
*h
, void *inf
)
1456 /* Symbols starting with _SPUEAR_ need a stub because they may be
1457 invoked by the PPU. */
1458 struct bfd_link_info
*info
= inf
;
1459 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1462 if ((h
->root
.type
== bfd_link_hash_defined
1463 || h
->root
.type
== bfd_link_hash_defweak
)
1465 && strncmp (h
->root
.root
.string
, "_SPUEAR_", 8) == 0
1466 && (sym_sec
= h
->root
.u
.def
.section
) != NULL
1467 && sym_sec
->output_section
!= bfd_abs_section_ptr
1468 && spu_elf_section_data (sym_sec
->output_section
) != NULL
1469 && (spu_elf_section_data (sym_sec
->output_section
)->u
.o
.ovl_index
!= 0
1470 || htab
->params
->non_overlay_stubs
))
1472 return count_stub (htab
, NULL
, NULL
, nonovl_stub
, h
, NULL
);
1479 build_spuear_stubs (struct elf_link_hash_entry
*h
, void *inf
)
1481 /* Symbols starting with _SPUEAR_ need a stub because they may be
1482 invoked by the PPU. */
1483 struct bfd_link_info
*info
= inf
;
1484 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1487 if ((h
->root
.type
== bfd_link_hash_defined
1488 || h
->root
.type
== bfd_link_hash_defweak
)
1490 && strncmp (h
->root
.root
.string
, "_SPUEAR_", 8) == 0
1491 && (sym_sec
= h
->root
.u
.def
.section
) != NULL
1492 && sym_sec
->output_section
!= bfd_abs_section_ptr
1493 && spu_elf_section_data (sym_sec
->output_section
) != NULL
1494 && (spu_elf_section_data (sym_sec
->output_section
)->u
.o
.ovl_index
!= 0
1495 || htab
->params
->non_overlay_stubs
))
1497 return build_stub (info
, NULL
, NULL
, nonovl_stub
, h
, NULL
,
1498 h
->root
.u
.def
.value
, sym_sec
);
1504 /* Size or build stubs. */
1507 process_stubs (struct bfd_link_info
*info
, bfd_boolean build
)
1509 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1512 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
1514 extern const bfd_target bfd_elf32_spu_vec
;
1515 Elf_Internal_Shdr
*symtab_hdr
;
1517 Elf_Internal_Sym
*local_syms
= NULL
;
1519 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
1522 /* We'll need the symbol table in a second. */
1523 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
1524 if (symtab_hdr
->sh_info
== 0)
1527 /* Walk over each section attached to the input bfd. */
1528 for (isec
= ibfd
->sections
; isec
!= NULL
; isec
= isec
->next
)
1530 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
1532 /* If there aren't any relocs, then there's nothing more to do. */
1533 if ((isec
->flags
& SEC_RELOC
) == 0
1534 || isec
->reloc_count
== 0)
1537 if (!maybe_needs_stubs (isec
))
1540 /* Get the relocs. */
1541 internal_relocs
= _bfd_elf_link_read_relocs (ibfd
, isec
, NULL
, NULL
,
1543 if (internal_relocs
== NULL
)
1544 goto error_ret_free_local
;
1546 /* Now examine each relocation. */
1547 irela
= internal_relocs
;
1548 irelaend
= irela
+ isec
->reloc_count
;
1549 for (; irela
< irelaend
; irela
++)
1551 enum elf_spu_reloc_type r_type
;
1552 unsigned int r_indx
;
1554 Elf_Internal_Sym
*sym
;
1555 struct elf_link_hash_entry
*h
;
1556 enum _stub_type stub_type
;
1558 r_type
= ELF32_R_TYPE (irela
->r_info
);
1559 r_indx
= ELF32_R_SYM (irela
->r_info
);
1561 if (r_type
>= R_SPU_max
)
1563 bfd_set_error (bfd_error_bad_value
);
1564 error_ret_free_internal
:
1565 if (elf_section_data (isec
)->relocs
!= internal_relocs
)
1566 free (internal_relocs
);
1567 error_ret_free_local
:
1568 if (local_syms
!= NULL
1569 && (symtab_hdr
->contents
1570 != (unsigned char *) local_syms
))
1575 /* Determine the reloc target section. */
1576 if (!get_sym_h (&h
, &sym
, &sym_sec
, &local_syms
, r_indx
, ibfd
))
1577 goto error_ret_free_internal
;
1579 stub_type
= needs_ovl_stub (h
, sym
, sym_sec
, isec
, irela
,
1581 if (stub_type
== no_stub
)
1583 else if (stub_type
== stub_error
)
1584 goto error_ret_free_internal
;
1586 if (htab
->stub_count
== NULL
)
1589 amt
= (htab
->num_overlays
+ 1) * sizeof (*htab
->stub_count
);
1590 htab
->stub_count
= bfd_zmalloc (amt
);
1591 if (htab
->stub_count
== NULL
)
1592 goto error_ret_free_internal
;
1597 if (!count_stub (htab
, ibfd
, isec
, stub_type
, h
, irela
))
1598 goto error_ret_free_internal
;
1605 dest
= h
->root
.u
.def
.value
;
1607 dest
= sym
->st_value
;
1608 dest
+= irela
->r_addend
;
1609 if (!build_stub (info
, ibfd
, isec
, stub_type
, h
, irela
,
1611 goto error_ret_free_internal
;
1615 /* We're done with the internal relocs, free them. */
1616 if (elf_section_data (isec
)->relocs
!= internal_relocs
)
1617 free (internal_relocs
);
1620 if (local_syms
!= NULL
1621 && symtab_hdr
->contents
!= (unsigned char *) local_syms
)
1623 if (!info
->keep_memory
)
1626 symtab_hdr
->contents
= (unsigned char *) local_syms
;
1633 /* Allocate space for overlay call and return stubs.
1634 Return 0 on error, 1 if no stubs, 2 otherwise. */
1637 spu_elf_size_stubs (struct bfd_link_info
*info
)
1639 struct spu_link_hash_table
*htab
;
1646 if (!process_stubs (info
, FALSE
))
1649 htab
= spu_hash_table (info
);
1650 elf_link_hash_traverse (&htab
->elf
, allocate_spuear_stubs
, info
);
1654 if (htab
->stub_count
== NULL
)
1657 ibfd
= info
->input_bfds
;
1658 amt
= (htab
->num_overlays
+ 1) * sizeof (*htab
->stub_sec
);
1659 htab
->stub_sec
= bfd_zmalloc (amt
);
1660 if (htab
->stub_sec
== NULL
)
1663 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_READONLY
1664 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
);
1665 stub
= bfd_make_section_anyway_with_flags (ibfd
, ".stub", flags
);
1666 htab
->stub_sec
[0] = stub
;
1668 || !bfd_set_section_alignment (ibfd
, stub
,
1669 ovl_stub_size_log2 (htab
->params
)))
1671 stub
->size
= htab
->stub_count
[0] * ovl_stub_size (htab
->params
);
1672 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1673 /* Extra space for linked list entries. */
1674 stub
->size
+= htab
->stub_count
[0] * 16;
1676 for (i
= 0; i
< htab
->num_overlays
; ++i
)
1678 asection
*osec
= htab
->ovl_sec
[i
];
1679 unsigned int ovl
= spu_elf_section_data (osec
)->u
.o
.ovl_index
;
1680 stub
= bfd_make_section_anyway_with_flags (ibfd
, ".stub", flags
);
1681 htab
->stub_sec
[ovl
] = stub
;
1683 || !bfd_set_section_alignment (ibfd
, stub
,
1684 ovl_stub_size_log2 (htab
->params
)))
1686 stub
->size
= htab
->stub_count
[ovl
] * ovl_stub_size (htab
->params
);
1689 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1691 /* Space for icache manager tables.
1692 a) Tag array, one quadword per cache line.
1693 b) Rewrite "to" list, one quadword per cache line.
1694 c) Rewrite "from" list, one byte per outgoing branch (rounded up to
1695 a power-of-two number of full quadwords) per cache line. */
1698 htab
->ovtab
= bfd_make_section_anyway_with_flags (ibfd
, ".ovtab", flags
);
1699 if (htab
->ovtab
== NULL
1700 || !bfd_set_section_alignment (ibfd
, htab
->ovtab
, 4))
1703 htab
->ovtab
->size
= (16 + 16 + (16 << htab
->fromelem_size_log2
))
1704 << htab
->num_lines_log2
;
1706 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
;
1707 htab
->init
= bfd_make_section_anyway_with_flags (ibfd
, ".ovini", flags
);
1708 if (htab
->init
== NULL
1709 || !bfd_set_section_alignment (ibfd
, htab
->init
, 4))
1712 htab
->init
->size
= 16;
1716 /* htab->ovtab consists of two arrays.
1726 . } _ovly_buf_table[];
1729 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
;
1730 htab
->ovtab
= bfd_make_section_anyway_with_flags (ibfd
, ".ovtab", flags
);
1731 if (htab
->ovtab
== NULL
1732 || !bfd_set_section_alignment (ibfd
, htab
->ovtab
, 4))
1735 htab
->ovtab
->size
= htab
->num_overlays
* 16 + 16 + htab
->num_buf
* 4;
1738 htab
->toe
= bfd_make_section_anyway_with_flags (ibfd
, ".toe", SEC_ALLOC
);
1739 if (htab
->toe
== NULL
1740 || !bfd_set_section_alignment (ibfd
, htab
->toe
, 4))
1742 htab
->toe
->size
= 16;
1747 /* Called from ld to place overlay manager data sections. This is done
1748 after the overlay manager itself is loaded, mainly so that the
1749 linker's htab->init section is placed after any other .ovl.init
1753 spu_elf_place_overlay_data (struct bfd_link_info
*info
)
1755 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1759 if (htab
->stub_count
== NULL
)
1762 (*htab
->params
->place_spu_section
) (htab
->stub_sec
[0], NULL
, ".text");
1764 for (i
= 0; i
< htab
->num_overlays
; ++i
)
1766 asection
*osec
= htab
->ovl_sec
[i
];
1767 unsigned int ovl
= spu_elf_section_data (osec
)->u
.o
.ovl_index
;
1768 (*htab
->params
->place_spu_section
) (htab
->stub_sec
[ovl
], osec
, NULL
);
1771 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1772 (*htab
->params
->place_spu_section
) (htab
->init
, NULL
, ".ovl.init");
1775 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1777 (*htab
->params
->place_spu_section
) (htab
->ovtab
, NULL
, ovout
);
1779 (*htab
->params
->place_spu_section
) (htab
->toe
, NULL
, ".toe");
1782 /* Functions to handle embedded spu_ovl.o object. */
1785 ovl_mgr_open (struct bfd
*nbfd ATTRIBUTE_UNUSED
, void *stream
)
1791 ovl_mgr_pread (struct bfd
*abfd ATTRIBUTE_UNUSED
,
1797 struct _ovl_stream
*os
;
1801 os
= (struct _ovl_stream
*) stream
;
1802 max
= (const char *) os
->end
- (const char *) os
->start
;
1804 if ((ufile_ptr
) offset
>= max
)
1808 if (count
> max
- offset
)
1809 count
= max
- offset
;
1811 memcpy (buf
, (const char *) os
->start
+ offset
, count
);
1816 spu_elf_open_builtin_lib (bfd
**ovl_bfd
, const struct _ovl_stream
*stream
)
1818 *ovl_bfd
= bfd_openr_iovec ("builtin ovl_mgr",
1825 return *ovl_bfd
!= NULL
;
1829 overlay_index (asection
*sec
)
1832 || sec
->output_section
== bfd_abs_section_ptr
)
1834 return spu_elf_section_data (sec
->output_section
)->u
.o
.ovl_index
;
1837 /* Define an STT_OBJECT symbol. */
1839 static struct elf_link_hash_entry
*
1840 define_ovtab_symbol (struct spu_link_hash_table
*htab
, const char *name
)
1842 struct elf_link_hash_entry
*h
;
1844 h
= elf_link_hash_lookup (&htab
->elf
, name
, TRUE
, FALSE
, FALSE
);
1848 if (h
->root
.type
!= bfd_link_hash_defined
1851 h
->root
.type
= bfd_link_hash_defined
;
1852 h
->root
.u
.def
.section
= htab
->ovtab
;
1853 h
->type
= STT_OBJECT
;
1856 h
->ref_regular_nonweak
= 1;
1859 else if (h
->root
.u
.def
.section
->owner
!= NULL
)
1861 (*_bfd_error_handler
) (_("%B is not allowed to define %s"),
1862 h
->root
.u
.def
.section
->owner
,
1863 h
->root
.root
.string
);
1864 bfd_set_error (bfd_error_bad_value
);
1869 (*_bfd_error_handler
) (_("you are not allowed to define %s in a script"),
1870 h
->root
.root
.string
);
1871 bfd_set_error (bfd_error_bad_value
);
1878 /* Fill in all stubs and the overlay tables. */
1881 spu_elf_build_stubs (struct bfd_link_info
*info
)
1883 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
1884 struct elf_link_hash_entry
*h
;
1890 if (htab
->stub_count
== NULL
)
1893 for (i
= 0; i
<= htab
->num_overlays
; i
++)
1894 if (htab
->stub_sec
[i
]->size
!= 0)
1896 htab
->stub_sec
[i
]->contents
= bfd_zalloc (htab
->stub_sec
[i
]->owner
,
1897 htab
->stub_sec
[i
]->size
);
1898 if (htab
->stub_sec
[i
]->contents
== NULL
)
1900 htab
->stub_sec
[i
]->rawsize
= htab
->stub_sec
[i
]->size
;
1901 htab
->stub_sec
[i
]->size
= 0;
1904 for (i
= 0; i
< 2; i
++)
1906 h
= htab
->ovly_entry
[i
];
1907 BFD_ASSERT (h
!= NULL
);
1909 if ((h
->root
.type
== bfd_link_hash_defined
1910 || h
->root
.type
== bfd_link_hash_defweak
)
1913 s
= h
->root
.u
.def
.section
->output_section
;
1914 if (spu_elf_section_data (s
)->u
.o
.ovl_index
)
1916 (*_bfd_error_handler
) (_("%s in overlay section"),
1917 h
->root
.root
.string
);
1918 bfd_set_error (bfd_error_bad_value
);
1926 /* Fill in all the stubs. */
1927 process_stubs (info
, TRUE
);
1928 if (!htab
->stub_err
)
1929 elf_link_hash_traverse (&htab
->elf
, build_spuear_stubs
, info
);
1933 (*_bfd_error_handler
) (_("overlay stub relocation overflow"));
1934 bfd_set_error (bfd_error_bad_value
);
1938 for (i
= 0; i
<= htab
->num_overlays
; i
++)
1940 if (htab
->stub_sec
[i
]->size
!= htab
->stub_sec
[i
]->rawsize
)
1942 (*_bfd_error_handler
) (_("stubs don't match calculated size"));
1943 bfd_set_error (bfd_error_bad_value
);
1946 htab
->stub_sec
[i
]->rawsize
= 0;
1949 if (htab
->ovtab
== NULL
|| htab
->ovtab
->size
== 0)
1952 htab
->ovtab
->contents
= bfd_zalloc (htab
->ovtab
->owner
, htab
->ovtab
->size
);
1953 if (htab
->ovtab
->contents
== NULL
)
1956 p
= htab
->ovtab
->contents
;
1957 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
1961 h
= define_ovtab_symbol (htab
, "__icache_tag_array");
1964 h
->root
.u
.def
.value
= 0;
1965 h
->size
= 16 << htab
->num_lines_log2
;
1968 h
= define_ovtab_symbol (htab
, "__icache_tag_array_size");
1971 h
->root
.u
.def
.value
= 16 << htab
->num_lines_log2
;
1972 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
1974 h
= define_ovtab_symbol (htab
, "__icache_rewrite_to");
1977 h
->root
.u
.def
.value
= off
;
1978 h
->size
= 16 << htab
->num_lines_log2
;
1981 h
= define_ovtab_symbol (htab
, "__icache_rewrite_to_size");
1984 h
->root
.u
.def
.value
= 16 << htab
->num_lines_log2
;
1985 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
1987 h
= define_ovtab_symbol (htab
, "__icache_rewrite_from");
1990 h
->root
.u
.def
.value
= off
;
1991 h
->size
= 16 << (htab
->fromelem_size_log2
+ htab
->num_lines_log2
);
1994 h
= define_ovtab_symbol (htab
, "__icache_rewrite_from_size");
1997 h
->root
.u
.def
.value
= 16 << (htab
->fromelem_size_log2
1998 + htab
->num_lines_log2
);
1999 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2001 h
= define_ovtab_symbol (htab
, "__icache_log2_fromelemsize");
2004 h
->root
.u
.def
.value
= htab
->fromelem_size_log2
;
2005 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2007 h
= define_ovtab_symbol (htab
, "__icache_base");
2010 h
->root
.u
.def
.value
= htab
->ovl_sec
[0]->vma
;
2011 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2012 h
->size
= htab
->num_buf
<< htab
->line_size_log2
;
2014 h
= define_ovtab_symbol (htab
, "__icache_linesize");
2017 h
->root
.u
.def
.value
= 1 << htab
->line_size_log2
;
2018 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2020 h
= define_ovtab_symbol (htab
, "__icache_log2_linesize");
2023 h
->root
.u
.def
.value
= htab
->line_size_log2
;
2024 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2026 h
= define_ovtab_symbol (htab
, "__icache_neg_log2_linesize");
2029 h
->root
.u
.def
.value
= -htab
->line_size_log2
;
2030 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2032 h
= define_ovtab_symbol (htab
, "__icache_cachesize");
2035 h
->root
.u
.def
.value
= 1 << (htab
->num_lines_log2
+ htab
->line_size_log2
);
2036 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2038 h
= define_ovtab_symbol (htab
, "__icache_log2_cachesize");
2041 h
->root
.u
.def
.value
= htab
->num_lines_log2
+ htab
->line_size_log2
;
2042 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2044 h
= define_ovtab_symbol (htab
, "__icache_neg_log2_cachesize");
2047 h
->root
.u
.def
.value
= -(htab
->num_lines_log2
+ htab
->line_size_log2
);
2048 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
2050 if (htab
->init
!= NULL
&& htab
->init
->size
!= 0)
2052 htab
->init
->contents
= bfd_zalloc (htab
->init
->owner
,
2054 if (htab
->init
->contents
== NULL
)
2057 h
= define_ovtab_symbol (htab
, "__icache_fileoff");
2060 h
->root
.u
.def
.value
= 0;
2061 h
->root
.u
.def
.section
= htab
->init
;
2067 /* Write out _ovly_table. */
2068 /* set low bit of .size to mark non-overlay area as present. */
2070 obfd
= htab
->ovtab
->output_section
->owner
;
2071 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
2073 unsigned int ovl_index
= spu_elf_section_data (s
)->u
.o
.ovl_index
;
2077 unsigned long off
= ovl_index
* 16;
2078 unsigned int ovl_buf
= spu_elf_section_data (s
)->u
.o
.ovl_buf
;
2080 bfd_put_32 (htab
->ovtab
->owner
, s
->vma
, p
+ off
);
2081 bfd_put_32 (htab
->ovtab
->owner
, (s
->size
+ 15) & -16,
2083 /* file_off written later in spu_elf_modify_program_headers. */
2084 bfd_put_32 (htab
->ovtab
->owner
, ovl_buf
, p
+ off
+ 12);
2088 h
= define_ovtab_symbol (htab
, "_ovly_table");
2091 h
->root
.u
.def
.value
= 16;
2092 h
->size
= htab
->num_overlays
* 16;
2094 h
= define_ovtab_symbol (htab
, "_ovly_table_end");
2097 h
->root
.u
.def
.value
= htab
->num_overlays
* 16 + 16;
2100 h
= define_ovtab_symbol (htab
, "_ovly_buf_table");
2103 h
->root
.u
.def
.value
= htab
->num_overlays
* 16 + 16;
2104 h
->size
= htab
->num_buf
* 4;
2106 h
= define_ovtab_symbol (htab
, "_ovly_buf_table_end");
2109 h
->root
.u
.def
.value
= htab
->num_overlays
* 16 + 16 + htab
->num_buf
* 4;
2113 h
= define_ovtab_symbol (htab
, "_EAR_");
2116 h
->root
.u
.def
.section
= htab
->toe
;
2117 h
->root
.u
.def
.value
= 0;
2123 /* Check that all loadable section VMAs lie in the range
2124 LO .. HI inclusive, and stash some parameters for --auto-overlay. */
2127 spu_elf_check_vma (struct bfd_link_info
*info
)
2129 struct elf_segment_map
*m
;
2131 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
2132 bfd
*abfd
= info
->output_bfd
;
2133 bfd_vma hi
= htab
->params
->local_store_hi
;
2134 bfd_vma lo
= htab
->params
->local_store_lo
;
2136 htab
->local_store
= hi
+ 1 - lo
;
2138 for (m
= elf_tdata (abfd
)->segment_map
; m
!= NULL
; m
= m
->next
)
2139 if (m
->p_type
== PT_LOAD
)
2140 for (i
= 0; i
< m
->count
; i
++)
2141 if (m
->sections
[i
]->size
!= 0
2142 && (m
->sections
[i
]->vma
< lo
2143 || m
->sections
[i
]->vma
> hi
2144 || m
->sections
[i
]->vma
+ m
->sections
[i
]->size
- 1 > hi
))
2145 return m
->sections
[i
];
2150 /* OFFSET in SEC (presumably) is the beginning of a function prologue.
2151 Search for stack adjusting insns, and return the sp delta.
2152 If a store of lr is found save the instruction offset to *LR_STORE.
2153 If a stack adjusting instruction is found, save that offset to
2157 find_function_stack_adjust (asection
*sec
,
2164 memset (reg
, 0, sizeof (reg
));
2165 for ( ; offset
+ 4 <= sec
->size
; offset
+= 4)
2167 unsigned char buf
[4];
2171 /* Assume no relocs on stack adjusing insns. */
2172 if (!bfd_get_section_contents (sec
->owner
, sec
, buf
, offset
, 4))
2176 ra
= ((buf
[2] & 0x3f) << 1) | (buf
[3] >> 7);
2178 if (buf
[0] == 0x24 /* stqd */)
2180 if (rt
== 0 /* lr */ && ra
== 1 /* sp */)
2185 /* Partly decoded immediate field. */
2186 imm
= (buf
[1] << 9) | (buf
[2] << 1) | (buf
[3] >> 7);
2188 if (buf
[0] == 0x1c /* ai */)
2191 imm
= (imm
^ 0x200) - 0x200;
2192 reg
[rt
] = reg
[ra
] + imm
;
2194 if (rt
== 1 /* sp */)
2198 *sp_adjust
= offset
;
2202 else if (buf
[0] == 0x18 && (buf
[1] & 0xe0) == 0 /* a */)
2204 int rb
= ((buf
[1] & 0x1f) << 2) | ((buf
[2] & 0xc0) >> 6);
2206 reg
[rt
] = reg
[ra
] + reg
[rb
];
2211 *sp_adjust
= offset
;
2215 else if (buf
[0] == 0x08 && (buf
[1] & 0xe0) == 0 /* sf */)
2217 int rb
= ((buf
[1] & 0x1f) << 2) | ((buf
[2] & 0xc0) >> 6);
2219 reg
[rt
] = reg
[rb
] - reg
[ra
];
2224 *sp_adjust
= offset
;
2228 else if ((buf
[0] & 0xfc) == 0x40 /* il, ilh, ilhu, ila */)
2230 if (buf
[0] >= 0x42 /* ila */)
2231 imm
|= (buf
[0] & 1) << 17;
2236 if (buf
[0] == 0x40 /* il */)
2238 if ((buf
[1] & 0x80) == 0)
2240 imm
= (imm
^ 0x8000) - 0x8000;
2242 else if ((buf
[1] & 0x80) == 0 /* ilhu */)
2248 else if (buf
[0] == 0x60 && (buf
[1] & 0x80) != 0 /* iohl */)
2250 reg
[rt
] |= imm
& 0xffff;
2253 else if (buf
[0] == 0x04 /* ori */)
2256 imm
= (imm
^ 0x200) - 0x200;
2257 reg
[rt
] = reg
[ra
] | imm
;
2260 else if (buf
[0] == 0x32 && (buf
[1] & 0x80) != 0 /* fsmbi */)
2262 reg
[rt
] = ( ((imm
& 0x8000) ? 0xff000000 : 0)
2263 | ((imm
& 0x4000) ? 0x00ff0000 : 0)
2264 | ((imm
& 0x2000) ? 0x0000ff00 : 0)
2265 | ((imm
& 0x1000) ? 0x000000ff : 0));
2268 else if (buf
[0] == 0x16 /* andbi */)
2274 reg
[rt
] = reg
[ra
] & imm
;
2277 else if (buf
[0] == 0x33 && imm
== 1 /* brsl .+4 */)
2279 /* Used in pic reg load. Say rt is trashed. Won't be used
2280 in stack adjust, but we need to continue past this branch. */
2284 else if (is_branch (buf
) || is_indirect_branch (buf
))
2285 /* If we hit a branch then we must be out of the prologue. */
2292 /* qsort predicate to sort symbols by section and value. */
2294 static Elf_Internal_Sym
*sort_syms_syms
;
2295 static asection
**sort_syms_psecs
;
2298 sort_syms (const void *a
, const void *b
)
2300 Elf_Internal_Sym
*const *s1
= a
;
2301 Elf_Internal_Sym
*const *s2
= b
;
2302 asection
*sec1
,*sec2
;
2303 bfd_signed_vma delta
;
2305 sec1
= sort_syms_psecs
[*s1
- sort_syms_syms
];
2306 sec2
= sort_syms_psecs
[*s2
- sort_syms_syms
];
2309 return sec1
->index
- sec2
->index
;
2311 delta
= (*s1
)->st_value
- (*s2
)->st_value
;
2313 return delta
< 0 ? -1 : 1;
2315 delta
= (*s2
)->st_size
- (*s1
)->st_size
;
2317 return delta
< 0 ? -1 : 1;
2319 return *s1
< *s2
? -1 : 1;
2322 /* Allocate a struct spu_elf_stack_info with MAX_FUN struct function_info
2323 entries for section SEC. */
2325 static struct spu_elf_stack_info
*
2326 alloc_stack_info (asection
*sec
, int max_fun
)
2328 struct _spu_elf_section_data
*sec_data
= spu_elf_section_data (sec
);
2331 amt
= sizeof (struct spu_elf_stack_info
);
2332 amt
+= (max_fun
- 1) * sizeof (struct function_info
);
2333 sec_data
->u
.i
.stack_info
= bfd_zmalloc (amt
);
2334 if (sec_data
->u
.i
.stack_info
!= NULL
)
2335 sec_data
->u
.i
.stack_info
->max_fun
= max_fun
;
2336 return sec_data
->u
.i
.stack_info
;
2339 /* Add a new struct function_info describing a (part of a) function
2340 starting at SYM_H. Keep the array sorted by address. */
2342 static struct function_info
*
2343 maybe_insert_function (asection
*sec
,
2346 bfd_boolean is_func
)
2348 struct _spu_elf_section_data
*sec_data
= spu_elf_section_data (sec
);
2349 struct spu_elf_stack_info
*sinfo
= sec_data
->u
.i
.stack_info
;
2355 sinfo
= alloc_stack_info (sec
, 20);
2362 Elf_Internal_Sym
*sym
= sym_h
;
2363 off
= sym
->st_value
;
2364 size
= sym
->st_size
;
2368 struct elf_link_hash_entry
*h
= sym_h
;
2369 off
= h
->root
.u
.def
.value
;
2373 for (i
= sinfo
->num_fun
; --i
>= 0; )
2374 if (sinfo
->fun
[i
].lo
<= off
)
2379 /* Don't add another entry for an alias, but do update some
2381 if (sinfo
->fun
[i
].lo
== off
)
2383 /* Prefer globals over local syms. */
2384 if (global
&& !sinfo
->fun
[i
].global
)
2386 sinfo
->fun
[i
].global
= TRUE
;
2387 sinfo
->fun
[i
].u
.h
= sym_h
;
2390 sinfo
->fun
[i
].is_func
= TRUE
;
2391 return &sinfo
->fun
[i
];
2393 /* Ignore a zero-size symbol inside an existing function. */
2394 else if (sinfo
->fun
[i
].hi
> off
&& size
== 0)
2395 return &sinfo
->fun
[i
];
2398 if (sinfo
->num_fun
>= sinfo
->max_fun
)
2400 bfd_size_type amt
= sizeof (struct spu_elf_stack_info
);
2401 bfd_size_type old
= amt
;
2403 old
+= (sinfo
->max_fun
- 1) * sizeof (struct function_info
);
2404 sinfo
->max_fun
+= 20 + (sinfo
->max_fun
>> 1);
2405 amt
+= (sinfo
->max_fun
- 1) * sizeof (struct function_info
);
2406 sinfo
= bfd_realloc (sinfo
, amt
);
2409 memset ((char *) sinfo
+ old
, 0, amt
- old
);
2410 sec_data
->u
.i
.stack_info
= sinfo
;
2413 if (++i
< sinfo
->num_fun
)
2414 memmove (&sinfo
->fun
[i
+ 1], &sinfo
->fun
[i
],
2415 (sinfo
->num_fun
- i
) * sizeof (sinfo
->fun
[i
]));
2416 sinfo
->fun
[i
].is_func
= is_func
;
2417 sinfo
->fun
[i
].global
= global
;
2418 sinfo
->fun
[i
].sec
= sec
;
2420 sinfo
->fun
[i
].u
.h
= sym_h
;
2422 sinfo
->fun
[i
].u
.sym
= sym_h
;
2423 sinfo
->fun
[i
].lo
= off
;
2424 sinfo
->fun
[i
].hi
= off
+ size
;
2425 sinfo
->fun
[i
].lr_store
= -1;
2426 sinfo
->fun
[i
].sp_adjust
= -1;
2427 sinfo
->fun
[i
].stack
= -find_function_stack_adjust (sec
, off
,
2428 &sinfo
->fun
[i
].lr_store
,
2429 &sinfo
->fun
[i
].sp_adjust
);
2430 sinfo
->num_fun
+= 1;
2431 return &sinfo
->fun
[i
];
2434 /* Return the name of FUN. */
2437 func_name (struct function_info
*fun
)
2441 Elf_Internal_Shdr
*symtab_hdr
;
2443 while (fun
->start
!= NULL
)
2447 return fun
->u
.h
->root
.root
.string
;
2450 if (fun
->u
.sym
->st_name
== 0)
2452 size_t len
= strlen (sec
->name
);
2453 char *name
= bfd_malloc (len
+ 10);
2456 sprintf (name
, "%s+%lx", sec
->name
,
2457 (unsigned long) fun
->u
.sym
->st_value
& 0xffffffff);
2461 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
2462 return bfd_elf_sym_name (ibfd
, symtab_hdr
, fun
->u
.sym
, sec
);
2465 /* Read the instruction at OFF in SEC. Return true iff the instruction
2466 is a nop, lnop, or stop 0 (all zero insn). */
2469 is_nop (asection
*sec
, bfd_vma off
)
2471 unsigned char insn
[4];
2473 if (off
+ 4 > sec
->size
2474 || !bfd_get_section_contents (sec
->owner
, sec
, insn
, off
, 4))
2476 if ((insn
[0] & 0xbf) == 0 && (insn
[1] & 0xe0) == 0x20)
2478 if (insn
[0] == 0 && insn
[1] == 0 && insn
[2] == 0 && insn
[3] == 0)
2483 /* Extend the range of FUN to cover nop padding up to LIMIT.
2484 Return TRUE iff some instruction other than a NOP was found. */
2487 insns_at_end (struct function_info
*fun
, bfd_vma limit
)
2489 bfd_vma off
= (fun
->hi
+ 3) & -4;
2491 while (off
< limit
&& is_nop (fun
->sec
, off
))
2502 /* Check and fix overlapping function ranges. Return TRUE iff there
2503 are gaps in the current info we have about functions in SEC. */
2506 check_function_ranges (asection
*sec
, struct bfd_link_info
*info
)
2508 struct _spu_elf_section_data
*sec_data
= spu_elf_section_data (sec
);
2509 struct spu_elf_stack_info
*sinfo
= sec_data
->u
.i
.stack_info
;
2511 bfd_boolean gaps
= FALSE
;
2516 for (i
= 1; i
< sinfo
->num_fun
; i
++)
2517 if (sinfo
->fun
[i
- 1].hi
> sinfo
->fun
[i
].lo
)
2519 /* Fix overlapping symbols. */
2520 const char *f1
= func_name (&sinfo
->fun
[i
- 1]);
2521 const char *f2
= func_name (&sinfo
->fun
[i
]);
2523 info
->callbacks
->einfo (_("warning: %s overlaps %s\n"), f1
, f2
);
2524 sinfo
->fun
[i
- 1].hi
= sinfo
->fun
[i
].lo
;
2526 else if (insns_at_end (&sinfo
->fun
[i
- 1], sinfo
->fun
[i
].lo
))
2529 if (sinfo
->num_fun
== 0)
2533 if (sinfo
->fun
[0].lo
!= 0)
2535 if (sinfo
->fun
[sinfo
->num_fun
- 1].hi
> sec
->size
)
2537 const char *f1
= func_name (&sinfo
->fun
[sinfo
->num_fun
- 1]);
2539 info
->callbacks
->einfo (_("warning: %s exceeds section size\n"), f1
);
2540 sinfo
->fun
[sinfo
->num_fun
- 1].hi
= sec
->size
;
2542 else if (insns_at_end (&sinfo
->fun
[sinfo
->num_fun
- 1], sec
->size
))
2548 /* Search current function info for a function that contains address
2549 OFFSET in section SEC. */
2551 static struct function_info
*
2552 find_function (asection
*sec
, bfd_vma offset
, struct bfd_link_info
*info
)
2554 struct _spu_elf_section_data
*sec_data
= spu_elf_section_data (sec
);
2555 struct spu_elf_stack_info
*sinfo
= sec_data
->u
.i
.stack_info
;
2559 hi
= sinfo
->num_fun
;
2562 mid
= (lo
+ hi
) / 2;
2563 if (offset
< sinfo
->fun
[mid
].lo
)
2565 else if (offset
>= sinfo
->fun
[mid
].hi
)
2568 return &sinfo
->fun
[mid
];
2570 info
->callbacks
->einfo (_("%A:0x%v not found in function table\n"),
2572 bfd_set_error (bfd_error_bad_value
);
2576 /* Add CALLEE to CALLER call list if not already present. Return TRUE
2577 if CALLEE was new. If this function return FALSE, CALLEE should
2581 insert_callee (struct function_info
*caller
, struct call_info
*callee
)
2583 struct call_info
**pp
, *p
;
2585 for (pp
= &caller
->call_list
; (p
= *pp
) != NULL
; pp
= &p
->next
)
2586 if (p
->fun
== callee
->fun
)
2588 /* Tail calls use less stack than normal calls. Retain entry
2589 for normal call over one for tail call. */
2590 p
->is_tail
&= callee
->is_tail
;
2593 p
->fun
->start
= NULL
;
2594 p
->fun
->is_func
= TRUE
;
2596 p
->count
+= callee
->count
;
2597 /* Reorder list so most recent call is first. */
2599 p
->next
= caller
->call_list
;
2600 caller
->call_list
= p
;
2603 callee
->next
= caller
->call_list
;
2604 caller
->call_list
= callee
;
2608 /* Copy CALL and insert the copy into CALLER. */
2611 copy_callee (struct function_info
*caller
, const struct call_info
*call
)
2613 struct call_info
*callee
;
2614 callee
= bfd_malloc (sizeof (*callee
));
2618 if (!insert_callee (caller
, callee
))
2623 /* We're only interested in code sections. Testing SEC_IN_MEMORY excludes
2624 overlay stub sections. */
2627 interesting_section (asection
*s
)
2629 return (s
->output_section
!= bfd_abs_section_ptr
2630 && ((s
->flags
& (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_IN_MEMORY
))
2631 == (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
))
2635 /* Rummage through the relocs for SEC, looking for function calls.
2636 If CALL_TREE is true, fill in call graph. If CALL_TREE is false,
2637 mark destination symbols on calls as being functions. Also
2638 look at branches, which may be tail calls or go to hot/cold
2639 section part of same function. */
2642 mark_functions_via_relocs (asection
*sec
,
2643 struct bfd_link_info
*info
,
2646 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
2647 Elf_Internal_Shdr
*symtab_hdr
;
2649 unsigned int priority
= 0;
2650 static bfd_boolean warned
;
2652 if (!interesting_section (sec
)
2653 || sec
->reloc_count
== 0)
2656 internal_relocs
= _bfd_elf_link_read_relocs (sec
->owner
, sec
, NULL
, NULL
,
2658 if (internal_relocs
== NULL
)
2661 symtab_hdr
= &elf_tdata (sec
->owner
)->symtab_hdr
;
2662 psyms
= &symtab_hdr
->contents
;
2663 irela
= internal_relocs
;
2664 irelaend
= irela
+ sec
->reloc_count
;
2665 for (; irela
< irelaend
; irela
++)
2667 enum elf_spu_reloc_type r_type
;
2668 unsigned int r_indx
;
2670 Elf_Internal_Sym
*sym
;
2671 struct elf_link_hash_entry
*h
;
2673 bfd_boolean reject
, is_call
;
2674 struct function_info
*caller
;
2675 struct call_info
*callee
;
2678 r_type
= ELF32_R_TYPE (irela
->r_info
);
2679 if (r_type
!= R_SPU_REL16
2680 && r_type
!= R_SPU_ADDR16
)
2683 if (!(call_tree
&& spu_hash_table (info
)->params
->auto_overlay
))
2687 r_indx
= ELF32_R_SYM (irela
->r_info
);
2688 if (!get_sym_h (&h
, &sym
, &sym_sec
, psyms
, r_indx
, sec
->owner
))
2692 || sym_sec
->output_section
== bfd_abs_section_ptr
)
2698 unsigned char insn
[4];
2700 if (!bfd_get_section_contents (sec
->owner
, sec
, insn
,
2701 irela
->r_offset
, 4))
2703 if (is_branch (insn
))
2705 is_call
= (insn
[0] & 0xfd) == 0x31;
2706 priority
= insn
[1] & 0x0f;
2708 priority
|= insn
[2];
2710 priority
|= insn
[3];
2712 if ((sym_sec
->flags
& (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
))
2713 != (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
))
2716 info
->callbacks
->einfo
2717 (_("%B(%A+0x%v): call to non-code section"
2718 " %B(%A), analysis incomplete\n"),
2719 sec
->owner
, sec
, irela
->r_offset
,
2720 sym_sec
->owner
, sym_sec
);
2728 if (!(call_tree
&& spu_hash_table (info
)->params
->auto_overlay
)
2736 /* For --auto-overlay, count possible stubs we need for
2737 function pointer references. */
2738 unsigned int sym_type
;
2742 sym_type
= ELF_ST_TYPE (sym
->st_info
);
2743 if (sym_type
== STT_FUNC
)
2744 spu_hash_table (info
)->non_ovly_stub
+= 1;
2749 val
= h
->root
.u
.def
.value
;
2751 val
= sym
->st_value
;
2752 val
+= irela
->r_addend
;
2756 struct function_info
*fun
;
2758 if (irela
->r_addend
!= 0)
2760 Elf_Internal_Sym
*fake
= bfd_zmalloc (sizeof (*fake
));
2763 fake
->st_value
= val
;
2765 = _bfd_elf_section_from_bfd_section (sym_sec
->owner
, sym_sec
);
2769 fun
= maybe_insert_function (sym_sec
, sym
, FALSE
, is_call
);
2771 fun
= maybe_insert_function (sym_sec
, h
, TRUE
, is_call
);
2774 if (irela
->r_addend
!= 0
2775 && fun
->u
.sym
!= sym
)
2780 caller
= find_function (sec
, irela
->r_offset
, info
);
2783 callee
= bfd_malloc (sizeof *callee
);
2787 callee
->fun
= find_function (sym_sec
, val
, info
);
2788 if (callee
->fun
== NULL
)
2790 callee
->is_tail
= !is_call
;
2791 callee
->is_pasted
= FALSE
;
2792 callee
->priority
= priority
;
2794 if (callee
->fun
->last_caller
!= sec
)
2796 callee
->fun
->last_caller
= sec
;
2797 callee
->fun
->call_count
+= 1;
2799 if (!insert_callee (caller
, callee
))
2802 && !callee
->fun
->is_func
2803 && callee
->fun
->stack
== 0)
2805 /* This is either a tail call or a branch from one part of
2806 the function to another, ie. hot/cold section. If the
2807 destination has been called by some other function then
2808 it is a separate function. We also assume that functions
2809 are not split across input files. */
2810 if (sec
->owner
!= sym_sec
->owner
)
2812 callee
->fun
->start
= NULL
;
2813 callee
->fun
->is_func
= TRUE
;
2815 else if (callee
->fun
->start
== NULL
)
2817 struct function_info
*caller_start
= caller
;
2818 while (caller_start
->start
)
2819 caller_start
= caller_start
->start
;
2821 if (caller_start
!= callee
->fun
)
2822 callee
->fun
->start
= caller_start
;
2826 struct function_info
*callee_start
;
2827 struct function_info
*caller_start
;
2828 callee_start
= callee
->fun
;
2829 while (callee_start
->start
)
2830 callee_start
= callee_start
->start
;
2831 caller_start
= caller
;
2832 while (caller_start
->start
)
2833 caller_start
= caller_start
->start
;
2834 if (caller_start
!= callee_start
)
2836 callee
->fun
->start
= NULL
;
2837 callee
->fun
->is_func
= TRUE
;
2846 /* Handle something like .init or .fini, which has a piece of a function.
2847 These sections are pasted together to form a single function. */
2850 pasted_function (asection
*sec
)
2852 struct bfd_link_order
*l
;
2853 struct _spu_elf_section_data
*sec_data
;
2854 struct spu_elf_stack_info
*sinfo
;
2855 Elf_Internal_Sym
*fake
;
2856 struct function_info
*fun
, *fun_start
;
2858 fake
= bfd_zmalloc (sizeof (*fake
));
2862 fake
->st_size
= sec
->size
;
2864 = _bfd_elf_section_from_bfd_section (sec
->owner
, sec
);
2865 fun
= maybe_insert_function (sec
, fake
, FALSE
, FALSE
);
2869 /* Find a function immediately preceding this section. */
2871 for (l
= sec
->output_section
->map_head
.link_order
; l
!= NULL
; l
= l
->next
)
2873 if (l
->u
.indirect
.section
== sec
)
2875 if (fun_start
!= NULL
)
2877 struct call_info
*callee
= bfd_malloc (sizeof *callee
);
2881 fun
->start
= fun_start
;
2883 callee
->is_tail
= TRUE
;
2884 callee
->is_pasted
= TRUE
;
2886 if (!insert_callee (fun_start
, callee
))
2892 if (l
->type
== bfd_indirect_link_order
2893 && (sec_data
= spu_elf_section_data (l
->u
.indirect
.section
)) != NULL
2894 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
2895 && sinfo
->num_fun
!= 0)
2896 fun_start
= &sinfo
->fun
[sinfo
->num_fun
- 1];
2899 /* Don't return an error if we did not find a function preceding this
2900 section. The section may have incorrect flags. */
2904 /* Map address ranges in code sections to functions. */
2907 discover_functions (struct bfd_link_info
*info
)
2911 Elf_Internal_Sym
***psym_arr
;
2912 asection
***sec_arr
;
2913 bfd_boolean gaps
= FALSE
;
2916 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
2919 psym_arr
= bfd_zmalloc (bfd_idx
* sizeof (*psym_arr
));
2920 if (psym_arr
== NULL
)
2922 sec_arr
= bfd_zmalloc (bfd_idx
* sizeof (*sec_arr
));
2923 if (sec_arr
== NULL
)
2926 for (ibfd
= info
->input_bfds
, bfd_idx
= 0;
2928 ibfd
= ibfd
->link_next
, bfd_idx
++)
2930 extern const bfd_target bfd_elf32_spu_vec
;
2931 Elf_Internal_Shdr
*symtab_hdr
;
2934 Elf_Internal_Sym
*syms
, *sy
, **psyms
, **psy
;
2935 asection
**psecs
, **p
;
2937 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
2940 /* Read all the symbols. */
2941 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
2942 symcount
= symtab_hdr
->sh_size
/ symtab_hdr
->sh_entsize
;
2946 for (sec
= ibfd
->sections
; sec
!= NULL
&& !gaps
; sec
= sec
->next
)
2947 if (interesting_section (sec
))
2955 if (symtab_hdr
->contents
!= NULL
)
2957 /* Don't use cached symbols since the generic ELF linker
2958 code only reads local symbols, and we need globals too. */
2959 free (symtab_hdr
->contents
);
2960 symtab_hdr
->contents
= NULL
;
2962 syms
= bfd_elf_get_elf_syms (ibfd
, symtab_hdr
, symcount
, 0,
2964 symtab_hdr
->contents
= (void *) syms
;
2968 /* Select defined function symbols that are going to be output. */
2969 psyms
= bfd_malloc ((symcount
+ 1) * sizeof (*psyms
));
2972 psym_arr
[bfd_idx
] = psyms
;
2973 psecs
= bfd_malloc (symcount
* sizeof (*psecs
));
2976 sec_arr
[bfd_idx
] = psecs
;
2977 for (psy
= psyms
, p
= psecs
, sy
= syms
; sy
< syms
+ symcount
; ++p
, ++sy
)
2978 if (ELF_ST_TYPE (sy
->st_info
) == STT_NOTYPE
2979 || ELF_ST_TYPE (sy
->st_info
) == STT_FUNC
)
2983 *p
= s
= bfd_section_from_elf_index (ibfd
, sy
->st_shndx
);
2984 if (s
!= NULL
&& interesting_section (s
))
2987 symcount
= psy
- psyms
;
2990 /* Sort them by section and offset within section. */
2991 sort_syms_syms
= syms
;
2992 sort_syms_psecs
= psecs
;
2993 qsort (psyms
, symcount
, sizeof (*psyms
), sort_syms
);
2995 /* Now inspect the function symbols. */
2996 for (psy
= psyms
; psy
< psyms
+ symcount
; )
2998 asection
*s
= psecs
[*psy
- syms
];
2999 Elf_Internal_Sym
**psy2
;
3001 for (psy2
= psy
; ++psy2
< psyms
+ symcount
; )
3002 if (psecs
[*psy2
- syms
] != s
)
3005 if (!alloc_stack_info (s
, psy2
- psy
))
3010 /* First install info about properly typed and sized functions.
3011 In an ideal world this will cover all code sections, except
3012 when partitioning functions into hot and cold sections,
3013 and the horrible pasted together .init and .fini functions. */
3014 for (psy
= psyms
; psy
< psyms
+ symcount
; ++psy
)
3017 if (ELF_ST_TYPE (sy
->st_info
) == STT_FUNC
)
3019 asection
*s
= psecs
[sy
- syms
];
3020 if (!maybe_insert_function (s
, sy
, FALSE
, TRUE
))
3025 for (sec
= ibfd
->sections
; sec
!= NULL
&& !gaps
; sec
= sec
->next
)
3026 if (interesting_section (sec
))
3027 gaps
|= check_function_ranges (sec
, info
);
3032 /* See if we can discover more function symbols by looking at
3034 for (ibfd
= info
->input_bfds
, bfd_idx
= 0;
3036 ibfd
= ibfd
->link_next
, bfd_idx
++)
3040 if (psym_arr
[bfd_idx
] == NULL
)
3043 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3044 if (!mark_functions_via_relocs (sec
, info
, FALSE
))
3048 for (ibfd
= info
->input_bfds
, bfd_idx
= 0;
3050 ibfd
= ibfd
->link_next
, bfd_idx
++)
3052 Elf_Internal_Shdr
*symtab_hdr
;
3054 Elf_Internal_Sym
*syms
, *sy
, **psyms
, **psy
;
3057 if ((psyms
= psym_arr
[bfd_idx
]) == NULL
)
3060 psecs
= sec_arr
[bfd_idx
];
3062 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
3063 syms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
3066 for (sec
= ibfd
->sections
; sec
!= NULL
&& !gaps
; sec
= sec
->next
)
3067 if (interesting_section (sec
))
3068 gaps
|= check_function_ranges (sec
, info
);
3072 /* Finally, install all globals. */
3073 for (psy
= psyms
; (sy
= *psy
) != NULL
; ++psy
)
3077 s
= psecs
[sy
- syms
];
3079 /* Global syms might be improperly typed functions. */
3080 if (ELF_ST_TYPE (sy
->st_info
) != STT_FUNC
3081 && ELF_ST_BIND (sy
->st_info
) == STB_GLOBAL
)
3083 if (!maybe_insert_function (s
, sy
, FALSE
, FALSE
))
3089 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
3091 extern const bfd_target bfd_elf32_spu_vec
;
3094 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
3097 /* Some of the symbols we've installed as marking the
3098 beginning of functions may have a size of zero. Extend
3099 the range of such functions to the beginning of the
3100 next symbol of interest. */
3101 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3102 if (interesting_section (sec
))
3104 struct _spu_elf_section_data
*sec_data
;
3105 struct spu_elf_stack_info
*sinfo
;
3107 sec_data
= spu_elf_section_data (sec
);
3108 sinfo
= sec_data
->u
.i
.stack_info
;
3109 if (sinfo
!= NULL
&& sinfo
->num_fun
!= 0)
3112 bfd_vma hi
= sec
->size
;
3114 for (fun_idx
= sinfo
->num_fun
; --fun_idx
>= 0; )
3116 sinfo
->fun
[fun_idx
].hi
= hi
;
3117 hi
= sinfo
->fun
[fun_idx
].lo
;
3120 sinfo
->fun
[0].lo
= 0;
3122 /* No symbols in this section. Must be .init or .fini
3123 or something similar. */
3124 else if (!pasted_function (sec
))
3130 for (ibfd
= info
->input_bfds
, bfd_idx
= 0;
3132 ibfd
= ibfd
->link_next
, bfd_idx
++)
3134 if (psym_arr
[bfd_idx
] == NULL
)
3137 free (psym_arr
[bfd_idx
]);
3138 free (sec_arr
[bfd_idx
]);
3147 /* Iterate over all function_info we have collected, calling DOIT on
3148 each node if ROOT_ONLY is false. Only call DOIT on root nodes
3152 for_each_node (bfd_boolean (*doit
) (struct function_info
*,
3153 struct bfd_link_info
*,
3155 struct bfd_link_info
*info
,
3161 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
3163 extern const bfd_target bfd_elf32_spu_vec
;
3166 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
3169 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3171 struct _spu_elf_section_data
*sec_data
;
3172 struct spu_elf_stack_info
*sinfo
;
3174 if ((sec_data
= spu_elf_section_data (sec
)) != NULL
3175 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3178 for (i
= 0; i
< sinfo
->num_fun
; ++i
)
3179 if (!root_only
|| !sinfo
->fun
[i
].non_root
)
3180 if (!doit (&sinfo
->fun
[i
], info
, param
))
3188 /* Transfer call info attached to struct function_info entries for
3189 all of a given function's sections to the first entry. */
3192 transfer_calls (struct function_info
*fun
,
3193 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
3194 void *param ATTRIBUTE_UNUSED
)
3196 struct function_info
*start
= fun
->start
;
3200 struct call_info
*call
, *call_next
;
3202 while (start
->start
!= NULL
)
3203 start
= start
->start
;
3204 for (call
= fun
->call_list
; call
!= NULL
; call
= call_next
)
3206 call_next
= call
->next
;
3207 if (!insert_callee (start
, call
))
3210 fun
->call_list
= NULL
;
3215 /* Mark nodes in the call graph that are called by some other node. */
3218 mark_non_root (struct function_info
*fun
,
3219 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
3220 void *param ATTRIBUTE_UNUSED
)
3222 struct call_info
*call
;
3227 for (call
= fun
->call_list
; call
; call
= call
->next
)
3229 call
->fun
->non_root
= TRUE
;
3230 mark_non_root (call
->fun
, 0, 0);
3235 /* Remove cycles from the call graph. Set depth of nodes. */
3238 remove_cycles (struct function_info
*fun
,
3239 struct bfd_link_info
*info
,
3242 struct call_info
**callp
, *call
;
3243 unsigned int depth
= *(unsigned int *) param
;
3244 unsigned int max_depth
= depth
;
3248 fun
->marking
= TRUE
;
3250 callp
= &fun
->call_list
;
3251 while ((call
= *callp
) != NULL
)
3253 call
->max_depth
= depth
+ !call
->is_pasted
;
3254 if (!call
->fun
->visit2
)
3256 if (!remove_cycles (call
->fun
, info
, &call
->max_depth
))
3258 if (max_depth
< call
->max_depth
)
3259 max_depth
= call
->max_depth
;
3261 else if (call
->fun
->marking
)
3263 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
3265 if (!htab
->params
->auto_overlay
3266 && htab
->params
->stack_analysis
)
3268 const char *f1
= func_name (fun
);
3269 const char *f2
= func_name (call
->fun
);
3271 info
->callbacks
->info (_("Stack analysis will ignore the call "
3276 call
->broken_cycle
= TRUE
;
3278 callp
= &call
->next
;
3280 fun
->marking
= FALSE
;
3281 *(unsigned int *) param
= max_depth
;
3285 /* Check that we actually visited all nodes in remove_cycles. If we
3286 didn't, then there is some cycle in the call graph not attached to
3287 any root node. Arbitrarily choose a node in the cycle as a new
3288 root and break the cycle. */
3291 mark_detached_root (struct function_info
*fun
,
3292 struct bfd_link_info
*info
,
3297 fun
->non_root
= FALSE
;
3298 *(unsigned int *) param
= 0;
3299 return remove_cycles (fun
, info
, param
);
3302 /* Populate call_list for each function. */
3305 build_call_tree (struct bfd_link_info
*info
)
3310 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
3312 extern const bfd_target bfd_elf32_spu_vec
;
3315 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
3318 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3319 if (!mark_functions_via_relocs (sec
, info
, TRUE
))
3323 /* Transfer call info from hot/cold section part of function
3325 if (!spu_hash_table (info
)->params
->auto_overlay
3326 && !for_each_node (transfer_calls
, info
, 0, FALSE
))
3329 /* Find the call graph root(s). */
3330 if (!for_each_node (mark_non_root
, info
, 0, FALSE
))
3333 /* Remove cycles from the call graph. We start from the root node(s)
3334 so that we break cycles in a reasonable place. */
3336 if (!for_each_node (remove_cycles
, info
, &depth
, TRUE
))
3339 return for_each_node (mark_detached_root
, info
, &depth
, FALSE
);
3342 /* qsort predicate to sort calls by priority, max_depth then count. */
3345 sort_calls (const void *a
, const void *b
)
3347 struct call_info
*const *c1
= a
;
3348 struct call_info
*const *c2
= b
;
3351 delta
= (*c2
)->priority
- (*c1
)->priority
;
3355 delta
= (*c2
)->max_depth
- (*c1
)->max_depth
;
3359 delta
= (*c2
)->count
- (*c1
)->count
;
3363 return (char *) c1
- (char *) c2
;
3367 unsigned int max_overlay_size
;
3370 /* Set linker_mark and gc_mark on any sections that we will put in
3371 overlays. These flags are used by the generic ELF linker, but we
3372 won't be continuing on to bfd_elf_final_link so it is OK to use
3373 them. linker_mark is clear before we get here. Set segment_mark
3374 on sections that are part of a pasted function (excluding the last
3377 Set up function rodata section if --overlay-rodata. We don't
3378 currently include merged string constant rodata sections since
3380 Sort the call graph so that the deepest nodes will be visited
3384 mark_overlay_section (struct function_info
*fun
,
3385 struct bfd_link_info
*info
,
3388 struct call_info
*call
;
3390 struct _mos_param
*mos_param
= param
;
3391 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
3397 if (!fun
->sec
->linker_mark
3398 && (htab
->params
->ovly_flavour
!= ovly_soft_icache
3399 || htab
->params
->non_ia_text
3400 || strncmp (fun
->sec
->name
, ".text.ia.", 9) == 0
3401 || strcmp (fun
->sec
->name
, ".init") == 0
3402 || strcmp (fun
->sec
->name
, ".fini") == 0))
3406 fun
->sec
->linker_mark
= 1;
3407 fun
->sec
->gc_mark
= 1;
3408 fun
->sec
->segment_mark
= 0;
3409 /* Ensure SEC_CODE is set on this text section (it ought to
3410 be!), and SEC_CODE is clear on rodata sections. We use
3411 this flag to differentiate the two overlay section types. */
3412 fun
->sec
->flags
|= SEC_CODE
;
3414 size
= fun
->sec
->size
;
3415 if (htab
->params
->auto_overlay
& OVERLAY_RODATA
)
3419 /* Find the rodata section corresponding to this function's
3421 if (strcmp (fun
->sec
->name
, ".text") == 0)
3423 name
= bfd_malloc (sizeof (".rodata"));
3426 memcpy (name
, ".rodata", sizeof (".rodata"));
3428 else if (strncmp (fun
->sec
->name
, ".text.", 6) == 0)
3430 size_t len
= strlen (fun
->sec
->name
);
3431 name
= bfd_malloc (len
+ 3);
3434 memcpy (name
, ".rodata", sizeof (".rodata"));
3435 memcpy (name
+ 7, fun
->sec
->name
+ 5, len
- 4);
3437 else if (strncmp (fun
->sec
->name
, ".gnu.linkonce.t.", 16) == 0)
3439 size_t len
= strlen (fun
->sec
->name
) + 1;
3440 name
= bfd_malloc (len
);
3443 memcpy (name
, fun
->sec
->name
, len
);
3449 asection
*rodata
= NULL
;
3450 asection
*group_sec
= elf_section_data (fun
->sec
)->next_in_group
;
3451 if (group_sec
== NULL
)
3452 rodata
= bfd_get_section_by_name (fun
->sec
->owner
, name
);
3454 while (group_sec
!= NULL
&& group_sec
!= fun
->sec
)
3456 if (strcmp (group_sec
->name
, name
) == 0)
3461 group_sec
= elf_section_data (group_sec
)->next_in_group
;
3463 fun
->rodata
= rodata
;
3466 size
+= fun
->rodata
->size
;
3467 if (htab
->params
->line_size
!= 0
3468 && size
> htab
->params
->line_size
)
3470 size
-= fun
->rodata
->size
;
3475 fun
->rodata
->linker_mark
= 1;
3476 fun
->rodata
->gc_mark
= 1;
3477 fun
->rodata
->flags
&= ~SEC_CODE
;
3483 if (mos_param
->max_overlay_size
< size
)
3484 mos_param
->max_overlay_size
= size
;
3487 for (count
= 0, call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3492 struct call_info
**calls
= bfd_malloc (count
* sizeof (*calls
));
3496 for (count
= 0, call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3497 calls
[count
++] = call
;
3499 qsort (calls
, count
, sizeof (*calls
), sort_calls
);
3501 fun
->call_list
= NULL
;
3505 calls
[count
]->next
= fun
->call_list
;
3506 fun
->call_list
= calls
[count
];
3511 for (call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3513 if (call
->is_pasted
)
3515 /* There can only be one is_pasted call per function_info. */
3516 BFD_ASSERT (!fun
->sec
->segment_mark
);
3517 fun
->sec
->segment_mark
= 1;
3519 if (!call
->broken_cycle
3520 && !mark_overlay_section (call
->fun
, info
, param
))
3524 /* Don't put entry code into an overlay. The overlay manager needs
3525 a stack! Also, don't mark .ovl.init as an overlay. */
3526 if (fun
->lo
+ fun
->sec
->output_offset
+ fun
->sec
->output_section
->vma
3527 == info
->output_bfd
->start_address
3528 || strncmp (fun
->sec
->output_section
->name
, ".ovl.init", 9) == 0)
3530 fun
->sec
->linker_mark
= 0;
3531 if (fun
->rodata
!= NULL
)
3532 fun
->rodata
->linker_mark
= 0;
3537 /* If non-zero then unmark functions called from those within sections
3538 that we need to unmark. Unfortunately this isn't reliable since the
3539 call graph cannot know the destination of function pointer calls. */
3540 #define RECURSE_UNMARK 0
3543 asection
*exclude_input_section
;
3544 asection
*exclude_output_section
;
3545 unsigned long clearing
;
3548 /* Undo some of mark_overlay_section's work. */
3551 unmark_overlay_section (struct function_info
*fun
,
3552 struct bfd_link_info
*info
,
3555 struct call_info
*call
;
3556 struct _uos_param
*uos_param
= param
;
3557 unsigned int excluded
= 0;
3565 if (fun
->sec
== uos_param
->exclude_input_section
3566 || fun
->sec
->output_section
== uos_param
->exclude_output_section
)
3570 uos_param
->clearing
+= excluded
;
3572 if (RECURSE_UNMARK
? uos_param
->clearing
: excluded
)
3574 fun
->sec
->linker_mark
= 0;
3576 fun
->rodata
->linker_mark
= 0;
3579 for (call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3580 if (!call
->broken_cycle
3581 && !unmark_overlay_section (call
->fun
, info
, param
))
3585 uos_param
->clearing
-= excluded
;
3590 unsigned int lib_size
;
3591 asection
**lib_sections
;
3594 /* Add sections we have marked as belonging to overlays to an array
3595 for consideration as non-overlay sections. The array consist of
3596 pairs of sections, (text,rodata), for functions in the call graph. */
3599 collect_lib_sections (struct function_info
*fun
,
3600 struct bfd_link_info
*info
,
3603 struct _cl_param
*lib_param
= param
;
3604 struct call_info
*call
;
3611 if (!fun
->sec
->linker_mark
|| !fun
->sec
->gc_mark
|| fun
->sec
->segment_mark
)
3614 size
= fun
->sec
->size
;
3616 size
+= fun
->rodata
->size
;
3618 if (size
<= lib_param
->lib_size
)
3620 *lib_param
->lib_sections
++ = fun
->sec
;
3621 fun
->sec
->gc_mark
= 0;
3622 if (fun
->rodata
&& fun
->rodata
->linker_mark
&& fun
->rodata
->gc_mark
)
3624 *lib_param
->lib_sections
++ = fun
->rodata
;
3625 fun
->rodata
->gc_mark
= 0;
3628 *lib_param
->lib_sections
++ = NULL
;
3631 for (call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3632 if (!call
->broken_cycle
)
3633 collect_lib_sections (call
->fun
, info
, param
);
3638 /* qsort predicate to sort sections by call count. */
3641 sort_lib (const void *a
, const void *b
)
3643 asection
*const *s1
= a
;
3644 asection
*const *s2
= b
;
3645 struct _spu_elf_section_data
*sec_data
;
3646 struct spu_elf_stack_info
*sinfo
;
3650 if ((sec_data
= spu_elf_section_data (*s1
)) != NULL
3651 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3654 for (i
= 0; i
< sinfo
->num_fun
; ++i
)
3655 delta
-= sinfo
->fun
[i
].call_count
;
3658 if ((sec_data
= spu_elf_section_data (*s2
)) != NULL
3659 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3662 for (i
= 0; i
< sinfo
->num_fun
; ++i
)
3663 delta
+= sinfo
->fun
[i
].call_count
;
3672 /* Remove some sections from those marked to be in overlays. Choose
3673 those that are called from many places, likely library functions. */
3676 auto_ovl_lib_functions (struct bfd_link_info
*info
, unsigned int lib_size
)
3679 asection
**lib_sections
;
3680 unsigned int i
, lib_count
;
3681 struct _cl_param collect_lib_param
;
3682 struct function_info dummy_caller
;
3683 struct spu_link_hash_table
*htab
;
3685 memset (&dummy_caller
, 0, sizeof (dummy_caller
));
3687 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
3689 extern const bfd_target bfd_elf32_spu_vec
;
3692 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
3695 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3696 if (sec
->linker_mark
3697 && sec
->size
< lib_size
3698 && (sec
->flags
& SEC_CODE
) != 0)
3701 lib_sections
= bfd_malloc (lib_count
* 2 * sizeof (*lib_sections
));
3702 if (lib_sections
== NULL
)
3703 return (unsigned int) -1;
3704 collect_lib_param
.lib_size
= lib_size
;
3705 collect_lib_param
.lib_sections
= lib_sections
;
3706 if (!for_each_node (collect_lib_sections
, info
, &collect_lib_param
,
3708 return (unsigned int) -1;
3709 lib_count
= (collect_lib_param
.lib_sections
- lib_sections
) / 2;
3711 /* Sort sections so that those with the most calls are first. */
3713 qsort (lib_sections
, lib_count
, 2 * sizeof (*lib_sections
), sort_lib
);
3715 htab
= spu_hash_table (info
);
3716 for (i
= 0; i
< lib_count
; i
++)
3718 unsigned int tmp
, stub_size
;
3720 struct _spu_elf_section_data
*sec_data
;
3721 struct spu_elf_stack_info
*sinfo
;
3723 sec
= lib_sections
[2 * i
];
3724 /* If this section is OK, its size must be less than lib_size. */
3726 /* If it has a rodata section, then add that too. */
3727 if (lib_sections
[2 * i
+ 1])
3728 tmp
+= lib_sections
[2 * i
+ 1]->size
;
3729 /* Add any new overlay call stubs needed by the section. */
3732 && (sec_data
= spu_elf_section_data (sec
)) != NULL
3733 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3736 struct call_info
*call
;
3738 for (k
= 0; k
< sinfo
->num_fun
; ++k
)
3739 for (call
= sinfo
->fun
[k
].call_list
; call
; call
= call
->next
)
3740 if (call
->fun
->sec
->linker_mark
)
3742 struct call_info
*p
;
3743 for (p
= dummy_caller
.call_list
; p
; p
= p
->next
)
3744 if (p
->fun
== call
->fun
)
3747 stub_size
+= ovl_stub_size (htab
->params
);
3750 if (tmp
+ stub_size
< lib_size
)
3752 struct call_info
**pp
, *p
;
3754 /* This section fits. Mark it as non-overlay. */
3755 lib_sections
[2 * i
]->linker_mark
= 0;
3756 if (lib_sections
[2 * i
+ 1])
3757 lib_sections
[2 * i
+ 1]->linker_mark
= 0;
3758 lib_size
-= tmp
+ stub_size
;
3759 /* Call stubs to the section we just added are no longer
3761 pp
= &dummy_caller
.call_list
;
3762 while ((p
= *pp
) != NULL
)
3763 if (!p
->fun
->sec
->linker_mark
)
3765 lib_size
+= ovl_stub_size (htab
->params
);
3771 /* Add new call stubs to dummy_caller. */
3772 if ((sec_data
= spu_elf_section_data (sec
)) != NULL
3773 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3776 struct call_info
*call
;
3778 for (k
= 0; k
< sinfo
->num_fun
; ++k
)
3779 for (call
= sinfo
->fun
[k
].call_list
;
3782 if (call
->fun
->sec
->linker_mark
)
3784 struct call_info
*callee
;
3785 callee
= bfd_malloc (sizeof (*callee
));
3787 return (unsigned int) -1;
3789 if (!insert_callee (&dummy_caller
, callee
))
3795 while (dummy_caller
.call_list
!= NULL
)
3797 struct call_info
*call
= dummy_caller
.call_list
;
3798 dummy_caller
.call_list
= call
->next
;
3801 for (i
= 0; i
< 2 * lib_count
; i
++)
3802 if (lib_sections
[i
])
3803 lib_sections
[i
]->gc_mark
= 1;
3804 free (lib_sections
);
3808 /* Build an array of overlay sections. The deepest node's section is
3809 added first, then its parent node's section, then everything called
3810 from the parent section. The idea being to group sections to
3811 minimise calls between different overlays. */
3814 collect_overlays (struct function_info
*fun
,
3815 struct bfd_link_info
*info
,
3818 struct call_info
*call
;
3819 bfd_boolean added_fun
;
3820 asection
***ovly_sections
= param
;
3826 for (call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3827 if (!call
->is_pasted
&& !call
->broken_cycle
)
3829 if (!collect_overlays (call
->fun
, info
, ovly_sections
))
3835 if (fun
->sec
->linker_mark
&& fun
->sec
->gc_mark
)
3837 fun
->sec
->gc_mark
= 0;
3838 *(*ovly_sections
)++ = fun
->sec
;
3839 if (fun
->rodata
&& fun
->rodata
->linker_mark
&& fun
->rodata
->gc_mark
)
3841 fun
->rodata
->gc_mark
= 0;
3842 *(*ovly_sections
)++ = fun
->rodata
;
3845 *(*ovly_sections
)++ = NULL
;
3848 /* Pasted sections must stay with the first section. We don't
3849 put pasted sections in the array, just the first section.
3850 Mark subsequent sections as already considered. */
3851 if (fun
->sec
->segment_mark
)
3853 struct function_info
*call_fun
= fun
;
3856 for (call
= call_fun
->call_list
; call
!= NULL
; call
= call
->next
)
3857 if (call
->is_pasted
)
3859 call_fun
= call
->fun
;
3860 call_fun
->sec
->gc_mark
= 0;
3861 if (call_fun
->rodata
)
3862 call_fun
->rodata
->gc_mark
= 0;
3868 while (call_fun
->sec
->segment_mark
);
3872 for (call
= fun
->call_list
; call
!= NULL
; call
= call
->next
)
3873 if (!call
->broken_cycle
3874 && !collect_overlays (call
->fun
, info
, ovly_sections
))
3879 struct _spu_elf_section_data
*sec_data
;
3880 struct spu_elf_stack_info
*sinfo
;
3882 if ((sec_data
= spu_elf_section_data (fun
->sec
)) != NULL
3883 && (sinfo
= sec_data
->u
.i
.stack_info
) != NULL
)
3886 for (i
= 0; i
< sinfo
->num_fun
; ++i
)
3887 if (!collect_overlays (&sinfo
->fun
[i
], info
, ovly_sections
))
3895 struct _sum_stack_param
{
3897 size_t overall_stack
;
3898 bfd_boolean emit_stack_syms
;
3901 /* Descend the call graph for FUN, accumulating total stack required. */
3904 sum_stack (struct function_info
*fun
,
3905 struct bfd_link_info
*info
,
3908 struct call_info
*call
;
3909 struct function_info
*max
;
3910 size_t stack
, cum_stack
;
3912 bfd_boolean has_call
;
3913 struct _sum_stack_param
*sum_stack_param
= param
;
3914 struct spu_link_hash_table
*htab
;
3916 cum_stack
= fun
->stack
;
3917 sum_stack_param
->cum_stack
= cum_stack
;
3923 for (call
= fun
->call_list
; call
; call
= call
->next
)
3925 if (call
->broken_cycle
)
3927 if (!call
->is_pasted
)
3929 if (!sum_stack (call
->fun
, info
, sum_stack_param
))
3931 stack
= sum_stack_param
->cum_stack
;
3932 /* Include caller stack for normal calls, don't do so for
3933 tail calls. fun->stack here is local stack usage for
3935 if (!call
->is_tail
|| call
->is_pasted
|| call
->fun
->start
!= NULL
)
3936 stack
+= fun
->stack
;
3937 if (cum_stack
< stack
)
3944 sum_stack_param
->cum_stack
= cum_stack
;
3946 /* Now fun->stack holds cumulative stack. */
3947 fun
->stack
= cum_stack
;
3951 && sum_stack_param
->overall_stack
< cum_stack
)
3952 sum_stack_param
->overall_stack
= cum_stack
;
3954 htab
= spu_hash_table (info
);
3955 if (htab
->params
->auto_overlay
)
3958 f1
= func_name (fun
);
3959 if (htab
->params
->stack_analysis
)
3962 info
->callbacks
->info (_(" %s: 0x%v\n"), f1
, (bfd_vma
) cum_stack
);
3963 info
->callbacks
->minfo (_("%s: 0x%v 0x%v\n"),
3964 f1
, (bfd_vma
) stack
, (bfd_vma
) cum_stack
);
3968 info
->callbacks
->minfo (_(" calls:\n"));
3969 for (call
= fun
->call_list
; call
; call
= call
->next
)
3970 if (!call
->is_pasted
&& !call
->broken_cycle
)
3972 const char *f2
= func_name (call
->fun
);
3973 const char *ann1
= call
->fun
== max
? "*" : " ";
3974 const char *ann2
= call
->is_tail
? "t" : " ";
3976 info
->callbacks
->minfo (_(" %s%s %s\n"), ann1
, ann2
, f2
);
3981 if (sum_stack_param
->emit_stack_syms
)
3983 char *name
= bfd_malloc (18 + strlen (f1
));
3984 struct elf_link_hash_entry
*h
;
3989 if (fun
->global
|| ELF_ST_BIND (fun
->u
.sym
->st_info
) == STB_GLOBAL
)
3990 sprintf (name
, "__stack_%s", f1
);
3992 sprintf (name
, "__stack_%x_%s", fun
->sec
->id
& 0xffffffff, f1
);
3994 h
= elf_link_hash_lookup (&htab
->elf
, name
, TRUE
, TRUE
, FALSE
);
3997 && (h
->root
.type
== bfd_link_hash_new
3998 || h
->root
.type
== bfd_link_hash_undefined
3999 || h
->root
.type
== bfd_link_hash_undefweak
))
4001 h
->root
.type
= bfd_link_hash_defined
;
4002 h
->root
.u
.def
.section
= bfd_abs_section_ptr
;
4003 h
->root
.u
.def
.value
= cum_stack
;
4008 h
->ref_regular_nonweak
= 1;
4009 h
->forced_local
= 1;
4017 /* SEC is part of a pasted function. Return the call_info for the
4018 next section of this function. */
4020 static struct call_info
*
4021 find_pasted_call (asection
*sec
)
4023 struct _spu_elf_section_data
*sec_data
= spu_elf_section_data (sec
);
4024 struct spu_elf_stack_info
*sinfo
= sec_data
->u
.i
.stack_info
;
4025 struct call_info
*call
;
4028 for (k
= 0; k
< sinfo
->num_fun
; ++k
)
4029 for (call
= sinfo
->fun
[k
].call_list
; call
!= NULL
; call
= call
->next
)
4030 if (call
->is_pasted
)
4036 /* qsort predicate to sort bfds by file name. */
4039 sort_bfds (const void *a
, const void *b
)
4041 bfd
*const *abfd1
= a
;
4042 bfd
*const *abfd2
= b
;
4044 return strcmp ((*abfd1
)->filename
, (*abfd2
)->filename
);
4048 print_one_overlay_section (FILE *script
,
4051 unsigned int ovlynum
,
4052 unsigned int *ovly_map
,
4053 asection
**ovly_sections
,
4054 struct bfd_link_info
*info
)
4058 for (j
= base
; j
< count
&& ovly_map
[j
] == ovlynum
; j
++)
4060 asection
*sec
= ovly_sections
[2 * j
];
4062 if (fprintf (script
, " %s%c%s (%s)\n",
4063 (sec
->owner
->my_archive
!= NULL
4064 ? sec
->owner
->my_archive
->filename
: ""),
4065 info
->path_separator
,
4066 sec
->owner
->filename
,
4069 if (sec
->segment_mark
)
4071 struct call_info
*call
= find_pasted_call (sec
);
4072 while (call
!= NULL
)
4074 struct function_info
*call_fun
= call
->fun
;
4075 sec
= call_fun
->sec
;
4076 if (fprintf (script
, " %s%c%s (%s)\n",
4077 (sec
->owner
->my_archive
!= NULL
4078 ? sec
->owner
->my_archive
->filename
: ""),
4079 info
->path_separator
,
4080 sec
->owner
->filename
,
4083 for (call
= call_fun
->call_list
; call
; call
= call
->next
)
4084 if (call
->is_pasted
)
4090 for (j
= base
; j
< count
&& ovly_map
[j
] == ovlynum
; j
++)
4092 asection
*sec
= ovly_sections
[2 * j
+ 1];
4094 && fprintf (script
, " %s%c%s (%s)\n",
4095 (sec
->owner
->my_archive
!= NULL
4096 ? sec
->owner
->my_archive
->filename
: ""),
4097 info
->path_separator
,
4098 sec
->owner
->filename
,
4102 sec
= ovly_sections
[2 * j
];
4103 if (sec
->segment_mark
)
4105 struct call_info
*call
= find_pasted_call (sec
);
4106 while (call
!= NULL
)
4108 struct function_info
*call_fun
= call
->fun
;
4109 sec
= call_fun
->rodata
;
4111 && fprintf (script
, " %s%c%s (%s)\n",
4112 (sec
->owner
->my_archive
!= NULL
4113 ? sec
->owner
->my_archive
->filename
: ""),
4114 info
->path_separator
,
4115 sec
->owner
->filename
,
4118 for (call
= call_fun
->call_list
; call
; call
= call
->next
)
4119 if (call
->is_pasted
)
4128 /* Handle --auto-overlay. */
4131 spu_elf_auto_overlay (struct bfd_link_info
*info
)
4135 struct elf_segment_map
*m
;
4136 unsigned int fixed_size
, lo
, hi
;
4137 struct spu_link_hash_table
*htab
;
4138 unsigned int base
, i
, count
, bfd_count
;
4139 unsigned int region
, ovlynum
;
4140 asection
**ovly_sections
, **ovly_p
;
4141 unsigned int *ovly_map
;
4143 unsigned int total_overlay_size
, overlay_size
;
4144 const char *ovly_mgr_entry
;
4145 struct elf_link_hash_entry
*h
;
4146 struct _mos_param mos_param
;
4147 struct _uos_param uos_param
;
4148 struct function_info dummy_caller
;
4150 /* Find the extents of our loadable image. */
4151 lo
= (unsigned int) -1;
4153 for (m
= elf_tdata (info
->output_bfd
)->segment_map
; m
!= NULL
; m
= m
->next
)
4154 if (m
->p_type
== PT_LOAD
)
4155 for (i
= 0; i
< m
->count
; i
++)
4156 if (m
->sections
[i
]->size
!= 0)
4158 if (m
->sections
[i
]->vma
< lo
)
4159 lo
= m
->sections
[i
]->vma
;
4160 if (m
->sections
[i
]->vma
+ m
->sections
[i
]->size
- 1 > hi
)
4161 hi
= m
->sections
[i
]->vma
+ m
->sections
[i
]->size
- 1;
4163 fixed_size
= hi
+ 1 - lo
;
4165 if (!discover_functions (info
))
4168 if (!build_call_tree (info
))
4171 htab
= spu_hash_table (info
);
4172 if (htab
->reserved
== 0)
4174 struct _sum_stack_param sum_stack_param
;
4176 sum_stack_param
.emit_stack_syms
= 0;
4177 sum_stack_param
.overall_stack
= 0;
4178 if (!for_each_node (sum_stack
, info
, &sum_stack_param
, TRUE
))
4180 htab
->reserved
= sum_stack_param
.overall_stack
+ htab
->extra_stack_space
;
4183 /* No need for overlays if everything already fits. */
4184 if (fixed_size
+ htab
->reserved
<= htab
->local_store
4185 && htab
->params
->ovly_flavour
!= ovly_soft_icache
)
4187 htab
->params
->auto_overlay
= 0;
4191 uos_param
.exclude_input_section
= 0;
4192 uos_param
.exclude_output_section
4193 = bfd_get_section_by_name (info
->output_bfd
, ".interrupt");
4195 ovly_mgr_entry
= "__ovly_load";
4196 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
4197 ovly_mgr_entry
= "__icache_br_handler";
4198 h
= elf_link_hash_lookup (&htab
->elf
, ovly_mgr_entry
,
4199 FALSE
, FALSE
, FALSE
);
4201 && (h
->root
.type
== bfd_link_hash_defined
4202 || h
->root
.type
== bfd_link_hash_defweak
)
4205 /* We have a user supplied overlay manager. */
4206 uos_param
.exclude_input_section
= h
->root
.u
.def
.section
;
4210 /* If no user overlay manager, spu_elf_load_ovl_mgr will add our
4211 builtin version to .text, and will adjust .text size. */
4212 fixed_size
+= (*htab
->params
->spu_elf_load_ovl_mgr
) ();
4215 /* Mark overlay sections, and find max overlay section size. */
4216 mos_param
.max_overlay_size
= 0;
4217 if (!for_each_node (mark_overlay_section
, info
, &mos_param
, TRUE
))
4220 /* We can't put the overlay manager or interrupt routines in
4222 uos_param
.clearing
= 0;
4223 if ((uos_param
.exclude_input_section
4224 || uos_param
.exclude_output_section
)
4225 && !for_each_node (unmark_overlay_section
, info
, &uos_param
, TRUE
))
4229 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
4231 bfd_arr
= bfd_malloc (bfd_count
* sizeof (*bfd_arr
));
4232 if (bfd_arr
== NULL
)
4235 /* Count overlay sections, and subtract their sizes from "fixed_size". */
4238 total_overlay_size
= 0;
4239 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
4241 extern const bfd_target bfd_elf32_spu_vec
;
4243 unsigned int old_count
;
4245 if (ibfd
->xvec
!= &bfd_elf32_spu_vec
)
4249 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
4250 if (sec
->linker_mark
)
4252 if ((sec
->flags
& SEC_CODE
) != 0)
4254 fixed_size
-= sec
->size
;
4255 total_overlay_size
+= sec
->size
;
4257 else if ((sec
->flags
& (SEC_ALLOC
| SEC_LOAD
)) == (SEC_ALLOC
| SEC_LOAD
)
4258 && sec
->output_section
->owner
== info
->output_bfd
4259 && strncmp (sec
->output_section
->name
, ".ovl.init", 9) == 0)
4260 fixed_size
-= sec
->size
;
4261 if (count
!= old_count
)
4262 bfd_arr
[bfd_count
++] = ibfd
;
4265 /* Since the overlay link script selects sections by file name and
4266 section name, ensure that file names are unique. */
4269 bfd_boolean ok
= TRUE
;
4271 qsort (bfd_arr
, bfd_count
, sizeof (*bfd_arr
), sort_bfds
);
4272 for (i
= 1; i
< bfd_count
; ++i
)
4273 if (strcmp (bfd_arr
[i
- 1]->filename
, bfd_arr
[i
]->filename
) == 0)
4275 if (bfd_arr
[i
- 1]->my_archive
== bfd_arr
[i
]->my_archive
)
4277 if (bfd_arr
[i
- 1]->my_archive
&& bfd_arr
[i
]->my_archive
)
4278 info
->callbacks
->einfo (_("%s duplicated in %s\n"),
4279 bfd_arr
[i
]->filename
,
4280 bfd_arr
[i
]->my_archive
->filename
);
4282 info
->callbacks
->einfo (_("%s duplicated\n"),
4283 bfd_arr
[i
]->filename
);
4289 info
->callbacks
->einfo (_("sorry, no support for duplicate "
4290 "object files in auto-overlay script\n"));
4291 bfd_set_error (bfd_error_bad_value
);
4297 fixed_size
+= htab
->reserved
;
4298 fixed_size
+= htab
->non_ovly_stub
* ovl_stub_size (htab
->params
);
4299 if (fixed_size
+ mos_param
.max_overlay_size
<= htab
->local_store
)
4301 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
4303 /* Stubs in the non-icache area are bigger. */
4304 fixed_size
+= htab
->non_ovly_stub
* 16;
4305 /* Space for icache manager tables.
4306 a) Tag array, one quadword per cache line.
4307 - word 0: ia address of present line, init to zero. */
4308 fixed_size
+= 16 << htab
->num_lines_log2
;
4309 /* b) Rewrite "to" list, one quadword per cache line. */
4310 fixed_size
+= 16 << htab
->num_lines_log2
;
4311 /* c) Rewrite "from" list, one byte per outgoing branch (rounded up
4312 to a power-of-two number of full quadwords) per cache line. */
4313 fixed_size
+= 16 << (htab
->fromelem_size_log2
4314 + htab
->num_lines_log2
);
4315 /* d) Pointer to __ea backing store (toe), 1 quadword. */
4320 /* Guess number of overlays. Assuming overlay buffer is on
4321 average only half full should be conservative. */
4322 ovlynum
= (total_overlay_size
* 2 * htab
->params
->num_lines
4323 / (htab
->local_store
- fixed_size
));
4324 /* Space for _ovly_table[], _ovly_buf_table[] and toe. */
4325 fixed_size
+= ovlynum
* 16 + 16 + 4 + 16;
4329 if (fixed_size
+ mos_param
.max_overlay_size
> htab
->local_store
)
4330 info
->callbacks
->einfo (_("non-overlay size of 0x%v plus maximum overlay "
4331 "size of 0x%v exceeds local store\n"),
4332 (bfd_vma
) fixed_size
,
4333 (bfd_vma
) mos_param
.max_overlay_size
);
4335 /* Now see if we should put some functions in the non-overlay area. */
4336 else if (fixed_size
< htab
->overlay_fixed
)
4338 unsigned int max_fixed
, lib_size
;
4340 max_fixed
= htab
->local_store
- mos_param
.max_overlay_size
;
4341 if (max_fixed
> htab
->overlay_fixed
)
4342 max_fixed
= htab
->overlay_fixed
;
4343 lib_size
= max_fixed
- fixed_size
;
4344 lib_size
= auto_ovl_lib_functions (info
, lib_size
);
4345 if (lib_size
== (unsigned int) -1)
4347 fixed_size
= max_fixed
- lib_size
;
4350 /* Build an array of sections, suitably sorted to place into
4352 ovly_sections
= bfd_malloc (2 * count
* sizeof (*ovly_sections
));
4353 if (ovly_sections
== NULL
)
4355 ovly_p
= ovly_sections
;
4356 if (!for_each_node (collect_overlays
, info
, &ovly_p
, TRUE
))
4358 count
= (size_t) (ovly_p
- ovly_sections
) / 2;
4359 ovly_map
= bfd_malloc (count
* sizeof (*ovly_map
));
4360 if (ovly_map
== NULL
)
4363 memset (&dummy_caller
, 0, sizeof (dummy_caller
));
4364 overlay_size
= (htab
->local_store
- fixed_size
) / htab
->params
->num_lines
;
4365 if (htab
->params
->line_size
!= 0)
4366 overlay_size
= htab
->params
->line_size
;
4369 while (base
< count
)
4371 unsigned int size
= 0;
4373 for (i
= base
; i
< count
; i
++)
4377 unsigned int num_stubs
;
4378 struct call_info
*call
, *pasty
;
4379 struct _spu_elf_section_data
*sec_data
;
4380 struct spu_elf_stack_info
*sinfo
;
4383 /* See whether we can add this section to the current
4384 overlay without overflowing our overlay buffer. */
4385 sec
= ovly_sections
[2 * i
];
4386 tmp
= size
+ sec
->size
;
4387 if (ovly_sections
[2 * i
+ 1])
4388 tmp
+= ovly_sections
[2 * i
+ 1]->size
;
4389 if (tmp
> overlay_size
)
4391 if (sec
->segment_mark
)
4393 /* Pasted sections must stay together, so add their
4395 struct call_info
*pasty
= find_pasted_call (sec
);
4396 while (pasty
!= NULL
)
4398 struct function_info
*call_fun
= pasty
->fun
;
4399 tmp
+= call_fun
->sec
->size
;
4400 if (call_fun
->rodata
)
4401 tmp
+= call_fun
->rodata
->size
;
4402 for (pasty
= call_fun
->call_list
; pasty
; pasty
= pasty
->next
)
4403 if (pasty
->is_pasted
)
4407 if (tmp
> overlay_size
)
4410 /* If we add this section, we might need new overlay call
4411 stubs. Add any overlay section calls to dummy_call. */
4413 sec_data
= spu_elf_section_data (sec
);
4414 sinfo
= sec_data
->u
.i
.stack_info
;
4415 for (k
= 0; k
< sinfo
->num_fun
; ++k
)
4416 for (call
= sinfo
->fun
[k
].call_list
; call
; call
= call
->next
)
4417 if (call
->is_pasted
)
4419 BFD_ASSERT (pasty
== NULL
);
4422 else if (call
->fun
->sec
->linker_mark
)
4424 if (!copy_callee (&dummy_caller
, call
))
4427 while (pasty
!= NULL
)
4429 struct function_info
*call_fun
= pasty
->fun
;
4431 for (call
= call_fun
->call_list
; call
; call
= call
->next
)
4432 if (call
->is_pasted
)
4434 BFD_ASSERT (pasty
== NULL
);
4437 else if (!copy_callee (&dummy_caller
, call
))
4441 /* Calculate call stub size. */
4443 for (call
= dummy_caller
.call_list
; call
; call
= call
->next
)
4446 unsigned int stub_delta
= 1;
4448 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
4449 stub_delta
= call
->count
;
4450 num_stubs
+= stub_delta
;
4452 /* If the call is within this overlay, we won't need a
4454 for (k
= base
; k
< i
+ 1; k
++)
4455 if (call
->fun
->sec
== ovly_sections
[2 * k
])
4457 num_stubs
-= stub_delta
;
4461 if (htab
->params
->ovly_flavour
== ovly_soft_icache
4462 && num_stubs
> htab
->params
->max_branch
)
4464 if (tmp
+ num_stubs
* ovl_stub_size (htab
->params
)
4472 info
->callbacks
->einfo (_("%B:%A%s exceeds overlay size\n"),
4473 ovly_sections
[2 * i
]->owner
,
4474 ovly_sections
[2 * i
],
4475 ovly_sections
[2 * i
+ 1] ? " + rodata" : "");
4476 bfd_set_error (bfd_error_bad_value
);
4480 while (dummy_caller
.call_list
!= NULL
)
4482 struct call_info
*call
= dummy_caller
.call_list
;
4483 dummy_caller
.call_list
= call
->next
;
4489 ovly_map
[base
++] = ovlynum
;
4492 script
= htab
->params
->spu_elf_open_overlay_script ();
4494 if (fprintf (script
, "SECTIONS\n{\n") <= 0)
4497 if (htab
->params
->ovly_flavour
== ovly_soft_icache
)
4499 if (fprintf (script
,
4500 " .data.icache ALIGN (16) : { *(.ovtab) *(.data.icache) }\n"
4501 " . = ALIGN (%u);\n"
4502 " .ovl.init : { *(.ovl.init) }\n"
4503 " . = ABSOLUTE (ADDR (.ovl.init));\n",
4504 htab
->params
->line_size
) <= 0)
4509 while (base
< count
)
4511 unsigned int indx
= ovlynum
- 1;
4512 unsigned int vma
, lma
;
4514 vma
= (indx
& (htab
->params
->num_lines
- 1)) << htab
->line_size_log2
;
4515 lma
= indx
<< htab
->line_size_log2
;
4517 if (fprintf (script
, " .ovly%u ABSOLUTE (ADDR (.ovl.init)) + %u "
4518 ": AT (ALIGN (LOADADDR (.ovl.init) + SIZEOF (.ovl.init), 16) + %u) {\n",
4519 ovlynum
, vma
, lma
) <= 0)
4522 base
= print_one_overlay_section (script
, base
, count
, ovlynum
,
4523 ovly_map
, ovly_sections
, info
);
4524 if (base
== (unsigned) -1)
4527 if (fprintf (script
, " }\n") <= 0)
4533 if (fprintf (script
, " . = ABSOLUTE (ADDR (.ovl.init)) + %u;\n",
4534 1 << (htab
->num_lines_log2
+ htab
->line_size_log2
)) <= 0)
4539 if (fprintf (script
,
4540 " . = ALIGN (16);\n"
4541 " .ovl.init : { *(.ovl.init) }\n"
4542 " . = ABSOLUTE (ADDR (.ovl.init));\n") <= 0)
4545 for (region
= 1; region
<= htab
->params
->num_lines
; region
++)
4549 while (base
< count
&& ovly_map
[base
] < ovlynum
)
4557 /* We need to set lma since we are overlaying .ovl.init. */
4558 if (fprintf (script
,
4559 " OVERLAY : AT (ALIGN (LOADADDR (.ovl.init) + SIZEOF (.ovl.init), 16))\n {\n") <= 0)
4564 if (fprintf (script
, " OVERLAY :\n {\n") <= 0)
4568 while (base
< count
)
4570 if (fprintf (script
, " .ovly%u {\n", ovlynum
) <= 0)
4573 base
= print_one_overlay_section (script
, base
, count
, ovlynum
,
4574 ovly_map
, ovly_sections
, info
);
4575 if (base
== (unsigned) -1)
4578 if (fprintf (script
, " }\n") <= 0)
4581 ovlynum
+= htab
->params
->num_lines
;
4582 while (base
< count
&& ovly_map
[base
] < ovlynum
)
4586 if (fprintf (script
, " }\n") <= 0)
4593 free (ovly_sections
);
4595 if (fprintf (script
, "}\nINSERT BEFORE .text;\n") <= 0)
4597 if (fclose (script
) != 0)
4600 if (htab
->params
->auto_overlay
& AUTO_RELINK
)
4601 (*htab
->params
->spu_elf_relink
) ();
4606 bfd_set_error (bfd_error_system_call
);
4608 info
->callbacks
->einfo ("%F%P: auto overlay error: %E\n");
4612 /* Provide an estimate of total stack required. */
4615 spu_elf_stack_analysis (struct bfd_link_info
*info
)
4617 struct spu_link_hash_table
*htab
;
4618 struct _sum_stack_param sum_stack_param
;
4620 if (!discover_functions (info
))
4623 if (!build_call_tree (info
))
4626 htab
= spu_hash_table (info
);
4627 if (htab
->params
->stack_analysis
)
4629 info
->callbacks
->info (_("Stack size for call graph root nodes.\n"));
4630 info
->callbacks
->minfo (_("\nStack size for functions. "
4631 "Annotations: '*' max stack, 't' tail call\n"));
4634 sum_stack_param
.emit_stack_syms
= htab
->params
->emit_stack_syms
;
4635 sum_stack_param
.overall_stack
= 0;
4636 if (!for_each_node (sum_stack
, info
, &sum_stack_param
, TRUE
))
4639 if (htab
->params
->stack_analysis
)
4640 info
->callbacks
->info (_("Maximum stack required is 0x%v\n"),
4641 (bfd_vma
) sum_stack_param
.overall_stack
);
4645 /* Perform a final link. */
4648 spu_elf_final_link (bfd
*output_bfd
, struct bfd_link_info
*info
)
4650 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
4652 if (htab
->params
->auto_overlay
)
4653 spu_elf_auto_overlay (info
);
4655 if ((htab
->params
->stack_analysis
4656 || (htab
->params
->ovly_flavour
== ovly_soft_icache
4657 && htab
->params
->lrlive_analysis
))
4658 && !spu_elf_stack_analysis (info
))
4659 info
->callbacks
->einfo ("%X%P: stack/lrlive analysis error: %E\n");
4661 if (!spu_elf_build_stubs (info
))
4662 info
->callbacks
->einfo ("%F%P: can not build overlay stubs: %E\n");
4664 return bfd_elf_final_link (output_bfd
, info
);
4667 /* Called when not normally emitting relocs, ie. !info->relocatable
4668 and !info->emitrelocations. Returns a count of special relocs
4669 that need to be emitted. */
4672 spu_elf_count_relocs (struct bfd_link_info
*info
, asection
*sec
)
4674 Elf_Internal_Rela
*relocs
;
4675 unsigned int count
= 0;
4677 relocs
= _bfd_elf_link_read_relocs (sec
->owner
, sec
, NULL
, NULL
,
4681 Elf_Internal_Rela
*rel
;
4682 Elf_Internal_Rela
*relend
= relocs
+ sec
->reloc_count
;
4684 for (rel
= relocs
; rel
< relend
; rel
++)
4686 int r_type
= ELF32_R_TYPE (rel
->r_info
);
4687 if (r_type
== R_SPU_PPU32
|| r_type
== R_SPU_PPU64
)
4691 if (elf_section_data (sec
)->relocs
!= relocs
)
4698 /* Apply RELOCS to CONTENTS of INPUT_SECTION from INPUT_BFD. */
4701 spu_elf_relocate_section (bfd
*output_bfd
,
4702 struct bfd_link_info
*info
,
4704 asection
*input_section
,
4706 Elf_Internal_Rela
*relocs
,
4707 Elf_Internal_Sym
*local_syms
,
4708 asection
**local_sections
)
4710 Elf_Internal_Shdr
*symtab_hdr
;
4711 struct elf_link_hash_entry
**sym_hashes
;
4712 Elf_Internal_Rela
*rel
, *relend
;
4713 struct spu_link_hash_table
*htab
;
4716 bfd_boolean emit_these_relocs
= FALSE
;
4717 bfd_boolean is_ea_sym
;
4719 unsigned int iovl
= 0;
4721 htab
= spu_hash_table (info
);
4722 stubs
= (htab
->stub_sec
!= NULL
4723 && maybe_needs_stubs (input_section
));
4724 iovl
= overlay_index (input_section
);
4725 ea
= bfd_get_section_by_name (output_bfd
, "._ea");
4726 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
4727 sym_hashes
= (struct elf_link_hash_entry
**) (elf_sym_hashes (input_bfd
));
4730 relend
= relocs
+ input_section
->reloc_count
;
4731 for (; rel
< relend
; rel
++)
4734 reloc_howto_type
*howto
;
4735 unsigned int r_symndx
;
4736 Elf_Internal_Sym
*sym
;
4738 struct elf_link_hash_entry
*h
;
4739 const char *sym_name
;
4742 bfd_reloc_status_type r
;
4743 bfd_boolean unresolved_reloc
;
4745 enum _stub_type stub_type
;
4747 r_symndx
= ELF32_R_SYM (rel
->r_info
);
4748 r_type
= ELF32_R_TYPE (rel
->r_info
);
4749 howto
= elf_howto_table
+ r_type
;
4750 unresolved_reloc
= FALSE
;
4755 if (r_symndx
< symtab_hdr
->sh_info
)
4757 sym
= local_syms
+ r_symndx
;
4758 sec
= local_sections
[r_symndx
];
4759 sym_name
= bfd_elf_sym_name (input_bfd
, symtab_hdr
, sym
, sec
);
4760 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
4764 if (sym_hashes
== NULL
)
4767 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
4769 while (h
->root
.type
== bfd_link_hash_indirect
4770 || h
->root
.type
== bfd_link_hash_warning
)
4771 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4774 if (h
->root
.type
== bfd_link_hash_defined
4775 || h
->root
.type
== bfd_link_hash_defweak
)
4777 sec
= h
->root
.u
.def
.section
;
4779 || sec
->output_section
== NULL
)
4780 /* Set a flag that will be cleared later if we find a
4781 relocation value for this symbol. output_section
4782 is typically NULL for symbols satisfied by a shared
4784 unresolved_reloc
= TRUE
;
4786 relocation
= (h
->root
.u
.def
.value
4787 + sec
->output_section
->vma
4788 + sec
->output_offset
);
4790 else if (h
->root
.type
== bfd_link_hash_undefweak
)
4792 else if (info
->unresolved_syms_in_objects
== RM_IGNORE
4793 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
4795 else if (!info
->relocatable
4796 && !(r_type
== R_SPU_PPU32
|| r_type
== R_SPU_PPU64
))
4799 err
= (info
->unresolved_syms_in_objects
== RM_GENERATE_ERROR
4800 || ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
);
4801 if (!info
->callbacks
->undefined_symbol (info
,
4802 h
->root
.root
.string
,
4805 rel
->r_offset
, err
))
4809 sym_name
= h
->root
.root
.string
;
4812 if (sec
!= NULL
&& elf_discarded_section (sec
))
4814 /* For relocs against symbols from removed linkonce sections,
4815 or sections discarded by a linker script, we just want the
4816 section contents zeroed. Avoid any special processing. */
4817 _bfd_clear_contents (howto
, input_bfd
, contents
+ rel
->r_offset
);
4823 if (info
->relocatable
)
4826 is_ea_sym
= (ea
!= NULL
4828 && sec
->output_section
== ea
);
4830 /* If this symbol is in an overlay area, we may need to relocate
4831 to the overlay stub. */
4832 addend
= rel
->r_addend
;
4835 && (stub_type
= needs_ovl_stub (h
, sym
, sec
, input_section
, rel
,
4836 contents
, info
)) != no_stub
)
4838 unsigned int ovl
= 0;
4839 struct got_entry
*g
, **head
;
4841 if (stub_type
!= nonovl_stub
)
4845 head
= &h
->got
.glist
;
4847 head
= elf_local_got_ents (input_bfd
) + r_symndx
;
4849 for (g
= *head
; g
!= NULL
; g
= g
->next
)
4850 if (htab
->params
->ovly_flavour
== ovly_soft_icache
4851 ? g
->br_addr
== (rel
->r_offset
4852 + input_section
->output_offset
4853 + input_section
->output_section
->vma
)
4854 : g
->addend
== addend
&& (g
->ovl
== ovl
|| g
->ovl
== 0))
4859 relocation
= g
->stub_addr
;
4864 /* For soft icache, encode the overlay index into addresses. */
4865 if (htab
->params
->ovly_flavour
== ovly_soft_icache
4866 && (r_type
== R_SPU_ADDR16_HI
4867 || r_type
== R_SPU_ADDR32
|| r_type
== R_SPU_REL32
)
4870 unsigned int ovl
= overlay_index (sec
);
4873 unsigned int set_id
= ((ovl
- 1) >> htab
->num_lines_log2
) + 1;
4874 relocation
+= set_id
<< 18;
4879 if (unresolved_reloc
)
4881 else if (r_type
== R_SPU_PPU32
|| r_type
== R_SPU_PPU64
)
4885 /* ._ea is a special section that isn't allocated in SPU
4886 memory, but rather occupies space in PPU memory as
4887 part of an embedded ELF image. If this reloc is
4888 against a symbol defined in ._ea, then transform the
4889 reloc into an equivalent one without a symbol
4890 relative to the start of the ELF image. */
4891 rel
->r_addend
+= (relocation
4893 + elf_section_data (ea
)->this_hdr
.sh_offset
);
4894 rel
->r_info
= ELF32_R_INFO (0, r_type
);
4896 emit_these_relocs
= TRUE
;
4900 unresolved_reloc
= TRUE
;
4902 if (unresolved_reloc
)
4904 (*_bfd_error_handler
)
4905 (_("%B(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
4907 bfd_get_section_name (input_bfd
, input_section
),
4908 (long) rel
->r_offset
,
4914 r
= _bfd_final_link_relocate (howto
,
4918 rel
->r_offset
, relocation
, addend
);
4920 if (r
!= bfd_reloc_ok
)
4922 const char *msg
= (const char *) 0;
4926 case bfd_reloc_overflow
:
4927 if (!((*info
->callbacks
->reloc_overflow
)
4928 (info
, (h
? &h
->root
: NULL
), sym_name
, howto
->name
,
4929 (bfd_vma
) 0, input_bfd
, input_section
, rel
->r_offset
)))
4933 case bfd_reloc_undefined
:
4934 if (!((*info
->callbacks
->undefined_symbol
)
4935 (info
, sym_name
, input_bfd
, input_section
,
4936 rel
->r_offset
, TRUE
)))
4940 case bfd_reloc_outofrange
:
4941 msg
= _("internal error: out of range error");
4944 case bfd_reloc_notsupported
:
4945 msg
= _("internal error: unsupported relocation error");
4948 case bfd_reloc_dangerous
:
4949 msg
= _("internal error: dangerous error");
4953 msg
= _("internal error: unknown error");
4958 if (!((*info
->callbacks
->warning
)
4959 (info
, msg
, sym_name
, input_bfd
, input_section
,
4968 && emit_these_relocs
4969 && !info
->emitrelocations
)
4971 Elf_Internal_Rela
*wrel
;
4972 Elf_Internal_Shdr
*rel_hdr
;
4974 wrel
= rel
= relocs
;
4975 relend
= relocs
+ input_section
->reloc_count
;
4976 for (; rel
< relend
; rel
++)
4980 r_type
= ELF32_R_TYPE (rel
->r_info
);
4981 if (r_type
== R_SPU_PPU32
|| r_type
== R_SPU_PPU64
)
4984 input_section
->reloc_count
= wrel
- relocs
;
4985 /* Backflips for _bfd_elf_link_output_relocs. */
4986 rel_hdr
= &elf_section_data (input_section
)->rel_hdr
;
4987 rel_hdr
->sh_size
= input_section
->reloc_count
* rel_hdr
->sh_entsize
;
4994 /* Adjust _SPUEAR_ syms to point at their overlay stubs. */
4997 spu_elf_output_symbol_hook (struct bfd_link_info
*info
,
4998 const char *sym_name ATTRIBUTE_UNUSED
,
4999 Elf_Internal_Sym
*sym
,
5000 asection
*sym_sec ATTRIBUTE_UNUSED
,
5001 struct elf_link_hash_entry
*h
)
5003 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
5005 if (!info
->relocatable
5006 && htab
->stub_sec
!= NULL
5008 && (h
->root
.type
== bfd_link_hash_defined
5009 || h
->root
.type
== bfd_link_hash_defweak
)
5011 && strncmp (h
->root
.root
.string
, "_SPUEAR_", 8) == 0)
5013 struct got_entry
*g
;
5015 for (g
= h
->got
.glist
; g
!= NULL
; g
= g
->next
)
5016 if (htab
->params
->ovly_flavour
== ovly_soft_icache
5017 ? g
->br_addr
== g
->stub_addr
5018 : g
->addend
== 0 && g
->ovl
== 0)
5020 sym
->st_shndx
= (_bfd_elf_section_from_bfd_section
5021 (htab
->stub_sec
[0]->output_section
->owner
,
5022 htab
->stub_sec
[0]->output_section
));
5023 sym
->st_value
= g
->stub_addr
;
5031 static int spu_plugin
= 0;
5034 spu_elf_plugin (int val
)
5039 /* Set ELF header e_type for plugins. */
5042 spu_elf_post_process_headers (bfd
*abfd
,
5043 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
5047 Elf_Internal_Ehdr
*i_ehdrp
= elf_elfheader (abfd
);
5049 i_ehdrp
->e_type
= ET_DYN
;
5053 /* We may add an extra PT_LOAD segment for .toe. We also need extra
5054 segments for overlays. */
5057 spu_elf_additional_program_headers (bfd
*abfd
, struct bfd_link_info
*info
)
5064 struct spu_link_hash_table
*htab
= spu_hash_table (info
);
5065 extra
= htab
->num_overlays
;
5071 sec
= bfd_get_section_by_name (abfd
, ".toe");
5072 if (sec
!= NULL
&& (sec
->flags
& SEC_LOAD
) != 0)
5078 /* Remove .toe section from other PT_LOAD segments and put it in
5079 a segment of its own. Put overlays in separate segments too. */
5082 spu_elf_modify_segment_map (bfd
*abfd
, struct bfd_link_info
*info
)
5085 struct elf_segment_map
*m
, *m_overlay
;
5086 struct elf_segment_map
**p
, **p_overlay
;
5092 toe
= bfd_get_section_by_name (abfd
, ".toe");
5093 for (m
= elf_tdata (abfd
)->segment_map
; m
!= NULL
; m
= m
->next
)
5094 if (m
->p_type
== PT_LOAD
&& m
->count
> 1)
5095 for (i
= 0; i
< m
->count
; i
++)
5096 if ((s
= m
->sections
[i
]) == toe
5097 || spu_elf_section_data (s
)->u
.o
.ovl_index
!= 0)
5099 struct elf_segment_map
*m2
;
5102 if (i
+ 1 < m
->count
)
5104 amt
= sizeof (struct elf_segment_map
);
5105 amt
+= (m
->count
- (i
+ 2)) * sizeof (m
->sections
[0]);
5106 m2
= bfd_zalloc (abfd
, amt
);
5109 m2
->count
= m
->count
- (i
+ 1);
5110 memcpy (m2
->sections
, m
->sections
+ i
+ 1,
5111 m2
->count
* sizeof (m
->sections
[0]));
5112 m2
->p_type
= PT_LOAD
;
5120 amt
= sizeof (struct elf_segment_map
);
5121 m2
= bfd_zalloc (abfd
, amt
);
5124 m2
->p_type
= PT_LOAD
;
5126 m2
->sections
[0] = s
;
5134 /* Some SPU ELF loaders ignore the PF_OVERLAY flag and just load all
5135 PT_LOAD segments. This can cause the .ovl.init section to be
5136 overwritten with the contents of some overlay segment. To work
5137 around this issue, we ensure that all PF_OVERLAY segments are
5138 sorted first amongst the program headers; this ensures that even
5139 with a broken loader, the .ovl.init section (which is not marked
5140 as PF_OVERLAY) will be placed into SPU local store on startup. */
5142 /* Move all overlay segments onto a separate list. */
5143 p
= &elf_tdata (abfd
)->segment_map
;
5144 p_overlay
= &m_overlay
;
5147 if ((*p
)->p_type
== PT_LOAD
&& (*p
)->count
== 1
5148 && spu_elf_section_data ((*p
)->sections
[0])->u
.o
.ovl_index
!= 0)
5150 struct elf_segment_map
*m
= *p
;
5153 p_overlay
= &m
->next
;
5160 /* Re-insert overlay segments at the head of the segment map. */
5161 *p_overlay
= elf_tdata (abfd
)->segment_map
;
5162 elf_tdata (abfd
)->segment_map
= m_overlay
;
5167 /* Tweak the section type of .note.spu_name. */
5170 spu_elf_fake_sections (bfd
*obfd ATTRIBUTE_UNUSED
,
5171 Elf_Internal_Shdr
*hdr
,
5174 if (strcmp (sec
->name
, SPU_PTNOTE_SPUNAME
) == 0)
5175 hdr
->sh_type
= SHT_NOTE
;
5179 /* Tweak phdrs before writing them out. */
5182 spu_elf_modify_program_headers (bfd
*abfd
, struct bfd_link_info
*info
)
5184 const struct elf_backend_data
*bed
;
5185 struct elf_obj_tdata
*tdata
;
5186 Elf_Internal_Phdr
*phdr
, *last
;
5187 struct spu_link_hash_table
*htab
;
5194 bed
= get_elf_backend_data (abfd
);
5195 tdata
= elf_tdata (abfd
);
5197 count
= tdata
->program_header_size
/ bed
->s
->sizeof_phdr
;
5198 htab
= spu_hash_table (info
);
5199 if (htab
->num_overlays
!= 0)
5201 struct elf_segment_map
*m
;
5204 for (i
= 0, m
= elf_tdata (abfd
)->segment_map
; m
; ++i
, m
= m
->next
)
5206 && (o
= spu_elf_section_data (m
->sections
[0])->u
.o
.ovl_index
) != 0)
5208 /* Mark this as an overlay header. */
5209 phdr
[i
].p_flags
|= PF_OVERLAY
;
5211 if (htab
->ovtab
!= NULL
&& htab
->ovtab
->size
!= 0
5212 && htab
->params
->ovly_flavour
!= ovly_soft_icache
)
5214 bfd_byte
*p
= htab
->ovtab
->contents
;
5215 unsigned int off
= o
* 16 + 8;
5217 /* Write file_off into _ovly_table. */
5218 bfd_put_32 (htab
->ovtab
->owner
, phdr
[i
].p_offset
, p
+ off
);
5221 /* Soft-icache has its file offset put in .ovl.init. */
5222 if (htab
->init
!= NULL
&& htab
->init
->size
!= 0)
5224 bfd_vma val
= elf_section_data (htab
->ovl_sec
[0])->this_hdr
.sh_offset
;
5226 bfd_put_32 (htab
->init
->owner
, val
, htab
->init
->contents
+ 4);
5230 /* Round up p_filesz and p_memsz of PT_LOAD segments to multiples
5231 of 16. This should always be possible when using the standard
5232 linker scripts, but don't create overlapping segments if
5233 someone is playing games with linker scripts. */
5235 for (i
= count
; i
-- != 0; )
5236 if (phdr
[i
].p_type
== PT_LOAD
)
5240 adjust
= -phdr
[i
].p_filesz
& 15;
5243 && phdr
[i
].p_offset
+ phdr
[i
].p_filesz
> last
->p_offset
- adjust
)
5246 adjust
= -phdr
[i
].p_memsz
& 15;
5249 && phdr
[i
].p_filesz
!= 0
5250 && phdr
[i
].p_vaddr
+ phdr
[i
].p_memsz
> last
->p_vaddr
- adjust
5251 && phdr
[i
].p_vaddr
+ phdr
[i
].p_memsz
<= last
->p_vaddr
)
5254 if (phdr
[i
].p_filesz
!= 0)
5258 if (i
== (unsigned int) -1)
5259 for (i
= count
; i
-- != 0; )
5260 if (phdr
[i
].p_type
== PT_LOAD
)
5264 adjust
= -phdr
[i
].p_filesz
& 15;
5265 phdr
[i
].p_filesz
+= adjust
;
5267 adjust
= -phdr
[i
].p_memsz
& 15;
5268 phdr
[i
].p_memsz
+= adjust
;
5274 #define TARGET_BIG_SYM bfd_elf32_spu_vec
5275 #define TARGET_BIG_NAME "elf32-spu"
5276 #define ELF_ARCH bfd_arch_spu
5277 #define ELF_MACHINE_CODE EM_SPU
5278 /* This matches the alignment need for DMA. */
5279 #define ELF_MAXPAGESIZE 0x80
5280 #define elf_backend_rela_normal 1
5281 #define elf_backend_can_gc_sections 1
5283 #define bfd_elf32_bfd_reloc_type_lookup spu_elf_reloc_type_lookup
5284 #define bfd_elf32_bfd_reloc_name_lookup spu_elf_reloc_name_lookup
5285 #define elf_info_to_howto spu_elf_info_to_howto
5286 #define elf_backend_count_relocs spu_elf_count_relocs
5287 #define elf_backend_relocate_section spu_elf_relocate_section
5288 #define elf_backend_symbol_processing spu_elf_backend_symbol_processing
5289 #define elf_backend_link_output_symbol_hook spu_elf_output_symbol_hook
5290 #define elf_backend_object_p spu_elf_object_p
5291 #define bfd_elf32_new_section_hook spu_elf_new_section_hook
5292 #define bfd_elf32_bfd_link_hash_table_create spu_elf_link_hash_table_create
5294 #define elf_backend_additional_program_headers spu_elf_additional_program_headers
5295 #define elf_backend_modify_segment_map spu_elf_modify_segment_map
5296 #define elf_backend_modify_program_headers spu_elf_modify_program_headers
5297 #define elf_backend_post_process_headers spu_elf_post_process_headers
5298 #define elf_backend_fake_sections spu_elf_fake_sections
5299 #define elf_backend_special_sections spu_elf_special_sections
5300 #define bfd_elf32_bfd_final_link spu_elf_final_link
5302 #include "elf32-target.h"