Author: hhinnant
Date: Wed Sep 29 13:13:54 2010
New Revision: 115054

URL: http://llvm.org/viewvc/llvm-project?rev=115054&view=rev
Log:
Wrestling with the slowly dawning realization that <atomic> isn't implementable 
on any compiler at my disposal...

Added:
    libcxx/trunk/test/atomics/atomics.flag/test_and_set.pass.cpp
    libcxx/trunk/test/atomics/atomics.flag/test_and_set.pass.s
    libcxx/trunk/test/atomics/atomics.types/nothing_to_do.pass.cpp
Modified:
    libcxx/trunk/include/__config
    libcxx/trunk/include/atomic

Modified: libcxx/trunk/include/__config
URL: 
http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=115054&r1=115053&r2=115054&view=diff
==============================================================================
--- libcxx/trunk/include/__config (original)
+++ libcxx/trunk/include/__config Wed Sep 29 13:13:54 2010
@@ -114,8 +114,9 @@
 #define _LIBCPP_HAS_NO_ATTRIBUTES
 #endif
 
-#if !(__has_feature(cxx_deleted_functions))
 #define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+
+#if !(__has_feature(cxx_deleted_functions))
 #define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
 #endif  // !(__has_feature(cxx_deleted_functions))
 

Modified: libcxx/trunk/include/atomic
URL: 
http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/atomic?rev=115054&r1=115053&r2=115054&view=diff
==============================================================================
--- libcxx/trunk/include/atomic (original)
+++ libcxx/trunk/include/atomic Wed Sep 29 13:13:54 2010
@@ -2411,6 +2411,7 @@
 */
 
 #include <__config>
+#include <initializer_list>
 
 #pragma GCC system_header
 
@@ -2430,6 +2431,71 @@
     return __y;
 }
 
+// flag type and operations
+
+struct __atomic_flag_init {};
+
+typedef struct atomic_flag
+{
+    bool __flg_;
+
+    bool test_and_set(memory_order __o = memory_order_seq_cst) volatile
+    {
+        switch (__o)
+        {
+        case memory_order_relaxed:
+        case memory_order_consume:
+        case memory_order_acquire:
+            return __sync_lock_test_and_set(&__flg_, true);
+        case memory_order_release:
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+            bool __r = __sync_lock_test_and_set(&__flg_, true);
+            __sync_synchronize();
+            return __r;
+        }
+    }
+
+    bool test_and_set(memory_order __o = memory_order_seq_cst)
+        {return const_cast<volatile atomic_flag*>(this)->test_and_set(__o);}
+    void clear(memory_order = memory_order_seq_cst) volatile;
+    void clear(memory_order = memory_order_seq_cst);
+
+#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+    atomic_flag() = default;
+#else
+    atomic_flag() {};
+#endif
+
+#if 0
+
+#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
+    atomic_flag(const atomic_flag&) = delete;
+    atomic_flag& operator=(const atomic_flag&) = delete;
+    atomic_flag& operator=(const atomic_flag&) volatile = delete;
+#else
+private:
+    atomic_flag(const atomic_flag&);
+    atomic_flag& operator=(const atomic_flag&);
+    atomic_flag& operator=(const atomic_flag&) volatile;
+public:
+#endif
+#else
+    atomic_flag(__atomic_flag_init) : __flg_(false) {}  // temporary
+#endif
+} atomic_flag;
+
+bool atomic_flag_test_and_set(volatile atomic_flag*);
+bool atomic_flag_test_and_set(atomic_flag*);
+bool atomic_flag_test_and_set_explicit(volatile atomic_flag*, memory_order);
+bool atomic_flag_test_and_set_explicit(atomic_flag*, memory_order);
+void atomic_flag_clear(volatile atomic_flag*);
+void atomic_flag_clear(atomic_flag*);
+void atomic_flag_clear_explicit(volatile atomic_flag*, memory_order);
+void atomic_flag_clear_explicit(atomic_flag*, memory_order);
+
+#define ATOMIC_FLAG_INIT _STD::__atomic_flag_init()
+
 _LIBCPP_END_NAMESPACE_STD
 
 #endif  // _LIBCPP_ATOMIC

Added: libcxx/trunk/test/atomics/atomics.flag/test_and_set.pass.cpp
URL: 
http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/atomics/atomics.flag/test_and_set.pass.cpp?rev=115054&view=auto
==============================================================================
--- libcxx/trunk/test/atomics/atomics.flag/test_and_set.pass.cpp (added)
+++ libcxx/trunk/test/atomics/atomics.flag/test_and_set.pass.cpp Wed Sep 29 
13:13:54 2010
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <atomic>
+
+// struct atomic_flag
+
+// bool test_and_set(memory_order = memory_order_seq_cst);
+// bool test_and_set(memory_order = memory_order_seq_cst) volatile;
+
+#include <atomic>
+#include <cassert>
+
+int main()
+{
+    std::atomic_flag f = ATOMIC_FLAG_INIT;
+    assert(f.test_and_set() == 0);
+    assert(f.test_and_set() == 1);
+}

Added: libcxx/trunk/test/atomics/atomics.flag/test_and_set.pass.s
URL: 
http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/atomics/atomics.flag/test_and_set.pass.s?rev=115054&view=auto
==============================================================================
--- libcxx/trunk/test/atomics/atomics.flag/test_and_set.pass.s (added)
+++ libcxx/trunk/test/atomics/atomics.flag/test_and_set.pass.s Wed Sep 29 
13:13:54 2010
@@ -0,0 +1,275 @@
+       .section        __TEXT,__text,regular,pure_instructions
+       .globl  _main
+       .align  4, 0x90
+_main:                                  ## @main
+Leh_func_begin0:
+## BB#0:
+       pushl   %ebp
+Ltmp0:
+       movl    %esp, %ebp
+Ltmp1:
+       pushl   %edi
+       pushl   %esi
+       subl    $48, %esp
+Ltmp2:
+       calll   L0$pb
+L0$pb:
+       popl    %eax
+       leal    -16(%ebp), %ecx
+       movl    $5, %edx
+       movl    $0, -12(%ebp)
+       movl    %ecx, -20(%ebp)         ## 4-byte Spill
+       movb    $0, (%ecx)
+       movl    -20(%ebp), %ecx         ## 4-byte Reload
+       movl    %ecx, (%esp)
+       movl    $5, 4(%esp)
+       movl    %eax, -24(%ebp)         ## 4-byte Spill
+       movl    %edx, -28(%ebp)         ## 4-byte Spill
+       calll   __ZNSt3__111atomic_flag12test_and_setENS_12memory_orderE
+       andb    $1, %al
+       andb    $1, %al
+       movzbl  %al, %ecx
+       cmpl    $0, %ecx
+       sete    %al
+       xorb    $1, %al
+       testb   %al, %al
+       jne     LBB0_1
+       jmp     LBB0_2
+LBB0_1:
+       movl    -24(%ebp), %eax         ## 4-byte Reload
+       leal    L___func__.main-L0$pb(%eax), %ecx
+       leal    L_.str-L0$pb(%eax), %edx
+       movl    $23, %esi
+       leal    L_.str1-L0$pb(%eax), %edi
+       movl    %ecx, (%esp)
+       movl    %edx, 4(%esp)
+       movl    $23, 8(%esp)
+       movl    %edi, 12(%esp)
+       movl    %esi, -32(%ebp)         ## 4-byte Spill
+       calll   ___assert_rtn
+LBB0_2:
+## BB#3:
+       leal    -16(%ebp), %eax
+       movl    %esp, %ecx
+       movl    %eax, (%ecx)
+       movl    $5, 4(%ecx)
+       calll   __ZNSt3__111atomic_flag12test_and_setENS_12memory_orderE
+       andb    $1, %al
+       movzbl  %al, %ecx
+       cmpl    $1, %ecx
+       sete    %al
+       xorb    $1, %al
+       testb   %al, %al
+       jne     LBB0_4
+       jmp     LBB0_5
+LBB0_4:
+       movl    -24(%ebp), %eax         ## 4-byte Reload
+       leal    L___func__.main-L0$pb(%eax), %ecx
+       leal    L_.str-L0$pb(%eax), %edx
+       movl    $24, %esi
+       leal    L_.str2-L0$pb(%eax), %edi
+       movl    %ecx, (%esp)
+       movl    %edx, 4(%esp)
+       movl    $24, 8(%esp)
+       movl    %edi, 12(%esp)
+       movl    %esi, -36(%ebp)         ## 4-byte Spill
+       calll   ___assert_rtn
+LBB0_5:
+## BB#6:
+       movl    -12(%ebp), %eax
+       addl    $48, %esp
+       popl    %esi
+       popl    %edi
+       popl    %ebp
+       ret
+Leh_func_end0:
+
+       .section        __TEXT,__textcoal_nt,coalesced,pure_instructions
+       .globl  __ZNSt3__111atomic_flag12test_and_setENS_12memory_orderE
+       .weak_definition        
__ZNSt3__111atomic_flag12test_and_setENS_12memory_orderE
+       .align  4, 0x90
+__ZNSt3__111atomic_flag12test_and_setENS_12memory_orderE: ## 
@_ZNSt3__111atomic_flag12test_and_setENS_12memory_orderE
+Leh_func_begin1:
+## BB#0:
+       pushl   %ebp
+Ltmp3:
+       movl    %esp, %ebp
+Ltmp4:
+       pushl   %ebx
+       subl    $20, %esp
+Ltmp5:
+       movl    12(%ebp), %eax
+       movl    8(%ebp), %ecx
+       movl    %ecx, -8(%ebp)
+       movl    %eax, -12(%ebp)
+       movl    -8(%ebp), %ecx
+       movl    %esp, %edx
+       movl    %eax, 4(%edx)
+       movl    %ecx, (%edx)
+       calll   __ZNVSt3__111atomic_flag12test_and_setENS_12memory_orderE
+       movb    %al, -13(%ebp)          ## 1-byte Spill
+       movzbl  %al, %eax
+       movb    -13(%ebp), %bl          ## 1-byte Reload
+       movb    %bl, -14(%ebp)          ## 1-byte Spill
+       addl    $20, %esp
+       popl    %ebx
+       popl    %ebp
+       ret
+Leh_func_end1:
+
+       .globl  __ZNVSt3__111atomic_flag12test_and_setENS_12memory_orderE
+       .weak_definition        
__ZNVSt3__111atomic_flag12test_and_setENS_12memory_orderE
+       .align  4, 0x90
+__ZNVSt3__111atomic_flag12test_and_setENS_12memory_orderE: ## 
@_ZNVSt3__111atomic_flag12test_and_setENS_12memory_orderE
+## BB#0:
+       pushl   %ebp
+       movl    %esp, %ebp
+       subl    $32, %esp
+       movl    12(%ebp), %eax
+       movl    8(%ebp), %ecx
+       movl    %ecx, -8(%ebp)
+       movl    %eax, -12(%ebp)
+       movl    -8(%ebp), %ecx
+       leal    -3(%eax), %edx
+       cmpl    $3, %edx
+       movl    %ecx, -20(%ebp)         ## 4-byte Spill
+       movl    %eax, -24(%ebp)         ## 4-byte Spill
+       jb      LBB2_2
+## BB#4:
+       movl    -24(%ebp), %eax         ## 4-byte Reload
+       cmpl    $2, %eax
+       ja      LBB2_3
+## BB#1:
+       movb    $-1, %al
+       movl    -20(%ebp), %ecx         ## 4-byte Reload
+       xchgb   %al, (%ecx)
+       andb    $1, %al
+       movb    %al, -1(%ebp)
+       jmp     LBB2_3
+LBB2_2:
+       movb    $-1, %al
+       movl    -20(%ebp), %ecx         ## 4-byte Reload
+       xchgb   %al, (%ecx)
+       andb    $1, %al
+       movb    %al, -13(%ebp)
+       #MEMBARRIER
+       movb    -13(%ebp), %al
+       andb    $1, %al
+       movb    %al, -1(%ebp)
+LBB2_3:
+       movzbl  -1(%ebp), %eax
+       movl    %eax, -28(%ebp)         ## 4-byte Spill
+       movb    %al, %cl
+       movl    -28(%ebp), %eax         ## 4-byte Reload
+       movb    %cl, -29(%ebp)          ## 1-byte Spill
+       addl    $32, %esp
+       popl    %ebp
+       ret
+
+       .section        __TEXT,__cstring,cstring_literals
+L___func__.main:                        ## @__func__.main
+       .asciz   "main"
+
+       .align  4                       ## @.str
+L_.str:
+       .asciz   "test_and_set.pass.cpp"
+
+       .align  4                       ## @.str1
+L_.str1:
+       .asciz   "f.test_and_set() == 0"
+
+       .align  4                       ## @.str2
+L_.str2:
+       .asciz   "f.test_and_set() == 1"
+
+       .section        
__TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
+EH_frame0:
+Lsection_eh_frame0:
+Leh_frame_common0:
+Lset0 = Leh_frame_common_end0-Leh_frame_common_begin0 ## Length of Common 
Information Entry
+       .long   Lset0
+Leh_frame_common_begin0:
+       .long   0                       ## CIE Identifier Tag
+       .byte   1                       ## DW_CIE_VERSION
+       .asciz   "zR"                   ## CIE Augmentation
+       .byte   1                       ## CIE Code Alignment Factor
+       .byte   124                     ## CIE Data Alignment Factor
+       .byte   8                       ## CIE Return Address Column
+       .byte   1                       ## Augmentation Size
+       .byte   16                      ## FDE Encoding = pcrel
+       .byte   12                      ## DW_CFA_def_cfa
+       .byte   5                       ## Register
+       .byte   4                       ## Offset
+       .byte   136                     ## DW_CFA_offset + Reg (8)
+       .byte   1                       ## Offset
+       .align  2
+Leh_frame_common_end0:
+       .globl  _main.eh
+_main.eh:
+Lset1 = Leh_frame_end0-Leh_frame_begin0 ## Length of Frame Information Entry
+       .long   Lset1
+Leh_frame_begin0:
+Lset2 = Leh_frame_begin0-Leh_frame_common0 ## FDE CIE offset
+       .long   Lset2
+Ltmp6:                                  ## FDE initial location
+       .long   Leh_func_begin0-Ltmp6
+Lset3 = Leh_func_end0-Leh_func_begin0   ## FDE address range
+       .long   Lset3
+       .byte   0                       ## Augmentation size
+       .byte   4                       ## DW_CFA_advance_loc4
+Lset4 = Ltmp0-Leh_func_begin0
+       .long   Lset4
+       .byte   14                      ## DW_CFA_def_cfa_offset
+       .byte   8                       ## Offset
+       .byte   132                     ## DW_CFA_offset + Reg (4)
+       .byte   2                       ## Offset
+       .byte   4                       ## DW_CFA_advance_loc4
+Lset5 = Ltmp1-Ltmp0
+       .long   Lset5
+       .byte   13                      ## DW_CFA_def_cfa_register
+       .byte   4                       ## Register
+       .byte   4                       ## DW_CFA_advance_loc4
+Lset6 = Ltmp2-Ltmp1
+       .long   Lset6
+       .byte   134                     ## DW_CFA_offset + Reg (6)
+       .byte   4                       ## Offset
+       .byte   135                     ## DW_CFA_offset + Reg (7)
+       .byte   3                       ## Offset
+       .align  2
+Leh_frame_end0:
+
+       .globl  __ZNSt3__111atomic_flag12test_and_setENS_12memory_orderE.eh
+       .weak_definition        
__ZNSt3__111atomic_flag12test_and_setENS_12memory_orderE.eh
+__ZNSt3__111atomic_flag12test_and_setENS_12memory_orderE.eh:
+Lset7 = Leh_frame_end1-Leh_frame_begin1 ## Length of Frame Information Entry
+       .long   Lset7
+Leh_frame_begin1:
+Lset8 = Leh_frame_begin1-Leh_frame_common0 ## FDE CIE offset
+       .long   Lset8
+Ltmp7:                                  ## FDE initial location
+       .long   Leh_func_begin1-Ltmp7
+Lset9 = Leh_func_end1-Leh_func_begin1   ## FDE address range
+       .long   Lset9
+       .byte   0                       ## Augmentation size
+       .byte   4                       ## DW_CFA_advance_loc4
+Lset10 = Ltmp3-Leh_func_begin1
+       .long   Lset10
+       .byte   14                      ## DW_CFA_def_cfa_offset
+       .byte   8                       ## Offset
+       .byte   132                     ## DW_CFA_offset + Reg (4)
+       .byte   2                       ## Offset
+       .byte   4                       ## DW_CFA_advance_loc4
+Lset11 = Ltmp4-Ltmp3
+       .long   Lset11
+       .byte   13                      ## DW_CFA_def_cfa_register
+       .byte   4                       ## Register
+       .byte   4                       ## DW_CFA_advance_loc4
+Lset12 = Ltmp5-Ltmp4
+       .long   Lset12
+       .byte   131                     ## DW_CFA_offset + Reg (3)
+       .byte   3                       ## Offset
+       .align  2
+Leh_frame_end1:
+
+
+.subsections_via_symbols

Added: libcxx/trunk/test/atomics/atomics.types/nothing_to_do.pass.cpp
URL: 
http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/atomics/atomics.types/nothing_to_do.pass.cpp?rev=115054&view=auto
==============================================================================
--- libcxx/trunk/test/atomics/atomics.types/nothing_to_do.pass.cpp (added)
+++ libcxx/trunk/test/atomics/atomics.types/nothing_to_do.pass.cpp Wed Sep 29 
13:13:54 2010
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to