On Wed, Nov 19, 2014 at 5:11 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Wed, Nov 19, 2014 at 4:54 PM, Andrew Pinski <pins...@gmail.com> wrote:
>> Hi,
>>   For ILP32 on AARCH64, we have ptr_mode != Pmode (we have ptr_mode
>> being SImode while Pmode is DImode and POINTER_SIZE is 32).  This
>> breaks ipa-polymorphic-call assumption that Pmode is the correct mode
>> for pointers.  Right now before this patch we get many testcase
>> failures in the C++ testsuite due to this.  Some of the tests fail due
>> to the wrong devirtualization happening (using the base class rather
>> the current class).
>>
>> This patch fixes the issue by using POINTER_SIZE in place of
>> GET_MODE_BITSIZE (Pmode) all over the file.
>>
>> OK?  Bootstrapped and tested on x86_64 and cross built and tested for
>> aarch64-elf with no regressions.
>>
>> Thanks,
>> Andrew Pinski
>>
>> ChangeLog:
>> ipa/63981
>> * ipa-polymorphic-call.c (possible_placement_new):
>> Use POINTER_SIZE instead of GET_MODE_BITSIZE (Pmode).
>> (ipa_polymorphic_call_context::restrict_to_inner_class): Likewise.
>> (extr_type_from_vtbl_ptr_store): Likewise.
>
> Does Pmode affect class layout?

No only POINTER_SIZE.  ILP32 is one of the few ABIs where Pmode !=
ptr_mode (sizeof(ptr_mode) == POINTER_SIZE always).

x32 has a similar issue with -maddress-mode=long but the default for
x32 is -maddress-mode=short.

Thanks,
Andrew Pinski

>
>
> --
> H.J.

Reply via email to