enable-non-contiguous-regions warnings
authorAlan Modra <amodra@gmail.com>
Wed, 21 Dec 2022 05:36:55 +0000 (16:06 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 21 Dec 2022 07:26:27 +0000 (17:56 +1030)
The warning about discarded sections in elf_link_input_bfd doesn't
belong there since the code is dealing with symbols.  Multiple symbols
in a discarded section will result in multiple identical warnings
about the section.  Move the warning to a new function in ldlang.c.

The patch also tidies the warning quoting of section and file names,
consistently using `%pA' and `%pB'.  I'm no stickler for one style of
section and file name quoting, but they ought to be consistent within
a warning, eg. see the first one fixed in ldlang.c, and when a warning
is emitted for multiple targets they all ought to use exactly the same
format string to reduce translation work.  elf64-ppc.c loses the
build_one_stub errors since we won't get there before hitting the
fatal errors in size_one_stub.

bfd/
* elflink.c (elf_link_input_bfd): Don't warn here about
discarded sections.
* elf32-arm.c (arm_build_one_stub): Use consistent style in
--enable-non-contiguous-regions error.
* elf32-csky.c (csky_build_one_stub): Likewise.
* elf32-hppa.c (hppa_build_one_stub): Likewise.
* elf32-m68hc11.c (m68hc11_elf_build_one_stub): Likewise.
* elf32-m68hc12.c (m68hc12_elf_build_one_stub): Likewise.
* elf32-metag.c (metag_build_one_stub): Likewise.
* elf32-nios2.c (nios2_build_one_stub): Likewise.
* elfnn-aarch64.c (aarch64_build_one_stub): Likewise.
* xcofflink.c (xcoff_build_one_stub): Likewise.
* elf64-ppc.c (ppc_size_one_stub): Likewise.
(ppc_build_one_stub): Delete dead code.
ld/
* ldlang.c (lang_add_section): Use consistent style in
--enable-non-contiguous-regions warnings.
(size_input_section): Likewise.
(warn_non_contiguous_discards): New function.
(lang_process): Call it.
* testsuite/ld-arm/non-contiguous-arm.d: Update.
* testsuite/ld-arm/non-contiguous-arm4.d: Update.
* testsuite/ld-arm/non-contiguous-arm7.d: Add
--enable-non-contiguous-regions-warnings.
* testsuite/ld-arm/non-contiguous-arm7.err: New.
* testsuite/ld-powerpc/non-contiguous-powerpc.d: Update.
* testsuite/ld-powerpc/non-contiguous-powerpc64.d: Update.

18 files changed:
bfd/elf32-arm.c
bfd/elf32-csky.c
bfd/elf32-hppa.c
bfd/elf32-m68hc11.c
bfd/elf32-m68hc12.c
bfd/elf32-metag.c
bfd/elf32-nios2.c
bfd/elf64-ppc.c
bfd/elflink.c
bfd/elfnn-aarch64.c
bfd/xcofflink.c
ld/ldlang.c
ld/testsuite/ld-arm/non-contiguous-arm.d
ld/testsuite/ld-arm/non-contiguous-arm4.d
ld/testsuite/ld-arm/non-contiguous-arm7.d
ld/testsuite/ld-arm/non-contiguous-arm7.err [new file with mode: 0644]
ld/testsuite/ld-powerpc/non-contiguous-powerpc.d
ld/testsuite/ld-powerpc/non-contiguous-powerpc64.d

index 86cc961f73ab2b66bdc1d3499dba02b533feebf9..3e262d707c737009508e4056e2756f642aa94dbb 100644 (file)
@@ -5053,7 +5053,7 @@ arm_build_one_stub (struct bfd_hash_entry *gen_entry,
      section.  The user should fix his linker script.  */
   if (stub_entry->target_section->output_section == NULL
       && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
                              "Retry without --enable-non-contiguous-regions.\n"),
                            stub_entry->target_section);
 
index 3333eec9e7fd475522c2996c7fc8eb2bb7d2f3b3..d0c7c751209d3f9ac2102bd00d2db63292f3be2d 100644 (file)
@@ -3739,7 +3739,7 @@ csky_build_one_stub (struct bfd_hash_entry *gen_entry,
      section.  The user should fix his linker script.  */
   if (stub_entry->target_section->output_section == NULL
       && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
                              "Retry without --enable-non-contiguous-regions.\n"),
                            stub_entry->target_section);
 
index 153a3ce11e1052cd1ed1d22080de8f5a106e7b3b..82e7e0de80b70c91be4d1757855930abc5d2033f 100644 (file)
@@ -729,7 +729,7 @@ hppa_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
         section.  The user should fix his linker script.  */
       if (hsh->target_section->output_section == NULL
          && info->non_contiguous_regions)
-       info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output "
+       info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output "
                                  "section. Retry without "
                                  "--enable-non-contiguous-regions.\n"),
                                hsh->target_section);
@@ -758,7 +758,7 @@ hppa_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
         section.  The user should fix his linker script.  */
       if (hsh->target_section->output_section == NULL
          && info->non_contiguous_regions)
-       info->callbacks->einfo (_("%F%P: Could not assign %pA to an output "
+       info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output "
                                  "section. Retry without "
                                  "--enable-non-contiguous-regions.\n"),
                                hsh->target_section);
@@ -839,7 +839,7 @@ hppa_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
         section.  The user should fix his linker script.  */
       if (hsh->target_section->output_section == NULL
          && info->non_contiguous_regions)
-       info->callbacks->einfo (_("%F%P: Could not assign %pA to an output "
+       info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output "
                                  "section. Retry without "
                                  "--enable-non-contiguous-regions.\n"),
                                hsh->target_section);
index 21e7a11499a3295e9129c642accdb5f79ae0228d..b812ad4d6764e98d3fdaafd6ad1b796fa1daa19f 100644 (file)
@@ -419,7 +419,7 @@ m68hc11_elf_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
      section.  The user should fix his linker script.  */
   if (stub_entry->target_section->output_section == NULL
       && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
                              "Retry without --enable-non-contiguous-regions.\n"),
                            stub_entry->target_section);
 
index 3a4458d3fe94d498f5d4a1e3338c81b460a29c78..efd440eabae0b4919f18cb982b3b0a04e867dd9d 100644 (file)
@@ -539,7 +539,7 @@ m68hc12_elf_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
      section.  The user should fix his linker script.  */
   if (stub_entry->target_section->output_section == NULL
       && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
                              "Retry without --enable-non-contiguous-regions.\n"),
                            stub_entry->target_section);
 
index 5099e8fc6c12c178b4f43297302a46e5de2457a7..fd19c339c439b9d3fdcdb9d7a953fb0a0b1bfea6 100644 (file)
@@ -3342,7 +3342,7 @@ metag_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
      section.  The user should fix his linker script.  */
   if (hsh->target_section->output_section == NULL
       && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
                              "Retry without --enable-non-contiguous-regions.\n"),
                            hsh->target_section);
 
index 806ec314c82d969217bc28df3589d087fd6aa80d..5ca64824de5c57da6dc5119d1a751847d3fd1345 100644 (file)
@@ -2491,7 +2491,7 @@ nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_U
      section.  The user should fix his linker script.  */
   if (hsh->target_section->output_section == NULL
       && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
                              "Retry without --enable-non-contiguous-regions.\n"),
                            hsh->target_section);
 
index 5329bb64afbc188fc6f3bf114edaa28a28ce6e48..a6c12a442341919eb1bded466b98affa8b1ce30a 100644 (file)
@@ -11701,25 +11701,6 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
   stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
   info = in_arg;
 
-  /* Fail if the target section could not be assigned to an output
-     section.  The user should fix his linker script.  */
-  if (stub_entry->target_section != NULL
-      && stub_entry->target_section->output_section == NULL
-      && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
-                             "Retry without --enable-non-contiguous-regions.\n"),
-                           stub_entry->target_section);
-
-  /* Same for the group.  */
-  if (stub_entry->group->stub_sec != NULL
-      && stub_entry->group->stub_sec->output_section == NULL
-      && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign group %pA target %pA to an "
-                             "output section. Retry without "
-                             "--enable-non-contiguous-regions.\n"),
-                           stub_entry->group->stub_sec,
-                           stub_entry->target_section);
-
   htab = ppc_hash_table (info);
   if (htab == NULL)
     return false;
@@ -12254,7 +12235,7 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
   if (stub_entry->target_section != NULL
       && stub_entry->target_section->output_section == NULL
       && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign %pA to an output section. "
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
                              "Retry without --enable-non-contiguous-regions.\n"),
                            stub_entry->target_section);
 
@@ -12262,11 +12243,9 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
   if (stub_entry->group->stub_sec != NULL
       && stub_entry->group->stub_sec->output_section == NULL
       && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign group %pA target %pA to an "
-                             "output section. Retry without "
-                             "--enable-non-contiguous-regions.\n"),
-                           stub_entry->group->stub_sec,
-                           stub_entry->target_section);
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
+                             "Retry without --enable-non-contiguous-regions.\n"),
+                           stub_entry->group->stub_sec);
 
   /* Make a note of the offset within the stubs for this entry.  */
   stub_offset = stub_entry->group->stub_sec->size;
index 0368256970b4182dd2e1094ef87ca46ed2f8a2a4..e15b683cc070298c1084ba4b04da911b1e696fa9 100644 (file)
@@ -11151,22 +11151,10 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd)
 
       /* If this symbol is defined in a section which we are
         discarding, we don't need to keep it.  */
-      if (isym->st_shndx != SHN_UNDEF
-         && isym->st_shndx < SHN_LORESERVE
-         && isec->output_section == NULL
-         && flinfo->info->non_contiguous_regions)
-       {
-         if (flinfo->info->non_contiguous_regions_warnings)
-           _bfd_error_handler (_("warning: --enable-non-contiguous-regions "
-                                 "discards section `%s' from '%s'\n"),
-                               isec->name, bfd_get_filename (isec->owner));
-         continue;
-       }
-
-      if (isym->st_shndx != SHN_UNDEF
-         && isym->st_shndx < SHN_LORESERVE
-         && bfd_section_removed_from_list (output_bfd,
-                                           isec->output_section))
+      if (isym->st_shndx < SHN_LORESERVE
+         && (isec->output_section == NULL
+             || bfd_section_removed_from_list (output_bfd,
+                                               isec->output_section)))
        continue;
 
       /* Get the name of the symbol.  */
index a9fefbd44a961550fb3f3576b84cd83161c17184..e1dc1103252be0ebd324e00f54c61a018b137c3f 100644 (file)
@@ -3264,7 +3264,7 @@ aarch64_build_one_stub (struct bfd_hash_entry *gen_entry,
      section.  The user should fix his linker script.  */
   if (stub_entry->target_section->output_section == NULL
       && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
                              "Retry without "
                              "--enable-non-contiguous-regions.\n"),
                            stub_entry->target_section);
index 83469775208845776921094b908d2a44adde8cdb..ec6bc5d310d66c92b9248e61b0f794f22c971583 100644 (file)
@@ -4690,7 +4690,7 @@ xcoff_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
   if (hstub->target_section != NULL
       && hstub->target_section->output_section == NULL
       && info->non_contiguous_regions)
-    info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
+    info->callbacks->einfo (_("%F%P: Could not assign `%pA' to an output section. "
                              "Retry without --enable-non-contiguous-regions.\n"),
                            hstub->target_section);
 
index 7829f86dfec6fb41400a28433bfe9e7c0f08bdbb..315b916b3667287697ce108ff9d8e6c21d2d1d62 100644 (file)
@@ -2539,7 +2539,7 @@ lang_add_section (lang_statement_list_type *ptr,
        }
       else if (link_info.non_contiguous_regions_warnings)
        einfo (_("%P:%pS: warning: --enable-non-contiguous-regions makes "
-                "section `%pA' from '%pB' match /DISCARD/ clause.\n"),
+                "section `%pA' from `%pB' match /DISCARD/ clause.\n"),
               NULL, section, section->owner);
 
       return;
@@ -2572,7 +2572,7 @@ lang_add_section (lang_statement_list_type *ptr,
 
       if (link_info.non_contiguous_regions_warnings && output->bfd_section)
        einfo (_("%P:%pS: warning: --enable-non-contiguous-regions may "
-                "change behaviour for section `%pA' from '%pB' (assigned to "
+                "change behaviour for section `%pA' from `%pB' (assigned to "
                 "%pA, but additional match: %pA)\n"),
               NULL, section, section->owner, section->output_section,
               output->bfd_section);
@@ -5252,15 +5252,15 @@ size_input_section
              if (dot + TO_ADDR (i->size) > end)
                {
                  if (i->flags & SEC_LINKER_CREATED)
-                   einfo (_("%F%P: Output section '%s' not large enough for the "
-                            "linker-created stubs section '%s'.\n"),
-                          i->output_section->name, i->name);
+                   einfo (_("%F%P: Output section `%pA' not large enough for "
+                            "the linker-created stubs section `%pA'.\n"),
+                          i->output_section, i);
 
                  if (i->rawsize && i->rawsize != i->size)
                    einfo (_("%F%P: Relaxation not supported with "
-                            "--enable-non-contiguous-regions (section '%s' "
-                            "would overflow '%s' after it changed size).\n"),
-                          i->name, i->output_section->name);
+                            "--enable-non-contiguous-regions (section `%pA' "
+                            "would overflow `%pA' after it changed size).\n"),
+                          i, i->output_section);
 
                  *removed = 1;
                  dot = end;
@@ -7850,6 +7850,24 @@ lang_propagate_lma_regions (void)
     }
 }
 
+static void
+warn_non_contiguous_discards (void)
+{
+  LANG_FOR_EACH_INPUT_STATEMENT (file)
+    {
+      if ((file->the_bfd->flags & (BFD_LINKER_CREATED | DYNAMIC)) != 0
+         || file->flags.just_syms)
+       continue;
+
+      for (asection *s = file->the_bfd->sections; s != NULL; s = s->next)
+       if (s->output_section == NULL
+           && (s->flags & SEC_LINKER_CREATED) == 0)
+         einfo (_("%P: warning: --enable-non-contiguous-regions "
+                  "discards section `%pA' from `%pB'\n"),
+                s, file->the_bfd);
+    }
+}
+
 static void
 reset_one_wild (lang_statement_union_type *statement)
 {
@@ -8191,6 +8209,10 @@ lang_process (void)
   if (command_line.check_section_addresses)
     lang_check_section_addresses ();
 
+  if (link_info.non_contiguous_regions
+      && link_info.non_contiguous_regions_warnings)
+    warn_non_contiguous_discards ();
+
   /* Check any required symbols are known.  */
   ldlang_check_require_defined_symbols ();
 
index d0e5fabeb56fda78dd2c25518176b69c8e27263b..3479778991e2c343c1b24641aa644a54630621ef 100644 (file)
@@ -1,4 +1,4 @@
 #name: non-contiguous-arm
 #source: non-contiguous-arm.s
 #ld: --enable-non-contiguous-regions -T non-contiguous-arm.ld
-# error: \A.*Could not assign '.code.4' to an output section. Retry without --enable-non-contiguous-regions.*\Z
+# error: .*Could not assign .?\.code\.4.? to an output section. Retry without --enable-non-contiguous-regions\.
index a55e8d6e45f858a6f32f2b9aec347d83bf0a50ab..a8e9d66caca4d0d44fc54d6c80ee717e1c59d414 100644 (file)
@@ -1,4 +1,4 @@
 #name: non-contiguous-arm4
 #source: non-contiguous-arm.s
 #ld: --enable-non-contiguous-regions -T non-contiguous-arm4.ld
-# error: \A.*Output section '.ramu' not large enough for the linker-created stubs section '.code.3.__stub'.*\Z
+# error: .*Output section .?\.ramu.? not large enough for the linker-created stubs section .?\.code\.3\.__stub.\.?
index b8f08d4661da09de1f8a68486ec1256ffc58f0bd..94e9757e931c8cecfd422f6bdf3b531c96a9c764 100644 (file)
@@ -1,4 +1,4 @@
 #name: non-contiguous-arm7
 #source: non-contiguous-arm7.s
-#ld: --enable-non-contiguous-regions -T non-contiguous-arm7.ld
-#error: \A.*unresolvable R_ARM_ABS32 relocation against symbol .MY_BUF..*\Z
+#ld: --enable-non-contiguous-regions --enable-non-contiguous-regions-warnings -T non-contiguous-arm7.ld
+#error_output: non-contiguous-arm7.err
diff --git a/ld/testsuite/ld-arm/non-contiguous-arm7.err b/ld/testsuite/ld-arm/non-contiguous-arm7.err
new file mode 100644 (file)
index 0000000..3185ef5
--- /dev/null
@@ -0,0 +1,4 @@
+.* may change behaviour for section .?\.bss.? from .*
+.* may change behaviour for section .?\.bss\.MY_BUF.? from .*
+.* discards section .?\.bss\.MY_BUF.? from .*
+.* unresolvable R_ARM_ABS32 relocation against symbol .?MY_BUF.?
index c0618dba0d3f84707d29fa8825e3b29151458ec6..ea41e0d102a91c6260fab45c3d487e0a4d5c59a5 100644 (file)
@@ -1,5 +1,5 @@
 #name: non-contiguous-powerpc
 #source: non-contiguous-powerpc.s
 #ld: --enable-non-contiguous-regions -T non-contiguous-powerpc.ld
-#error: \A.*Relaxation not supported with --enable-non-contiguous-regions.*
+#error: .*Relaxation not supported with --enable-non-contiguous-regions.*
 #skip: powerpc64*-*
index ff0e3fc3f8b5938eb9a10e15bba1fc2cccbf2f1c..9f903bbea3512044a6269a9b5ad869dddb5ad6ed 100644 (file)
@@ -2,4 +2,4 @@
 #source: non-contiguous-powerpc.s
 #as: -a64
 #ld: -melf64ppc --enable-non-contiguous-regions -T non-contiguous-powerpc.ld
-#error: .*Could not assign group.*
+#error: .*Could not assign .?\.text\.one\.stub.? to an output section\. Retry without --enable-non-contiguous-regions\.