[testsuite] Fix false FAIL for gdb.base/morestack.exp

Message ID 20161022194906.GA18811@host1.jankratochvil.net
State New, archived
Headers

Commit Message

Jan Kratochvil Oct. 22, 2016, 7:49 p.m. UTC
  Hi,

since
	[commit] [testsuite patch] Fix gcc_compiled for gcc 6 & 7
	https://sourceware.org/ml/gdb-patches/2016-10/msg00620.html

there has started running again
	 Running gdb/testsuite/gdb.base/morestack.exp ...
	+FAIL: gdb.base/morestack.exp: continue
	+PASS: gdb.base/morestack.exp: up 3000

but as you can see it FAILs now - on Fedora 24 x86_64 (although for example it
still PASSes on CentOS-7.2 x86_64).

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff787c7bb in malloc_consolidate (av=av@entry=0x7ffff7bbcb00 <main_arena>) at malloc.c:4181
4181		      unlink(av, nextchunk, bck, fwd);
(gdb) bt
#0  0x00007ffff787c7bb in malloc_consolidate (av=av@entry=0x7ffff7bbcb00 <main_arena>) at malloc.c:4181
#1  0x00007ffff787f235 in _int_malloc (av=av@entry=0x7ffff7bbcb00 <main_arena>, bytes=bytes@entry=1024) at malloc.c:3448
[...]
#8  0x00007ffff784c5ac in _IO_vfprintf_internal (s=0x7ffff7bbd600 <_IO_2_1_stdout_>, format=<optimized out>, ap=ap@entry=0x7ffff77fd7f8) at vfprintf.c:1631
#9  0x00007ffff7853939 in __printf (format=<optimized out>) at printf.c:33
#10 0x0000000000400d6b in down ()
#11 0x0000000000400f2c in __morestack ()
#12 0x0000000000400dda in down ()
[...]

This apparently is due to - man gcc - -fsplit-stack:
	When code compiled with -fsplit-stack calls code compiled without
	-fsplit-stack, there may not be much stack space available for the
	latter code to run.  If compiling all code, including library code,
	with -fsplit-stack is not an option, then the linker can fix up these
	calls so that the code compiled without -fsplit-stack always has
	a large stack.  Support for this is implemented in the gold linker in
	GNU binutils release 2.21 and later.

Personally I do not understand why gold is not the default linker as GNU ld is
unusably slow (6x) for C++ but that is off-topic here.

OK for check-in?


Thanks,
Jan
gdb/testsuite/ChangeLog
2016-10-22  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.base/morestack.exp: Try to build it using -fuse-ld=gold first.
  

Comments

Pedro Alves Oct. 24, 2016, 11:59 a.m. UTC | #1
OK with typo below fixed.

On 10/22/2016 08:49 PM, Jan Kratochvil wrote:

> -if { [prepare_for_testing ${testfile}.exp ${testfile} $srcfile {additional_flags=-fsplit-stack}] } {
> +# -fuse-ld=gold is used for calling printf code built without -fsplit-stack
> +# which could crash otherise.  See GCC documentation of -fsplit-stack.

"otherwise"

Thanks,
Pedro Alves
  
Jan Kratochvil Oct. 24, 2016, 12:15 p.m. UTC | #2
On Mon, 24 Oct 2016 13:59:01 +0200, Pedro Alves wrote:
> OK with typo below fixed.

Checked in:
	b8d38ee4250fb6ad001c2f03fa2cef8c2bc06b57


Thanks,
Jan
  

Patch

diff --git a/gdb/testsuite/gdb.base/morestack.exp b/gdb/testsuite/gdb.base/morestack.exp
index 12f5d28..caa85b8 100644
--- a/gdb/testsuite/gdb.base/morestack.exp
+++ b/gdb/testsuite/gdb.base/morestack.exp
@@ -23,7 +23,11 @@  if {$gcc_compiled == 0} {
 
 standard_testfile
 
-if { [prepare_for_testing ${testfile}.exp ${testfile} $srcfile {additional_flags=-fsplit-stack}] } {
+# -fuse-ld=gold is used for calling printf code built without -fsplit-stack
+# which could crash otherise.  See GCC documentation of -fsplit-stack.
+set opts "additional_flags=-fsplit-stack"
+if { [prepare_for_testing ${testfile}.exp ${testfile} $srcfile [list $opts additional_flags=-fuse-ld=gold]] \
+     && [prepare_for_testing ${testfile}.exp ${testfile} $srcfile $opts] } {
     return -1
 }