Perhaps something along the lines of the following?
{
unsigned char buf[sizeof (CORE_ADDR)];
if (target_read_memory (memaddr, buf, TYPE_LENGTH (builtin_type_void_data_ptr)) != 0)
error ("Unable to determine lower bound of array.");
*lower_bound = extract_typed_address (buf, builtin_type_void_data_ptr);
}
That's a bit verbose, and it's not clear to me if sizeof (CORE_ADDR) is guaranteed to be large enough to contain a raw target pointer, but I can't really think of any better alternatives.
Aside from the intimidating comments in findvar.c, this would seem a good candidate for extract_address ... though a similar modification would have to be made to it to handle the sign-extension as well.
Or alternately, I could just leave well-enough alone, and be careful to truncate CORE_ADDRs to 32 bits in our target xfer_memory code (or the MIPS code could sign-extend it in the same place).
Just FYI, the MIPS tried to do this, and it lost badly! It also turned
out that the MIPS case was just a simplification of the more generic
harvard case and hence the core of GDB is being modified, as people
notice, to use the pointer to address and address to pointer functions.