bfd/
authorAlan Modra <amodra@gmail.com>
Wed, 21 Jan 2009 02:27:13 +0000 (02:27 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 21 Jan 2009 02:27:13 +0000 (02:27 +0000)
* 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.

bfd/ChangeLog
bfd/elf32-spu.c
bfd/elf32-spu.h
ld/ChangeLog
ld/emultempl/spuelf.em

index 7539164a865fbb664e206bc6f7789f5f320c69ac..2876ce77d4907384297da10c6b881a4126ce8c3f 100644 (file)
@@ -1,3 +1,10 @@
+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
index 318c5b4deec1e70a7bf8f36c18365d669c1e27dd..94de8fadf59bcd3c55da01ac239dabe53ea3fb3e 100644 (file)
@@ -3279,12 +3279,16 @@ mark_overlay_section (struct function_info *fun,
   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->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))
     {
       unsigned int size;
 
@@ -3296,7 +3300,8 @@ mark_overlay_section (struct function_info *fun,
         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)
        {
          char *name = NULL;
 
@@ -3347,16 +3352,23 @@ mark_overlay_section (struct function_info *fun,
              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;
+                   }
                }
              free (name);
            }
        }
-      size = fun->sec->size;
-      if (fun->rodata)
-       size += fun->rodata->size;
       if (mos_param->max_overlay_size < size)
        mos_param->max_overlay_size = size;
     }
index 0487d5917dfdf0681953e0df7d87f0b803e75080..0e69555364c3b87771ab91b4bbf997d11e7a20ae 100644 (file)
@@ -1,6 +1,6 @@
 /* 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.
 
@@ -53,6 +53,9 @@ struct spu_elf_params
   /* 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;
index a73efc556596bca90b92c99391d3c42f3cfbb589..b45626af9690ab5f58d75012333125fd7f724f91 100644 (file)
@@ -1,3 +1,10 @@
+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.
index f72690d1783a501775ea0ad1c191f645df02ae88..7c98f714531197eb95ad1d1f1930e71ede6acde5 100644 (file)
@@ -37,7 +37,7 @@ static struct spu_elf_params params =
   &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
 };
@@ -594,7 +594,8 @@ PARSE_AND_LIST_PROLOGUE='
 #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)
@@ -606,6 +607,7 @@ PARSE_AND_LIST_LONGOPTS='
   { "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 },
@@ -647,6 +649,7 @@ PARSE_AND_LIST_OPTIONS='
   --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"
                   ));
 '
@@ -725,6 +728,10 @@ PARSE_AND_LIST_ARGS_CASES='
       params.lrlive_analysis = 1;
       break;
 
+    case OPTION_SPU_NON_IA_TEXT:
+      params.non_ia_text = 1;
+      break;
+
     case OPTION_SPU_NUM_LINES:
       {
        char *end;