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);