This is the mail archive of the
gdb-prs@sourceware.org
mailing list for the GDB project.
tdep/2075: incorrect return value when bool functions are printed on amd64
- From: larue at cadence dot com
- To: gdb-gnats at sources dot redhat dot com
- Date: 27 Jan 2006 21:39:56 -0000
- Subject: tdep/2075: incorrect return value when bool functions are printed on amd64
- Reply-to: larue at cadence dot com
>Number: 2075
>Category: tdep
>Synopsis: incorrect return value when bool functions are printed on amd64
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Fri Jan 27 21:48:01 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator: Woody LaRue
>Release: gdb-6.3
>Organization:
>Environment:
amd64 / linux
>Description:
printing a function that returns a bool value always returns false.
>How-To-Repeat:
cat test.cpp
bool test()
{
return true;
}
main(int, char**)
{
while(1);
}
sdvopt05{larue 60}:!g++
g++ -g test.cpp
sdvopt05{larue 61}:gdb a.out
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".
(gdb) run
Starting program: /home/larue/a.out
Interrupt
Program received signal SIGINT, Interrupt.
main () at test.cpp:8
8 while(1);
(gdb) print test()
$1 = false
(gdb)
>Fix:
I have a fix to the function amd64_classify function (add TYPE_CODE_BOOL to the test clause)
static void
amd64_classify (struct type *type, enum amd64_reg_class class[2])
{
enum type_code code = TYPE_CODE (type);
int len = TYPE_LENGTH (type);
class[0] = class[1] = AMD64_NO_CLASS;
/* Arguments of types (signed and unsigned) _Bool, char, short, int,
long, long long, and pointers are in the INTEGER class. Similarly,
range types, used by languages such as Ada, are also in the INTEGER
class. */
/* Adding TYPE_CODE_BOOL to the following test. Without this printing a boolean
valued function is incorrectly returning false.
larue@cadence.com 1/27/06 */
if ((code == TYPE_CODE_INT || code == TYPE_CODE_ENUM
|| code == TYPE_CODE_RANGE
|| code == TYPE_CODE_PTR || code == TYPE_CODE_REF || TYPE_CODE_BOOL)
/* ADD BOOLEAN TO CLAUSE */
&& (len == 1 || len == 2 || len == 4 || len == 8))
class[0] = AMD64_INTEGER;
>Release-Note:
>Audit-Trail:
>Unformatted: