mirror of git://gcc.gnu.org/git/gcc.git
libitm: Handle HTM fastpath in status query functions.
* query.cc (_ITM_inTransaction): Abort when using the HTM fastpath. (_ITM_getTransactionId): Same. * config/x86/target.h (htm_transaction_active): New. From-SVN: r200251
This commit is contained in:
parent
b1db457bf9
commit
480c696bb0
|
@ -1,3 +1,9 @@
|
||||||
|
2013-06-20 Torvald Riegel <triegel@redhat.com>
|
||||||
|
|
||||||
|
* query.cc (_ITM_inTransaction): Abort when using the HTM fastpath.
|
||||||
|
(_ITM_getTransactionId): Same.
|
||||||
|
* config/x86/target.h (htm_transaction_active): New.
|
||||||
|
|
||||||
2013-06-20 Torvald Riegel <triegel@redhat.com>
|
2013-06-20 Torvald Riegel <triegel@redhat.com>
|
||||||
|
|
||||||
PR libitm/57643
|
PR libitm/57643
|
||||||
|
|
|
@ -125,6 +125,13 @@ htm_abort_should_retry (uint32_t begin_ret)
|
||||||
{
|
{
|
||||||
return begin_ret & _XABORT_RETRY;
|
return begin_ret & _XABORT_RETRY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns true iff a hardware transaction is currently being executed. */
|
||||||
|
static inline bool
|
||||||
|
htm_transaction_active ()
|
||||||
|
{
|
||||||
|
return _xtest() != 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,15 @@ _ITM_libraryVersion (void)
|
||||||
_ITM_howExecuting ITM_REGPARM
|
_ITM_howExecuting ITM_REGPARM
|
||||||
_ITM_inTransaction (void)
|
_ITM_inTransaction (void)
|
||||||
{
|
{
|
||||||
|
#if defined(USE_HTM_FASTPATH)
|
||||||
|
// If we use the HTM fastpath, we cannot reliably detect whether we are
|
||||||
|
// in a transaction because this function can be called outside of
|
||||||
|
// a transaction and thus we can't deduce this by looking at just the serial
|
||||||
|
// lock. This function isn't used in practice currently, so the easiest
|
||||||
|
// way to handle it is to just abort.
|
||||||
|
if (htm_fastpath && htm_transaction_active())
|
||||||
|
htm_abort();
|
||||||
|
#endif
|
||||||
struct gtm_thread *tx = gtm_thr();
|
struct gtm_thread *tx = gtm_thr();
|
||||||
if (tx && (tx->nesting > 0))
|
if (tx && (tx->nesting > 0))
|
||||||
{
|
{
|
||||||
|
@ -58,6 +67,11 @@ _ITM_inTransaction (void)
|
||||||
_ITM_transactionId_t ITM_REGPARM
|
_ITM_transactionId_t ITM_REGPARM
|
||||||
_ITM_getTransactionId (void)
|
_ITM_getTransactionId (void)
|
||||||
{
|
{
|
||||||
|
#if defined(USE_HTM_FASTPATH)
|
||||||
|
// See ITM_inTransaction.
|
||||||
|
if (htm_fastpath && htm_transaction_active())
|
||||||
|
htm_abort();
|
||||||
|
#endif
|
||||||
struct gtm_thread *tx = gtm_thr();
|
struct gtm_thread *tx = gtm_thr();
|
||||||
return (tx && (tx->nesting > 0)) ? tx->id : _ITM_noTransactionId;
|
return (tx && (tx->nesting > 0)) ? tx->id : _ITM_noTransactionId;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue