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
 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 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))
     {
       unsigned int size;
 
     {
       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;
 
         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;
 
        {
          char *name = NULL;
 
@@ -3347,16 +3352,23 @@ mark_overlay_section (struct function_info *fun,
              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;
+                   }
                }
              free (name);
            }
        }
                }
              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;
     }
       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.
 
 /* 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.
 
@@ -53,6 +53,9 @@ struct spu_elf_params
   /* 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;
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.
 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,
   &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
 };
@@ -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_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)
@@ -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 },
   { "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 },
@@ -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\
   --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"
                   ));
 '
@@ -725,6 +728,10 @@ PARSE_AND_LIST_ARGS_CASES='
       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;
This page took 0.051013 seconds and 4 git commands to generate.