Peter Bigot a écrit:
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.
I don't think it's a good solution to use different pointer sizes.
You will run into all sorts of trouble -- both in the application and
in GCC.
Besides that, named address spaces are for data, not for functions.
And they are supported for C only, not for C++, Objective-C, etc.
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.
Could somebody suggest a workable solution for 4.7.x?
AVR has similar problems to solve, see
http://gcc.gnu.org/ml/gcc/2012-01/msg00365.html
On AVR, the problem only arises for functions outside 128 KiB
because instructions are always 2-byte aligned. Consequently,
function pointers hold word-addresses.
An easy solution would be to align function entry points and
labels of computed and non-local goto to 2^n bytes. That way
16-bit pointers can target addresses in 2^n * 64 KiB.
Other approach is linker stubs as mantioned in the link above.
Johann