OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-dev/] [fsf-gcc-snapshot-1-mar-12/] [or1k-gcc/] [libitm/] [local.cc] - Diff between revs 737 and 783

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 737 Rev 783
/* Copyright (C) 2008, 2009, 2011, 2012 Free Software Foundation, Inc.
/* Copyright (C) 2008, 2009, 2011, 2012 Free Software Foundation, Inc.
   Contributed by Richard Henderson <rth@redhat.com>.
   Contributed by Richard Henderson <rth@redhat.com>.
 
 
   This file is part of the GNU Transactional Memory Library (libitm).
   This file is part of the GNU Transactional Memory Library (libitm).
 
 
   Libitm is free software; you can redistribute it and/or modify it
   Libitm is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by
   under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   Libitm is distributed in the hope that it will be useful, but WITHOUT ANY
   Libitm is distributed in the hope that it will be useful, but WITHOUT ANY
   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   more details.
   more details.
 
 
   Under Section 7 of GPL version 3, you are granted additional
   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.
   3.1, as published by the Free Software Foundation.
 
 
   You should have received a copy of the GNU General Public License and
   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;
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */
   <http://www.gnu.org/licenses/>.  */
 
 
#include "libitm_i.h"
#include "libitm_i.h"
 
 
namespace GTM HIDDEN {
namespace GTM HIDDEN {
 
 
// This function needs to be noinline because we need to prevent that it gets
// This function needs to be noinline because we need to prevent that it gets
// inlined into another function that calls further functions. This could
// inlined into another function that calls further functions. This could
// break our assumption that we only call memcpy and thus only need to
// break our assumption that we only call memcpy and thus only need to
// additionally protect the memcpy stack (see the hack in mask_stack_bottom()).
// additionally protect the memcpy stack (see the hack in mask_stack_bottom()).
// Even if that isn't an issue because those other calls don't happen during
// Even if that isn't an issue because those other calls don't happen during
// copying, we still need mask_stack_bottom() to be called "close" to the
// copying, we still need mask_stack_bottom() to be called "close" to the
// memcpy in terms of stack frames, so just ensure that for now using the
// memcpy in terms of stack frames, so just ensure that for now using the
// noinline.
// noinline.
void __attribute__((noinline))
void __attribute__((noinline))
gtm_undolog::rollback (gtm_thread* tx, size_t until_size)
gtm_undolog::rollback (gtm_thread* tx, size_t until_size)
{
{
  size_t i, n = undolog.size();
  size_t i, n = undolog.size();
  void *top = mask_stack_top(tx);
  void *top = mask_stack_top(tx);
  void *bot = mask_stack_bottom(tx);
  void *bot = mask_stack_bottom(tx);
 
 
  if (n > 0)
  if (n > 0)
    {
    {
      for (i = n; i-- > until_size; )
      for (i = n; i-- > until_size; )
        {
        {
          void *ptr = (void *) undolog[i--];
          void *ptr = (void *) undolog[i--];
          size_t len = undolog[i];
          size_t len = undolog[i];
          size_t words = (len + sizeof(gtm_word) - 1) / sizeof(gtm_word);
          size_t words = (len + sizeof(gtm_word) - 1) / sizeof(gtm_word);
          i -= words;
          i -= words;
          // Filter out any updates that overlap the libitm stack.  We don't
          // Filter out any updates that overlap the libitm stack.  We don't
          // bother filtering out just the overlapping bytes because we don't
          // bother filtering out just the overlapping bytes because we don't
          // merge writes and thus any overlapping write is either bogus or
          // merge writes and thus any overlapping write is either bogus or
          // would restore data on stack frames that are not in use anymore.
          // would restore data on stack frames that are not in use anymore.
          // FIXME The memcpy can/will end up as another call but we
          // FIXME The memcpy can/will end up as another call but we
          // calculated BOT based on the current function.  Can we inline or
          // calculated BOT based on the current function.  Can we inline or
          // reimplement this without too much trouble due to unaligned calls
          // reimplement this without too much trouble due to unaligned calls
          // and still have good performance, so that we can remove the hack
          // and still have good performance, so that we can remove the hack
          // in mask_stack_bottom()?
          // in mask_stack_bottom()?
          if (likely(ptr > top || (uint8_t*)ptr + len <= bot))
          if (likely(ptr > top || (uint8_t*)ptr + len <= bot))
            __builtin_memcpy (ptr, &undolog[i], len);
            __builtin_memcpy (ptr, &undolog[i], len);
        }
        }
      undolog.set_size(until_size);
      undolog.set_size(until_size);
    }
    }
}
}
 
 
void ITM_REGPARM
void ITM_REGPARM
GTM_LB (const void *ptr, size_t len)
GTM_LB (const void *ptr, size_t len)
{
{
  gtm_thread *tx = gtm_thr();
  gtm_thread *tx = gtm_thr();
  tx->undolog.log(ptr, len);
  tx->undolog.log(ptr, len);
}
}
 
 
} // namespace GTM
} // namespace GTM
 
 
using namespace GTM;
using namespace GTM;
 
 
/* ??? Use configure to determine if aliases are supported.  Or convince
/* ??? Use configure to determine if aliases are supported.  Or convince
   the compiler to not just tail call this, but actually generate the
   the compiler to not just tail call this, but actually generate the
   same_body_alias itself.  */
   same_body_alias itself.  */
void ITM_REGPARM
void ITM_REGPARM
_ITM_LB (const void *ptr, size_t len)
_ITM_LB (const void *ptr, size_t len)
{
{
  GTM_LB (ptr, len);
  GTM_LB (ptr, len);
}
}
 
 
#define ITM_LOG_DEF(T) \
#define ITM_LOG_DEF(T) \
void ITM_REGPARM _ITM_L##T (const _ITM_TYPE_##T *ptr) \
void ITM_REGPARM _ITM_L##T (const _ITM_TYPE_##T *ptr) \
{ GTM_LB (ptr, sizeof (*ptr)); }
{ GTM_LB (ptr, sizeof (*ptr)); }
 
 
ITM_LOG_DEF(U1)
ITM_LOG_DEF(U1)
ITM_LOG_DEF(U2)
ITM_LOG_DEF(U2)
ITM_LOG_DEF(U4)
ITM_LOG_DEF(U4)
ITM_LOG_DEF(U8)
ITM_LOG_DEF(U8)
ITM_LOG_DEF(F)
ITM_LOG_DEF(F)
ITM_LOG_DEF(D)
ITM_LOG_DEF(D)
ITM_LOG_DEF(E)
ITM_LOG_DEF(E)
ITM_LOG_DEF(CF)
ITM_LOG_DEF(CF)
ITM_LOG_DEF(CD)
ITM_LOG_DEF(CD)
ITM_LOG_DEF(CE)
ITM_LOG_DEF(CE)
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.