diff options
Diffstat (limited to 'src/c-writer.cc')
-rw-r--r-- | src/c-writer.cc | 60 |
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, "(", |