summaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-01-27 22:25:02 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-01-27 22:25:02 +0000
commitc307f1064fa0315692c3dcdd800435d5895b234d (patch)
treed398842589b29ac849e11574620ca087d812c8b1 /gcc/builtins.c
parent8486bb628f7b4482426d77009850dff7efe1f9d3 (diff)
downloadgcc-c307f1064fa0315692c3dcdd800435d5895b234d.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183650 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index d62b419075a..74be5522681 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);