We should use ptr_mode instead of Pmode for vtable adjustment. This patch fixed:
FAIL: ext/ext_pointer/1.cc execution test FAIL: gcc.dg/c99-stdint-1.c (test for excess errors) FAIL: g++.dg/abi/covariant3.C execution test FAIL: g++.dg/abi/vcall1.C execution test FAIL: g++.dg/inherit/covariant17.C execution test FAIL: g++.dg/inherit/covariant18.C execution test FAIL: g++.dg/inherit/covariant3.C execution test FAIL: g++.dg/inherit/covariant4.C execution test FAIL: g++.old-deja/g++.abi/vtable3a.C execution test FAIL: g++.old-deja/g++.abi/vtable3b.C execution test FAIL: g++.old-deja/g++.abi/vtable3c.C execution test FAIL: g++.old-deja/g++.abi/vtable3d.C execution test FAIL: g++.old-deja/g++.abi/vtable3e.C execution test FAIL: g++.old-deja/g++.abi/vtable3f.C execution test FAIL: g++.old-deja/g++.abi/vtable3g.C execution test FAIL: g++.old-deja/g++.abi/vtable3h.C execution test FAIL: g++.old-deja/g++.abi/vtable3i.C execution test FAIL: g++.old-deja/g++.abi/vtable3j.C execution test FAIL: g++.old-deja/g++.mike/p4736b.C execution test FAIL: g++.old-deja/g++.mike/p4736c.C execution test FAIL: g++.old-deja/g++.mike/virt2.C execution test FAIL: g++.old-deja/g++.mike/virt5.C execution test FAIL: g++.old-deja/g++.oliva/thunk1.C execution test H.J. --- commit f18335eabb233ebe05ee1b0b0dc64ce0be5d88cd Author: H.J. Lu <hjl.to...@gmail.com> Date: Fri May 20 05:05:17 2011 -0700 Use ptr_mode instead of Pmode for vtable adjustment. diff --git a/gcc/ChangeLog.x32 b/gcc/ChangeLog.x32 index 227b377..abd57a4 100644 --- a/gcc/ChangeLog.x32 +++ b/gcc/ChangeLog.x32 @@ -1,3 +1,9 @@ +2011-05-20 H.J. Lu <hongjiu...@intel.com> + + PR target/48529 + * config/i386/i386.c (x86_output_mi_thunk): Use ptr_mode instead + of Pmode for vtable adjustment. + 2011-05-19 H.J. Lu <hongjiu...@intel.com> * config/i386/x86-64.h (SIZE_TYPE): Check TARGET_LP64 instead diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index f4a74da..b68e2e8 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -30249,7 +30249,7 @@ x86_output_mi_thunk (FILE *file, if (vcall_offset) { if (TARGET_64BIT) - tmp = gen_rtx_REG (DImode, R10_REG); + tmp = gen_rtx_REG (ptr_mode, R10_REG); else { int tmp_regno = CX_REG; @@ -30259,7 +30259,7 @@ x86_output_mi_thunk (FILE *file, tmp = gen_rtx_REG (SImode, tmp_regno); } - xops[0] = gen_rtx_MEM (Pmode, this_reg); + xops[0] = gen_rtx_MEM (ptr_mode, this_reg); xops[1] = tmp; output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops); @@ -30271,9 +30271,10 @@ x86_output_mi_thunk (FILE *file, xops[0] = GEN_INT (vcall_offset); xops[1] = tmp2; output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops); - xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2)); + xops[0] = gen_rtx_MEM (ptr_mode, + gen_rtx_PLUS (Pmode, tmp, tmp2)); } - xops[1] = this_reg; + xops[1] = gen_rtx_REG (ptr_mode, REGNO (this_reg)); output_asm_insn ("add%z1\t{%0, %1|%1, %0}", xops); }