aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/bfd-in2.h4
-rw-r--r--bfd/elfxx-ia64.c17
-rw-r--r--bfd/section.c8
-rw-r--r--include/ChangeLog4
-rw-r--r--include/bfdlink.h3
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/ldlang.c8
-rw-r--r--ld/ldmain.c1
9 files changed, 56 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index f596fd2..51c0726 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index d23a0b7..9b6b5a3 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -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;
diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c
index bff78c8..946157f 100644
--- a/bfd/elfxx-ia64.c
+++ b/bfd/elfxx-ia64.c
@@ -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;
diff --git a/bfd/section.c b/bfd/section.c
index 89f8126..04f439e 100644
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -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, \
diff --git a/include/ChangeLog b/include/ChangeLog
index 3d7ec5c..6d18714 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -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.
diff --git a/include/bfdlink.h b/include/bfdlink.h
index acb7449..380923a 100644
--- a/include/bfdlink.h
+++ b/include/bfdlink.h
@@ -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;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 4f24454..ced3178 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+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.
+
2003-04-24 Roland McGrath <roland@redhat.com>
* ldgram.y (phdr_type): Grok PT_TLS and PT_GNU_EH_FRAME names.
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 5cca71f..8846917 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -4393,6 +4393,14 @@ lang_process ()
abs_output_section,
&statement_list.head, 0, (bfd_vma) 0,
&relax_again, FALSE);
+
+ /* If the normal relax is done and the relax finalize pass
+ is not performed yet, we perform another relax pass. */
+ if (!relax_again && !link_info.relax_finalizing)
+ {
+ link_info.relax_finalizing = TRUE;
+ relax_again = TRUE;
+ }
}
while (relax_again);
diff --git a/ld/ldmain.c b/ld/ldmain.c
index d8ee1b2..0b0b038 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -329,6 +329,7 @@ main (argc, argv)
link_info.spare_dynamic_tags = 5;
link_info.flags = (bfd_vma) 0;
link_info.flags_1 = (bfd_vma) 0;
+ link_info.relax_finalizing = FALSE;
ldfile_add_arch ("");