This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch][plugin,mudflap] Mark builtin alloca as not inlineable


Mudflap prevents inlining of builtin_alloca using  flag_mudflap test.
Based on pbonzini 's suggestion, this patch achieves the same thing
using gimple_call_set_cannot_inline().
This is cleaner and eases the conversion of mudflap into a plugin.

Patch bootstraps and shows no testsuite regression.
Thanks

tunji


2009-06-19  Olatunji Ruwase  <tjruwase@google.com>

        * builtins.c (expand_builtin_alloca): Handle builtin alloca
          that is marked not to be inlined. Remove flag_mudflap use.
        * tree-mudflap.c: Rename mf_xform_derefs to
          mf_xfrom_statements.
          (mf_xform_statements): Mark builtin alloca
          calls as un-inlineable.


Index: builtins.c
===================================================================
--- builtins.c  (revision 148726)
+++ builtins.c  (working copy)
@@ -5182,10 +5182,8 @@ expand_builtin_alloca (tree exp, rtx tar
   rtx op0;
   rtx result;

-  /* In -fmudflap-instrumented code, alloca() and __builtin_alloca()
-     should always expand to function calls.  These can be intercepted
-     in libmudflap.  */
-  if (flag_mudflap)
+  /* Emit normal call if marked not-inlineable.  */
+  if (CALL_CANNOT_INLINE_P (exp))
     return NULL_RTX;

   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
Index: tree-mudflap.c
===================================================================
--- tree-mudflap.c      (revision 148726)
+++ tree-mudflap.c      (working copy)
@@ -62,7 +62,7 @@ static tree mf_file_function_line_tree (
 /* Indirection-related instrumentation.  */
 static void mf_decl_cache_locals (void);
 static void mf_decl_clear_locals (void);
-static void mf_xform_derefs (void);
+static void mf_xform_statements (void);
 static unsigned int execute_mudflap_function_ops (void);

 /* Addressable variables instrumentation.  */
@@ -416,13 +416,19 @@ mudflap_init (void)


 /* ------------------------------------------------------------------------ */
-/* Memory reference transforms. Perform the mudflap indirection-related
-   tree transforms on the current function.
-
-   This is the second part of the mudflap instrumentation.  It works on
+/* This is the second part of the mudflap instrumentation.  It works on
    low-level GIMPLE using the CFG, because we want to run this pass after
    tree optimizations have been performed, but we have to preserve the CFG
-   for expansion from trees to RTL.  */
+   for expansion from trees to RTL.
+   Below is the list of transformations performed on statements in the
+   current function.
+
+ 1)  Memory reference transforms: Perform the mudflap indirection-related
+    tree transforms on memory references.
+
+ 2) Mark BUILTIN_ALLOCA calls not inlineable.
+
+ */

 static unsigned int
 execute_mudflap_function_ops (void)
@@ -441,7 +447,7 @@ execute_mudflap_function_ops (void)
   if (! flag_mudflap_threads)
     mf_decl_cache_locals ();

-  mf_xform_derefs ();
+  mf_xform_statements ();

   if (! flag_mudflap_threads)
     mf_decl_clear_locals ();
@@ -934,9 +940,12 @@ mf_xform_derefs_1 (gimple_stmt_iterator

   mf_build_check_statement_for (base, limit, iter, location, dirflag);
 }
-
+/* Transform
+   1) Memory references.
+   2) BUILTIN_ALLOCA calls.
+*/
 static void
-mf_xform_derefs (void)
+mf_xform_statements (void)
 {
   basic_block bb, next;
   gimple_stmt_iterator i;
@@ -974,6 +983,14 @@ mf_xform_derefs (void)
                 }
               break;

+            case GIMPLE_CALL:
+              {
+                tree fndecl = gimple_call_fndecl (s);
+                if (fndecl && (DECL_FUNCTION_CODE (fndecl) ==
BUILT_IN_ALLOCA))
+                  gimple_call_set_cannot_inline (s, true);
+              }
+              break;
+
             default:
               ;
             }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]