This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: ARM and virtual/raw registers


> 
> Argh!  I've just come across another nasty gotcha in this code, if I try 
> to make it so that the regcache does not hold any pseudos:  There's an 
> implicit assumption that all the physical registers will preceed the 
> pseudo registers.

I should have warned you to not go looking under rocks :-(

I think the real issue on this one is that the pseudo-registers and raw 
registers currently occupy the same register number space.  If there was 
clear separation then it would be clear how many of these problems 
should be handled - you couldn't for instance try to put a pseudo in the 
middle of the raw part of the register buffer.

I think it was mentioned, when adding register_{read,write} that this 
was likely to be sufficient rope to ....

See also gdb/122.

> This is a major problem when I want to implement the banked registers for 
> the ARM, since then r8 through r14 (which must have regnums 8 through 14 
> for stabs debug info to work correctly), need to be pseudo registers (they 
> must access the correct physical register for the current processor mode); 
> which means they must appear in the middle of the register range.

Make these pseudo registers (the corresponding real register_name() 
return ""), map stabs_regnum onto that and then (for all raw registers) 
use register register_{read,write} map onto the correct raw register.

You'll also need to tweak saved_regs[] to set the pseudo and not the 
real register address.

Even consider making everything a pseudo so that you know exactly what 
you have at any stage.

> I can make my arm_register_read function correctly remap the register 
> numbers, but then I run into the problem that REGISTER_RAW_SIZE is used 
> both above and below the regcache.

I don't understand why this is a problem.  I think a register (pseudo or 
raw) should have only one size (c.f. my register_size() patch).

Andrew



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]