On 01/18/12 03:09, Richard Guenther wrote:
On Tue, 17 Jan 2012, Aldy Hernandez wrote:


What I have in mind is to abstract out the initialization of TM builtins
from
gtm-builtins.def (through its inclusion in builtins.def) into a separate
function that we can call either in c_define_builtins() from the C-ish
front-ends, or from lto_define_builtins (once we encounter a TM builtin
and
enable flag_tm appropriately).

Hm?  They are included in builtins.def, that looks appropriate for
middle-end builtins.  Thus they should be initialized by lto1, too.
Are they not?

Since flag_tm is NULL, when lto_define_builtins runs, the TM builtins do not
get initialized.  This is because DEF_TM_BUILTIN is predicated on flag_tm.

Ok, so arrange that -fgnu-tm is enabled at link-time as soon as it was
enabled in one TU.  You can do that alongside handling of OPT_fPIC, etc.
in lto-wrapper.c:merge_and_complain.

The following patch fixes the problem.

OK?

It isn't until streamer_get_builtin_tree() that we realize the object file has
a TM builtin.

I see.  Probably similar issues exist with -fopenmp and the GOMP
builtins.

It is my understanding that openmp is lowered before LTO streaming, so this isn't a problem for it. I manually tested something similar to the testcase in the patch below (but for openmp) and verified that openmp does not suffer from this problem.

Thanks for the suggestion.
        PR lto/51280
        * lto-wrapper.c (run_gcc): Pass -fgnu_tm on.
        (merge_and_complain): Same.

Index: testsuite/gcc.dg/lto/trans-mem-3_0.c
===================================================================
--- testsuite/gcc.dg/lto/trans-mem-3_0.c        (revision 0)
+++ testsuite/gcc.dg/lto/trans-mem-3_0.c        (revision 0)
@@ -0,0 +1,8 @@
+/* { dg-lto-options {{-flto}} } */
+/* { dg-lto-do link } */
+
+/* Test that we can build one object file with -fgnu-tm
+   (trans-mem-3_1.c), but do the final link of all objects without
+   -fgnu-tm.  */
+
+int i;
Index: testsuite/gcc.dg/lto/trans-mem-3_1.c
===================================================================
--- testsuite/gcc.dg/lto/trans-mem-3_1.c        (revision 0)
+++ testsuite/gcc.dg/lto/trans-mem-3_1.c        (revision 0)
@@ -0,0 +1,18 @@
+/* { dg-options "-fgnu-tm" } */
+
+extern int i;
+
+main()
+{
+  __transaction_atomic { i = 0; }
+}
+
+#define dummy(func)                                                    \
+  __attribute__((noinline,noclone,used)) void func() { asm (""); }
+
+dummy(_ITM_beginTransaction)
+dummy(_ITM_commitTransaction)
+dummy(_ITM_WU4)
+dummy(_ITM_WU8)
+dummy(_ITM_registerTMCloneTable)
+dummy(_ITM_deregisterTMCloneTable)
Index: lto-wrapper.c
===================================================================
--- lto-wrapper.c       (revision 183244)
+++ lto-wrapper.c       (working copy)
@@ -403,6 +403,7 @@ merge_and_complain (struct cl_decoded_op
        case OPT_fpie:
        case OPT_fcommon:
        case OPT_fexceptions:
+       case OPT_fgnu_tm:
          /* Do what the old LTO code did - collect exactly one option
             setting per OPT code, we pick the first we encounter.
             ???  This doesn't make too much sense, but when it doesn't
@@ -555,6 +556,7 @@ run_gcc (unsigned argc, char *argv[])
        case OPT_fpie:
        case OPT_fcommon:
        case OPT_fexceptions:
+       case OPT_fgnu_tm:
          break;
 
        default:

Reply via email to