Disable region size checking whilst relaxing sections.
authorNick Clifton <nickc@redhat.com>
Fri, 21 Feb 2003 10:51:24 +0000 (10:51 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 21 Feb 2003 10:51:24 +0000 (10:51 +0000)
ld/ChangeLog
ld/emultempl/elf32.em
ld/emultempl/hppaelf.em
ld/emultempl/ppc64elf.em
ld/ldlang.c
ld/ldlang.h
ld/pe-dll.c

index 307fd54fb834ec2ac185847fa15374ffe60e17d6..30bfed0c3333d48b32c6f5a997ee52aca9529baf 100644 (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.
index d58a3c9ff8e6db3d6d9498a799827a682a0f0ad1..c401fe210a700c986a943281dcf84b193f87ed9c 100644 (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 ();
index c44b01a7b8aa729ce955978c06f999c16a122aa8..9f94b84d1fcd1c8d42bc47c63074e8c88c10291f 100644 (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 ();
index b524e0123f03c2ceeb4ee926a11f068c9eadae1b..925c27fa4bebcaca342b8011dde68bef165fddbd 100644 (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 ();
index 0feeb6924e8eb2b1ffc301ae756197a3b772f820..283b9700628f7b8125a125c726106520e2e8502a 100644 (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.
 #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
index a0fe13719b06db60bd454d440c615a369e68ff18..7dd4efd39e66756866ff636b7c3c1ee30a16d466 100644 (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
index 5b7a741b3f46989f2c0d3d4c9f90492fb517e8fe..95cdd7e36c16f9a1b03183f0b7587a4b7b9845df 100644 (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 ();