Follow-up of Dave's patch with a testcase.
Functions with indirect calls must be transactified (transformed).

Tested on i686.
Ok for trunk?
--
Patrick

2012-05-15  Dave Boutcher  <daveboutc...@gmail.com>
            Patrick Marlier  <patrick.marl...@gmail.com>

        * trans-mem.c (ipa_tm_transform_clone): Transform functions with
        indirect calls.

2012-05-15  Patrick Marlier  <patrick.marl...@gmail.com>

        * gcc.dg/tm/indirect-2.c: New test.


On 05/08/2012 06:40 PM, Dave Boutcher wrote:
  gcc/trans-mem.c |    2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c
index 2badf25..24073fa 100644
--- a/gcc/trans-mem.c
+++ b/gcc/trans-mem.c
@@ -4721,7 +4721,7 @@ ipa_tm_transform_clone (struct cgraph_node *node)
    /* If this function makes no calls and has no irrevocable blocks,
       then there's nothing to do.  */
    /* ??? Remove non-aborting top-level transactions.  */
-  if (!node->callees&&  !d->irrevocable_blocks_clone)
+  if (!node->callees&&  !node->indirect_calls&&  !d->irrevocable_blocks_clone)
      return;

    current_function_decl = d->clone->decl;

Index: testsuite/gcc.dg/tm/indirect-2.c
===================================================================
--- testsuite/gcc.dg/tm/indirect-2.c	(revision 0)
+++ testsuite/gcc.dg/tm/indirect-2.c	(revision 0)
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm" } */
+
+void __attribute__((transaction_safe))
+foo(void);
+
+void __attribute__((transaction_safe))
+set_fn(void)
+{
+  void __attribute__((transaction_safe)) (*fn)(void);
+  fn = foo;
+  fn();
+}
+
+/* { dg-final { scan-assembler "_ITM_getTMCloneSafe" } } */
Index: trans-mem.c
===================================================================
--- trans-mem.c	(revision 187371)
+++ trans-mem.c	(working copy)
@@ -4732,7 +4732,7 @@ ipa_tm_transform_clone (struct cgraph_node *node)
   /* If this function makes no calls and has no irrevocable blocks,
      then there's nothing to do.  */
   /* ??? Remove non-aborting top-level transactions.  */
-  if (!node->callees && !d->irrevocable_blocks_clone)
+  if (!node->callees && !node->indirect_calls && !d->irrevocable_blocks_clone)
     return;
 
   current_function_decl = d->clone->symbol.decl;

Reply via email to