diff options
author | Mikael Pettersson <mikpelinux@gmail.com> | 2024-01-21 15:55:49 -0700 |
---|---|---|
committer | Jeff Law <jlaw@ventanamicro.com> | 2024-01-21 15:59:33 -0700 |
commit | bdcf7226c9fe87352466eb9a6bfc58fa24b3e5e1 (patch) | |
tree | d47f6bbcf0d654bbbdbf7ffacc61978b83240544 /gcc/expr.cc | |
parent | 5efd98c6f818ce2c55f54c34008557d0a3f953aa (diff) | |
download | gcc-bdcf7226c9fe87352466eb9a6bfc58fa24b3e5e1.zip gcc-bdcf7226c9fe87352466eb9a6bfc58fa24b3e5e1.tar.gz gcc-bdcf7226c9fe87352466eb9a6bfc58fa24b3e5e1.tar.bz2 |
Re: [PATCH] Avoid ICE with m68k-elf -malign-int and libcalls
>> 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>
Diffstat (limited to 'gcc/expr.cc')
-rw-r--r-- | gcc/expr.cc | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/gcc/expr.cc b/gcc/expr.cc index 3396edf..502518d 100644 --- a/gcc/expr.cc +++ b/gcc/expr.cc @@ -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)) |