This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gold testsuite: line numbers in debug_msg test


I'm having problems with the gold debug_msg test on s390, specifically with the line numbers printed. debug_msg.sh already allows some leeway for them, but it seems the code emitted for s390 is more unusual than it expects.

The first problem is with undefined symbol references in testfn. The testsuite assumes the relocation for the undefined symbol will be inside an instruction described by .debug_line to be on the exact line of the undefined reference. However, this doesn't work for s390, which uses literal pools - the addresses (which are relocated) are stored after the function code, and .debug_line considers them to belong to the closing brace of the function.

The second problem is with SometimesInlineFunction in odr_violation2.cc - while the test checks for first instruction belonging to either the opening brace or the return statement, gcc on RHEL does one better by marking the first instruction (which is a multiply instruction) as belonging to line 29 (the closing brace).

I'm attaching a patch to make the testsuite more open-minded about the correct line numbers. Does that look OK?

Marcin KoÅcielnicki
>From 359a3cc0ca6943d2486b2825cc569bf94b8eb38d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?= <koriakin@0x04.net>
Date: Wed, 23 Sep 2015 22:02:09 +0200
Subject: [PATCH] gold/testsuite: Make debug_msg.sh more open-minded about line
 numbers.

---
 gold/testsuite/debug_msg.sh | 38 +++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/gold/testsuite/debug_msg.sh b/gold/testsuite/debug_msg.sh
index 54c72f1..b556d8c 100755
--- a/gold/testsuite/debug_msg.sh
+++ b/gold/testsuite/debug_msg.sh
@@ -64,8 +64,8 @@ check debug_msg.err "debug_msg.o:debug_msg.cc:badref1: error: undefined referenc
 # file recorded in the objects.
 check debug_msg.err ".*/debug_msg.cc:50: error: undefined reference to 'undef_fn1()'"
 check debug_msg.err ".*/debug_msg.cc:55: error: undefined reference to 'undef_fn2()'"
-check debug_msg.err ".*/debug_msg.cc:43: error: undefined reference to 'undef_fn1()'"
-check debug_msg.err ".*/debug_msg.cc:44: error: undefined reference to 'undef_fn2()'"
+check debug_msg.err ".*/debug_msg.cc:4[356]: error: undefined reference to 'undef_fn1()'"
+check debug_msg.err ".*/debug_msg.cc:4[456]: error: undefined reference to 'undef_fn2()'"
 if test "$DEFAULT_TARGET" != "powerpc"
 then
   check debug_msg.err ".*/debug_msg.cc:.*: error: undefined reference to 'undef_int'"
@@ -74,7 +74,7 @@ fi
 # Check we detected the ODR (One Definition Rule) violation.
 check debug_msg.err ": symbol 'Ordering::operator()(int, int)' defined in multiple places (possible ODR violation):"
 check debug_msg.err "odr_violation1.cc:6"
-check debug_msg.err "odr_violation2.cc:1[25]"
+check debug_msg.err "odr_violation2.cc:1[256]"
 
 # Check we don't have ODR false positives:
 check_missing debug_msg.err "OdrDerived::~OdrDerived()"
@@ -84,11 +84,11 @@ check_missing debug_msg.err "__adjust_heap"
 # still flag it for C++ symbols since those are more likely to be
 # unintentional.
 check_missing debug_msg.err ": symbol 'OverriddenCFunction' defined in multiple places (possible ODR violation):"
-check_missing debug_msg.err "odr_violation1.cc:16"
-check_missing debug_msg.err "odr_violation2.cc:23"
+check_missing debug_msg.err "odr_violation1.cc:1[6-8]"
+check_missing debug_msg.err "odr_violation2.cc:2[3-5]"
 check debug_msg.err ": symbol 'SometimesInlineFunction(int)' defined in multiple places (possible ODR violation):"
-check debug_msg.err "debug_msg.cc:68"
-check debug_msg.err "odr_violation2.cc:2[78]"
+check debug_msg.err "debug_msg.cc:6[89]"
+check debug_msg.err "odr_violation2.cc:2[7-9]"
 
 # Check for the same error messages when using --compressed-debug-sections.
 if test -r debug_msg_cdebug.err
@@ -98,23 +98,23 @@ then
   check debug_msg_cdebug.err "debug_msg_cdebug.o:debug_msg.cc:badref1: error: undefined reference to 'undef_int'"
   check debug_msg_cdebug.err ".*/debug_msg.cc:50: error: undefined reference to 'undef_fn1()'"
   check debug_msg_cdebug.err ".*/debug_msg.cc:55: error: undefined reference to 'undef_fn2()'"
-  check debug_msg_cdebug.err ".*/debug_msg.cc:43: error: undefined reference to 'undef_fn1()'"
-  check debug_msg_cdebug.err ".*/debug_msg.cc:44: error: undefined reference to 'undef_fn2()'"
+  check debug_msg_cdebug.err ".*/debug_msg.cc:4[356]: error: undefined reference to 'undef_fn1()'"
+  check debug_msg_cdebug.err ".*/debug_msg.cc:4[456]: error: undefined reference to 'undef_fn2()'"
   if test "$DEFAULT_TARGET" != "powerpc"
   then
     check debug_msg_cdebug.err ".*/debug_msg.cc:.*: error: undefined reference to 'undef_int'"
   fi
   check debug_msg_cdebug.err ": symbol 'Ordering::operator()(int, int)' defined in multiple places (possible ODR violation):"
   check debug_msg_cdebug.err "odr_violation1.cc:6"
-  check debug_msg_cdebug.err "odr_violation2.cc:1[25]"
+  check debug_msg_cdebug.err "odr_violation2.cc:1[256]"
   check_missing debug_msg_cdebug.err "OdrDerived::~OdrDerived()"
   check_missing debug_msg_cdebug.err "__adjust_heap"
   check_missing debug_msg_cdebug.err ": symbol 'OverriddenCFunction' defined in multiple places (possible ODR violation):"
-  check_missing debug_msg_cdebug.err "odr_violation1.cc:16"
-  check_missing debug_msg_cdebug.err "odr_violation2.cc:23"
+  check_missing debug_msg_cdebug.err "odr_violation1.cc:1[6-8]"
+  check_missing debug_msg_cdebug.err "odr_violation2.cc:2[3-5]"
   check debug_msg_cdebug.err ": symbol 'SometimesInlineFunction(int)' defined in multiple places (possible ODR violation):"
-  check debug_msg_cdebug.err "debug_msg.cc:68"
-  check debug_msg_cdebug.err "odr_violation2.cc:2[78]"
+  check debug_msg_cdebug.err "debug_msg.cc:6[89]"
+  check debug_msg_cdebug.err "odr_violation2.cc:2[7-9]"
 fi
 
 # When linking together .so's, we don't catch the line numbers, but we
@@ -124,15 +124,15 @@ check debug_msg_so.err "debug_msg.so: error: undefined reference to 'undef_fn2()
 check debug_msg_so.err "debug_msg.so: error: undefined reference to 'undef_int'"
 check debug_msg_so.err ": symbol 'Ordering::operator()(int, int)' defined in multiple places (possible ODR violation):"
 check debug_msg_so.err "odr_violation1.cc:6"
-check debug_msg_so.err "odr_violation2.cc:1[25]"
+check debug_msg_so.err "odr_violation2.cc:1[256]"
 check_missing debug_msg_so.err "OdrDerived::~OdrDerived()"
 check_missing debug_msg_so.err "__adjust_heap"
 check_missing debug_msg_so.err ": symbol 'OverriddenCFunction' defined in multiple places (possible ODR violation):"
-check_missing debug_msg_so.err "odr_violation1.cc:16"
-check_missing debug_msg_so.err "odr_violation2.cc:23"
+check_missing debug_msg_so.err "odr_violation1.cc:1[6-8]"
+check_missing debug_msg_so.err "odr_violation2.cc:2[3-5]"
 check debug_msg_so.err ": symbol 'SometimesInlineFunction(int)' defined in multiple places (possible ODR violation):"
-check debug_msg_so.err "debug_msg.cc:68"
-check debug_msg_so.err "odr_violation2.cc:2[78]"
+check debug_msg_so.err "debug_msg.cc:6[89]"
+check debug_msg_so.err "odr_violation2.cc:2[7-9]"
 
 # These messages shouldn't need any debug info to detect:
 check debug_msg_ndebug.err "debug_msg_ndebug.so: error: undefined reference to 'undef_fn1()'"
-- 
2.5.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]