/* Copyright (C) 2008-2021 Free Software Foundation, Inc.
   Contributed by Richard Henderson <rth@redhat.com>.

   This file is part of the GNU Transactional Memory Library (libitm).

   Libitm is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   Libitm is distributed in the hope that it will be useful, but WITHOUT ANY
   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

#include "libitm_i.h"

using namespace GTM;

int ITM_REGPARM
_ITM_versionCompatible (int version)
{
  return version == _ITM_VERSION_NO;
}


const char * ITM_REGPARM
_ITM_libraryVersion (void)
{
  return "GNU libitm " _ITM_VERSION;
}


_ITM_howExecuting ITM_REGPARM
_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 (gtm_thread::serial_lock.get_htm_fastpath() && htm_transaction_active())
    htm_abort();
#endif
  struct gtm_thread *tx = gtm_thr();
  if (tx && (tx->nesting > 0))
    {
      if (tx->state & gtm_thread::STATE_IRREVOCABLE)
	return inIrrevocableTransaction;
      else
	return inRetryableTransaction;
    }
  return outsideTransaction;
}


_ITM_transactionId_t ITM_REGPARM
_ITM_getTransactionId (void)
{
#if defined(USE_HTM_FASTPATH)
  // See ITM_inTransaction.
  if (gtm_thread::serial_lock.get_htm_fastpath() && htm_transaction_active())
    htm_abort();
#endif
  struct gtm_thread *tx = gtm_thr();
  return (tx && (tx->nesting > 0)) ? tx->id : _ITM_noTransactionId;
}


void ITM_REGPARM ITM_NORETURN
_ITM_error (const _ITM_srcLocation * loc UNUSED, int errorCode UNUSED)
{
  abort ();
}
