From c7996ad62885c79a8d94f98dd03e390c6a2d4551 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 29 Apr 2003 01:53:46 +0000 Subject: [PATCH] bfd/ 2003-04-28 H.J. Lu * 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 * bfdlink.h (bfd_link_info): Add relax_finalizing. ld/ 2003-04-28 H.J. Lu * ldlang.c (lang_process): Add the relax finalize pass. * ldmain.c (main): Initialize link_info.relax_finalizing to FALSE. --- bfd/ChangeLog | 10 ++++++++++ bfd/bfd-in2.h | 4 +++- bfd/elfxx-ia64.c | 17 +++++++++++++++-- bfd/section.c | 8 +++++--- include/ChangeLog | 4 ++++ include/bfdlink.h | 3 +++ ld/ChangeLog | 7 +++++++ ld/ldlang.c | 8 ++++++++ ld/ldmain.c | 1 + 9 files changed, 56 insertions(+), 6 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f596fd2807..51c0726875 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2003-04-28 H.J. Lu + + * 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 * elflink.h (elf_merge_symbol): Call elf_backend_copy_indirect_symbol diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index d23a0b7a6b..9b6b5a3937 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 bff78c8434..946157fd7b 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 89f8126536..04f439e9b4 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 3d7ec5caa7..6d18714eee 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2003-04-28 H.J. Lu + + * bfdlink.h (bfd_link_info): Add relax_finalizing. + 2003-04-23 H.J. Lu * bfdlink.h (bfd_link_callbacks): Add error_handler. diff --git a/include/bfdlink.h b/include/bfdlink.h index acb7449e52..380923a979 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 4f2445425e..ced3178bb0 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2003-04-28 H.J. Lu + + * ldlang.c (lang_process): Add the relax finalize pass. + + * ldmain.c (main): Initialize link_info.relax_finalizing to + FALSE. + 2003-04-24 Roland McGrath * ldgram.y (phdr_type): Grok PT_TLS and PT_GNU_EH_FRAME names. diff --git a/ld/ldlang.c b/ld/ldlang.c index 5cca71ff34..884691702c 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 d8ee1b23e7..0b0b0383ac 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 (""); -- 2.34.1