On 12/20/11 03:43, Richard Guenther wrote:
On Mon, 19 Dec 2011, Patrick Marlier wrote:
On 12/16/2011 03:54 AM, Richard Guenther wrote:
On Thu, 15 Dec 2011, Patrick Marlier wrote:
In PR51280, LTO does ICE because the object file uses TM builtin but the
TM is
not enabled.
In the patch, it displays a error message if the builtin is not defined
and
due to TM.
I moved is_tm_builtin() from calls.c to trans-mem.c. I splitted it into 2
functions is_tm_builtin/is_tm_builtin_code. In is_tm_builtin_code, I added
some missing builtins (TM_START, TM_GETTMCLONE_SAFE, TM_MALLOC, TM_CALLOC,
TM_FREE). Finally, I declared them into tree.h to be usable in calls.c and
tree-streamer-in.c.
Bootstrapped and LTO/TM regtested on Linux/i686.
(If ok, please commit it. Thanks.)
No - why should this matter? All of TM should be lowered to a point
where only target specific code should be needed.
Richard.
Thanks Richard.
In lto file, there is GIMPLE_TRANSACTION statement and a builtin call
(__builtin_ITM_commitTransaction) to delimit the end of the transaction
region. The transaction is not yet instrumented. So all of TM are not lowered.
I guess this could be also added even if we should always break at the missing
_ITM_commitTransaction builtin declaration.
Index: gimple-streamer-in.c
===================================================================
--- gimple-streamer-in.c (revision 182487)
+++ gimple-streamer-in.c (working copy)
@@ -234,6 +234,9 @@ input_gimple_stmt (struct lto_input_block *ib, str
break;
case GIMPLE_TRANSACTION:
+ if (!flag_tm)
+ error_at (gimple_location (stmt),
+ "use of transactional memory without support enabled");
gimple_transaction_set_label (stmt, stream_read_tree (ib, data_in));
break;
It seems a bit out of my scope of my GCC knowledge so I guess I will let GCC
guys solve this in a proper way.
I'd say we should stream the new IL elements and enable TM at link-time
once we encounter such IL element (similar to how we enable exceptions
when one TU contains EH regions).
Ok, I was finally able to reproduce with the new testcase Patrick
provided. I'm back on the saddle on this one.
Richi, I can certainly do something similar here, but let me see if
we're on the same wavelength before I commit many keystrokes.
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).
We may also have to add a hook to initialize target dependent TM
builtins (for example, ix86_init_tm_builtins on x86).
Is this acceptable or did you have something else in mind?