Generate safeheap functions for acqrel loads
diff --git a/src/passes/SafeHeap.cpp b/src/passes/SafeHeap.cpp
index ce0737d..6f78ef5 100644
--- a/src/passes/SafeHeap.cpp
+++ b/src/passes/SafeHeap.cpp
@@ -38,19 +38,32 @@
 static const Name ALIGNFAULT_IMPORT("alignfault");
 
 static Name getLoadName(Load* curr) {
-  std::string ret = "SAFE_HEAP_LOAD_";
-  ret += curr->type.toString();
-  ret += "_" + std::to_string(curr->bytes) + "_";
+  std::vector<std::string> parts{curr->type.toString(),
+                                 std::to_string(curr->bytes)};
   if (LoadUtils::isSignRelevant(curr) && !curr->signed_) {
-    ret += "U_";
-  }
-  if (curr->isAtomic()) {
-    ret += "A";
-  } else {
-    ret += std::to_string(curr->align);
+    parts.push_back("U");
   }
 
-  return "SAFE_HEAP_LOAD_" + String::join({}, "_");
+  switch (curr->order) {
+    case MemoryOrder::Unordered: {
+      parts.push_back(std::to_string(curr->align));
+      break;
+    }
+    case MemoryOrder::SeqCst: {
+      parts.push_back("SC");
+      break;
+    }
+    case MemoryOrder::AcqRel: {
+      parts.push_back("AR");
+      break;
+    }
+  }
+
+  return "SAFE_HEAP_LOAD_" +
+         String::join(
+           std::vector<std::string_view>{curr->type.toString(),
+                                         std::to_string(curr->bytes)},
+           "_");
 }
 
 static Name getStoreName(Store* curr) {
@@ -234,10 +247,11 @@
             if (align > bytes) {
               continue;
             }
-            for (auto isAtomic : {true, false}) {
-              load.order =
-                isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered;
-              if (isAtomic &&
+            for (auto memoryOrder : {MemoryOrder::Unordered,
+                                     MemoryOrder::AcqRel,
+                                     MemoryOrder::SeqCst}) {
+              load.order = memoryOrder;
+              if (load.isAtomic() &&
                   !isPossibleAtomicOperation(
                     align, bytes, module->memories[0]->shared, type)) {
                 continue;
diff --git a/src/support/string.h b/src/support/string.h
index aab3a27..4e092cf 100644
--- a/src/support/string.h
+++ b/src/support/string.h
@@ -66,7 +66,7 @@
     return "";
   }
 
-  std::string ret = strs[0];
+  std::string ret = std::string(strs[0]);
   for (std::string_view s : strs) {
     ret.append(sep);
     ret.append(s);