This is the mail archive of the mailing list for the GCC 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: making sizeof(void*) different from sizeof(void(*)())


We have a working backend for an Harvard Architecture chip where function pointer and data pointers have necessarily different sizes. We couldn't do this without changing GCC itself in strategic places and adding some extra support in our backend. We haven't used address spaces or any other existing GCC solution.

Let me know if you need some further information about these changes.


Paulo Matos

On 28/04/12 20:32, 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.

Could somebody suggest a workable solution for 4.7.x?




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