From: uros Date: Tue, 10 Jul 2012 17:53:48 +0000 (+0000) Subject: Backport from mainline X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=23a4780c5260641f5b24b9a11a1b3b0bce7e12d1 Backport from mainline 2012-07-03 Uros Bizjak PR target/53811 * config/i386/i386.c (x86_output_mi_thunk): Check if fnaddr satisfies sibcall_insn_operand. Move it to a temporary register if not. 2012-07-06 Uros Bizjak PR target/53853 * config/i386/i386.c (x86_output_mi_thunk): For CM_LARGE_PIC model, emit PIC sequence for fnaddr symbol reference in advance. testsuite/ChangeLog: Backport from mainline 2012-07-03 Uros Bizjak PR target/53811 * g++.dg/other/pr53811.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@189412 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3b6a1e89eb9..a15cf456130 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2012-07-10 Uros Bizjak + + Backport from mainline + 2012-07-03 Uros Bizjak + + PR target/53811 + * config/i386/i386.c (x86_output_mi_thunk): Check if fnaddr satisfies + sibcall_insn_operand. Move it to a temporary register if not. + + 2012-07-06 Uros Bizjak + + PR target/53853 + * config/i386/i386.c (x86_output_mi_thunk): For CM_LARGE_PIC model, + emit PIC sequence for fnaddr symbol reference in advance. + 2012-07-09 Jason Merrill PR c++/53882 @@ -30,8 +45,7 @@ 2012-03-30 Richard Guenther PR middle-end/52786 - * double-int.c (rshift_double): Remove not needed - cast. + * double-int.c (rshift_double): Remove not needed cast. 2012-03-28 Richard Guenther diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 73ab12980d0..1701a2d1024 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -32080,6 +32080,18 @@ x86_output_mi_thunk (FILE *file, { rtx this_param = x86_this_parameter (function); rtx this_reg, tmp, fnaddr; + unsigned int tmp_regno; + + if (TARGET_64BIT) + tmp_regno = R10_REG; + else + { + unsigned int ccvt = ix86_get_callcvt (TREE_TYPE (function)); + if ((ccvt & (IX86_CALLCVT_FASTCALL | IX86_CALLCVT_THISCALL)) != 0) + tmp_regno = AX_REG; + else + tmp_regno = CX_REG; + } emit_note (NOTE_INSN_PROLOGUE_END); @@ -32106,7 +32118,7 @@ x86_output_mi_thunk (FILE *file, { if (!x86_64_general_operand (delta_rtx, Pmode)) { - tmp = gen_rtx_REG (Pmode, R10_REG); + tmp = gen_rtx_REG (Pmode, tmp_regno); emit_move_insn (tmp, delta_rtx); delta_rtx = tmp; } @@ -32119,18 +32131,7 @@ x86_output_mi_thunk (FILE *file, if (vcall_offset) { rtx vcall_addr, vcall_mem, this_mem; - unsigned int tmp_regno; - if (TARGET_64BIT) - tmp_regno = R10_REG; - else - { - unsigned int ccvt = ix86_get_callcvt (TREE_TYPE (function)); - if ((ccvt & (IX86_CALLCVT_FASTCALL | IX86_CALLCVT_THISCALL)) != 0) - tmp_regno = AX_REG; - else - tmp_regno = CX_REG; - } tmp = gen_rtx_REG (Pmode, tmp_regno); this_mem = gen_rtx_MEM (ptr_mode, this_reg); @@ -32205,6 +32206,19 @@ x86_output_mi_thunk (FILE *file, emit_jump_insn (gen_indirect_jump (fnaddr)); else { + if (ix86_cmodel == CM_LARGE_PIC && SYMBOLIC_CONST (fnaddr)) + fnaddr = legitimize_pic_address (fnaddr, + gen_rtx_REG (Pmode, tmp_regno)); + + if (!sibcall_insn_operand (fnaddr, Pmode)) + { + tmp = gen_rtx_REG (Pmode, tmp_regno); + if (GET_MODE (fnaddr) != Pmode) + fnaddr = gen_rtx_ZERO_EXTEND (Pmode, fnaddr); + emit_move_insn (tmp, fnaddr); + fnaddr = tmp; + } + tmp = gen_rtx_MEM (QImode, fnaddr); tmp = gen_rtx_CALL (VOIDmode, tmp, const0_rtx); tmp = emit_call_insn (tmp); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 39b6dbd7344..a3ab746b76c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2012-07-10 Uros Bizjak + + Backport from mainline + 2012-07-03 Uros Bizjak + + PR target/53811 + * g++.dg/other/pr53811.C: New test. + 2012-07-10 Jason Merrill PR c++/53733 diff --git a/gcc/testsuite/g++.dg/other/pr53811.C b/gcc/testsuite/g++.dg/other/pr53811.C new file mode 100644 index 00000000000..c00b7f6d4dd --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr53811.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-options "-mcmodel=large" { target { { i?86-*-* x86_64-*-* } && lp64 } } } + +struct ICCStringClass +{ + virtual void * + CreateString (const char *fromText) = 0; +}; + +struct AGSCCDynamicObject +{ + virtual void + Unserialize (int index, const char *serializedData, int dataSize) = 0; +}; + + +struct ScriptString:AGSCCDynamicObject, ICCStringClass +{ + virtual void *CreateString (const char *fromText); +}; + +const char * +CreateNewScriptString (const char *fromText, bool reAllocate = true); + +void * +ScriptString::CreateString (const char *fromText) +{ + return (void *) CreateNewScriptString (fromText); +}