re PR target/83111 ([sh] stack smashing detected in gen_udivsi3)
authorOleg Endo <olegendo@gcc.gnu.org>
Thu, 23 Nov 2017 14:06:15 +0000 (14:06 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Thu, 23 Nov 2017 14:06:15 +0000 (14:06 +0000)
gcc/
PR target/83111
* config/sh/sh.md (udivsi3, divsi3, sibcall_value_pcrel,
sibcall_value_pcrel_fdpic): Use local variable instead of
operands[3].
(calli_tbr_rel): Add missing operand 2.
(call_valuei_tbr_rel): Add missing operand 3.

From-SVN: r255096

gcc/ChangeLog
gcc/config/sh/sh.md

index 836e9bb..df331c0 100644 (file)
@@ -1,3 +1,12 @@
+2017-11-23  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/83111
+       * config/sh/sh.md (udivsi3, divsi3, sibcall_value_pcrel,
+       sibcall_value_pcrel_fdpic): Use local variable instead of
+       operands[3].
+       (calli_tbr_rel): Add missing operand 2.
+       (call_valuei_tbr_rel): Add missing operand 3.
+
 2017-11-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/82253
index 15d99f1..840fd92 100644 (file)
   ""
 {
   rtx last;
+  rtx func_ptr = gen_reg_rtx (Pmode);
 
-  operands[3] = gen_reg_rtx (Pmode);
   /* Emit the move of the address to a pseudo outside of the libcall.  */
   if (TARGET_DIVIDE_CALL_TABLE)
     {
          emit_move_insn (operands[0], operands[2]);
          DONE;
        }
-      function_symbol (operands[3], "__udivsi3_i4i", SFUNC_GOT);
-      last = gen_udivsi3_i4_int (operands[0], operands[3]);
+      function_symbol (func_ptr, "__udivsi3_i4i", SFUNC_GOT);
+      last = gen_udivsi3_i4_int (operands[0], func_ptr);
     }
   else if (TARGET_DIVIDE_CALL_FP)
     {
-      rtx lab = function_symbol (operands[3], "__udivsi3_i4", SFUNC_STATIC).lab;
+      rtx lab = function_symbol (func_ptr, "__udivsi3_i4", SFUNC_STATIC).lab;
       if (TARGET_FPU_SINGLE)
-       last = gen_udivsi3_i4_single (operands[0], operands[3], lab);
+       last = gen_udivsi3_i4_single (operands[0], func_ptr, lab);
       else
-       last = gen_udivsi3_i4 (operands[0], operands[3], lab);
+       last = gen_udivsi3_i4 (operands[0], func_ptr, lab);
     }
   else if (TARGET_SH2A)
     {
     }
   else
     {
-      rtx lab = function_symbol (operands[3], "__udivsi3", SFUNC_STATIC).lab;
-      last = gen_udivsi3_i1 (operands[0], operands[3], lab);
+      rtx lab = function_symbol (func_ptr, "__udivsi3", SFUNC_STATIC).lab;
+      last = gen_udivsi3_i1 (operands[0], func_ptr, lab);
     }
   emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
   emit_move_insn (gen_rtx_REG (SImode, 5), operands[2]);
   ""
 {
   rtx last;
+  rtx func_ptr = gen_reg_rtx (Pmode);
 
-  operands[3] = gen_reg_rtx (Pmode);
   /* Emit the move of the address to a pseudo outside of the libcall.  */
   if (TARGET_DIVIDE_CALL_TABLE)
     {
-      function_symbol (operands[3], sh_divsi3_libfunc, SFUNC_GOT);
-      last = gen_divsi3_i4_int (operands[0], operands[3]);
+      function_symbol (func_ptr, sh_divsi3_libfunc, SFUNC_GOT);
+      last = gen_divsi3_i4_int (operands[0], func_ptr);
     }
   else if (TARGET_DIVIDE_CALL_FP)
     {
-      rtx lab = function_symbol (operands[3], sh_divsi3_libfunc,
+      rtx lab = function_symbol (func_ptr, sh_divsi3_libfunc,
                                 SFUNC_STATIC).lab;
       if (TARGET_FPU_SINGLE)
-       last = gen_divsi3_i4_single (operands[0], operands[3], lab);
+       last = gen_divsi3_i4_single (operands[0], func_ptr, lab);
       else
-       last = gen_divsi3_i4 (operands[0], operands[3], lab);
+       last = gen_divsi3_i4 (operands[0], func_ptr, lab);
     }
   else if (TARGET_SH2A)
     {
     }
   else
     {
-      function_symbol (operands[3], sh_divsi3_libfunc, SFUNC_GOT);
-      last = gen_divsi3_i1 (operands[0], operands[3]);
+      function_symbol (func_ptr, sh_divsi3_libfunc, SFUNC_GOT);
+      last = gen_divsi3_i1 (operands[0], func_ptr);
     }
   emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
   emit_move_insn (gen_rtx_REG (SImode, 5), operands[2]);
   [(call (mem (match_operand:SI 0 "symbol_ref_operand" ""))
         (match_operand 1 "" ""))
    (use (reg:SI FPSCR_MODES_REG))
+   (use (match_scratch 2))
    (clobber (reg:SI PR_REG))]
   "TARGET_SH2A && sh2a_is_function_vector_call (operands[0])"
 {
        (call (mem:SI (match_operand:SI 1 "symbol_ref_operand" ""))
              (match_operand 2 "" "")))
    (use (reg:SI FPSCR_MODES_REG))
+   (use (match_scratch 3))
    (clobber (reg:SI PR_REG))]
   "TARGET_SH2A && sh2a_is_function_vector_call (operands[1])"
 {
   [(const_int 0)]
 {
   rtx lab = PATTERN (gen_call_site ());
-  rtx call_insn;
-
-  operands[3] =  gen_rtx_REG (SImode, R1_REG);
+  rtx tmp =  gen_rtx_REG (SImode, R1_REG);
 
-  sh_expand_sym_label2reg (operands[3], operands[1], lab, true);
-  call_insn = emit_call_insn (gen_sibcall_valuei_pcrel (operands[0],
-                                                       operands[3],
+  sh_expand_sym_label2reg (tmp, operands[1], lab, true);
+  rtx call_insn = emit_call_insn (gen_sibcall_valuei_pcrel (operands[0],
+                                                       tmp,
                                                        operands[2],
                                                        copy_rtx (lab)));
   SIBLING_CALL_P (call_insn) = 1;
   [(const_int 0)]
 {
   rtx lab = PATTERN (gen_call_site ());
+  rtx tmp = gen_rtx_REG (SImode, R1_REG);
 
-  operands[3] =  gen_rtx_REG (SImode, R1_REG);
-
-  sh_expand_sym_label2reg (operands[3], operands[1], lab, true);
+  sh_expand_sym_label2reg (tmp, operands[1], lab, true);
   rtx i = emit_call_insn (gen_sibcall_valuei_pcrel_fdpic (operands[0],
-                                                         operands[3],
+                                                         tmp,
                                                          operands[2],
                                                          copy_rtx (lab)));
   SIBLING_CALL_P (i) = 1;