[llvm-commits] [llvm] r72174 - in /llvm/trunk: include/llvm/System/Atomic.h lib/System/Atomic.cpp

Howard Su howard0su at gmail.com
Wed May 20 17:03:37 PDT 2009


don't inlcude platform dependent header here. please include
"llvm/Support/DataTypes.h" instead.

Also, please update CMakeLists file also to add Atomic.cpp.

On Thu, May 21, 2009 at 2:26 AM, Owen Anderson <resistor at mac.com> wrote:

> Author: resistor
> Date: Wed May 20 13:26:15 2009
> New Revision: 72174
>
> URL: http://llvm.org/viewvc/llvm-project?rev=72174&view=rev
> Log:
> Move atomic operations' definitions out of line.  While this seems kind of
> silly,
> all kinds of problems caused by including windows.h and/or config.h in an
> LLVM header.
>
> Added:
>    llvm/trunk/lib/System/Atomic.cpp
> Modified:
>    llvm/trunk/include/llvm/System/Atomic.h
>
> Modified: llvm/trunk/include/llvm/System/Atomic.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Atomic.h?rev=72174&r1=72173&r2=72174&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/include/llvm/System/Atomic.h (original)
> +++ llvm/trunk/include/llvm/System/Atomic.h Wed May 20 13:26:15 2009
> @@ -14,75 +14,16 @@
>  #ifndef LLVM_SYSTEM_ATOMIC_H
>  #define LLVM_SYSTEM_ATOMIC_H
>
> -#include "llvm/Config/config.h"
> -
> -#if defined(_MSC_VER)
> -#define NOMINMAX
> -#include <windows.h>
> -#endif
> -
> +#include <stdint.h>
>
>  namespace llvm {
>   namespace sys {
> -
> -    inline void MemoryFence() {
> -#if LLVM_MULTITHREADED==0
> -      return;
> -#else
> -#  if defined(__GNUC__)
> -      __sync_synchronize();
> -#  elif defined(_MSC_VER)
> -      MemoryBarrier();
> -#  else
> -#    error No memory fence implementation for your platform!
> -#  endif
> -#endif
> -}
> -
> -#if LLVM_MULTITHREADED==0
> -    typedef unsigned long cas_flag;
> -    template<typename T>
> -    inline T CompareAndSwap(volatile T* dest,
> -                           T exc, T c) {
> -      T result = *dest;
> -      if (result == c)
> -        *dest = exc;
> -      return result;
> -    }
> -#elif defined(__GNUC__)
> -    typedef unsigned long cas_flag;
> -    template<typename T>
> -    inline T CompareAndSwap(volatile T* ptr,
> -                           T new_value,
> -                           T old_value) {
> -      return __sync_val_compare_and_swap(ptr, old_value, new_value);
> -    }
> -#elif defined(_MSC_VER)
> -    typedef LONG cas_flag;
> -    template<typename T>
> -    inline T CompareAndSwap(volatile T* ptr,
> -                           T new_value,
> -                           T old_value) {
> -      if (sizeof(T) == 4)
> -       return InterlockedCompareExchange(ptr, new_value, old_value);
> -      else if (sizeof(T) == 8)
> -       return InterlockedCompareExchange64(ptr, new_value, old_value);
> -      else
> -       assert(0 && "Unsupported compare-and-swap size!");
> -    }
> -
> -    template<typename T>
> -    inline T* CompareAndSwap<T*>(volatile T** ptr,
> -                                T* new_value,
> -                                T* old_value) {
> -      return InterlockedCompareExchangePtr(ptr, new_value, old_value);
> -    }
> -
> -
> -#else
> -#  error No compare-and-swap implementation for your platform!
> -#endif
> +    void MemoryFence();
>
> +    typedef uint32_t cas_flag;
> +    cas_flag CompareAndSwap(volatile cas_flag* ptr,
> +                             cas_flag new_value,
> +                            cas_flag old_value);
>   }
>  }
>
>
> Added: llvm/trunk/lib/System/Atomic.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Atomic.cpp?rev=72174&view=auto
>
>
> ==============================================================================
> --- llvm/trunk/lib/System/Atomic.cpp (added)
> +++ llvm/trunk/lib/System/Atomic.cpp Wed May 20 13:26:15 2009
> @@ -0,0 +1,52 @@
> +//===-- Atomic.cpp - Atomic Operations --------------------------*- C++
> -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +//  This header file implements atomic operations.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/System/Atomic.h"
> +#include "llvm/Config/config.h"
> +
> +using namespace llvm;
> +
> +#if defined(_MSC_VER)
> +#include <windows.h>
> +#endif
> +
> +void sys::MemoryFence() {
> +#if LLVM_MULTITHREADED==0
> +  return;
> +#else
> +#  if defined(__GNUC__)
> +  __sync_synchronize();
> +#  elif defined(_MSC_VER)
> +  MemoryBarrier();
> +#  else
> +# error No memory fence implementation for your platform!
> +#  endif
> +#endif
> +}
> +
> +sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr,
> +                                       sys::cas_flag new_value,
> +                                       sys::cas_flag old_value) {
> +#if LLVM_MULTITHREADED==0
> +  T result = *dest;
> +  if (result == c)
> +    *dest = exc;
> +  return result;
> +#elif defined(__GNUC__)
> +  return __sync_val_compare_and_swap(ptr, old_value, new_value);
> +#elif defined(_MSC_VER)
> +       return InterlockedCompareExchange(ptr, new_value, old_value);
> +#else
> +#  error No compare-and-swap implementation for your platform!
> +#endif
> +}
> \ No newline at end of file
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
-Howard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20090521/fb14577b/attachment.html>


More information about the llvm-commits mailing list