On Wed, Nov 19, 2014 at 5:23 PM, Andrew Pinski <pins...@gmail.com> wrote:
> 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.

Pmode shouldn't change class layout, which is determined by ptr_mode.
You can mix  object files compiled by -maddress-mode=long with
-maddress-mode=short.  Do those tests fail with -maddress-mode=long
under x32?

-- 
H.J.

Reply via email to