RISC-V: Fix -msave-restore bug with sibcalls.
2018-01-08 Monk Chiang <sh.chiang04@gmail.com> Kito Cheng <kito.cheng@gmail.com> gcc/ * config/riscv/riscv.c (machine_function::is_leaf): Remove field. (riscv_leaf_function_p): Delete. (riscv_function_ok_for_sibcall): Return false when TARGET_SAVE_RESTORE. 2018-01-08 Chih-Mao Chen <pkmx.tw@gmail.com> Monk Chiang <sh.chiang04@gmail.com> gcc/testsuite/ * gcc.target/riscv/save-restore-1.c: New. 2017-11-29 Jim Wilson <jimw@sifive.com> gcc/testsuite/ * gcc.target/riscv/riscv.exp: New. From-SVN: r256363
This commit is contained in:
parent
c9af7ef850
commit
603ceb882d
|
@ -1,3 +1,13 @@
|
|||
2018-01-08 Jim Wilson <jimw@sifive.com>
|
||||
|
||||
Backport from mainline
|
||||
2018-01-08 Monk Chiang <sh.chiang04@gmail.com>
|
||||
Kito Cheng <kito.cheng@gmail.com>
|
||||
|
||||
* config/riscv/riscv.c (machine_function::is_leaf): Remove field.
|
||||
(riscv_leaf_function_p): Delete.
|
||||
(riscv_function_ok_for_sibcall): Return false when TARGET_SAVE_RESTORE.
|
||||
|
||||
2018-01-08 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
Backport from mainline
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Subroutines used for code generation for RISC-V.
|
||||
Copyright (C) 2011-2017 Free Software Foundation, Inc.
|
||||
Copyright (C) 2011-2018 Free Software Foundation, Inc.
|
||||
Contributed by Andrew Waterman (andrew@sifive.com).
|
||||
Based on MIPS target for GNU compiler.
|
||||
|
||||
|
@ -177,9 +177,6 @@ struct GTY(()) machine_function {
|
|||
This area is allocated by the callee at the very top of the frame. */
|
||||
int varargs_size;
|
||||
|
||||
/* Memoized return value of leaf_function_p. <0 if false, >0 if true. */
|
||||
int is_leaf;
|
||||
|
||||
/* The current frame information, calculated by riscv_compute_frame_info. */
|
||||
struct riscv_frame_info frame;
|
||||
};
|
||||
|
@ -3994,26 +3991,15 @@ riscv_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
|
|||
emit_insn (gen_clear_cache (addr, end_addr));
|
||||
}
|
||||
|
||||
/* Return leaf_function_p () and memoize the result. */
|
||||
|
||||
static bool
|
||||
riscv_leaf_function_p (void)
|
||||
{
|
||||
if (cfun->machine->is_leaf == 0)
|
||||
cfun->machine->is_leaf = leaf_function_p () ? 1 : -1;
|
||||
|
||||
return cfun->machine->is_leaf > 0;
|
||||
}
|
||||
|
||||
/* Implement TARGET_FUNCTION_OK_FOR_SIBCALL. */
|
||||
|
||||
static bool
|
||||
riscv_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
|
||||
tree exp ATTRIBUTE_UNUSED)
|
||||
{
|
||||
/* When optimzing for size, don't use sibcalls in non-leaf routines */
|
||||
/* Don't use sibcalls when use save-restore routine. */
|
||||
if (TARGET_SAVE_RESTORE)
|
||||
return riscv_leaf_function_p ();
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,15 @@
|
|||
2018-01-08 Jim Wilson <jimw@sifive.com>
|
||||
|
||||
Backport from mainline
|
||||
2018-01-08 Chih-Mao Chen <pkmx.tw@gmail.com>
|
||||
Monk Chiang <sh.chiang04@gmail.com>
|
||||
|
||||
* gcc.target/riscv/save-restore-1.c: New.
|
||||
|
||||
2017-11-29 Jim Wilson <jimw@sifive.com>
|
||||
|
||||
* gcc.target/riscv/riscv.exp: New.
|
||||
|
||||
2018-01-08 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
Backport from mainline
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
# Copyright (C) 2017-2018 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GCC; see the file COPYING3. If not see
|
||||
# <http://www.gnu.org/licenses/>.
|
||||
|
||||
# GCC testsuite that uses the `dg.exp' driver.
|
||||
|
||||
# Exit immediately if this isn't a RISC-V target.
|
||||
if ![istarget riscv*-*-*] then {
|
||||
return
|
||||
}
|
||||
|
||||
# Load support procs.
|
||||
load_lib gcc-dg.exp
|
||||
|
||||
# If a testcase doesn't have special options, use these.
|
||||
global DEFAULT_CFLAGS
|
||||
if ![info exists DEFAULT_CFLAGS] then {
|
||||
set DEFAULT_CFLAGS " -ansi -pedantic-errors"
|
||||
}
|
||||
|
||||
# Initialize `dg'.
|
||||
dg-init
|
||||
|
||||
# Main loop.
|
||||
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] \
|
||||
"" $DEFAULT_CFLAGS
|
||||
|
||||
# All done.
|
||||
dg-finish
|
|
@ -0,0 +1,25 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-options "-O2 -msave-restore -fomit-frame-pointer" } */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
__attribute__((noinline)) int g(void) { return 42; }
|
||||
|
||||
__attribute__((noinline)) int f(void) {
|
||||
asm volatile ("li s0, 0x87654321" ::: "s0");
|
||||
return g();
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
asm volatile ("li s0, 0x12345678" ::: "s0");
|
||||
|
||||
f();
|
||||
|
||||
long s0;
|
||||
asm volatile ("mv %0, s0" : "=r"(s0));
|
||||
|
||||
if (s0 == 0x12345678)
|
||||
exit (0);
|
||||
else
|
||||
abort();
|
||||
}
|
Loading…
Reference in New Issue