Bug 12790 - GDB is unable to do inf-call of vararg of type _Complex on x86_64-linux
Summary: GDB is unable to do inf-call of vararg of type _Complex on x86_64-linux
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: tdep (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-05-20 14:04 UTC by Yao Qi
Modified: 2012-10-25 09:00 UTC (History)
2 users (show)

See Also:
Host: x86_64-linux
Target: x86_64-linux
Build: x86_64-linux
Last reconfirmed:


Attachments
test case (411 bytes, text/x-csrc)
2011-05-20 14:04 UTC, Yao Qi
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Yao Qi 2011-05-20 14:04:22 UTC
Created attachment 5741 [details]
test case

GDB on x86_64-linux is unable to handl inf-call of vararg function of parameter type _Complex.  Here are the steps to reproduce.

$ gcc -g complex.c -o complex

$ ./gdb/gdb complex
...
(gdb) b main
(gdb) run
Starting program: /scratch/yao/gdb_cvs/build-x86_64/complex

Breakpoint 1, main () at ../../complex.c:25
25        return 0;
(gdb) print find_max_float_real(4, fc1, fc2, fc3, fc4)
During symbol reading, incomplete CFI data; unspecified registers (e.g., rax) at 0x40044c.
$1 = 0 + 0 * I  <-- wrong result.
(gdb) print find_max_double_real(4, dc1, dc2, dc3, dc4)
$2 = 0 + 0 * I  <-- wrong result.

(gdb) print find_max_long_double_real(4, ldc1, ldc2, ldc3, ldc4)
../../src/gdb/amd64-tdep.c:622: internal-error: amd64_return_value: Assertion `len <= 16' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) n

../../src/gdb/amd64-tdep.c:622: internal-error: amd64_return_value: Assertion `len <= 16' failed.
A problem internal to GDB has been detected,
Comment 1 Jan Kratochvil 2012-10-24 13:35:53 UTC
On Fedora 18 x86_64:
KPASS: gdb.base/varargs.exp: print find_max_float_real(4, fc1, fc2, fc3, fc4) (PRMS gdb/12790)
KPASS: gdb.base/varargs.exp: print find_max_double_real(4, dc1, dc2, dc3, dc4) (PRMS gdb/12790)
KPASS: gdb.base/varargs.exp: print find_max_long_double_real(4, ldc1, ldc2, ldc3, ldc4) (PRMS gdb/12790)
Why KFAIL, on which OS?

with -m32:
KPASS: gdb.base/varargs.exp: print find_max_float_real(4, fc1, fc2, fc3, fc4) (PRMS gdb/12790)
KFAIL: gdb.base/varargs.exp: print find_max_double_real(4, dc1, dc2, dc3, dc4) (PRMS: gdb/12790)
KFAIL: gdb.base/varargs.exp: print find_max_long_double_real(4, ldc1, ldc2, ldc3, ldc4) (PRMS: gdb/12790)

Those KFAILs seem to be some different bug but still a GDB bug:

print find_max_double_real(4, dc1, dc2, dc3, dc4)
Program received signal SIGSEGV, Segmentation fault.
find_max_double_real (num_vals=0) at ./gdb.base/varargs.c:169
169       return max;
The program being debugged was signaled while in a function called from GDB.
Comment 2 Sourceware Commits 2012-10-25 08:59:11 UTC
CVSROOT:	/cvs/src
Module name:	src
Changes by:	kettenis@sourceware.org	2012-10-25 08:59:07

Modified files:
	gdb/testsuite  : ChangeLog 
	gdb/testsuite/gdb.base: varargs.exp 

Log message:
	* gdb.base/varargs.exp: PR gdb/12790 is now fixed.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/ChangeLog.diff?cvsroot=src&r1=1.3429&r2=1.3430
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.base/varargs.exp.diff?cvsroot=src&r1=1.20&r2=1.21
Comment 3 Mark Kettenis 2012-10-25 09:00:31 UTC
See PR gdb/12796, PR gdb/12798 and PR gdb/12800.