diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 5c68811e3b9722dbee69b4bff822caa3c8ea566f..fca9703309bf9ec0a2e345bbb72a63f34ee7d075 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2009-12-21  Benjamin Kosnik  <bkoz@redhat.com>
+
+	PR libstdc++/42456
+	* src/atomic.cc: Move _GLIBCXX_ASM_SYMVER define within guard.
+	* config/abi/pre/gnu.ver: Add non-volatile exports.
+
 2009-12-21  Benjamin Kosnik  <bkoz@redhat.com>
 
 	* scripts/run_doxygen: Update nested namespace exceptions.
diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver
index cbd0596fa9b2102d969d1513078ecfe0e4644432..2d4b0c3c363161163292fd4c60758995e595796d 100644
--- a/libstdc++-v3/config/abi/pre/gnu.ver
+++ b/libstdc++-v3/config/abi/pre/gnu.ver
@@ -1050,6 +1050,10 @@ GLIBCXX_3.4.13 {
 
 GLIBCXX_3.4.14 {
 
+    # atomic
+    _ZNSt9__atomic011atomic_flag12test_and_setESt12memory_order;
+    _ZNSt9__atomic011atomic_flag5clearESt12memory_order;
+
     # future
     _ZSt15future_category;
     _ZNSt12future_errorD*;
diff --git a/libstdc++-v3/src/atomic.cc b/libstdc++-v3/src/atomic.cc
index bff8fa98c647b2834fc9bb5d04e5563dc7174b38..7ec08c5d7c0ca80f1e3fbe7bf78aa8dbe8aed62f 100644
--- a/libstdc++-v3/src/atomic.cc
+++ b/libstdc++-v3/src/atomic.cc
@@ -78,15 +78,15 @@ namespace std
   {
     bool
     atomic_flag_test_and_set_explicit(__atomic_flag_base* __a,
-				      memory_order __m) throw ()
+				      memory_order __m) throw()
     {
       atomic_flag* d = static_cast<volatile atomic_flag*>(__a);
       return d->test_and_set(__m);
     }
 
     void
-    atomic_flag_clear_explicit(__atomic_flag_base* __a,
-			       memory_order __m) throw ()
+    atomic_flag_clear_explicit(__atomic_flag_base* __a, 
+			       memory_order __m) throw()
     {
       atomic_flag* d = static_cast<volatile atomic_flag*>(__a);
       return d->clear(__m);
@@ -94,14 +94,14 @@ namespace std
 
     void
     __atomic_flag_wait_explicit(__atomic_flag_base* __a,
-				memory_order __x) throw ()
+				memory_order __x) throw()
     {
       while (atomic_flag_test_and_set_explicit(__a, __x))
 	{ };
     }
 
     __atomic_flag_base*
-    __atomic_flag_for_address(const void* __z) throw ()
+    __atomic_flag_for_address(const void* __z) throw()
     {
       uintptr_t __u = reinterpret_cast<uintptr_t>(__z);
       __u += (__u >> 2) + (__u << 4);
@@ -126,12 +126,14 @@ namespace std
 // In the future, GLIBCXX_ABI > 6 should remove all uses of
 // _GLIBCXX_*_SYMVER macros in this file.
 
+#if defined(_GLIBCXX_SYMVER_GNU) && defined(PIC) \
+    && defined(_GLIBCXX_HAVE_AS_SYMVER_DIRECTIVE)
+
 #define _GLIBCXX_ASM_SYMVER(cur, old, version) \
    asm (".symver " #cur "," #old "@@" #version);
 
-#if defined(_GLIBCXX_SYMVER_GNU) && defined(PIC) \
-    && defined(_GLIBCXX_HAVE_AS_SYMVER_DIRECTIVE)
 _GLIBCXX_ASM_SYMVER(_ZNSt9__atomic011atomic_flag5clearESt12memory_order, _ZNVSt9__atomic011atomic_flag5clearESt12memory_order, GLIBCXX_3.4.11)
 
 _GLIBCXX_ASM_SYMVER(_ZNSt9__atomic011atomic_flag12test_and_setESt12memory_order, _ZNVSt9__atomic011atomic_flag12test_and_setESt12memory_order, GLIBCXX_3.4.11)
+
 #endif