Disable region size checking whilst relaxing sections.

This commit is contained in:
Nick Clifton 2003-02-21 10:51:24 +00:00
parent c125362777
commit cf888e70e2
7 changed files with 70 additions and 35 deletions

View File

@ -1,3 +1,20 @@
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.

View File

@ -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 ();

View File

@ -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 ();

View File

@ -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 ();

View File

@ -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

View File

@ -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

View File

@ -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 ();