aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2012-01-27 22:25:02 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2012-01-27 22:25:02 +0000
commit183dd1301c72cacee121b79651fb0dbe2f8cc864 (patch)
treed398842589b29ac849e11574620ca087d812c8b1 /gcc
parenta6bc04232912152fff06106d082c8f04a6d6fa91 (diff)
downloadgcc-183dd1301c72cacee121b79651fb0dbe2f8cc864.zip
gcc-183dd1301c72cacee121b79651fb0dbe2f8cc864.tar.gz
gcc-183dd1301c72cacee121b79651fb0dbe2f8cc864.tar.bz2
compiler: Use new __builtin_init_heap_trampoline.
PR go/47656 * builtins.def (BUILT_IN_INIT_HEAP_TRAMPOLINE): Define. * builtins.c (expand_builtin_init_trampoline): Add onstack parameter. Change caller. (expand_builtin): Handle BUILT_IN_INIT_HEAP_TRAMPOLINE. * tree.c (build_common_builtin_nodes): Declare __builtin_init_heap_trampoline. From-SVN: r183650
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/builtins.c28
-rw-r--r--gcc/builtins.def3
-rw-r--r--gcc/go/gofrontend/gogo-tree.cc4
-rw-r--r--gcc/tree.c6
5 files changed, 37 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8773d62..b9e7791 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2012-01-27 Ian Lance Taylor <iant@google.com>
+
+ PR go/47656
+ * builtins.def (BUILT_IN_INIT_HEAP_TRAMPOLINE): Define.
+ * builtins.c (expand_builtin_init_trampoline): Add onstack
+ parameter. Change caller.
+ (expand_builtin): Handle BUILT_IN_INIT_HEAP_TRAMPOLINE.
+ * tree.c (build_common_builtin_nodes): Declare
+ __builtin_init_heap_trampoline.
+
2012-01-27 Georg-Johann Lay <avr@gjlay.de>
* config/avr/avr-protos.h (lpm_reg_rtx, lpm_addr_reg_rtx,
diff --git a/gcc/builtins.c b/gcc/builtins.c
index d62b419..74be552 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -1,7 +1,7 @@
/* Expand builtin functions.
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+ 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
+ 2012 Free Software Foundation, Inc.
This file is part of GCC.
@@ -4854,7 +4854,7 @@ round_trampoline_addr (rtx tramp)
}
static rtx
-expand_builtin_init_trampoline (tree exp)
+expand_builtin_init_trampoline (tree exp, bool onstack)
{
tree t_tramp, t_func, t_chain;
rtx m_tramp, r_tramp, r_chain, tmp;
@@ -4871,13 +4871,16 @@ expand_builtin_init_trampoline (tree exp)
m_tramp = gen_rtx_MEM (BLKmode, r_tramp);
MEM_NOTRAP_P (m_tramp) = 1;
- /* The TRAMP argument should be the address of a field within the
- local function's FRAME decl. Let's see if we can fill in the
- to fill in the MEM_ATTRs for this memory. */
+ /* If ONSTACK, the TRAMP argument should be the address of a field
+ within the local function's FRAME decl. Either way, let's see if
+ we can fill in the MEM_ATTRs for this memory. */
if (TREE_CODE (t_tramp) == ADDR_EXPR)
set_mem_attributes_minus_bitpos (m_tramp, TREE_OPERAND (t_tramp, 0),
true, 0);
+ /* Creator of a heap trampoline is responsible for making sure the
+ address is aligned to at least STACK_BOUNDARY. Normally malloc
+ will ensure this anyhow. */
tmp = round_trampoline_addr (r_tramp);
if (tmp != r_tramp)
{
@@ -4897,10 +4900,13 @@ expand_builtin_init_trampoline (tree exp)
/* Generate insns to initialize the trampoline. */
targetm.calls.trampoline_init (m_tramp, t_func, r_chain);
- trampolines_created = 1;
+ if (onstack)
+ {
+ trampolines_created = 1;
- warning_at (DECL_SOURCE_LOCATION (t_func), OPT_Wtrampolines,
- "trampoline generated for nested function %qD", t_func);
+ warning_at (DECL_SOURCE_LOCATION (t_func), OPT_Wtrampolines,
+ "trampoline generated for nested function %qD", t_func);
+ }
return const0_rtx;
}
@@ -6325,7 +6331,9 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
return const0_rtx;
case BUILT_IN_INIT_TRAMPOLINE:
- return expand_builtin_init_trampoline (exp);
+ return expand_builtin_init_trampoline (exp, true);
+ case BUILT_IN_INIT_HEAP_TRAMPOLINE:
+ return expand_builtin_init_trampoline (exp, false);
case BUILT_IN_ADJUST_TRAMPOLINE:
return expand_builtin_adjust_trampoline (exp);
diff --git a/gcc/builtins.def b/gcc/builtins.def
index 0fb9286..0cba2fe 100644
--- a/gcc/builtins.def
+++ b/gcc/builtins.def
@@ -1,7 +1,7 @@
/* This file contains the definitions and documentation for the
builtins used in the GNU compiler.
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
- 2010, 2011 Free Software Foundation, Inc.
+ 2010, 2011, 2012 Free Software Foundation, Inc.
This file is part of GCC.
@@ -740,6 +740,7 @@ DEF_C99_BUILTIN (BUILT_IN__EXIT2, "_Exit", BT_FN_VOID_INT, ATTR_NORETURN_
/* Implementing nested functions. */
DEF_BUILTIN_STUB (BUILT_IN_INIT_TRAMPOLINE, "__builtin_init_trampoline")
+DEF_BUILTIN_STUB (BUILT_IN_INIT_HEAP_TRAMPOLINE, "__builtin_init_heap_trampoline")
DEF_BUILTIN_STUB (BUILT_IN_ADJUST_TRAMPOLINE, "__builtin_adjust_trampoline")
DEF_BUILTIN_STUB (BUILT_IN_NONLOCAL_GOTO, "__builtin_nonlocal_goto")
diff --git a/gcc/go/gofrontend/gogo-tree.cc b/gcc/go/gofrontend/gogo-tree.cc
index 9ab4a3b..352179d 100644
--- a/gcc/go/gofrontend/gogo-tree.cc
+++ b/gcc/go/gofrontend/gogo-tree.cc
@@ -2422,8 +2422,8 @@ Gogo::make_trampoline(tree fnaddr, tree closure, Location location)
x = save_expr(x);
// Initialize the trampoline.
- tree ini = build_call_expr(builtin_decl_implicit(BUILT_IN_INIT_TRAMPOLINE),
- 3, x, fnaddr, closure);
+ tree calldecl = builtin_decl_implicit(BUILT_IN_INIT_HEAP_TRAMPOLINE);
+ tree ini = build_call_expr(calldecl, 3, x, fnaddr, closure);
// On some targets the trampoline address needs to be adjusted. For
// example, when compiling in Thumb mode on the ARM, the address
diff --git a/gcc/tree.c b/gcc/tree.c
index 34bcb39..22f9d00 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -1,7 +1,7 @@
/* Language-independent node constructors for parse phase of GNU compiler.
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
- 2011 Free Software Foundation, Inc.
+ 2011, 2012 Free Software Foundation, Inc.
This file is part of GCC.
@@ -9527,6 +9527,10 @@ build_common_builtin_nodes (void)
local_define_builtin ("__builtin_init_trampoline", ftype,
BUILT_IN_INIT_TRAMPOLINE,
"__builtin_init_trampoline", ECF_NOTHROW | ECF_LEAF);
+ local_define_builtin ("__builtin_init_heap_trampoline", ftype,
+ BUILT_IN_INIT_HEAP_TRAMPOLINE,
+ "__builtin_init_heap_trampoline",
+ ECF_NOTHROW | ECF_LEAF);
ftype = build_function_type_list (ptr_type_node, ptr_type_node, NULL_TREE);
local_define_builtin ("__builtin_adjust_trampoline", ftype,