OSDN Git Service

bfd/
authorH.J. Lu <hjl@lucon.org>
Tue, 29 Apr 2003 01:53:45 +0000 (01:53 +0000)
committerH.J. Lu <hjl@lucon.org>
Tue, 29 Apr 2003 01:53:45 +0000 (01:53 +0000)
2003-04-28  H.J. Lu <hjl@gnu.org>

* elfxx-ia64.c (elfNN_ia64_relax_section): Relax ldxmov during
the relax finalize pass.

* section.c (struct sec): Add need_finalize_relax and remove
flag11.
(STD_SECTION): Update struct sec initializer.
* bfd-in2.h: Regenerated.

include/

2003-04-28  H.J. Lu <hjl@gnu.org>

* bfdlink.h (bfd_link_info): Add relax_finalizing.

ld/

2003-04-28  H.J. Lu <hjl@gnu.org>

* ldlang.c (lang_process): Add the relax finalize pass.

* ldmain.c (main): Initialize link_info.relax_finalizing to
FALSE.

bfd/ChangeLog
bfd/bfd-in2.h
bfd/elfxx-ia64.c
bfd/section.c
include/ChangeLog
include/bfdlink.h

index f596fd2..51c0726 100644 (file)
@@ -1,5 +1,15 @@
 2003-04-28  H.J. Lu <hjl@gnu.org>
 
+       * elfxx-ia64.c (elfNN_ia64_relax_section): Relax ldxmov during
+       the relax finalize pass.
+
+       * section.c (struct sec): Add need_finalize_relax and remove
+       flag11.
+       (STD_SECTION): Update struct sec initializer.
+       * bfd-in2.h: Regenerated.
+
+2003-04-28  H.J. Lu <hjl@gnu.org>
+
        * elflink.h (elf_merge_symbol): Call elf_backend_copy_indirect_symbol
        to copy any information related to dynamic linking when we flip
        the indirection.
index d23a0b7..9b6b5a3 100644 (file)
@@ -1291,8 +1291,10 @@ typedef struct sec
   /* Bits used by various backends.  */
   unsigned int has_tls_reloc:1;
 
+  /* Nonzero if this section needs the relax finalize pass.  */
+  unsigned int need_finalize_relax:1;
+
   /* Usused bits.  */
-  unsigned int flag11:1;
   unsigned int flag12:1;
   unsigned int flag13:1;
   unsigned int flag14:1;
index bff78c8..946157f 100644 (file)
@@ -704,9 +704,12 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again)
   if (link_info->hash->creator->flavour != bfd_target_elf_flavour)
     return FALSE;
 
-  /* Nothing to do if there are no relocations.  */
+  /* Nothing to do if there are no relocations or there is no need for
+     the relax finalize pass.  */
   if ((sec->flags & SEC_RELOC) == 0
-      || sec->reloc_count == 0)
+      || sec->reloc_count == 0
+      || (link_info->relax_finalizing
+         && sec->need_finalize_relax == 0))
     return TRUE;
 
   /* If this is the first time we have been called for this section,
@@ -756,11 +759,18 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again)
        case R_IA64_PCREL21BI:
        case R_IA64_PCREL21M:
        case R_IA64_PCREL21F:
+         if (link_info->relax_finalizing)
+           continue;
          is_branch = TRUE;
          break;
 
        case R_IA64_LTOFF22X:
        case R_IA64_LDXMOV:
+         if (!link_info->relax_finalizing)
+           {
+             sec->need_finalize_relax = 1;
+             continue;
+           }
          is_branch = FALSE;
          break;
 
@@ -1047,6 +1057,9 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again)
       /* ??? Resize .rela.got too.  */
     }
 
+  if (link_info->relax_finalizing)
+    sec->need_finalize_relax = 0;
+
   *again = changed_contents || changed_relocs;
   return TRUE;
 
index 89f8126..04f439e 100644 (file)
@@ -396,8 +396,10 @@ CODE_FRAGMENT
 .  {* Bits used by various backends.  *}
 .  unsigned int has_tls_reloc:1;
 .
+.  {* Nonzero if this section needs the relax finalize pass.  *}
+.  unsigned int need_finalize_relax:1;
+.
 .  {* Usused bits.  *}
-.  unsigned int flag11:1;
 .  unsigned int flag12:1;
 .  unsigned int flag13:1;
 .  unsigned int flag14:1;
@@ -615,8 +617,8 @@ static const asymbol global_syms[] =
     /* linker_mark, linker_has_input, gc_mark, segment_mark,         */        \
        0,           0,                1,       0,                      \
                                                                        \
-    /* sec_info_type, use_rela_p, has_tls_reloc, flag11, flag12,     */ \
-       0,            0,          0,             0,      0,             \
+    /* sec_info_type, use_rela_p, has_tls_reloc, need_finalize_relax, flag12,     */ \
+       0,            0,          0,             0,                   0,                \
                                                                        \
     /* flag13, flag14, flag15, flag16, flag20, flag24,               */ \
        0,      0,      0,      0,      0,      0,                      \
index 3d7ec5c..6d18714 100644 (file)
@@ -1,3 +1,7 @@
+2003-04-28  H.J. Lu <hjl@gnu.org>
+
+       * bfdlink.h (bfd_link_info): Add relax_finalizing.
+
 2003-04-23  H.J. Lu <hjl@gnu.org>
 
        * bfdlink.h (bfd_link_callbacks): Add error_handler.
index acb7449..380923a 100644 (file)
@@ -288,6 +288,9 @@ struct bfd_link_info
   /* TRUE if global symbols in discarded sections should be stripped.  */
   unsigned int strip_discarded: 1;
 
+  /* TRUE if relaxation is being finalized.  */
+  unsigned int relax_finalizing: 1;
+
   /* Which symbols to strip.  */
   enum bfd_link_strip strip;