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

Reply via email to