compiler: Use new __builtin_init_heap_trampoline.
authorIan Lance Taylor <iant@google.com>
Fri, 27 Jan 2012 22:25:02 +0000 (22:25 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 27 Jan 2012 22:25:02 +0000 (22:25 +0000)
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

gcc/ChangeLog
gcc/builtins.c
gcc/builtins.def
gcc/go/gofrontend/gogo-tree.cc
gcc/tree.c

index 8773d622c182536ab5278869db8ffc8d007362b9..b9e77915696f8afededbe5cd50975261555ad66e 100644 (file)
@@ -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,
index d62b419075a57d25c4f415482d4e6b0513927334..74be5522681a0cd41064bc3e3b4e8b9d8157b791 100644 (file)
@@ -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);
 
index 0fb92860933e2afafb192521cc785024ffcbc08d..0cba2feea63d0d6896ce70fcf6da825ea8c8e8a5 100644 (file)
@@ -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")
 
index 9ab4a3bf2ac59f1d81f65b1ac7f99abb3737aef9..352179df02ab0dc8a6ddf82290f26c5d05d2cc8b 100644 (file)
@@ -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
index 34bcb39b8e90e17d47e32550efc451e9effc37b9..22f9d007826b325ef0e4e48716f819a15a142066 100644 (file)
@@ -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,