Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 80 additions & 30 deletions src/c-writer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,10 @@ class CWriter {
void WriteElemInitializers();
void WriteFuncRefWrappers();
void WriteElemTableInit(bool, const ElemSegment*, const Table*);
bool IsSingleUnsharedDefault32Memory();
bool IsSingleUnsharedMemory();
void WriteLocalMemoryBaseSizeDeclaration();
void RefreshLocalMemorySize();
void InstallSegueBase(Memory* memory, bool save_old_value);
void RestoreSegueBase();
void WriteExports(CWriterPhase);
Expand Down Expand Up @@ -1593,8 +1596,8 @@ void CWriter::WriteSourceTop() {
Write(s_source_includes);
Write(Newline(), "#include \"", header_name_, "\"", Newline());

if (IsSingleUnsharedMemory()) {
Write("#define IS_SINGLE_UNSHARED_MEMORY 1", Newline());
if (IsSingleUnsharedDefault32Memory()) {
Write("#define IS_SINGLE_UNSHARED_DEFAULT32_MEMORY 1", Newline());
}

Write(s_source_declarations, Newline());
Expand Down Expand Up @@ -2599,9 +2602,41 @@ void CWriter::WriteElemTableInit(bool active_initialization,
Write(");", Newline());
}

bool CWriter::IsSingleUnsharedMemory() {
bool CWriter::IsSingleUnsharedDefault32Memory() {
return module_->memories.size() == 1 &&
!module_->memories[0]->page_limits.is_shared;
!module_->memories[0]->page_limits.is_shared &&
module_->memories[0]->page_size == WABT_DEFAULT_PAGE_SIZE &&
!module_->memories[0]->page_limits.is_64;
}

void CWriter::WriteLocalMemoryBaseSizeDeclaration() {
Write("uint8_t* const wasm_rt_local_memory_base = ");
if (IsSingleUnsharedDefault32Memory()) {
const Memory* memory = module_->memories[0];
Write("(", ExternalInstancePtr(ModuleFieldType::Memory, memory->name),
")->data");
} else {
Write("NULL");
}
Write(";", Newline(), "uint64_t wasm_rt_local_memory_size = ");
if (IsSingleUnsharedDefault32Memory()) {
const Memory* memory = module_->memories[0];
Write("(", ExternalInstancePtr(ModuleFieldType::Memory, memory->name),
")->size");
} else {
Write("0");
}
Write(";", Newline(), "(void)wasm_rt_local_memory_base;", Newline(),
"(void)wasm_rt_local_memory_size;", Newline());
}

void CWriter::RefreshLocalMemorySize() {
if (IsSingleUnsharedDefault32Memory()) {
const Memory* memory = module_->memories[0];
Write("wasm_rt_local_memory_size = (",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name),
")->size;", Newline());
}
}

void CWriter::InstallSegueBase(Memory* memory, bool save_old_value) {
Expand Down Expand Up @@ -2703,7 +2738,7 @@ void CWriter::WriteExports(CWriterPhase kind) {
switch (export_->kind) {
case ExternalKind::Func: {
Write(OpenBrace());
if (IsSingleUnsharedMemory()) {
if (IsSingleUnsharedDefault32Memory()) {
InstallSegueBase(module_->memories[0], true /* save_old_value */);
}
auto num_results = func_->GetNumResults();
Expand All @@ -2722,7 +2757,7 @@ void CWriter::WriteExports(CWriterPhase kind) {
Write("instance");
}
WriteParamSymbols(index_to_name);
if (IsSingleUnsharedMemory()) {
if (IsSingleUnsharedDefault32Memory()) {
RestoreSegueBase();
}
if (num_results > 0) {
Expand Down Expand Up @@ -2826,7 +2861,7 @@ void CWriter::WriteInit() {
}
if (!module_->memories.empty()) {
Write("init_memories(instance);", Newline());
if (IsSingleUnsharedMemory()) {
if (IsSingleUnsharedDefault32Memory()) {
InstallSegueBase(module_->memories[0], true /* save_old_value */);
}
}
Expand All @@ -2850,7 +2885,7 @@ void CWriter::WriteInit() {
Write(Newline());
}

if (IsSingleUnsharedMemory()) {
if (IsSingleUnsharedDefault32Memory()) {
RestoreSegueBase();
}
Write(CloseBrace(), Newline());
Expand Down Expand Up @@ -3175,6 +3210,7 @@ void CWriter::Write(const Func& func) {
GlobalName(ModuleFieldType::Func, func.name), "(");
WriteParamsAndLocals();
Write("FUNC_PROLOGUE;", Newline());
WriteLocalMemoryBaseSizeDeclaration();

size_t stack_vars_section = func_sections_.size() - 1;
PushFuncSection();
Expand Down Expand Up @@ -3249,6 +3285,7 @@ void CWriter::WriteTailCallee(const Func& func) {
Write(" ", OpenBrace());
WriteTailCallAsserts(func.decl.sig);
Write(ModuleInstanceTypeName(), "* instance = *instance_ptr;", Newline());
WriteLocalMemoryBaseSizeDeclaration();

std::vector<std::string> index_to_name;
MakeTypeBindingReverseMapping(func.GetNumParamsAndLocals(), func.bindings,
Expand Down Expand Up @@ -3417,6 +3454,7 @@ size_t CWriter::BeginTry(const Block& block) {

void CWriter::WriteTryCatch(const TryExpr& tryexpr) {
const size_t mark = BeginTry(tryexpr.block);
RefreshLocalMemorySize();

/* exception has been thrown -- do we catch it? */

Expand Down Expand Up @@ -3563,6 +3601,7 @@ void CWriter::WriteTryDelegate(const TryExpr& tryexpr) {

void CWriter::Write(const TryTableExpr& try_table_expr) {
const size_t mark = BeginTry(try_table_expr.block);
RefreshLocalMemorySize();

/* exception has been thrown -- do we catch it? */

Expand Down Expand Up @@ -3717,6 +3756,7 @@ void CWriter::Write(const ExprList& exprs) {
Write(StackVar(num_params - i - 1));
}
Write(");", Newline());
RefreshLocalMemorySize();
DropTypes(num_params);
PushTypes(func.decl.sig.result_types);
if (num_results > 1) {
Expand Down Expand Up @@ -3753,9 +3793,10 @@ void CWriter::Write(const ExprList& exprs) {
Write(", ", StackVar(num_params - i));
}
Write(");", Newline());
if (IsSingleUnsharedMemory()) {
if (IsSingleUnsharedDefault32Memory()) {
InstallSegueBase(module_->memories[0], false /* save_old_value */);
}
RefreshLocalMemorySize();
DropTypes(num_params + 1);
PushTypes(decl.sig.result_types);
if (num_results > 1) {
Expand Down Expand Up @@ -4081,9 +4122,10 @@ void CWriter::Write(const ExprList& exprs) {
Write(StackVar(0), " = ", func, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ",
StackVar(0), ");", Newline());
if (IsSingleUnsharedMemory()) {
if (IsSingleUnsharedDefault32Memory()) {
InstallSegueBase(module_->memories[0], false /* save_old_value */);
}
RefreshLocalMemorySize();
break;
}

Expand Down Expand Up @@ -5373,8 +5415,9 @@ void CWriter::Write(const LoadExpr& expr) {
func = GetMemoryAPIString(*memory, func);

Type result_type = expr.opcode.GetResultType();
Write(StackVar(0, result_type), " = ", func, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
Write(StackVar(0, result_type), " = ", func,
"(wasm_rt_local_memory_base, wasm_rt_local_memory_size, ");
Write(ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
WriteMemoryAddress(0, memory, expr.offset);
Write(");", Newline());
DropTypes(1);
Expand Down Expand Up @@ -5404,8 +5447,8 @@ void CWriter::Write(const StoreExpr& expr) {
Memory* memory = module_->memories[module_->GetMemoryIndex(expr.memidx)];
func = GetMemoryAPIString(*memory, func);

Write(func, "(", ExternalInstancePtr(ModuleFieldType::Memory, memory->name),
", ");
Write(func, "(wasm_rt_local_memory_base, wasm_rt_local_memory_size, ");
Write(ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
WriteMemoryAddress(1, memory, expr.offset);
Write(", ", StackVar(0), ");", Newline());
DropTypes(2);
Expand Down Expand Up @@ -5863,8 +5906,9 @@ void CWriter::Write(const SimdLoadLaneExpr& expr) {
// clang-format on
Memory* memory = module_->memories[module_->GetMemoryIndex(expr.memidx)];
Type result_type = expr.opcode.GetResultType();
Write(StackVar(1, result_type), " = ", func, expr.val, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
Write(StackVar(1, result_type), " = ", func, expr.val,
"(wasm_rt_local_memory_base, wasm_rt_local_memory_size, ");
Write(ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
WriteMemoryAddress(1, memory, expr.offset);
Write(", ", StackVar(0));
Write(");", Newline());
Expand All @@ -5887,8 +5931,9 @@ void CWriter::Write(const SimdStoreLaneExpr& expr) {
// clang-format on
Memory* memory = module_->memories[module_->GetMemoryIndex(expr.memidx)];

Write(func, expr.val, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
Write(func, expr.val,
"(wasm_rt_local_memory_base, wasm_rt_local_memory_size, ");
Write(ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
WriteMemoryAddress(1, memory, expr.offset);
Write(", ", StackVar(0));
Write(");", Newline());
Expand Down Expand Up @@ -5930,8 +5975,9 @@ void CWriter::Write(const LoadSplatExpr& expr) {
}
// clang-format on
Type result_type = expr.opcode.GetResultType();
Write(StackVar(0, result_type), " = ", func, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
Write(StackVar(0, result_type), " = ", func,
"(wasm_rt_local_memory_base, wasm_rt_local_memory_size, ");
Write(ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
WriteMemoryAddress(0, memory, expr.offset);
Write(");", Newline());

Expand All @@ -5953,8 +5999,9 @@ void CWriter::Write(const LoadZeroExpr& expr) {
// clang-format on

Type result_type = expr.opcode.GetResultType();
Write(StackVar(0, result_type), " = ", func, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
Write(StackVar(0, result_type), " = ", func,
"(wasm_rt_local_memory_base, wasm_rt_local_memory_size, ");
Write(ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
WriteMemoryAddress(0, memory, expr.offset);
Write(");", Newline());

Expand Down Expand Up @@ -5983,8 +6030,9 @@ void CWriter::Write(const AtomicLoadExpr& expr) {
func = GetMemoryAPIString(*memory, func);

Type result_type = expr.opcode.GetResultType();
Write(StackVar(0, result_type), " = ", func, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
Write(StackVar(0, result_type), " = ", func,
"(wasm_rt_local_memory_base, wasm_rt_local_memory_size, ");
Write(ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
WriteMemoryAddress(0, memory, expr.offset);
Write(");", Newline());
DropTypes(1);
Expand All @@ -6011,8 +6059,8 @@ void CWriter::Write(const AtomicStoreExpr& expr) {
Memory* memory = module_->memories[module_->GetMemoryIndex(expr.memidx)];
func = GetMemoryAPIString(*memory, func);

Write(func, "(", ExternalInstancePtr(ModuleFieldType::Memory, memory->name),
", ");
Write(func, "(wasm_rt_local_memory_base, wasm_rt_local_memory_size, ");
Write(ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
WriteMemoryAddress(1, memory, expr.offset);
Write(", ", StackVar(0), ");", Newline());
DropTypes(2);
Expand Down Expand Up @@ -6074,8 +6122,9 @@ void CWriter::Write(const AtomicRmwExpr& expr) {

Type result_type = expr.opcode.GetResultType();

Write(StackVar(1, result_type), " = ", func, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
Write(StackVar(1, result_type), " = ", func,
"(wasm_rt_local_memory_base, wasm_rt_local_memory_size, ");
Write(ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
WriteMemoryAddress(1, memory, expr.offset);
Write(", ", StackVar(0), ");", Newline());
DropTypes(2);
Expand Down Expand Up @@ -6103,8 +6152,9 @@ void CWriter::Write(const AtomicRmwCmpxchgExpr& expr) {

Type result_type = expr.opcode.GetResultType();

Write(StackVar(2, result_type), " = ", func, "(",
ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
Write(StackVar(2, result_type), " = ", func,
"(wasm_rt_local_memory_base, wasm_rt_local_memory_size, ");
Write(ExternalInstancePtr(ModuleFieldType::Memory, memory->name), ", ");
WriteMemoryAddress(2, memory, expr.offset);
Write(", ", StackVar(1), ", ", StackVar(0), ");", Newline());
DropTypes(3);
Expand Down
Loading
Loading