diff options
-rw-r--r-- | ld/ChangeLog | 17 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 2 | ||||
-rw-r--r-- | ld/emultempl/hppaelf.em | 8 | ||||
-rw-r--r-- | ld/emultempl/ppc64elf.em | 4 | ||||
-rw-r--r-- | ld/ldlang.c | 66 | ||||
-rw-r--r-- | ld/ldlang.h | 4 | ||||
-rw-r--r-- | ld/pe-dll.c | 4 |
7 files changed, 70 insertions, 35 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 307fd54..30bfed0 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,22 @@ 2003-02-21 Bob Wilson <bob.wilson@acm.org> + * ldlang.c (lang_size_sections_1): Add CHECK_REGIONS argument and only + call os_region_check when it is set. + (lang_size_sections): Add CHECK_REGIONS argument and pass it through to + lang_size_sections_1. + (lang_process): Change lang_size_sections calls to set CHECK_REGIONS + only for the last call, not on every relaxation iteration. + * ldlang.h (lang_size_sections): Update prototype. + * pe-dll.c (pe_dll_fill_sections): Set CHECK_REGIONS argument in calls + to lang_size_sections. + (pe_exe_fill_sections): Likewise. + * emultempl/elf32.em (gld${EMULATION_NAME}_finish): Likewise. + * emultempl/hppaelf.em (hppaelf_layout_sections_again): Likewise. + * emultempl/ppc64elf.em (ppc_before_allocation): Likewise. + (ppc_layout_sections_again): Likewise. + +2003-02-21 Bob Wilson <bob.wilson@acm.org> + * gen-doc.texi: Set ARM and HPPA variables. * ld.texinfo: Fix typos and obvious texinfo mistakes. Make section title capitalization more consistent. Add missing menu entries for diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index d58a3c9..c401fe2 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -1427,7 +1427,7 @@ gld${EMULATION_NAME}_finish () /* Resize the sections. */ lang_size_sections (stat_ptr->head, abs_output_section, - &stat_ptr->head, 0, (bfd_vma) 0, NULL); + &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); /* Redo special stuff. */ ldemul_after_allocation (); diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em index c44b01a..9f94b84 100644 --- a/ld/emultempl/hppaelf.em +++ b/ld/emultempl/hppaelf.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 1991, 1993, 1994, 1997, 1999, 2000, 2001, 2002 +# Copyright 1991, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # # This file is part of GLD, the Gnu Linker. @@ -27,7 +27,7 @@ cat >>e${EMULATION_NAME}.c <<EOF #include "ldctor.h" #include "elf32-hppa.h" -static void hppaelf_after_parse PARAMS((void)); +static void hppaelf_after_parse PARAMS ((void)); static void hppaelf_create_output_section_statements PARAMS ((void)); static asection *hppaelf_add_stub_section PARAMS ((const char *, asection *)); @@ -60,7 +60,7 @@ hppaelf_after_parse () { if (link_info.relocateable) lang_add_unique (".text"); -#if 0 /* enable this once we split millicode stuff from libgcc */ +#if 0 /* Enable this once we split millicode stuff from libgcc. */ else lang_add_input_file ("milli", lang_input_file_is_l_enum, @@ -231,7 +231,7 @@ hppaelf_layout_sections_again () /* Resize the sections. */ lang_size_sections (stat_ptr->head, abs_output_section, - &stat_ptr->head, 0, (bfd_vma) 0, NULL); + &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); /* Redo special stuff. */ ldemul_after_allocation (); diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em index b524e01..925c27f 100644 --- a/ld/emultempl/ppc64elf.em +++ b/ld/emultempl/ppc64elf.em @@ -118,7 +118,7 @@ ppc_before_allocation () /* Size the sections. This is premature, but we want to know the TLS segment layout so that certain optimizations can be done. */ lang_size_sections (stat_ptr->head, abs_output_section, - &stat_ptr->head, 0, (bfd_vma) 0, NULL); + &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); if (!ppc64_elf_tls_optimize (output_bfd, &link_info)) { @@ -273,7 +273,7 @@ ppc_layout_sections_again () /* Resize the sections. */ lang_size_sections (stat_ptr->head, abs_output_section, - &stat_ptr->head, 0, (bfd_vma) 0, NULL); + &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); /* Recalculate TOC base. */ ldemul_after_allocation (); diff --git a/ld/ldlang.c b/ld/ldlang.c index 0feeb69..283b970 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -1,6 +1,6 @@ /* Linker command language support. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002 + 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GLD, the Gnu Linker. @@ -41,14 +41,10 @@ #include "demangle.h" #ifndef offsetof -#define offsetof(TYPE,MEMBER) ((size_t)&(((TYPE*)0)->MEMBER)) +#define offsetof(TYPE, MEMBER) ((size_t) & (((TYPE*) 0)->MEMBER)) #endif -/* FORWARDS */ -static lang_statement_union_type *new_statement - PARAMS ((enum statement_enum, size_t, lang_statement_list_type *)); - -/* LOCALS */ +/* Locals variables. */ static struct obstack stat_obstack; #define obstack_chunk_alloc xmalloc @@ -65,6 +61,9 @@ static const char *output_target; static lang_statement_list_type statement_list; static struct lang_phdr *lang_phdr_list; +/* Forward declarations. */ +static lang_statement_union_type *new_statement + PARAMS ((enum statement_enum, size_t, lang_statement_list_type *)); static void lang_for_each_statement_worker PARAMS ((void (*) (lang_statement_union_type *), lang_statement_union_type *)); @@ -201,7 +200,8 @@ static void os_region_check struct memory_region_struct *, etree_type *, bfd_vma)); static bfd_vma lang_size_sections_1 PARAMS ((lang_statement_union_type *, lang_output_section_statement_type *, - lang_statement_union_type **, fill_type *, bfd_vma, bfd_boolean *)); + lang_statement_union_type **, fill_type *, bfd_vma, bfd_boolean *, + bfd_boolean)); typedef void (*callback_t) PARAMS ((lang_wild_statement_type *, struct wildcard_list *, asection *, lang_input_statement_type *, PTR)); @@ -226,7 +226,7 @@ static int closest_target_match static char * get_first_input_target PARAMS ((void)); -/* EXPORTS */ +/* Exported variables. */ lang_output_section_statement_type *abs_output_section; lang_statement_list_type lang_output_section_statement; lang_statement_list_type *stat_ptr = &statement_list; @@ -2971,13 +2971,15 @@ os_region_check (os, region, tree, base) /* Set the sizes for all the output sections. */ static bfd_vma -lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax) +lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax, + check_regions) lang_statement_union_type *s; lang_output_section_statement_type *output_section_statement; lang_statement_union_type **prev; fill_type *fill; bfd_vma dot; bfd_boolean *relax; + bfd_boolean check_regions; { unsigned opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, ldfile_output_machine); @@ -3047,6 +3049,7 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax) && (bfd_get_section_flags (output_bfd, os->bfd_section) & SEC_NEVER_LOAD) == 0 && ! link_info.relocateable + && check_regions && strcmp (os->region->name, "*default*") == 0 && lang_memory_region_list != NULL && (strcmp (lang_memory_region_list->name, @@ -3098,7 +3101,7 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax) } lang_size_sections_1 (os->children.head, os, &os->children.head, - os->fill, dot, relax); + os->fill, dot, relax, check_regions); /* Put the section within the requested block size, or align at the block boundary. */ @@ -3139,9 +3142,10 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax) { os->region->current = dot; - /* Make sure the new address is within the region. */ - os_region_check (os, os->region, os->addr_tree, - os->bfd_section->vma); + if (check_regions) + /* Make sure the new address is within the region. */ + os_region_check (os, os->region, os->addr_tree, + os->bfd_section->vma); /* If there's no load address specified, use the run region as the load region. */ @@ -3154,8 +3158,9 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax) os->load_base = exp_intop (os->lma_region->current); os->lma_region->current += os->bfd_section->_raw_size / opb; - os_region_check (os, os->lma_region, NULL, - os->bfd_section->lma); + if (check_regions) + os_region_check (os, os->lma_region, NULL, + os->bfd_section->lma); } } } @@ -3165,7 +3170,7 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax) dot = lang_size_sections_1 (constructor_list.head, output_section_statement, &s->wild_statement.children.head, - fill, dot, relax); + fill, dot, relax, check_regions); break; case lang_data_statement_enum: @@ -3229,7 +3234,7 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax) dot = lang_size_sections_1 (s->wild_statement.children.head, output_section_statement, &s->wild_statement.children.head, - fill, dot, relax); + fill, dot, relax, check_regions); break; @@ -3327,7 +3332,7 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax) dot = lang_size_sections_1 (s->group_statement.children.head, output_section_statement, &s->group_statement.children.head, - fill, dot, relax); + fill, dot, relax, check_regions); break; default: @@ -3344,19 +3349,21 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax) } bfd_vma -lang_size_sections (s, output_section_statement, prev, fill, dot, relax) +lang_size_sections (s, output_section_statement, prev, fill, dot, relax, + check_regions) lang_statement_union_type *s; lang_output_section_statement_type *output_section_statement; lang_statement_union_type **prev; fill_type *fill; bfd_vma dot; bfd_boolean *relax; + bfd_boolean check_regions; { bfd_vma result; exp_data_seg.phase = exp_dataseg_none; result = lang_size_sections_1 (s, output_section_statement, prev, fill, - dot, relax); + dot, relax, check_regions); if (exp_data_seg.phase == exp_dataseg_end_seen) { /* If DATA_SEGMENT_ALIGN DATA_SEGMENT_END pair was seen, check whether @@ -3372,7 +3379,7 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax) { exp_data_seg.phase = exp_dataseg_adjust; result = lang_size_sections_1 (s, output_section_statement, prev, - fill, dot, relax); + fill, dot, relax, check_regions); } } @@ -4348,7 +4355,8 @@ lang_process () /* Size up the sections. */ lang_size_sections (statement_list.head, abs_output_section, - &statement_list.head, 0, (bfd_vma) 0, NULL); + &statement_list.head, 0, (bfd_vma) 0, NULL, + command_line.relax ? FALSE : TRUE); /* Now run around and relax if we can. */ if (command_line.relax) @@ -4377,9 +4385,19 @@ lang_process () lang_size_sections (statement_list.head, abs_output_section, &statement_list.head, 0, (bfd_vma) 0, - &relax_again); + &relax_again, FALSE); } while (relax_again); + + /* Final extra sizing to report errors. */ + lang_reset_memory_regions (); + lang_do_assignments (statement_list.head, + abs_output_section, + (fill_type *) 0, (bfd_vma) 0); + lang_size_sections (statement_list.head, + abs_output_section, + & statement_list.head, 0, (bfd_vma) 0, + NULL, TRUE); } /* See if anything special should be done now we know how big diff --git a/ld/ldlang.h b/ld/ldlang.h index a0fe137..7dd4efd 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -1,6 +1,6 @@ /* ldlang.h - linker command language support Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002 + 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GLD, the Gnu Linker. @@ -476,7 +476,7 @@ extern bfd_vma lang_size_sections PARAMS ((lang_statement_union_type *s, lang_output_section_statement_type *output_section_statement, lang_statement_union_type **prev, fill_type *fill, - bfd_vma dot, bfd_boolean *relax)); + bfd_vma dot, bfd_boolean *relax, bfd_boolean check_regions)); extern void lang_enter_group PARAMS ((void)); extern void lang_leave_group diff --git a/ld/pe-dll.c b/ld/pe-dll.c index 5b7a741..95cdd7e 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -2694,7 +2694,7 @@ pe_dll_fill_sections (abfd, info) /* Resize the sections. */ lang_size_sections (stat_ptr->head, abs_output_section, - &stat_ptr->head, 0, (bfd_vma) 0, NULL); + &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); /* Redo special stuff. */ ldemul_after_allocation (); @@ -2728,7 +2728,7 @@ pe_exe_fill_sections (abfd, info) /* Resize the sections. */ lang_size_sections (stat_ptr->head, abs_output_section, - &stat_ptr->head, 0, (bfd_vma) 0, NULL); + &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); /* Redo special stuff. */ ldemul_after_allocation (); |