* elf32-spu.h (struct spu_elf_params): Add non_ia_text.
* elf32-spu.c (mark_overlay_section): Only include .text.ia.*
sections in soft-icache lines unless non_ia_text. Don't add
rodata if doing so would exceed line size.
ld/
* emultempl/spuelf.em (params): Init new field.
(OPTION_SPU_NON_IA_TEXT): Define.
(PARSE_AND_LIST_LONGOPTS, PARSE_AND_LIST_OPTIONS): Add --non-ia-text.
(PARSE_AND_LIST_ARGS_CASES): Handle OPTION_SPU_NON_IA_TEXT.
+2009-01-21 Alan Modra <amodra@bigpond.net.au>
+
+ * elf32-spu.h (struct spu_elf_params): Add non_ia_text.
+ * elf32-spu.c (mark_overlay_section): Only include .text.ia.*
+ sections in soft-icache lines unless non_ia_text. Don't add
+ rodata if doing so would exceed line size.
+
2009-01-19 Hans-Peter Nilsson <hp@axis.com>
* elf32-cris.c (elf_cris_copy_indirect_symbol): For other symbol
2009-01-19 Hans-Peter Nilsson <hp@axis.com>
* elf32-cris.c (elf_cris_copy_indirect_symbol): For other symbol
struct call_info *call;
unsigned int count;
struct _mos_param *mos_param = param;
struct call_info *call;
unsigned int count;
struct _mos_param *mos_param = param;
+ struct spu_link_hash_table *htab = spu_hash_table (info);
if (fun->visit4)
return TRUE;
fun->visit4 = TRUE;
if (fun->visit4)
return TRUE;
fun->visit4 = TRUE;
- if (!fun->sec->linker_mark)
+ if (!fun->sec->linker_mark
+ && (htab->params->ovly_flavour != ovly_soft_icache
+ || htab->params->non_ia_text
+ || strncmp (fun->sec->name, ".text.ia.", 9) == 0))
this flag to differentiate the two overlay section types. */
fun->sec->flags |= SEC_CODE;
this flag to differentiate the two overlay section types. */
fun->sec->flags |= SEC_CODE;
- if (spu_hash_table (info)->params->auto_overlay & OVERLAY_RODATA)
+ size = fun->sec->size;
+ if (htab->params->auto_overlay & OVERLAY_RODATA)
fun->rodata = rodata;
if (fun->rodata)
{
fun->rodata = rodata;
if (fun->rodata)
{
- fun->rodata->linker_mark = 1;
- fun->rodata->gc_mark = 1;
- fun->rodata->flags &= ~SEC_CODE;
+ size += fun->rodata->size;
+ if (htab->params->line_size != 0
+ && size > htab->params->line_size)
+ {
+ size -= fun->rodata->size;
+ fun->rodata = NULL;
+ }
+ else
+ {
+ fun->rodata->linker_mark = 1;
+ fun->rodata->gc_mark = 1;
+ fun->rodata->flags &= ~SEC_CODE;
+ }
- size = fun->sec->size;
- if (fun->rodata)
- size += fun->rodata->size;
if (mos_param->max_overlay_size < size)
mos_param->max_overlay_size = size;
}
if (mos_param->max_overlay_size < size)
mos_param->max_overlay_size = size;
}
/* SPU specific support for 32-bit ELF.
/* SPU specific support for 32-bit ELF.
- Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
+ Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
This file is part of BFD, the Binary File Descriptor library.
/* Set if __stack_* syms will be emitted. */
unsigned int emit_stack_syms : 1;
/* Set if __stack_* syms will be emitted. */
unsigned int emit_stack_syms : 1;
+ /* Set if non-icache code should be allowed in icache lines. */
+ unsigned int non_ia_text : 1;
+
/* Range of valid addresses for loadable sections. */
bfd_vma local_store_lo;
bfd_vma local_store_hi;
/* Range of valid addresses for loadable sections. */
bfd_vma local_store_lo;
bfd_vma local_store_hi;
+2009-01-21 Alan Modra <amodra@bigpond.net.au>
+
+ * emultempl/spuelf.em (params): Init new field.
+ (OPTION_SPU_NON_IA_TEXT): Define.
+ (PARSE_AND_LIST_LONGOPTS, PARSE_AND_LIST_OPTIONS): Add --non-ia-text.
+ (PARSE_AND_LIST_ARGS_CASES): Handle OPTION_SPU_NON_IA_TEXT.
+
2009-01-16 H.J. Lu <hongjiu.lu@intel.com>
* lexsup.c (option_values): Add OPTION_TTEXT_SEGMENT.
2009-01-16 H.J. Lu <hongjiu.lu@intel.com>
* lexsup.c (option_values): Add OPTION_TTEXT_SEGMENT.
&spu_elf_load_ovl_mgr,
&spu_elf_open_overlay_script,
&spu_elf_relink,
&spu_elf_load_ovl_mgr,
&spu_elf_open_overlay_script,
&spu_elf_relink,
- 0, ovly_normal, 0, 0, 0, 0, 0,
+ 0, ovly_normal, 0, 0, 0, 0, 0, 0,
0, 0x3ffff,
1, 0, 16, 0, 0, 2000
};
0, 0x3ffff,
1, 0, 16, 0, 0, 2000
};
#define OPTION_SPU_LINE_SIZE (OPTION_SPU_SOFT_ICACHE + 1)
#define OPTION_SPU_NUM_LINES (OPTION_SPU_LINE_SIZE + 1)
#define OPTION_SPU_LRLIVE (OPTION_SPU_NUM_LINES + 1)
#define OPTION_SPU_LINE_SIZE (OPTION_SPU_SOFT_ICACHE + 1)
#define OPTION_SPU_NUM_LINES (OPTION_SPU_LINE_SIZE + 1)
#define OPTION_SPU_LRLIVE (OPTION_SPU_NUM_LINES + 1)
-#define OPTION_SPU_FIXED_SPACE (OPTION_SPU_LRLIVE + 1)
+#define OPTION_SPU_NON_IA_TEXT (OPTION_SPU_LRLIVE + 1)
+#define OPTION_SPU_FIXED_SPACE (OPTION_SPU_NON_IA_TEXT + 1)
#define OPTION_SPU_RESERVED_SPACE (OPTION_SPU_FIXED_SPACE + 1)
#define OPTION_SPU_EXTRA_STACK (OPTION_SPU_RESERVED_SPACE + 1)
#define OPTION_SPU_NO_AUTO_OVERLAY (OPTION_SPU_EXTRA_STACK + 1)
#define OPTION_SPU_RESERVED_SPACE (OPTION_SPU_FIXED_SPACE + 1)
#define OPTION_SPU_EXTRA_STACK (OPTION_SPU_RESERVED_SPACE + 1)
#define OPTION_SPU_NO_AUTO_OVERLAY (OPTION_SPU_EXTRA_STACK + 1)
{ "lrlive-analysis", no_argument, NULL, OPTION_SPU_LRLIVE },
{ "num-lines", required_argument, NULL, OPTION_SPU_NUM_LINES },
{ "line-size", required_argument, NULL, OPTION_SPU_LINE_SIZE },
{ "lrlive-analysis", no_argument, NULL, OPTION_SPU_LRLIVE },
{ "num-lines", required_argument, NULL, OPTION_SPU_NUM_LINES },
{ "line-size", required_argument, NULL, OPTION_SPU_LINE_SIZE },
+ { "non-ia-text", no_argument, NULL, OPTION_SPU_NON_IA_TEXT },
{ "no-overlays", no_argument, NULL, OPTION_SPU_NO_OVERLAYS },
{ "emit-stub-syms", no_argument, NULL, OPTION_SPU_STUB_SYMS },
{ "extra-overlay-stubs", no_argument, NULL, OPTION_SPU_NON_OVERLAY_STUBS },
{ "no-overlays", no_argument, NULL, OPTION_SPU_NO_OVERLAYS },
{ "emit-stub-syms", no_argument, NULL, OPTION_SPU_STUB_SYMS },
{ "extra-overlay-stubs", no_argument, NULL, OPTION_SPU_NON_OVERLAY_STUBS },
--soft-icache Generate software icache overlays.\n\
--num-lines Number of soft-icache lines (default 32).\n\
--line-size Size of soft-icache lines (default 1k).\n\
--soft-icache Generate software icache overlays.\n\
--num-lines Number of soft-icache lines (default 32).\n\
--line-size Size of soft-icache lines (default 1k).\n\
+ --non-ia-text Allow non-icache code in icache lines.\n\
--lrlive-analysis Scan function prologue for lr liveness.\n"
));
'
--lrlive-analysis Scan function prologue for lr liveness.\n"
));
'
params.lrlive_analysis = 1;
break;
params.lrlive_analysis = 1;
break;
+ case OPTION_SPU_NON_IA_TEXT:
+ params.non_ia_text = 1;
+ break;
+
case OPTION_SPU_NUM_LINES:
{
char *end;
case OPTION_SPU_NUM_LINES:
{
char *end;