[binutils-gdb/binutils-2_35-branch] mmix bfd: fix bfd_assert for R_MMIX_PUSHJ_STUBBABLE against undef'd symbol

Hans-Peter Nilsson hp@sourceware.org
Wed Jul 15 18:28:01 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=131af83de30f8a87bfdf323010ea923368d290e2

commit 131af83de30f8a87bfdf323010ea923368d290e2
Author: Hans-Peter Nilsson <hp@bitrange.com>
Date:   Wed Jul 15 06:22:28 2020 +0200

    mmix bfd: fix bfd_assert for R_MMIX_PUSHJ_STUBBABLE against undef'd symbol
    
    Spotted when inspecting gcc testsuite logs, but this already is
    covered by the ld-mmix testsuite, it's just that the assert is ignored
    since the regexp match is for a substring and not anchored.
    
    With the anchors added but not the bugfix, the ld.log shows that the
    asserts cause a non-match as intended:
    
    Executing on host: sh -c {./ld-new   -LX/src/ld/testsuite/ld-mmix  -m elf64mmix -o tmpdir/dump tmpdir/undef-2.o tmpdir/start.o  2>&1}  /dev/null dump.tmp (timeout = 300)
    ./ld-new: BFD (GNU Binutils) 2.34.50.20200629 assertion fail X/src/bfd/elf64-mmix.c:2845
    ./ld-new: BFD (GNU Binutils) 2.34.50.20200629 assertion fail X/src/bfd/elf64-mmix.c:2845
    ./ld-new: BFD (GNU Binutils) 2.34.50.20200629 assertion fail X/src/bfd/elf64-mmix.c:2845
    ./ld-new: tmpdir/undef-2.o:(.text+0x0): undefined reference to `undefd'
    failed with: <./ld-new: BFD (GNU Binutils) 2.34.50.20200629 assertion fail X/src/bfd/elf64-mmix.c:2845
    ./ld-new: BFD (GNU Binutils) 2.34.50.20200629 assertion fail X/src/bfd/elf64-mmix.c:2845
    ./ld-new: BFD (GNU Binutils) 2.34.50.20200629 assertion fail X/src/bfd/elf64-mmix.c:2845
    ./ld-new: tmpdir/undef-2.o:(.text+0x0): undefined reference to `undefd'>, expected: <\A[^\n\r]*undefined reference to `undefd'\Z>
    FAIL: ld-mmix/undef-2
    
    Gone with the fix of course, leaving just the intended "undefined
    reference" line.
    
    I'm not going to add anchors manually for all the "error:" strings in
    the test-suite, not even in the mmix parts.  Sorry, but I'll just do
    it for *these* specific undefined-reference tests.
    
    Just a thought: maybe the run_dump_test "error:" string should
    *automatically* get anchor marks prepended and appended for a single
    line match as in the patch, "\A[^\n\r]*" prepended and \Z appended
    unless either anchor mark or \r or \n is present in the regexp?
    
    Committed.
    
    bfd:
            * elf64-mmix.c (mmix_elf_relax_section): Improve accounting for
            R_MMIX_PUSHJ_STUBBABLE relocs against undefined symbols.
    
    ld/testsuite:
            * testsuite/ld-mmix/undef-1.d, testsuite/ld-mmix/undef-1m.d,
            testsuite/ld-mmix/undef-2.d, testsuite/ld-mmix/undef-2m.d: Add
            start- and end-anchors to error-string to match just a
            single-line error-message.
    
    (cherry picked from commit a8a48c756c0da3a49008662e14ae582764ddd0bb)

Diff:
---
 bfd/ChangeLog                   | 5 +++++
 bfd/elf64-mmix.c                | 9 ++++++++-
 ld/ChangeLog                    | 7 +++++++
 ld/testsuite/ld-mmix/undef-1.d  | 2 +-
 ld/testsuite/ld-mmix/undef-1m.d | 2 +-
 ld/testsuite/ld-mmix/undef-2.d  | 2 +-
 ld/testsuite/ld-mmix/undef-2m.d | 2 +-
 7 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 312df82c409..1a25c8e99c8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2020-07-15  Hans-Peter Nilsson  <hp@bitrange.com>
+
+	* elf64-mmix.c (mmix_elf_relax_section): Improve accounting for
+	R_MMIX_PUSHJ_STUBBABLE relocs against undefined symbols.
+
 2020-07-15  Nick Clifton  <nickc@redhat.com>
 
 	PR26240
diff --git a/bfd/elf64-mmix.c b/bfd/elf64-mmix.c
index fee4a0fbd78..2fc491c5ffa 100644
--- a/bfd/elf64-mmix.c
+++ b/bfd/elf64-mmix.c
@@ -2538,6 +2538,7 @@ mmix_elf_relax_section (bfd *abfd,
      spot a missing actual initialization.  */
   size_t bpono = (size_t) -1;
   size_t pjsno = 0;
+  size_t pjsno_undefs = 0;
   Elf_Internal_Sym *isymbuf = NULL;
   bfd_size_type size = sec->rawsize ? sec->rawsize : sec->size;
 
@@ -2703,6 +2704,11 @@ mmix_elf_relax_section (bfd *abfd,
 		  gregdata->n_remaining_bpo_relocs_this_relaxation_round--;
 		  bpono++;
 		}
+
+	      /* Similarly, keep accounting consistent for PUSHJ
+		 referring to an undefined symbol.  */
+	      if (ELF64_R_TYPE (irel->r_info) == R_MMIX_PUSHJ_STUBBABLE)
+		pjsno_undefs++;
 	      continue;
 	    }
 	}
@@ -2842,7 +2848,8 @@ mmix_elf_relax_section (bfd *abfd,
 	}
     }
 
-  BFD_ASSERT(pjsno == mmix_elf_section_data (sec)->pjs.n_pushj_relocs);
+  BFD_ASSERT(pjsno + pjsno_undefs
+	     == mmix_elf_section_data (sec)->pjs.n_pushj_relocs);
 
   if (elf_section_data (sec)->relocs != internal_relocs)
     free (internal_relocs);
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 9ecb8e576fd..2985f105306 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2020-07-15  Hans-Peter Nilsson  <hp@bitrange.com>
+
+	* testsuite/ld-mmix/undef-1.d, testsuite/ld-mmix/undef-1m.d,
+	testsuite/ld-mmix/undef-2.d, testsuite/ld-mmix/undef-2m.d: Add
+	start- and end-anchors to error-string to match just a
+	single-line error-message.
+
 2020-07-13  Alan Modra  <amodra@gmail.com>
 
 	Apply from master
diff --git a/ld/testsuite/ld-mmix/undef-1.d b/ld/testsuite/ld-mmix/undef-1.d
index fb8c7ee03a0..ad8d757683e 100644
--- a/ld/testsuite/ld-mmix/undef-1.d
+++ b/ld/testsuite/ld-mmix/undef-1.d
@@ -1,4 +1,4 @@
 #source: undef-1.s
 #source: start.s
 #ld: -m elf64mmix
-#error: undefined reference to `regvar'
+#error: \A[^\n\r]*undefined reference to `regvar'\Z
diff --git a/ld/testsuite/ld-mmix/undef-1m.d b/ld/testsuite/ld-mmix/undef-1m.d
index 001d7f64b87..e747e5026cc 100644
--- a/ld/testsuite/ld-mmix/undef-1m.d
+++ b/ld/testsuite/ld-mmix/undef-1m.d
@@ -1,4 +1,4 @@
 #source: undef-1.s
 #source: start.s
 #ld: -m mmo
-#error: undefined reference to `regvar'
+#error: \A[^\n\r]*undefined reference to `regvar'\Z
diff --git a/ld/testsuite/ld-mmix/undef-2.d b/ld/testsuite/ld-mmix/undef-2.d
index 52844dbad44..2dc2b4e4d57 100644
--- a/ld/testsuite/ld-mmix/undef-2.d
+++ b/ld/testsuite/ld-mmix/undef-2.d
@@ -2,4 +2,4 @@
 #source: start.s
 #as: -x
 #ld: -m elf64mmix
-#error: undefined reference to `undefd'
+#error: \A[^\n\r]*undefined reference to `undefd'\Z
diff --git a/ld/testsuite/ld-mmix/undef-2m.d b/ld/testsuite/ld-mmix/undef-2m.d
index aa0becc251e..7eb3c673c62 100644
--- a/ld/testsuite/ld-mmix/undef-2m.d
+++ b/ld/testsuite/ld-mmix/undef-2m.d
@@ -2,4 +2,4 @@
 #source: start.s
 #as: -x
 #ld: -m mmo
-#error: undefined reference to `undefd'
+#error: \A[^\n\r]*undefined reference to `undefd'\Z


More information about the Binutils-cvs mailing list