summaryrefslogtreecommitdiff
path: root/src/c-writer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/c-writer.cc')
-rw-r--r--src/c-writer.cc60
1 files changed, 41 insertions, 19 deletions
diff --git a/src/c-writer.cc b/src/c-writer.cc
index 0326c886..24bc0057 100644
--- a/src/c-writer.cc
+++ b/src/c-writer.cc
@@ -388,8 +388,8 @@ class CWriter {
void WriteGlobal(const Global&, const std::string&);
void WriteGlobalPtr(const Global&, const std::string&);
void WriteMemories();
- void WriteMemory(const std::string&);
- void WriteMemoryPtr(const std::string&);
+ void WriteMemory(const std::string&, const Memory& memory);
+ void WriteMemoryPtr(const std::string&, const Memory& memory);
void WriteTables();
void WriteTable(const std::string&, const wabt::Type&);
void WriteTablePtr(const std::string&, const Table&);
@@ -1328,6 +1328,15 @@ void CWriter::WriteGetFuncTypeDecl() {
Newline());
}
+static std::string GetMemoryTypeString(const Memory& memory) {
+ return memory.page_limits.is_shared ? "wasm_rt_shared_memory_t"
+ : "wasm_rt_memory_t";
+}
+
+static std::string GetMemoryAPIString(const Memory& memory, std::string api) {
+ return memory.page_limits.is_shared ? (api + "_shared") : api;
+}
+
void CWriter::WriteInitExpr(const ExprList& expr_list) {
if (expr_list.empty()) {
WABT_UNREACHABLE;
@@ -1736,7 +1745,7 @@ void CWriter::BeginInstance() {
}
case ExternalKind::Memory: {
- Write("wasm_rt_memory_t");
+ Write(GetMemoryTypeString(cast<MemoryImport>(import)->memory));
break;
}
@@ -1779,7 +1788,8 @@ void CWriter::BeginInstance() {
case ExternalKind::Memory:
WriteMemory(std::string("*") +
- ExportName(import->module_name, import->field_name));
+ ExportName(import->module_name, import->field_name),
+ cast<MemoryImport>(import)->memory);
break;
case ExternalKind::Table: {
@@ -2027,19 +2037,20 @@ void CWriter::WriteMemories() {
bool is_import = memory_index < module_->num_memory_imports;
if (!is_import) {
WriteMemory(
- DefineInstanceMemberName(ModuleFieldType::Memory, memory->name));
+ DefineInstanceMemberName(ModuleFieldType::Memory, memory->name),
+ *memory);
Write(Newline());
}
++memory_index;
}
}
-void CWriter::WriteMemory(const std::string& name) {
- Write("wasm_rt_memory_t ", name, ";");
+void CWriter::WriteMemory(const std::string& name, const Memory& memory) {
+ Write(GetMemoryTypeString(memory), " ", name, ";");
}
-void CWriter::WriteMemoryPtr(const std::string& name) {
- Write("wasm_rt_memory_t* ", name, "(", ModuleInstanceTypeName(),
+void CWriter::WriteMemoryPtr(const std::string& name, const Memory& memory) {
+ Write(GetMemoryTypeString(memory), "* ", name, "(", ModuleInstanceTypeName(),
"* instance)");
}
@@ -2169,7 +2180,8 @@ void CWriter::WriteDataInitializers() {
max = memory->page_limits.is_64 ? (static_cast<uint64_t>(1) << 48)
: 65536;
}
- Write("wasm_rt_allocate_memory(",
+ std::string func = GetMemoryAPIString(*memory, "wasm_rt_allocate_memory");
+ Write(func, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ",
memory->page_limits.initial, ", ", max, ", ",
memory->page_limits.is_64, ");", Newline());
@@ -2444,7 +2456,7 @@ void CWriter::WriteExports(CWriterPhase kind) {
case ExternalKind::Memory: {
const Memory* memory = module_->GetMemory(export_->var);
internal_name = memory->name;
- WriteMemoryPtr(mangled_name);
+ WriteMemoryPtr(mangled_name, *memory);
break;
}
@@ -2754,7 +2766,8 @@ void CWriter::WriteFree() {
for (const Memory* memory : module_->memories) {
bool is_import = memory_index < module_->num_memory_imports;
if (!is_import) {
- Write("wasm_rt_free_memory(",
+ std::string func = GetMemoryAPIString(*memory, "wasm_rt_free_memory");
+ Write(func, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ");",
Newline());
}
@@ -3706,7 +3719,8 @@ void CWriter::Write(const ExprList& exprs) {
Memory* memory = module_->memories[module_->GetMemoryIndex(
cast<MemoryGrowExpr>(&expr)->memidx)];
- Write(StackVar(0), " = wasm_rt_grow_memory(",
+ std::string func = GetMemoryAPIString(*memory, "wasm_rt_grow_memory");
+ Write(StackVar(0), " = ", func, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ",
StackVar(0), ");", Newline());
break;
@@ -4923,7 +4937,7 @@ void CWriter::Write(const ConvertExpr& expr) {
}
void CWriter::Write(const LoadExpr& expr) {
- const char* func = nullptr;
+ std::string func;
// clang-format off
switch (expr.opcode) {
case Opcode::I32Load: func = "i32_load"; break;
@@ -4954,6 +4968,7 @@ void CWriter::Write(const LoadExpr& expr) {
// clang-format on
Memory* memory = module_->memories[module_->GetMemoryIndex(expr.memidx)];
+ func = GetMemoryAPIString(*memory, func);
Type result_type = expr.opcode.GetResultType();
Write(StackVar(0, result_type), " = ", func, "(",
@@ -4967,7 +4982,7 @@ void CWriter::Write(const LoadExpr& expr) {
}
void CWriter::Write(const StoreExpr& expr) {
- const char* func = nullptr;
+ std::string func;
// clang-format off
switch (expr.opcode) {
case Opcode::I32Store: func = "i32_store"; break;
@@ -4987,6 +5002,7 @@ void CWriter::Write(const StoreExpr& expr) {
// clang-format on
Memory* memory = module_->memories[module_->GetMemoryIndex(expr.memidx)];
+ func = GetMemoryAPIString(*memory, func);
Write(func, "(", ExternalInstancePtr(ModuleFieldType::Memory, memory->name),
", (u64)(", StackVar(1), ")");
@@ -5560,7 +5576,7 @@ void CWriter::Write(const LoadZeroExpr& expr) {
}
void CWriter::Write(const AtomicLoadExpr& expr) {
- const char* func = nullptr;
+ std::string func;
// clang-format off
switch (expr.opcode) {
case Opcode::I32AtomicLoad: func = "i32_atomic_load"; break;
@@ -5577,6 +5593,7 @@ void CWriter::Write(const AtomicLoadExpr& expr) {
// clang-format on
Memory* memory = module_->memories[module_->GetMemoryIndex(expr.memidx)];
+ func = GetMemoryAPIString(*memory, func);
Type result_type = expr.opcode.GetResultType();
Write(StackVar(0, result_type), " = ", func, "(",
@@ -5590,7 +5607,7 @@ void CWriter::Write(const AtomicLoadExpr& expr) {
}
void CWriter::Write(const AtomicStoreExpr& expr) {
- const char* func = nullptr;
+ std::string func;
// clang-format off
switch (expr.opcode) {
case Opcode::I32AtomicStore: func = "i32_atomic_store"; break;
@@ -5607,6 +5624,7 @@ void CWriter::Write(const AtomicStoreExpr& expr) {
// clang-format on
Memory* memory = module_->memories[module_->GetMemoryIndex(expr.memidx)];
+ func = GetMemoryAPIString(*memory, func);
Write(func, "(", ExternalInstancePtr(ModuleFieldType::Memory, memory->name),
", (u64)(", StackVar(1), ")");
@@ -5617,7 +5635,7 @@ void CWriter::Write(const AtomicStoreExpr& expr) {
}
void CWriter::Write(const AtomicRmwExpr& expr) {
- const char* func = nullptr;
+ std::string func;
// clang-format off
switch (expr.opcode) {
case Opcode::I32AtomicRmwAdd: func = "i32_atomic_rmw_add"; break;
@@ -5668,6 +5686,8 @@ void CWriter::Write(const AtomicRmwExpr& expr) {
// clang-format on
Memory* memory = module_->memories[module_->GetMemoryIndex(expr.memidx)];
+ func = GetMemoryAPIString(*memory, func);
+
Type result_type = expr.opcode.GetResultType();
Write(StackVar(1, result_type), " = ", func, "(",
@@ -5681,7 +5701,7 @@ void CWriter::Write(const AtomicRmwExpr& expr) {
}
void CWriter::Write(const AtomicRmwCmpxchgExpr& expr) {
- const char* func = nullptr;
+ std::string func;
// clang-format off
switch(expr.opcode) {
case Opcode::I32AtomicRmwCmpxchg: func = "i32_atomic_rmw_cmpxchg"; break;
@@ -5697,6 +5717,8 @@ void CWriter::Write(const AtomicRmwCmpxchgExpr& expr) {
// clang-format on
Memory* memory = module_->memories[module_->GetMemoryIndex(expr.memidx)];
+ func = GetMemoryAPIString(*memory, func);
+
Type result_type = expr.opcode.GetResultType();
Write(StackVar(2, result_type), " = ", func, "(",