From dfeb079032defa94da5cd2328db9fc072bb5d7a0 Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Thu, 22 Apr 2021 12:56:09 +0300 Subject: [PATCH 1/5] Cleanup --- source/m3_compile.c | 150 ++++++++++++++++++++++---------------------- source/m3_emit.c | 4 +- source/m3_info.c | 20 +++--- 3 files changed, 87 insertions(+), 87 deletions(-) diff --git a/source/m3_compile.c b/source/m3_compile.c index 11b26a8..65879f4 100644 --- a/source/m3_compile.c +++ b/source/m3_compile.c @@ -131,7 +131,7 @@ u8 GetStackTypeFromTop (IM3Compilation o, u16 i_offset) if (o->stackIndex >= i_offset) { u16 index = o->stackIndex - i_offset; - + if (index >= o->stackFirstDynamicIndex) type = o->typeStack [index]; } @@ -208,13 +208,13 @@ u16 GetSlotForStackIndex (IM3Compilation o, u16 i_stackIndex) u16 GetExtraSlotForStackIndex (IM3Compilation o, u16 i_stackIndex) { u16 baseSlot = GetSlotForStackIndex (o, i_stackIndex); - + if (baseSlot != c_slotUnused) { u16 extraSlot = GetTypeNumSlots (GetStackTypeFromBottom (o, i_stackIndex)) - 1; baseSlot += extraSlot; } - + return baseSlot; } @@ -233,9 +233,9 @@ void TouchSlot (IM3Compilation o, u16 i_slot) void MarkSlotAllocated (IM3Compilation o, u16 i_slot) { d_m3Assert (o->m3Slots [i_slot] == 0); // shouldn't be already allocated o->m3Slots [i_slot] = 1; - + o->slotMaxAllocatedIndexPlusOne = M3_MAX (o->slotMaxAllocatedIndexPlusOne, i_slot + 1); - + TouchSlot (o, i_slot); } @@ -723,7 +723,7 @@ void PatchBranches (IM3Compilation o) pc_t patches = o->block.patches; o->block.patches = NULL; - + while (patches) { m3log (compile, "patching location: %p to pc: %p", patches, pc); pc_t next = * (pc_t *) patches; @@ -895,20 +895,20 @@ M3Result GetBlockScope (IM3Compilation o, IM3CompilationScope * o_scope, i32 i M3Result MoveStackSlotsR (IM3Compilation o, u16 i_targetSlotStackIndex, u16 i_stackIndex, u16 i_endStackIndex, u16 i_tempSlot) { M3Result result = m3Err_none; - + if (i_stackIndex < i_endStackIndex) { u16 srcSlot = GetSlotForStackIndex (o, i_stackIndex); - + u8 type = GetStackTypeFromBottom (o, i_stackIndex); u16 numSlots = GetTypeNumSlots (type); u16 extraSlot = numSlots - 1; - + u16 targetSlot = GetSlotForStackIndex (o, i_targetSlotStackIndex); - + u16 preserveIndex = i_stackIndex; u16 collisionSlot = srcSlot; - + if (targetSlot != srcSlot) { // search for collisions @@ -917,7 +917,7 @@ M3Result MoveStackSlotsR (IM3Compilation o, u16 i_targetSlotStackIndex, u16 i_ { u16 otherSlot1 = GetSlotForStackIndex (o, checkIndex); u16 otherSlot2 = GetExtraSlotForStackIndex (o, checkIndex); - + if (targetSlot == otherSlot1 or targetSlot == otherSlot2 or targetSlot + extraSlot == otherSlot1) @@ -932,25 +932,25 @@ _ (CopyStackIndexToSlot (o, i_tempSlot, checkIndex)); // restore this on the way back down preserveIndex = checkIndex; collisionSlot = otherSlot1; - + break; } - + ++checkIndex; } - + _ (CopyStackIndexToSlot (o, targetSlot, i_stackIndex)); m3log (compile, " copying slot: %d to slot: %d", srcSlot, targetSlot); o->wasmStack [i_stackIndex] = targetSlot; } - + _ (MoveStackSlotsR (o, i_targetSlotStackIndex + 1, i_stackIndex + 1, i_endStackIndex, i_tempSlot)); - + // restore the stack state o->wasmStack [i_stackIndex] = srcSlot; o->wasmStack [preserveIndex] = collisionSlot; } - + _catch: return result; } @@ -961,10 +961,10 @@ M3Result ResolveBlockResults (IM3Compilation o, IM3CompilationScope i_targetBl M3Result result = m3Err_none; if (d_m3LogWasmStack) dump_type_stack (o); bool isLoop = (i_targetBlock->opcode == c_waOp_loop and i_isBranch); - + u16 numParams = GetFuncTypeNumParams (i_targetBlock->type); u16 numResults = GetFuncTypeNumResults (i_targetBlock->type); - + u16 slotRecords = i_targetBlock->exitStackIndex; u16 numValues; @@ -975,30 +975,30 @@ M3Result ResolveBlockResults (IM3Compilation o, IM3CompilationScope i_targetBl slotRecords += numParams; } else numValues = numParams; - + u16 blockHeight = GetNumBlockValuesOnStack (o); - + _throwif (m3Err_typeCountMismatch, i_isBranch ? (blockHeight < numValues) : (blockHeight != numValues)); if (numValues) { u16 endIndex = GetStackTopIndex (o) + 1; - + if (not isLoop and IsFpType (GetStackTopType (o))) { _ (CopyStackTopToRegister (o, false)); --endIndex; } - + // TODO: tempslot affects maxStackSlots, so can grow unnecess each time. u16 tempSlot = o->maxStackSlots;// GetMaxUsedSlotPlusOne (o); doesn't work cause can collide with slotRecords AlignSlotToType (& tempSlot, c_m3Type_i64); - + _ (MoveStackSlotsR (o, slotRecords, endIndex - numValues, endIndex, tempSlot)); - + if (d_m3LogWasmStack) dump_type_stack (o); } - + _catch: return result; } @@ -1023,12 +1023,12 @@ M3Result ReturnValues (IM3Compilation o, IM3CompilationScope i_functionBlock, for (u16 i = 0; i < numReturns; ++i) { u8 returnType = GetFuncTypeResultType (i_functionBlock->type, numReturns - 1 - i); - + u8 stackType = GetStackTypeFromTop (o, i); // using FromTop so that only dynamic items are checked - + if (IsStackPolymorphic (o) and stackType == c_m3Type_none) stackType = returnType; - + _throwif (m3Err_typeMismatch, returnType != stackType); if (not IsStackPolymorphic (o)) @@ -1037,7 +1037,7 @@ M3Result ReturnValues (IM3Compilation o, IM3CompilationScope i_functionBlock, _ (CopyStackIndexToSlot (o, returnSlot, stackTop--)); } } - + if (not i_isBranch) { while (numReturns--) @@ -1134,11 +1134,11 @@ M3Result Compile_Return (IM3Compilation o, m3opcode_t i_opcode) { IM3CompilationScope functionScope; _ (GetBlockScope (o, & functionScope, o->block.depth)); - + _ (ReturnValues (o, functionScope, true)); - + _ (EmitOp (o, op_Return)); - + _ (SetStackPolymorphic (o)); } @@ -1152,7 +1152,7 @@ M3Result ValidateBlockEnd (IM3Compilation o) /* u16 numResults = GetFuncTypeNumResults (o->block.type); u16 blockHeight = GetNumBlockValuesOnStack (o); - + if (IsStackPolymorphic (o)) { } @@ -1179,7 +1179,7 @@ M3Result Compile_End (IM3Compilation o, m3opcode_t i_opcode) { _ (ReturnValues (o, & o->block, false)); } - + _ (EmitOp (o, op_Return)); } } @@ -1342,9 +1342,9 @@ _ (GetBlockScope (o, & scope, depth)); _ (EmitOp (o, op)); _ (EmitSlotNumOfStackTopAndPop (o)); - + pc_t * jumpTo = (pc_t *) ReservePointer (o); - + _ (ResolveBlockResults (o, scope, /* isBranch: */ true)); _ (EmitOp (o, op_ContinueLoop)); @@ -1357,11 +1357,11 @@ _ (EmitOp (o, op_ContinueLoop)); // move the condition to a register _ (CopyStackTopToRegister (o, false)); _ (PopType (o, c_m3Type_i32)); - + _ (EmitOp (o, op_ContinueLoopIf)); EmitPointer (o, scope->pc); } - + // dump_type_stack(o); } else // is c_waOp_branch @@ -1374,7 +1374,7 @@ _ (EmitOp (o, op_ContinueLoopIf)); else // forward branch { pc_t * jumpTo = NULL; - + bool isReturn = (scope->depth == 0); bool targetHasResults = GetFuncTypeNumResults (scope->type); @@ -1386,7 +1386,7 @@ _ (EmitOp (o, op_ContinueLoopIf)); _ (EmitOp (o, op)); _ (EmitSlotNumOfStackTopAndPop (o)); // condition - + // this is continuation point, if the branch isn't taken jumpTo = (pc_t *) ReservePointer (o); } @@ -1396,12 +1396,12 @@ _ (EmitOp (o, op_ContinueLoopIf)); _ (EmitOp (o, op)); _ (EmitSlotNumOfStackTopAndPop (o)); // condition - + EmitPatchingBranchPointer (o, scope); goto _catch; } } - + if (not IsStackPolymorphic (o)) { if (isReturn) @@ -1415,12 +1415,12 @@ _ (ResolveBlockResults (o, scope, true)); _ (EmitPatchingBranch (o, scope)); } } - + if (jumpTo) { * jumpTo = GetPC (o); } - + if (i_opcode == c_waOp_branch) _ (SetStackPolymorphic (o)); } @@ -1471,7 +1471,7 @@ _ (AcquireCompilationCodePage (o, & continueOpPage)); o->page = continueOpPage; // TODO: validate stack with target - + if (scope->opcode == c_waOp_loop) { _ (ResolveBlockResults (o, scope, true)); @@ -1552,7 +1552,7 @@ _ (Pop (o)); _ (Push (o, type, topSlot)); MarkSlotsAllocatedByType (o, topSlot, type); - + topSlot += c_ioSlotCount; } @@ -1678,7 +1678,7 @@ static M3Result ReadBlockType (IM3Compilation o, IM3FuncType * o_blockType) { M3Result result; - + i64 type; _ (ReadLebSigned (& type, 33, & o->wasm, o->wasmEnd)); @@ -1756,7 +1756,7 @@ _ (ReadBlockType (o, & blockType)); { u16 slot = GetSlotForStackIndex (o, i); u8 type = GetStackTypeFromBottom (o, i); - + if (IsConstantSlot (o, slot)) { u16 newSlot; @@ -1767,7 +1767,7 @@ _ (CopyStackIndexToSlot (o, newSlot, i)); } } } - + _ (EmitOp (o, op_Loop)); } else @@ -1785,7 +1785,7 @@ M3Result CompileElseBlock (IM3Compilation o, pc_t * o_startPC, IM3FuncType i_b M3Result result; _try { - + IM3CodePage elsePage; _ (AcquireCompilationCodePage (o, & elsePage)); @@ -1811,15 +1811,15 @@ _ (EmitOp (o, op_Branch)); M3Result Compile_If (IM3Compilation o, m3opcode_t i_opcode) { M3Result result; - + /* [ op_If ] [ ] ----> [ ..else.. ] [ ..if.. ] [ ..block.. ] [ ..block.. ] [ op_Branch ] [ end ] <----- [ ] */ - + _try { - + _ (PreserveNonTopRegisters (o)); _ (PreserveArgsAndLocals (o)); @@ -1832,11 +1832,11 @@ _ (EmitSlotNumOfStackTopAndPop (o)); IM3FuncType blockType; _ (ReadBlockType (o, & blockType)); - + // dump_type_stack (o); - + u16 stackIndex = o->stackIndex; - + _ (CompileBlock (o, blockType, i_opcode)); if (o->previousOpcode == c_waOp_else) @@ -2463,13 +2463,13 @@ _catch: M3Result PushBlockResults (IM3Compilation o) { M3Result result = m3Err_none; - + u16 numResults = GetFuncTypeNumResults (o->block.type); for (u16 i = 0; i < numResults; ++i) { u8 type = GetFuncTypeResultType (o->block.type, i); - + if (i == numResults - 1 and IsFpType (type)) { _ (PushRegister (o, type)); @@ -2485,12 +2485,12 @@ _ (PushAllocatedSlot (o, type)); M3Result CommitBlockResults (IM3Compilation o) { M3Result result = m3Err_none; - + // pop the param/result slot records o->stackIndex = o->block.exitStackIndex; - + _ (PushBlockResults (o)); - + _catch: return result; } @@ -2517,7 +2517,7 @@ M3Result CompileBlock (IM3Compilation o, IM3FuncType i_blockType, m3opcode_t i (deallocated) and the stack top is readjusted to keep these records around so that branch instructions can find their result landing pads. Finally, the params are copied from the "dead" records and pushed back onto the stack as active stack items for the CompileBlockStatements () call. - + [ block ] [ params ] ------------------ @@ -2528,14 +2528,14 @@ M3Result CompileBlock (IM3Compilation o, IM3FuncType i_blockType, m3opcode_t i [ records ] <----- exitStackIndex */ - + _try { // validate and dealloc params ---------------------------- - + u16 stackIndex = o->stackIndex; - + u16 numParams = GetFuncTypeNumParams (i_blockType); - + if (i_blockOpcode != c_waOp_else) { for (u16 i = 0; i < numParams; ++i) @@ -2561,9 +2561,9 @@ _ (PopType (o, type)); u16 numResults = GetFuncTypeNumResults (i_blockType); while (numResults--) Pop (o); - + block->blockStackIndex = o->stackIndex = stackIndex; - + // push the params back onto the stack ------------------- for (u16 i = 0; i < numParams; ++i) { @@ -2571,13 +2571,13 @@ _ (PopType (o, type)); u16 slot = GetSlotForStackIndex (o, paramIndex + i); Push (o, type, slot); - + if (slot >= o->slotFirstDynamicIndex) MarkSlotsAllocatedByType (o, slot, type); } //-------------------------------------------------------- - + _ (CompileBlockStatements (o)); _ (ValidateBlockEnd (o)); @@ -2586,7 +2586,7 @@ _ (ValidateBlockEnd (o)); { if (not IsStackPolymorphic (o)) _ (ResolveBlockResults (o, & o->block, /* isBranch: */ false)); - + _ (UnwindBlockStack (o)) if (not ((i_blockOpcode == c_waOp_if and numResults) or o->previousOpcode == c_waOp_else)) @@ -2643,7 +2643,7 @@ M3Result ReserveConstants (IM3Compilation o) numConstantSlots += 1; else if (code == c_waOp_i64_const or code == c_waOp_f64_const) numConstantSlots += GetTypeNumSlots (c_m3Type_i64); - + if (numConstantSlots >= d_m3MaxConstantTableSize) break; } @@ -2667,7 +2667,7 @@ M3Result ReserveConstants (IM3Compilation o) M3Result CompileFunction (IM3Function io_function) { M3Result result = m3Err_none; - + if (!io_function->wasm) return "function body is missing"; IM3FuncType funcType = io_function->funcType; m3log (compile, "compiling: [%d] %s %s; wasm-size: %d", diff --git a/source/m3_emit.c b/source/m3_emit.c index 9c1e9fa..4a96a75 100644 --- a/source/m3_emit.c +++ b/source/m3_emit.c @@ -90,10 +90,10 @@ void EmitSlotOffset (IM3Compilation o, const i32 i_offset) pc_t EmitPointer (IM3Compilation o, const void * const i_pointer) { pc_t ptr = GetPagePC (o->page); - + if (o->page) EmitWord (o->page, i_pointer); - + return ptr; } diff --git a/source/m3_info.c b/source/m3_info.c index 17e27ac..53710db 100644 --- a/source/m3_info.c +++ b/source/m3_info.c @@ -357,17 +357,17 @@ void dump_type_stack (IM3Compilation o) for (u32 p = 1; p <= 2; ++p) { d_m3Log(stack, " "); - + for (u32 i = 0; i < o->stackIndex; ++i) { if (i > 0 and i == o->stackFirstDynamicIndex) printf ("#"); - + if (i == o->block.blockStackIndex) printf (">"); - + const char * type = c_waCompactTypes [o->typeStack [i]]; - + const char * location = ""; i32 slot = o->wasmStack [i]; @@ -394,7 +394,7 @@ void dump_type_stack (IM3Compilation o) } char item [100]; - + if (slot >= 0) sprintf (item, "%s%s%d", type, location, slot); else @@ -403,22 +403,22 @@ void dump_type_stack (IM3Compilation o) if (p == 1) { size_t s = strlen (item); - + sprintf (item, "%d", i); - + while (strlen (item) < s) strcat (item, " "); } - + printf ("|%s ", item); - + } printf ("\n"); } // for (u32 r = 0; r < 2; ++r) // d_m3Assert (regAllocated [r] == 0); // reg allocation & stack out of sync - + u16 maxSlot = GetMaxUsedSlotPlusOne (o); if (maxSlot > o->slotFirstDynamicIndex) From 6d423a8fbad2f217e75e2e73ddecd5627890c77c Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Thu, 22 Apr 2021 13:01:35 +0300 Subject: [PATCH 2/5] Improve wasi_unstable + wasi_snapshot_preview1 compatibility --- source/m3_api_meta_wasi.c | 120 +++++++++++++-- source/m3_api_uvwasi.c | 315 ++++++++++++++++++++++++++++++++++---- 2 files changed, 389 insertions(+), 46 deletions(-) diff --git a/source/m3_api_meta_wasi.c b/source/m3_api_meta_wasi.c index 83d414a..2d4a5ed 100644 --- a/source/m3_api_meta_wasi.c +++ b/source/m3_api_meta_wasi.c @@ -192,15 +192,60 @@ m3ApiRawFunction(m3_wasi_generic_fd_fdstat_set_flags) m3ApiReturn(ret); } -m3ApiRawFunction(m3_wasi_generic_fd_filestat_get) +m3ApiRawFunction(m3_wasi_unstable_fd_filestat_get) { m3ApiReturnType (uint32_t) m3ApiGetArg (__wasi_fd_t , fd) - m3ApiGetArgMem (__wasi_filestat_t * , buff) + m3ApiGetArgMem (uint8_t * , buf) + + m3ApiCheckMem(buf, 56); // wasi_filestat_t + + __wasi_filestat_t stat; - m3ApiCheckMem(buff, sizeof(__wasi_filestat_t)); + __wasi_errno_t ret = __wasi_fd_filestat_get(fd, &stat); - __wasi_errno_t ret = __wasi_fd_filestat_get(fd, buff); + if (ret != __WASI_ERRNO_SUCCESS) { + m3ApiReturn(ret); + } + + memset(buf, 0, 56); + m3ApiWriteMem64(buf+0, stat.st_dev); + m3ApiWriteMem64(buf+8, stat.st_ino); + m3ApiWriteMem8 (buf+16, stat.st_filetype); + m3ApiWriteMem64(buf+20, stat.st_nlink); + m3ApiWriteMem64(buf+24, stat.st_size); + m3ApiWriteMem64(buf+32, stat.st_atim); + m3ApiWriteMem64(buf+40, stat.st_mtim); + m3ApiWriteMem64(buf+48, stat.st_ctim); + + m3ApiReturn(ret); +} + +m3ApiRawFunction(m3_wasi_snapshot_preview1_fd_filestat_get) +{ + m3ApiReturnType (uint32_t) + m3ApiGetArg (__wasi_fd_t , fd) + m3ApiGetArgMem (uint8_t * , buf) + + m3ApiCheckMem(buf, 64); // wasi_filestat_t + + __wasi_filestat_t stat; + + __wasi_errno_t ret = __wasi_fd_filestat_get(fd, &stat); + + if (ret != __WASI_ERRNO_SUCCESS) { + m3ApiReturn(ret); + } + + memset(buf, 0, 64); + m3ApiWriteMem64(buf+0, stat.st_dev); + m3ApiWriteMem64(buf+8, stat.st_ino); + m3ApiWriteMem8 (buf+16, stat.st_filetype); + m3ApiWriteMem64(buf+24, stat.st_nlink); + m3ApiWriteMem64(buf+32, stat.st_size); + m3ApiWriteMem64(buf+40, stat.st_atim); + m3ApiWriteMem64(buf+48, stat.st_mtim); + m3ApiWriteMem64(buf+56, stat.st_ctim); m3ApiReturn(ret); } @@ -362,19 +407,68 @@ m3ApiRawFunction(m3_wasi_generic_path_open) m3ApiReturn(ret); } -m3ApiRawFunction(m3_wasi_generic_path_filestat_get) +m3ApiRawFunction(m3_wasi_unstable_path_filestat_get) +{ + m3ApiReturnType (uint32_t) + m3ApiGetArg (__wasi_fd_t , fd) + m3ApiGetArg (__wasi_lookupflags_t , flags) + m3ApiGetArgMem (const char * , path) + m3ApiGetArg (uint32_t , path_len) + m3ApiGetArgMem (uint8_t * , buf) + + m3ApiCheckMem(path, path_len); + m3ApiCheckMem(buf, 56); // wasi_filestat_t + + __wasi_filestat_t stat; + + __wasi_errno_t ret = __wasi_path_filestat_get(fd, flags, path, path_len, &stat); + + if (ret != __WASI_ERRNO_ESUCCESS) { + m3ApiReturn(ret); + } + + memset(buf, 0, 56); + m3ApiWriteMem64(buf+0, stat.st_dev); + m3ApiWriteMem64(buf+8, stat.st_ino); + m3ApiWriteMem8 (buf+16, stat.st_filetype); + m3ApiWriteMem64(buf+20, stat.st_nlink); + m3ApiWriteMem64(buf+24, stat.st_size); + m3ApiWriteMem64(buf+32, stat.st_atim); + m3ApiWriteMem64(buf+40, stat.st_mtim); + m3ApiWriteMem64(buf+48, stat.st_ctim); + + m3ApiReturn(ret); +} + +m3ApiRawFunction(m3_wasi_snapshot_preview1_path_filestat_get) { m3ApiReturnType (uint32_t) m3ApiGetArg (__wasi_fd_t , fd) m3ApiGetArg (__wasi_lookupflags_t , flags) m3ApiGetArgMem (const char * , path) m3ApiGetArg (uint32_t , path_len) - m3ApiGetArgMem (__wasi_filestat_t * , buf) + m3ApiGetArgMem (uint8_t * , buf) m3ApiCheckMem(path, path_len); - m3ApiCheckMem(buf, sizeof(__wasi_filestat_t)); + m3ApiCheckMem(buf, 64); // wasi_filestat_t + + __wasi_filestat_t stat; + + __wasi_errno_t ret = __wasi_path_filestat_get(fd, flags, path, path_len, &stat); + + if (ret != __WASI_ERRNO_ESUCCESS) { + m3ApiReturn(ret); + } - __wasi_errno_t ret = __wasi_path_filestat_get(fd, flags, path, path_len, buf); + memset(buf, 0, 64); + m3ApiWriteMem64(buf+0, stat.st_dev); + m3ApiWriteMem64(buf+8, stat.st_ino); + m3ApiWriteMem8 (buf+16, stat.st_filetype); + m3ApiWriteMem64(buf+24, stat.st_nlink); + m3ApiWriteMem64(buf+32, stat.st_size); + m3ApiWriteMem64(buf+40, stat.st_atim); + m3ApiWriteMem64(buf+48, stat.st_mtim); + m3ApiWriteMem64(buf+56, stat.st_ctim); m3ApiReturn(ret); } @@ -574,8 +668,12 @@ M3Result m3_LinkWASI (IM3Module module) static const char* namespaces[2] = { "wasi_unstable", "wasi_snapshot_preview1" }; // fd_seek is incompatible -_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_unstable", "fd_seek", "i(iIi*)", &m3_wasi_unstable_fd_seek))); -_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_snapshot_preview1", "fd_seek", "i(iIi*)", &m3_wasi_snapshot_preview1_fd_seek))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_unstable", "fd_seek", "i(iIi*)", &m3_wasi_unstable_fd_seek))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_snapshot_preview1", "fd_seek", "i(iIi*)", &m3_wasi_snapshot_preview1_fd_seek))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_unstable", "fd_filestat_get", "i(i*)", &m3_wasi_unstable_fd_filestat_get))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_snapshot_preview1", "fd_filestat_get", "i(i*)", &m3_wasi_snapshot_preview1_fd_filestat_get))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_unstable", "path_filestat_get", "i(ii*i*)", &m3_wasi_unstable_path_filestat_get))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_snapshot_preview1", "path_filestat_get", "i(ii*i*)", &m3_wasi_snapshot_preview1_path_filestat_get))); for (int i=0; i<2; i++) { @@ -595,7 +693,6 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_datasync", _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_get", "i(i*)", &m3_wasi_generic_fd_fdstat_get))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_flags", "i(ii)", &m3_wasi_generic_fd_fdstat_set_flags))); //_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_rights", "i(iII)", ))); -_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_filestat_get", "i(i*)", &m3_wasi_generic_fd_filestat_get))); //_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_filestat_set_size", "i(iI)", ))); //_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_filestat_set_times","i(iIIi)", ))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_pread", "i(i*iI*)",&m3_wasi_generic_fd_pread))); @@ -610,7 +707,6 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_readdir", _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_write", "i(i*i*)", &m3_wasi_generic_fd_write))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_create_directory", "i(i*i)", &m3_wasi_generic_path_create_directory))); -_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_filestat_get", "i(ii*i*)", &m3_wasi_generic_path_filestat_get))); //_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_filestat_set_times", "i(ii*iIIi)", ))); //_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_link", "i(ii*ii*i)", ))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_open", "i(ii*iiIIi*)", &m3_wasi_generic_path_open))); diff --git a/source/m3_api_uvwasi.c b/source/m3_api_uvwasi.c index a8c72e6..766200e 100644 --- a/source/m3_api_uvwasi.c +++ b/source/m3_api_uvwasi.c @@ -40,6 +40,97 @@ typedef struct wasi_iovec_t * WASI API implementation */ +#if d_m3EnableWasiTracing + +const char* wasi_errno2str(uvwasi_errno_t err) +{ + switch (err) { + case 0: return "ESUCCESS"; + case 1: return "E2BIG"; + case 2: return "EACCES"; + case 3: return "EADDRINUSE"; + case 4: return "EADDRNOTAVAIL"; + case 5: return "EAFNOSUPPORT"; + case 6: return "EAGAIN"; + case 7: return "EALREADY"; + case 8: return "EBADF"; + case 9: return "EBADMSG"; + case 10: return "EBUSY"; + case 11: return "ECANCELED"; + case 12: return "ECHILD"; + case 13: return "ECONNABORTED"; + case 14: return "ECONNREFUSED"; + case 15: return "ECONNRESET"; + case 16: return "EDEADLK"; + case 17: return "EDESTADDRREQ"; + case 18: return "EDOM"; + case 19: return "EDQUOT"; + case 20: return "EEXIST"; + case 21: return "EFAULT"; + case 22: return "EFBIG"; + case 23: return "EHOSTUNREACH"; + case 24: return "EIDRM"; + case 25: return "EILSEQ"; + case 26: return "EINPROGRESS"; + case 27: return "EINTR"; + case 28: return "EINVAL"; + case 29: return "EIO"; + case 30: return "EISCONN"; + case 31: return "EISDIR"; + case 32: return "ELOOP"; + case 33: return "EMFILE"; + case 34: return "EMLINK"; + case 35: return "EMSGSIZE"; + case 36: return "EMULTIHOP"; + case 37: return "ENAMETOOLONG"; + case 38: return "ENETDOWN"; + case 39: return "ENETRESET"; + case 40: return "ENETUNREACH"; + case 41: return "ENFILE"; + case 42: return "ENOBUFS"; + case 43: return "ENODEV"; + case 44: return "ENOENT"; + case 45: return "ENOEXEC"; + case 46: return "ENOLCK"; + case 47: return "ENOLINK"; + case 48: return "ENOMEM"; + case 49: return "ENOMSG"; + case 50: return "ENOPROTOOPT"; + case 51: return "ENOSPC"; + case 52: return "ENOSYS"; + case 53: return "ENOTCONN"; + case 54: return "ENOTDIR"; + case 55: return "ENOTEMPTY"; + case 56: return "ENOTRECOVERABLE"; + case 57: return "ENOTSOCK"; + case 58: return "ENOTSUP"; + case 59: return "ENOTTY"; + case 60: return "ENXIO"; + case 61: return "EOVERFLOW"; + case 62: return "EOWNERDEAD"; + case 63: return "EPERM"; + case 64: return "EPIPE"; + case 65: return "EPROTO"; + case 66: return "EPROTONOSUPPORT"; + case 67: return "EPROTOTYPE"; + case 68: return "ERANGE"; + case 69: return "EROFS"; + case 70: return "ESPIPE"; + case 71: return "ESRCH"; + case 72: return "ESTALE"; + case 73: return "ETIMEDOUT"; + case 74: return "ETXTBSY"; + case 75: return "EXDEV"; + case 76: return "ENOTCAPABLE"; + default: return ""; + } +} + +# define WASI_TRACE(fmt, ...) { fprintf(stderr, "%s " fmt, __FUNCTION__+16, ##__VA_ARGS__); fprintf(stderr, " => %s\n", wasi_errno2str(ret)); } +#else +# define WASI_TRACE(fmt, ...) +#endif + m3ApiRawFunction(m3_wasi_generic_args_get) { m3ApiReturnType (uint32_t) @@ -165,6 +256,8 @@ m3ApiRawFunction(m3_wasi_generic_fd_prestat_dir_name) uvwasi_errno_t ret = uvwasi_fd_prestat_dir_name(&uvwasi, fd, path, path_len); + WASI_TRACE("fd:%d, path:%s", fd, path); + m3ApiReturn(ret); } @@ -174,17 +267,19 @@ m3ApiRawFunction(m3_wasi_generic_fd_prestat_get) m3ApiGetArg (uvwasi_fd_t , fd) m3ApiGetArgMem (uint8_t * , buf) - m3ApiCheckMem(buf, 2*sizeof(uint32_t)); + m3ApiCheckMem(buf, 8); uvwasi_prestat_t prestat; - uvwasi_errno_t ret; - ret = uvwasi_fd_prestat_get(&uvwasi, fd, &prestat); + uvwasi_errno_t ret = uvwasi_fd_prestat_get(&uvwasi, fd, &prestat); + + WASI_TRACE("fd:%d", fd); + if (ret != UVWASI_ESUCCESS) { m3ApiReturn(ret); } - m3ApiWriteMem32(buf, prestat.pr_type); + m3ApiWriteMem32(buf+0, prestat.pr_type); m3ApiWriteMem32(buf+4, prestat.u.dir.pr_name_len); m3ApiReturn(UVWASI_ESUCCESS); } @@ -200,11 +295,14 @@ m3ApiRawFunction(m3_wasi_generic_fd_fdstat_get) uvwasi_fdstat_t stat; uvwasi_errno_t ret = uvwasi_fd_fdstat_get(&uvwasi, fd, &stat); + WASI_TRACE("fd:%d", fd); + if (ret != UVWASI_ESUCCESS) { m3ApiReturn(ret); } - m3ApiWriteMem16(fdstat, stat.fs_filetype); + memset(fdstat, 0, 24); + m3ApiWriteMem8 (fdstat+0, stat.fs_filetype); m3ApiWriteMem16(fdstat+2, stat.fs_flags); m3ApiWriteMem64(fdstat+8, stat.fs_rights_base); m3ApiWriteMem64(fdstat+16, stat.fs_rights_inheriting); @@ -219,22 +317,71 @@ m3ApiRawFunction(m3_wasi_generic_fd_fdstat_set_flags) uvwasi_errno_t ret = uvwasi_fd_fdstat_set_flags(&uvwasi, fd, flags); + WASI_TRACE("fd:%d, flags:0x%x", fd, flags); + m3ApiReturn(ret); } -m3ApiRawFunction(m3_wasi_generic_fd_filestat_get) +m3ApiRawFunction(m3_wasi_unstable_fd_filestat_get) { m3ApiReturnType (uint32_t) m3ApiGetArg (uvwasi_fd_t , fd) - m3ApiGetArgMem (uvwasi_filestat_t * , buff) + m3ApiGetArgMem (uint8_t * , buf) - //TODO: m3ApiCheckMem + m3ApiCheckMem(buf, 56); // wasi_filestat_t - uvwasi_errno_t ret = uvwasi_fd_filestat_get(&uvwasi, fd, buff); + uvwasi_filestat_t stat; - //TODO: m3ApiWriteMem + uvwasi_errno_t ret = uvwasi_fd_filestat_get(&uvwasi, fd, &stat); - m3ApiReturn(ret); + WASI_TRACE("fd:%d | fs.size:%d", fd, stat.st_size); + + if (ret != UVWASI_ESUCCESS) { + m3ApiReturn(ret); + } + + memset(buf, 0, 56); + m3ApiWriteMem64(buf+0, stat.st_dev); + m3ApiWriteMem64(buf+8, stat.st_ino); + m3ApiWriteMem8 (buf+16, stat.st_filetype); + m3ApiWriteMem64(buf+20, stat.st_nlink); + m3ApiWriteMem64(buf+24, stat.st_size); + m3ApiWriteMem64(buf+32, stat.st_atim); + m3ApiWriteMem64(buf+40, stat.st_mtim); + m3ApiWriteMem64(buf+48, stat.st_ctim); + + m3ApiReturn(UVWASI_ESUCCESS); +} + +m3ApiRawFunction(m3_wasi_snapshot_preview1_fd_filestat_get) +{ + m3ApiReturnType (uint32_t) + m3ApiGetArg (uvwasi_fd_t , fd) + m3ApiGetArgMem (uint8_t * , buf) + + m3ApiCheckMem(buf, 64); // wasi_filestat_t + + uvwasi_filestat_t stat; + + uvwasi_errno_t ret = uvwasi_fd_filestat_get(&uvwasi, fd, &stat); + + WASI_TRACE("fd:%d | fs.size:%d", fd, stat.st_size); + + if (ret != UVWASI_ESUCCESS) { + m3ApiReturn(ret); + } + + memset(buf, 0, 64); + m3ApiWriteMem64(buf+0, stat.st_dev); + m3ApiWriteMem64(buf+8, stat.st_ino); + m3ApiWriteMem8 (buf+16, stat.st_filetype); + m3ApiWriteMem64(buf+24, stat.st_nlink); + m3ApiWriteMem64(buf+32, stat.st_size); + m3ApiWriteMem64(buf+40, stat.st_atim); + m3ApiWriteMem64(buf+48, stat.st_mtim); + m3ApiWriteMem64(buf+56, stat.st_ctim); + + m3ApiReturn(UVWASI_ESUCCESS); } m3ApiRawFunction(m3_wasi_unstable_fd_seek) @@ -247,17 +394,19 @@ m3ApiRawFunction(m3_wasi_unstable_fd_seek) m3ApiCheckMem(result, sizeof(uvwasi_filesize_t)); - uvwasi_whence_t whence; + uvwasi_whence_t whence = -1; + const char* whstr = "???"; switch (wasi_whence) { - case 0: whence = UVWASI_WHENCE_CUR; break; - case 1: whence = UVWASI_WHENCE_END; break; - case 2: whence = UVWASI_WHENCE_SET; break; - default: m3ApiReturn(UVWASI_EINVAL); + case 0: whence = UVWASI_WHENCE_CUR; whstr = "CUR"; break; + case 1: whence = UVWASI_WHENCE_END; whstr = "END"; break; + case 2: whence = UVWASI_WHENCE_SET; whstr = "SET"; break; } uvwasi_errno_t ret = uvwasi_fd_seek(&uvwasi, fd, offset, whence, result); + WASI_TRACE("fd:%d, offset:%d, whence:%s | result:%d", fd, offset, whstr, *result); + //TODO: m3ApiWriteMem m3ApiReturn(ret); @@ -273,17 +422,19 @@ m3ApiRawFunction(m3_wasi_snapshot_preview1_fd_seek) m3ApiCheckMem(result, sizeof(uvwasi_filesize_t)); - uvwasi_whence_t whence; + uvwasi_whence_t whence = -1; + const char* whstr = "???"; switch (wasi_whence) { - case 0: whence = UVWASI_WHENCE_SET; break; - case 1: whence = UVWASI_WHENCE_CUR; break; - case 2: whence = UVWASI_WHENCE_END; break; - default: m3ApiReturn(UVWASI_EINVAL); + case 0: whence = UVWASI_WHENCE_SET; whstr = "SET"; break; + case 1: whence = UVWASI_WHENCE_CUR; whstr = "CUR"; break; + case 2: whence = UVWASI_WHENCE_END; whstr = "END"; break; } uvwasi_errno_t ret = uvwasi_fd_seek(&uvwasi, fd, offset, whence, result); + WASI_TRACE("fd:%d, offset:%d, whence:%s | result:%d", fd, offset, whstr, *result); + //TODO: m3ApiWriteMem m3ApiReturn(ret); @@ -300,6 +451,8 @@ m3ApiRawFunction(m3_wasi_generic_path_create_directory) uvwasi_errno_t ret = uvwasi_path_create_directory(&uvwasi, fd, path, path_len); + WASI_TRACE("fd:%d, path:%s", fd, path); + m3ApiReturn(ret); } @@ -321,6 +474,8 @@ m3ApiRawFunction(m3_wasi_generic_path_readlink) uvwasi_errno_t ret = uvwasi_path_readlink(&uvwasi, fd, path, path_len, buf, buf_len, &uvbufused); + WASI_TRACE("fd:%d, path:%s | buf:%s, bufused:%d", fd, path, buf, uvbufused); + m3ApiWriteMem32(bufused, uvbufused); m3ApiReturn(ret); @@ -337,6 +492,8 @@ m3ApiRawFunction(m3_wasi_generic_path_remove_directory) uvwasi_errno_t ret = uvwasi_path_remove_directory(&uvwasi, fd, path, path_len); + WASI_TRACE("fd:%d, path:%s", fd, path); + m3ApiReturn(ret); } @@ -356,6 +513,8 @@ m3ApiRawFunction(m3_wasi_generic_path_rename) uvwasi_errno_t ret = uvwasi_path_rename(&uvwasi, old_fd, old_path, old_path_len, new_fd, new_path, new_path_len); + WASI_TRACE("old_fd:%d, old_path:%s, new_fd:%d, new_path:%s", old_fd, old_path, new_fd, new_path); + m3ApiReturn(ret); } @@ -370,6 +529,8 @@ m3ApiRawFunction(m3_wasi_generic_path_unlink_file) uvwasi_errno_t ret = uvwasi_path_unlink_file(&uvwasi, fd, path, path_len); + WASI_TRACE("fd:%d, path:%s", fd, path); + m3ApiReturn(ret); } @@ -402,28 +563,81 @@ m3ApiRawFunction(m3_wasi_generic_path_open) fs_flags, &uvfd); + WASI_TRACE("dirfd:%d, dirflags:0x%x, path:%s, oflags:0x%x, fs_flags:0x%x | fd:%d", dirfd, dirflags, path, oflags, fs_flags, uvfd); + m3ApiWriteMem32(fd, uvfd); m3ApiReturn(ret); } -m3ApiRawFunction(m3_wasi_generic_path_filestat_get) +m3ApiRawFunction(m3_wasi_unstable_path_filestat_get) { m3ApiReturnType (uint32_t) m3ApiGetArg (uvwasi_fd_t , fd) m3ApiGetArg (uvwasi_lookupflags_t , flags) m3ApiGetArgMem (const char * , path) m3ApiGetArg (uint32_t , path_len) - m3ApiGetArgMem (uvwasi_filestat_t * , buf) + m3ApiGetArgMem (uint8_t * , buf) m3ApiCheckMem(path, path_len); - m3ApiCheckMem(buf, sizeof(uvwasi_filestat_t)); + m3ApiCheckMem(buf, 56); // wasi_filestat_t - uvwasi_errno_t ret = uvwasi_path_filestat_get(&uvwasi, fd, flags, path, path_len, buf); + uvwasi_filestat_t stat; - //TODO: m3ApiWriteMem + uvwasi_errno_t ret = uvwasi_path_filestat_get(&uvwasi, fd, flags, path, path_len, &stat); - m3ApiReturn(ret); + WASI_TRACE("fd:%d, flags:0x%x, path:%s | fs.size:%d", fd, flags, path, stat.st_size); + + if (ret != UVWASI_ESUCCESS) { + m3ApiReturn(ret); + } + + memset(buf, 0, 56); + m3ApiWriteMem64(buf+0, stat.st_dev); + m3ApiWriteMem64(buf+8, stat.st_ino); + m3ApiWriteMem8 (buf+16, stat.st_filetype); + m3ApiWriteMem64(buf+20, stat.st_nlink); + m3ApiWriteMem64(buf+24, stat.st_size); + m3ApiWriteMem64(buf+32, stat.st_atim); + m3ApiWriteMem64(buf+40, stat.st_mtim); + m3ApiWriteMem64(buf+48, stat.st_ctim); + + m3ApiReturn(UVWASI_ESUCCESS); +} + +m3ApiRawFunction(m3_wasi_snapshot_preview1_path_filestat_get) +{ + m3ApiReturnType (uint32_t) + m3ApiGetArg (uvwasi_fd_t , fd) + m3ApiGetArg (uvwasi_lookupflags_t , flags) + m3ApiGetArgMem (const char * , path) + m3ApiGetArg (uint32_t , path_len) + m3ApiGetArgMem (uint8_t * , buf) + + m3ApiCheckMem(path, path_len); + m3ApiCheckMem(buf, 64); // wasi_filestat_t + + uvwasi_filestat_t stat; + + uvwasi_errno_t ret = uvwasi_path_filestat_get(&uvwasi, fd, flags, path, path_len, &stat); + + WASI_TRACE("fd:%d, flags:0x%x, path:%s | fs.size:%d", fd, flags, path, stat.st_size); + + if (ret != UVWASI_ESUCCESS) { + m3ApiReturn(ret); + } + + memset(buf, 0, 64); + m3ApiWriteMem64(buf+0, stat.st_dev); + m3ApiWriteMem64(buf+8, stat.st_ino); + m3ApiWriteMem8 (buf+16, stat.st_filetype); + m3ApiWriteMem64(buf+24, stat.st_nlink); + m3ApiWriteMem64(buf+32, stat.st_size); + m3ApiWriteMem64(buf+40, stat.st_atim); + m3ApiWriteMem64(buf+48, stat.st_mtim); + m3ApiWriteMem64(buf+56, stat.st_ctim); + + m3ApiReturn(UVWASI_ESUCCESS); } m3ApiRawFunction(m3_wasi_generic_fd_pread) @@ -445,15 +659,20 @@ m3ApiRawFunction(m3_wasi_generic_fd_pread) if (iovs_len > 128) m3ApiReturn(UVWASI_EINVAL); uvwasi_ciovec_t iovs[iovs_len]; #endif - uvwasi_size_t num_read; - uvwasi_errno_t ret; for (uvwasi_size_t i = 0; i < iovs_len; ++i) { iovs[i].buf = m3ApiOffsetToPtr(m3ApiReadMem32(&wasi_iovs[i].buf)); iovs[i].buf_len = m3ApiReadMem32(&wasi_iovs[i].buf_len); + + //fprintf(stderr, "> fd_pread fd:%d iov%d.len:%d\n", fd, i, iovs[i].buf_len); } - ret = uvwasi_fd_pread(&uvwasi, fd, (const uvwasi_iovec_t *) iovs, iovs_len, offset, &num_read); + uvwasi_size_t num_read; + + uvwasi_errno_t ret = uvwasi_fd_pread(&uvwasi, fd, (const uvwasi_iovec_t *) iovs, iovs_len, offset, &num_read); + + WASI_TRACE("fd:%d | nread:%d", fd, num_read); + m3ApiWriteMem32(nread, num_read); m3ApiReturn(ret); } @@ -482,9 +701,14 @@ m3ApiRawFunction(m3_wasi_generic_fd_read) for (uvwasi_size_t i = 0; i < iovs_len; ++i) { iovs[i].buf = m3ApiOffsetToPtr(m3ApiReadMem32(&wasi_iovs[i].buf)); iovs[i].buf_len = m3ApiReadMem32(&wasi_iovs[i].buf_len); + + //fprintf(stderr, "> fd_read fd:%d iov%d.len:%d\n", fd, i, iovs[i].buf_len); } ret = uvwasi_fd_read(&uvwasi, fd, (const uvwasi_iovec_t *) iovs, iovs_len, &num_read); + + WASI_TRACE("fd:%d | nread:%d", fd, num_read); + m3ApiWriteMem32(nread, num_read); m3ApiReturn(ret); } @@ -516,6 +740,9 @@ m3ApiRawFunction(m3_wasi_generic_fd_write) } ret = uvwasi_fd_write(&uvwasi, fd, iovs, iovs_len, &num_written); + + WASI_TRACE("fd:%d | nwritten:%d", fd, num_written); + m3ApiWriteMem32(nwritten, num_written); m3ApiReturn(ret); } @@ -535,6 +762,8 @@ m3ApiRawFunction(m3_wasi_generic_fd_readdir) uvwasi_size_t uvbufused; uvwasi_errno_t ret = uvwasi_fd_readdir(&uvwasi, fd, buf, buf_len, cookie, &uvbufused); + WASI_TRACE("fd:%d | bufused:%d", fd, uvbufused); + m3ApiWriteMem32(bufused, uvbufused); m3ApiReturn(ret); @@ -547,6 +776,8 @@ m3ApiRawFunction(m3_wasi_generic_fd_close) uvwasi_errno_t ret = uvwasi_fd_close(&uvwasi, fd); + WASI_TRACE("fd:%d", fd); + m3ApiReturn(ret); } @@ -557,6 +788,8 @@ m3ApiRawFunction(m3_wasi_generic_fd_datasync) uvwasi_errno_t ret = uvwasi_fd_datasync(&uvwasi, fd); + WASI_TRACE("fd:%d", fd); + m3ApiReturn(ret); } @@ -570,6 +803,8 @@ m3ApiRawFunction(m3_wasi_generic_random_get) uvwasi_errno_t ret = uvwasi_random_get(&uvwasi, buf, buf_len); + WASI_TRACE("len:%d", buf_len); + m3ApiReturn(ret); } @@ -583,6 +818,8 @@ m3ApiRawFunction(m3_wasi_generic_clock_res_get) uvwasi_errno_t ret = uvwasi_clock_res_get(&uvwasi, wasi_clk_id, resolution); + WASI_TRACE("clk_id:%d", wasi_clk_id); + //TODO: m3ApiWriteMem64 m3ApiReturn(ret); @@ -599,6 +836,8 @@ m3ApiRawFunction(m3_wasi_generic_clock_time_get) uvwasi_errno_t ret = uvwasi_clock_time_get(&uvwasi, wasi_clk_id, precision, time); + WASI_TRACE("clk_id:%d", wasi_clk_id); + //TODO: m3ApiWriteMem64 m3ApiReturn(ret); @@ -616,8 +855,12 @@ m3ApiRawFunction(m3_wasi_generic_poll_oneoff) m3ApiCheckMem(out, nsubscriptions * sizeof(uvwasi_event_t)); m3ApiCheckMem(nevents, sizeof(uvwasi_size_t)); + // TODO: unstable/snapshot_preview1 compatibility + uvwasi_errno_t ret = uvwasi_poll_oneoff(&uvwasi, in, out, nsubscriptions, nevents); + WASI_TRACE("nsubscriptions:%d | nevents:%d", nsubscriptions, *nevents); + //TODO: m3ApiWriteMem m3ApiReturn(ret); @@ -633,6 +876,8 @@ m3ApiRawFunction(m3_wasi_generic_proc_exit) context->exit_code = code; } + //TODO: fprintf(stderr, "proc_exit code:%d\n", code); + m3ApiTrap(m3Err_trapExit); } @@ -700,8 +945,12 @@ M3Result m3_LinkWASI (IM3Module module) static const char* namespaces[2] = { "wasi_unstable", "wasi_snapshot_preview1" }; // fd_seek is incompatible -_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_unstable", "fd_seek", "i(iIi*)", &m3_wasi_unstable_fd_seek))); -_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_snapshot_preview1", "fd_seek", "i(iIi*)", &m3_wasi_snapshot_preview1_fd_seek))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_unstable", "fd_seek", "i(iIi*)", &m3_wasi_unstable_fd_seek))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_snapshot_preview1", "fd_seek", "i(iIi*)", &m3_wasi_snapshot_preview1_fd_seek))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_unstable", "fd_filestat_get", "i(i*)", &m3_wasi_unstable_fd_filestat_get))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_snapshot_preview1", "fd_filestat_get", "i(i*)", &m3_wasi_snapshot_preview1_fd_filestat_get))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_unstable", "path_filestat_get", "i(ii*i*)", &m3_wasi_unstable_path_filestat_get))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, "wasi_snapshot_preview1", "path_filestat_get", "i(ii*i*)", &m3_wasi_snapshot_preview1_path_filestat_get))); for (int i=0; i<2; i++) { @@ -721,7 +970,6 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_datasync", _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_get", "i(i*)", &m3_wasi_generic_fd_fdstat_get))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_flags", "i(ii)", &m3_wasi_generic_fd_fdstat_set_flags))); //_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_rights", "i(iII)", ))); -_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_filestat_get", "i(i*)", &m3_wasi_generic_fd_filestat_get))); //_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_filestat_set_size", "i(iI)", ))); //_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_filestat_set_times","i(iIIi)", ))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_pread", "i(i*iI*)",&m3_wasi_generic_fd_pread))); @@ -736,7 +984,6 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_readdir", _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_write", "i(i*i*)", &m3_wasi_generic_fd_write))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_create_directory", "i(i*i)", &m3_wasi_generic_path_create_directory))); -_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_filestat_get", "i(ii*i*)", &m3_wasi_generic_path_filestat_get))); //_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_filestat_set_times", "i(ii*iIIi)", ))); //_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_link", "i(ii*ii*i)", ))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_open", "i(ii*iiIIi*)", &m3_wasi_generic_path_open))); From b7d2ff21d1256e4092f30608c0babad34949c262 Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Thu, 22 Apr 2021 13:03:01 +0300 Subject: [PATCH 3/5] Update spec tests to opam-1.1.1, enable Multi-Value tests --- .github/workflows/tests.yml | 12 ++++++++++++ test/run-spec-test.py | 2 +- test/run-wasi-test.py | 12 ++++++++++-- test/wasi/smallpt/smallpt-ex-mv.wasm | Bin 0 -> 66233 bytes 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 test/wasi/smallpt/smallpt-ex-mv.wasm diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 965e983..5b88d05 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -48,6 +48,10 @@ jobs: cmake --build build - name: Test WebAssembly spec run: cd test && python3 run-spec-test.py + - name: Test previous WebAssembly specs + run: | + cd test + python3 run-spec-test.py --spec=v1.1 - name: Test WASI apps run: cd test && python3 run-wasi-test.py @@ -95,6 +99,10 @@ jobs: cmake --build build - name: Test WebAssembly spec run: cd test && python3 run-spec-test.py + - name: Test previous WebAssembly specs + run: | + cd test + python3 run-spec-test.py --spec=v1.1 - name: Test WASI apps run: cd test && python3 run-wasi-test.py @@ -136,6 +144,10 @@ jobs: run: | cd test python run-spec-test.py + - name: Test previous WebAssembly specs + run: | + cd test + python run-spec-test.py --spec=v1.1 - name: Test WASI apps run: | cd test diff --git a/test/run-spec-test.py b/test/run-spec-test.py index 03d6b8f..fdd9e51 100755 --- a/test/run-spec-test.py +++ b/test/run-spec-test.py @@ -49,7 +49,7 @@ from pprint import pprint parser = argparse.ArgumentParser() parser.add_argument("--exec", metavar="", default="../build/wasm3 --repl") -parser.add_argument("--spec", default="v1.1") +parser.add_argument("--spec", default="opam-1.1.1") parser.add_argument("--timeout", type=int, default=30) parser.add_argument("--line", metavar="", type=int) parser.add_argument("--all", action="store_true") diff --git a/test/run-wasi-test.py b/test/run-wasi-test.py index f789e79..9773b1e 100755 --- a/test/run-wasi-test.py +++ b/test/run-wasi-test.py @@ -65,7 +65,11 @@ commands_full = [ "args": ["16", "64"], "expect_sha1": "d85df3561eb15f6f0e6f20d5640e8e1306222c6d" }, { - "skip": True, # TODO + "name": "smallpt (explicit light sampling, multi-value)", + "wasm": "./wasi/smallpt/smallpt-ex-mv.wasm", + "args": ["16", "64"], + "expect_sha1": "d85df3561eb15f6f0e6f20d5640e8e1306222c6d" + }, { "name": "mal", "wasm": "./wasi/mal/mal.wasm", "args": ["./wasi/mal/test-fib.mal", "16"], @@ -127,7 +131,11 @@ commands_fast = [ "args": ["4", "32"], "expect_sha1": "ea05d85998b2f453b588ef76a1256215bf9b851c" }, { - "skip": True, # TODO + "name": "smallpt (explicit light sampling, multi-value)", + "wasm": "./wasi/smallpt/smallpt-ex-mv.wasm", + "args": ["4", "32"], + "expect_sha1": "ea05d85998b2f453b588ef76a1256215bf9b851c" + }, { "name": "mal", "wasm": "./wasi/mal/mal.wasm", "args": ["./wasi/mal/test-fib.mal", "16"], diff --git a/test/wasi/smallpt/smallpt-ex-mv.wasm b/test/wasi/smallpt/smallpt-ex-mv.wasm new file mode 100644 index 0000000000000000000000000000000000000000..1c2de15eb67faa2c56504c34c697e90546e3b037 GIT binary patch literal 66233 zcmd4431C#!^*{cWnam`UkjY9GggYZDiYRV~7@a&s1XrwRU8)ixNEXP-q9U1sbzgA# zwu)Ah;6hz#wSqR7xZ{rdQnhhwT|>0CT9@+we9nDu=7oT0zyJPzzo0Yky?gJuXFunj zci$VMs%5Te7>0STIc$bu%&^GlGOjXvDxE;KefMk{K3y<9M;Y;vJ*o zVqUU3t#I+es+O8lTjo_Yw#;d0J+-m9dO=O~!aXt@n;T}HTD_>I)v&kHWys9>hM9Gz zw${w8KK1nKRwJ;repStKWrG5Wt#a$*bIe(W#p%9vX{x1sqA%g8tt2sF1EnVDIp;h2#?#csPEn03cmYno+5b~eqn z==sTH(um%~&zKRtmETsSG7io$lo7>Q(l8>C6D

xV@Y@(Ym-XQXj6zX!cvler3uS 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 literal 0 HcmV?d00001 From bb8d50e14c1912074994feb30822ab7487d76835 Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Thu, 22 Apr 2021 17:18:07 +0300 Subject: [PATCH 4/5] Tick Multi-value --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 41afb69..4f97654 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ Minimum useful system requirements: **~64Kb** for code and **~10Kb** RAM ☑ Big-Endian systems support ☑ Self-hosting ☑ Gas metering -☐ Multi-value +☑ Multi-value ☐ Reference types ☐ Bulk memory operations ☐ Tail call optimization From 22d02119577e1203839e09e680e934b17655ec64 Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Fri, 23 Apr 2021 01:45:02 +0300 Subject: [PATCH 5/5] WASI test fixes --- source/m3_api_meta_wasi.c | 4 ++-- source/m3_api_uvwasi.c | 32 ++++++++++++++++---------------- source/m3_api_wasi.c | 16 +++++++++------- test/wasi/mal/.gitattributes | 1 + 4 files changed, 28 insertions(+), 25 deletions(-) create mode 100644 test/wasi/mal/.gitattributes diff --git a/source/m3_api_meta_wasi.c b/source/m3_api_meta_wasi.c index 2d4a5ed..be233dd 100644 --- a/source/m3_api_meta_wasi.c +++ b/source/m3_api_meta_wasi.c @@ -423,7 +423,7 @@ m3ApiRawFunction(m3_wasi_unstable_path_filestat_get) __wasi_errno_t ret = __wasi_path_filestat_get(fd, flags, path, path_len, &stat); - if (ret != __WASI_ERRNO_ESUCCESS) { + if (ret != __WASI_ERRNO_SUCCESS) { m3ApiReturn(ret); } @@ -456,7 +456,7 @@ m3ApiRawFunction(m3_wasi_snapshot_preview1_path_filestat_get) __wasi_errno_t ret = __wasi_path_filestat_get(fd, flags, path, path_len, &stat); - if (ret != __WASI_ERRNO_ESUCCESS) { + if (ret != __WASI_ERRNO_SUCCESS) { m3ApiReturn(ret); } diff --git a/source/m3_api_uvwasi.c b/source/m3_api_uvwasi.c index 766200e..86951c0 100644 --- a/source/m3_api_uvwasi.c +++ b/source/m3_api_uvwasi.c @@ -36,10 +36,6 @@ typedef struct wasi_iovec_t uvwasi_size_t buf_len; } wasi_iovec_t; -/* - * WASI API implementation - */ - #if d_m3EnableWasiTracing const char* wasi_errno2str(uvwasi_errno_t err) @@ -131,6 +127,10 @@ const char* wasi_errno2str(uvwasi_errno_t err) # define WASI_TRACE(fmt, ...) #endif +/* + * WASI API implementation + */ + m3ApiRawFunction(m3_wasi_generic_args_get) { m3ApiReturnType (uint32_t) @@ -256,7 +256,7 @@ m3ApiRawFunction(m3_wasi_generic_fd_prestat_dir_name) uvwasi_errno_t ret = uvwasi_fd_prestat_dir_name(&uvwasi, fd, path, path_len); - WASI_TRACE("fd:%d, path:%s", fd, path); + WASI_TRACE("fd:%d, len:%d | path:%s", fd, path_len, path); m3ApiReturn(ret); } @@ -273,7 +273,7 @@ m3ApiRawFunction(m3_wasi_generic_fd_prestat_get) uvwasi_errno_t ret = uvwasi_fd_prestat_get(&uvwasi, fd, &prestat); - WASI_TRACE("fd:%d", fd); + WASI_TRACE("fd:%d | type:%d, name_len:%d", fd, prestat.pr_type, prestat.u.dir.pr_name_len); if (ret != UVWASI_ESUCCESS) { m3ApiReturn(ret); @@ -281,16 +281,16 @@ m3ApiRawFunction(m3_wasi_generic_fd_prestat_get) m3ApiWriteMem32(buf+0, prestat.pr_type); m3ApiWriteMem32(buf+4, prestat.u.dir.pr_name_len); - m3ApiReturn(UVWASI_ESUCCESS); + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_generic_fd_fdstat_get) { m3ApiReturnType (uint32_t) m3ApiGetArg (uvwasi_fd_t , fd) - m3ApiGetArgMem (uint8_t * , fdstat) + m3ApiGetArgMem (uint8_t * , buf) - m3ApiCheckMem(fdstat, 24); + m3ApiCheckMem(buf, 24); uvwasi_fdstat_t stat; uvwasi_errno_t ret = uvwasi_fd_fdstat_get(&uvwasi, fd, &stat); @@ -301,12 +301,12 @@ m3ApiRawFunction(m3_wasi_generic_fd_fdstat_get) m3ApiReturn(ret); } - memset(fdstat, 0, 24); - m3ApiWriteMem8 (fdstat+0, stat.fs_filetype); - m3ApiWriteMem16(fdstat+2, stat.fs_flags); - m3ApiWriteMem64(fdstat+8, stat.fs_rights_base); - m3ApiWriteMem64(fdstat+16, stat.fs_rights_inheriting); - m3ApiReturn(UVWASI_ESUCCESS); + memset(buf, 0, 24); + m3ApiWriteMem8 (buf+0, stat.fs_filetype); + m3ApiWriteMem16(buf+2, stat.fs_flags); + m3ApiWriteMem64(buf+8, stat.fs_rights_base); + m3ApiWriteMem64(buf+16, stat.fs_rights_inheriting); + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_generic_fd_fdstat_set_flags) @@ -919,7 +919,7 @@ M3Result m3_LinkWASI (IM3Module module) uvwasi_preopen_t preopens[PREOPENS_COUNT]; preopens[0].mapped_path = "/"; preopens[0].real_path = "."; - preopens[1].mapped_path = "."; + preopens[1].mapped_path = "./"; preopens[1].real_path = "."; uvwasi_options_t init_options; diff --git a/source/m3_api_wasi.c b/source/m3_api_wasi.c index 413d07e..c5698cc 100644 --- a/source/m3_api_wasi.c +++ b/source/m3_api_wasi.c @@ -83,8 +83,8 @@ Preopen preopen[PREOPEN_CNT] = { { 0, "" , "" }, { 1, "", "" }, { 2, "", "" }, - { -1, "./" , "." }, { -1, "/" , "." }, + { -1, "./" , "." }, }; #if defined(APE) @@ -293,7 +293,7 @@ m3ApiRawFunction(m3_wasi_generic_fd_prestat_dir_name) m3ApiCheckMem(path, path_len); if (fd < 3 || fd >= PREOPEN_CNT) { m3ApiReturn(__WASI_ERRNO_BADF); } - size_t slen = strlen(preopen[fd].path); + size_t slen = strlen(preopen[fd].path) + 1; memcpy(path, preopen[fd].path, M3_MIN(slen, path_len)); m3ApiReturn(__WASI_ERRNO_SUCCESS); } @@ -302,13 +302,14 @@ m3ApiRawFunction(m3_wasi_generic_fd_prestat_get) { m3ApiReturnType (uint32_t) m3ApiGetArg (__wasi_fd_t , fd) - m3ApiGetArgMem (uint32_t * , buf) // TODO: use actual struct + m3ApiGetArgMem (uint8_t * , buf) - m3ApiCheckMem(buf, 2*sizeof(uint32_t)); + m3ApiCheckMem(buf, 8); if (fd < 3 || fd >= PREOPEN_CNT) { m3ApiReturn(__WASI_ERRNO_BADF); } - m3ApiWriteMem32(buf, __WASI_PREOPENTYPE_DIR); - m3ApiWriteMem32(buf+1, strlen(preopen[fd].path)); + + m3ApiWriteMem32(buf+0, __WASI_PREOPENTYPE_DIR); + m3ApiWriteMem32(buf+4, strlen(preopen[fd].path) + 1); m3ApiReturn(__WASI_ERRNO_SUCCESS); } @@ -499,7 +500,8 @@ m3ApiRawFunction(m3_wasi_generic_path_open) int flags = ((oflags & __WASI_OFLAGS_CREAT) ? _O_CREAT : 0) | ((oflags & __WASI_OFLAGS_EXCL) ? _O_EXCL : 0) | ((oflags & __WASI_OFLAGS_TRUNC) ? _O_TRUNC : 0) | - ((fs_flags & __WASI_FDFLAGS_APPEND) ? _O_APPEND : 0); + ((fs_flags & __WASI_FDFLAGS_APPEND) ? _O_APPEND : 0) | + _O_BINARY; if ((fs_rights_base & __WASI_RIGHTS_FD_READ) && (fs_rights_base & __WASI_RIGHTS_FD_WRITE)) { diff --git a/test/wasi/mal/.gitattributes b/test/wasi/mal/.gitattributes new file mode 100644 index 0000000..f1a8064 --- /dev/null +++ b/test/wasi/mal/.gitattributes @@ -0,0 +1 @@ +*.mal binary