]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Re: [PATCH] Avoid ICE with m68k-elf -malign-int and libcalls
authorMikael Pettersson <mikpelinux@gmail.com>
Sun, 21 Jan 2024 22:55:49 +0000 (15:55 -0700)
committerJeff Law <jlaw@ventanamicro.com>
Sun, 21 Jan 2024 22:59:33 +0000 (15:59 -0700)
>> emit_library_call_value_1 calls emit_push_insn with NULL_TREE
>> for TYPE.  Sometimes emit_push_insn needs to assign a temp with
>> that TYPE, which causes a segfault.
>>
>> Fixed by computing the TYPE from MODE when needed.
>>
>> Original patch by Thorsten Otto.
>>
[ ... ]
> This really needs to happen in the two call paths which pass in
> NULL_TREE for the type.  Note how the type is used to determine padding
> earlier in emit_push_insn.  That would also make the code more
> consistent with the comment before emit_push_insn which implies that
> both MODE and TYPE are valid.
>
>
> Additionally you should bootstrap and regression test this patch on at
> least one target.

Updated as requested, and bootstrapped and tested on
{x86_64,aarch64,m68k}-linux-gnu without regressions.

gcc/

PR target/82420
PR target/111279
* calls.cc (emit_library_call_value_1): Pass valid TYPE
to emit_push_insn.
* expr.cc (emit_push_insn): Likewise.

gcc/testsuite/

PR target/82420
* gcc.target/m68k/pr82420.c: New test.

Co-authored-by: Thorsten Otto <admin@tho-otto.de>
gcc/calls.cc
gcc/expr.cc
gcc/testsuite/gcc.target/m68k/pr82420.c [new file with mode: 0644]

index 7c35b1ad2047365efac56d2a97f01b6b2d5aaf98..01f44734743711510240f9393b69670822589dda 100644 (file)
@@ -4580,8 +4580,8 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
                }
            }
 
-         emit_push_insn (val, mode, NULL_TREE, NULL_RTX, parm_align,
-                         partial, reg, 0, argblock,
+         emit_push_insn (val, mode, lang_hooks.types.type_for_mode (mode, 0),
+                         NULL_RTX, parm_align, partial, reg, 0, argblock,
                          (gen_int_mode
                           (argvec[argnum].locate.offset.constant, Pmode)),
                          reg_parm_stack_space,
index 3396edff1c9c501dc5daa258072fe60a1022b3f6..502518d69c527e46e039cea0ee392477e88be09d 100644 (file)
@@ -5532,11 +5532,12 @@ emit_push_insn (rtx x, machine_mode mode, tree type, rtx size,
       /* Loop over all the words allocated on the stack for this arg.  */
       /* We can do it by words, because any scalar bigger than a word
         has a size a multiple of a word.  */
+      tree word_mode_type = lang_hooks.types.type_for_mode (word_mode, 1);
       for (i = num_words - 1; i >= not_stack; i--)
        if (i >= not_stack + offset)
          if (!emit_push_insn (operand_subword_force (x, i, mode),
-                         word_mode, NULL_TREE, NULL_RTX, align, 0, NULL_RTX,
-                         0, args_addr,
+                         word_mode, word_mode_type, NULL_RTX, align, 0,
+                         NULL_RTX, 0, args_addr,
                          GEN_INT (args_offset + ((i - not_stack + skip)
                                                  * UNITS_PER_WORD)),
                          reg_parm_stack_space, alignment_pad, sibcall_p))
diff --git a/gcc/testsuite/gcc.target/m68k/pr82420.c b/gcc/testsuite/gcc.target/m68k/pr82420.c
new file mode 100644 (file)
index 0000000..5c84f29
--- /dev/null
@@ -0,0 +1,9 @@
+/* { do-do compile } */
+/* { dg-options "-march=68000 -malign-int" } */
+
+int a;
+
+void f(void)
+{
+    a /= 3;
+}