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.