Re: [RFA] New bitflags type and eflags on i386/x86-64

Pierre Muller
2002-04-29T16:54:35Z

At 17:45 22/04/2002 , Daniel Jacobowitz a Ã©crit:
>On Mon, Apr 22, 2002 at 05:15:34PM +0200, Michal Ludvig wrote:
> > Hi all,
> > I've created a new typecode TYPE_CODE_FLAGS with appropriate functions
> > and used it in builtin_type_i386_eflags type. I did this to be able to
> > print i386's and x86-64's FLAGS register in a symbolic form, instead of
> > printing it in a hexadecimal and decimal notation.
> >
> > Now it looks like this:
> > (gdb) info registers eflags
> > eflags 0x747 [ DF IF TF ZF PF CF ]
> >
> > I've chosen quite a generic way for implementation, so that the others
> > could use this for their types as well. For now I'm using this type
> > only on x86-64, but using it on i386 should be possible without
> > modifications. (BTW Should I do it or the maintainer will?)
> >
> > Any comments? Can I commit?
>
>First of all, please include ChangeLog entries; it makes patches easier
>to digest quickly.
>
>Second, I see that you assume a TYPE_CODE_FLAGS type is the size of a
>long. I'm not fond of that. I would prefer if you instead added
>support to c-valprint.c for something like Pascal's TYPE_CODE_SET (see
>p-valprint.c) and used that. It should be exactly what you're looking
>for. Basically, you create an enum describing the bit position (not
>mask) for each flag, and then call create_set_type with that type as
>the domain_type.

Beware that if you try to use this in C language,
you will get an error that C language doesn't know anything about TYPE_CODE_SET.
Furthermore, if you force the use of the pascal version of printing sets,
you are still not safe:
Pascal set valprint code does print a set with ranges:
if you have a pascal type
tset = set of [1..16];
and a variable a of type tset, that contains
2,5,6,7,8,15
it will be dispalyed as
[2,5..8,15]
this is also the case for enumerated flags,
but this is bad for the flag enumeration.

Given this info, I would support the creation of a TYPE_CODE_FLAGS
rather than trying to use pascal sets.
Note that the code submitted does failm to write the flags if language is set to
pascal for instance... So this means that the p-valprint and
maybe others (f-valprint or jv-valprint code should be adapted too).
So maybe the best would be to move thiscode from c-valprint.c to valprint.c
and simply call it for the different language-valprint.c sources.

Last but not least, adding this patch for i386-tdep source would allow to use
this code also for normal i386 cpus.

$ cvs diff -u -p i386-tdep.c
Index: i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.53
diff -u -p -r1.53 i386-tdep.c
--- i386-tdep.c 19 Mar 2002 02:51:07 -0000 1.53
+++ i386-tdep.c 29 Apr 2002 16:51:22 -0000
@@ -1054,6 +1054,9 @@ i386_register_virtual_type (int regnum)
if (regnum == PC_REGNUM || regnum == FP_REGNUM || regnum == SP_REGNUM)
return lookup_pointer_type (builtin_type_void);

+ if (regnum == PS_REGNUM)
+ return builtin_type_i386_eflags;
+
if (IS_FP_REGNUM (regnum))
return builtin_type_i387_ext;

Pierre Muller
Institut Charles Sadron
6,rue Boussingault
F 67083 STRASBOURG CEDEX (France)
mailto:muller@ics.u-strasbg.fr
Phone : (33)-3-88-41-40-07 Fax : (33)-3-88-41-40-99