[atomic] Add compiler memory_r_barrier

https://github.com/harfbuzz/harfbuzz/issues/3728
diff --git a/src/hb-atomic.hh b/src/hb-atomic.hh
index e640d1b..b95fe5d 100644
--- a/src/hb-atomic.hh
+++ b/src/hb-atomic.hh
@@ -111,6 +111,13 @@
 #endif
 
 
+/* This we always use std::atomic for; and should never be disabled. */
+#include <atomic>
+#ifndef _hb_compiler_memory_r_barrier
+#define _hb_compiler_memory_r_barrier() std::atomic_signal_fence (std::memory_order_acquire)
+#endif
+
+
 #ifndef _hb_memory_r_barrier
 #define _hb_memory_r_barrier()			_hb_memory_barrier ()
 #endif
diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh
index 8da6b8c..bc43de7 100644
--- a/src/hb-open-type.hh
+++ b/src/hb-open-type.hh
@@ -459,7 +459,7 @@
     unsigned int i = (unsigned int) i_;
     const Type *p = &arrayZ[i];
     if (unlikely (p < arrayZ)) return Null (Type); /* Overflowed. */
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return *p;
   }
   Type& operator [] (int i_)
@@ -467,7 +467,7 @@
     unsigned int i = (unsigned int) i_;
     Type *p = &arrayZ[i];
     if (unlikely (p < arrayZ)) return Crap (Type); /* Overflowed. */
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return *p;
   }
 
@@ -561,7 +561,7 @@
     unsigned int i = (unsigned int) i_;
     const OffsetTo<Type, OffsetType, has_null> *p = &this->arrayZ[i];
     if (unlikely (p < this->arrayZ)) return Null (Type); /* Overflowed. */
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return this+*p;
   }
   Type& operator [] (int i_)
@@ -569,7 +569,7 @@
     unsigned int i = (unsigned int) i_;
     const OffsetTo<Type, OffsetType, has_null> *p = &this->arrayZ[i];
     if (unlikely (p < this->arrayZ)) return Crap (Type); /* Overflowed. */
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return this+*p;
   }
 
@@ -620,14 +620,14 @@
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i >= len)) return Null (Type);
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return arrayZ[i];
   }
   Type& operator [] (int i_)
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i >= len)) return Crap (Type);
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return arrayZ[i];
   }
 
@@ -760,14 +760,14 @@
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i >= this->len)) return Null (Type);
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return this+this->arrayZ[i];
   }
   const Type& operator [] (int i_)
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i >= this->len)) return Crap (Type);
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return this+this->arrayZ[i];
   }
 
@@ -805,14 +805,14 @@
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i >= lenP1 || !i)) return Null (Type);
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return arrayZ[i-1];
   }
   Type& operator [] (int i_)
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i >= lenP1 || !i)) return Crap (Type);
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return arrayZ[i-1];
   }
   unsigned int get_size () const
@@ -891,14 +891,14 @@
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i > lenM1)) return Null (Type);
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return arrayZ[i];
   }
   Type& operator [] (int i_)
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i > lenM1)) return Crap (Type);
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return arrayZ[i];
   }
   unsigned int get_size () const
@@ -1078,14 +1078,14 @@
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i >= get_length ())) return Null (Type);
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return StructAtOffset<Type> (&bytesZ, i * header.unitSize);
   }
   Type& operator [] (int i_)
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i >= get_length ())) return Crap (Type);
-    _hb_memory_r_barrier ();
+    _hb_compiler_memory_r_barrier ();
     return StructAtOffset<Type> (&bytesZ, i * header.unitSize);
   }
   unsigned int get_length () const