Re: Assuming types for PC

Pedro Alves <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
On 06/11/2013 10:21 AM, Pedro Alves wrote:
>>>  Overall I think the test is too strict.  If you think the use of "long 
>>> long" is unfortunate for the PC, then an artificial type might be created 
>>> internally within GDB specifically for the PC, similarly to what we do 
>>> e.g. for IEEE 754 data types and floating-point registers in some cases.
>>
>> An artificial type like that probably is the way to go.
> 
> I agree.  Something like the GDB equivalent of:
> 
>   typedef void * ptr64 __attribute ((mode(DI)));
> 
> (That worked last time I tried it on x32, probably works on MIPS too.)
> 

BTW, this whole issue is really a special case of an ABI register name
colliding with a machine register name.  A similar example came up when GDB
was made to expose whole set of x86 general purpose registers.  Specifically
the $rsp/$rsp/$sp, where $sp (16-bit) collides with desire to use $sp
to refer to stack pointer.  An alternative idea I thrown out back then,
would be to always leave $pc/$sp/$fp as the ABI version of the registers,
and in case the machine has real registers by that name, expose those with
an alternative naming, like e.g., $_pc/$_sp/$_fp.  These would have the
machine's full width.

On i686, you'd get:
 32-bit pointer $pc, 16-bit integer $ip, 32-bit pointer $eip.
 32-bit pointer $sp, 16-bit integer $_sp, 32-bit pointer $esp.
 32-bit pointer $fp, 16-bit integer $bp, 32-bit pointer $ebp.

On x32, you'd get:
 32-bit pointer $pc, 16-bit integer $ip, 32-bit pointer $eip, 64-bit integer $rip.
 32-bit pointer $sp, 16-bit integer $_sp, 32-bit pointer $esp, 64-bit integer $rsp.
 32-bit pointer $fp, 16-bit integer $bp, 32-bit pointer $ebp, 64-bit integer $rbp.

On x86_64 (-m64), you'd get
 64-bit pointer $pc, 16-bit integer $ip, 32-bit integer $eip, 64-bit pointer $rip.
 64-bit pointer $sp, 16-bit integer $_sp, 32-bit integer $esp, 64-bit pointer $rsp.
 64-bit pointer $fp, 16-bit integer $bp, 32-bit integer $ebp, 64-bit pointer $rbp.

On MIPS n32, you'd get:
 32-bit pointer $pc, 64-bit integer $_pc/$rNN.
 32-bit pointer $sp, 64-bit integer $_sp/$rNN.
 32-bit pointer $fp, 64-bit integer $_fp/$rNN.

(the _ variants probably would be raw from any arch bit manipulation).

(I'm not really sure which solution I prefer.)

-- 
Pedro Alves
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.