Michael Meissner wrote: > On Sat, Apr 28, 2012 at 02:32:18PM -0500, Peter Bigot wrote: >> The MSP430's split address space and ISA make it expensive to place >> data above the 64 kB boundary, but cheap to place code there. So I'm >> looking for a way to use HImode for data pointers, but PSImode for >> function pointers. If gcc supports this, it's not obvious how. >> >> I get partway there with FUNCTION_MODE and some hacks for the case >> where the called object is a symbol, but not when it's a >> pointer-to-function data object. As an example, bootstrapping fails >> in libgcc/unwind-dw2-fde.c because the fde_compare pointer-to-function >> object is stored in a HImode register instead of a PSImode register. >> >> The only candidate solution I've seen (and haven't yet tried) is to >> somehow assign all functions to be in a special named address space >> and use TARGET_ADDR_SPACE_POINTER_MODE to override the normal use of >> ptr_mode in build_pointer_type. >> >> I haven't been able to identify an existing back-end that has such a >> case, though I'd swear I've seen memory models like this for some >> other processor in the past. > > In the original 1989 ANSI C standard (which became the 1990 ISO C standard) > function pointers could be a different size than void * pointers. In that > standard, void * and char * had to have the same underlying size and > representation. I don't recall if C99 changed this in any way. > > The D10V port sort of cheated in that it had 16-bit pointers that were byte > pointers for data, and 16-bit pointers that were word pointers for functions, > and it caused a number of issues, back when I did the D10V many years ago. > However, since the D10V has been removed quite some time ago, it is no longer > relevant.
The AVR port does the same: Function addresses are word addresses whereas data addresses are byte addresses. Johann > Another way to go is what we do in 64-bit powerpc -- function pointers are > actually pointers to a 3 word descriptor, that contains the real function > address, the value to load into the GOT pointer, and the value to load into > the > register holding the static chain.