[RFA] ax-gdb: Do not treat enums and bools as integers.
Tom Tromey
tromey@redhat.com
Fri Mar 9 17:00:00 GMT 2012
>>>>> "Joel" == Joel Brobecker <brobecker@adacore.com> writes:
Joel> But the reason why GDB decides to use a 32bit extension is because
Joel> it overrides the symbol's type with a plain integer type in
Joel> ax-gdb.c:gen_usual_unary...
FWIW you can see the bug from C, if you make an enum type and then
compile with -fshort-enums (which IIRC is the default for some targets).
Then:
(gdb) maintenance agent-eval e
Scope: 0x400478
Reg mask: 00
0 const32 6293576
5 ref8
6 end
Here the 'ref8' is correct -- 'e' is a 1-byte variable.
But:
(gdb) maintenance agent-eval e + 1
Scope: 0x400478
Reg mask: 00
0 const32 6293576
5 ref32
6 ext 32
8 const8 1
10 add
11 ext 32
13 end
Whoops, how did that ref32 get there?
Joel> * ax-gdb.c (gen_usual_unary): Remove special handling of
Joel> enum and bool types.
I think it is correct.
Also, I think you can make a test case like this:
enum EE {
VALUE = 1
};
struct x {
unsigned char before;
enum EE e;
unsigned char after;
};
struct x global;
int main () { }
Compile with -fshort-enums.
Then:
(gdb) maint agent-eval global.e + 1
Scope: 0x400478
Reg mask: 00
0 const32 6293576
5 const8 1
7 add
8 ref32
9 ext 32
11 const8 1
13 add
14 ext 32
16 end
So, I think you could provoke the wrong answer by setting 'after' to
some non-zero value.
Tom
More information about the Gdb-patches
mailing list