From a4609a6e7259d536d4b489bd836ec922ba395710 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Wed, 5 Oct 2022 09:41:11 -0400 Subject: [PATCH] feat(WASI): Support itk_wasm_delayed_start Build as a Reactor but add a default export, defined by the empty string, that behaves like _start did before for command line execution via wasmtime. https://docs.rs/wasmtime/0.17.0/src/wasmtime/linker.rs.html#685 --- .../itk-wasm/ITKWebAssemblyInterface.cmake | 10 ++- src/initialization.cxx | 69 ++++++++++++++++++ src/python/itkwasm/itkwasm/pipeline.py | 10 ++- .../test/input/stdout-stderr-test.wasi.wasm | Bin 227585 -> 227575 bytes 4 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 src/initialization.cxx diff --git a/src/docker/itk-wasm/ITKWebAssemblyInterface.cmake b/src/docker/itk-wasm/ITKWebAssemblyInterface.cmake index a2a8adecd..3ec909546 100644 --- a/src/docker/itk-wasm/ITKWebAssemblyInterface.cmake +++ b/src/docker/itk-wasm/ITKWebAssemblyInterface.cmake @@ -55,15 +55,17 @@ function(add_executable target) set_property(TARGET ${wasm_target} PROPERTY LINK_FLAGS_DEBUG " -fno-lto -s SAFE_HEAP=1 -s DISABLE_EXCEPTION_CATCHING=0 --bind ${_link_flags_debug}") set_property(TARGET ${umd_target} PROPERTY LINK_FLAGS_DEBUG " -fno-lto -s SAFE_HEAP=1 -s DISABLE_EXCEPTION_CATCHING=0 --bind ${_link_flags_debug}") else() + # WASI set_property(TARGET ${wasm_target} PROPERTY SUFFIX ".wasi.wasm") - if (NOT TARGET wasi-exception-shim AND DEFINED CMAKE_CXX_COMPILE_OBJECT) - add_library(wasi-exception-shim STATIC /ITKWebAssemblyInterface/src/exceptionShim.cxx) + if (NOT TARGET wasi-itk-extras AND DEFINED CMAKE_CXX_COMPILE_OBJECT) + add_library(wasi-itk-extras STATIC /ITKWebAssemblyInterface/src/exceptionShim.cxx /ITKWebAssemblyInterface/src/initialization.cxx) endif() get_property(_is_imported TARGET ${wasm_target} PROPERTY IMPORTED) if (NOT ${_is_imported}) - _target_link_libraries(${target} PRIVATE $<$:wasi-exception-shim>) + _target_link_libraries(${target} PRIVATE $<$:wasi-itk-extras>) get_property(_link_flags TARGET ${wasm_target} PROPERTY LINK_FLAGS) - set_property(TARGET ${wasm_target} PROPERTY LINK_FLAGS "-Wl,--export-if-defined=main -Wl,--export-if-defined=itk_wasm_input_array_alloc -Wl,--export-if-defined=itk_wasm_input_json_alloc -Wl,--export-if-defined=itk_wasm_output_json_address -Wl,--export-if-defined=itk_wasm_output_json_size -Wl,--export-if-defined=itk_wasm_output_array_address -Wl,--export-if-defined=itk_wasm_output_array_size -Wl,--export-if-defined=itk_wasm_free_all ${_link_flags}") + set_property(TARGET ${wasm_target} PROPERTY LINK_FLAGS + "-mexec-model=reactor -Wl,--export-if-defined=itk_wasm_input_array_alloc -Wl,--export-if-defined=itk_wasm_input_json_alloc -Wl,--export-if-defined=itk_wasm_output_json_address -Wl,--export-if-defined=itk_wasm_output_json_size -Wl,--export-if-defined=itk_wasm_output_array_address -Wl,--export-if-defined=itk_wasm_output_array_size -Wl,--export-if-defined=itk_wasm_free_all -Wl,--export-if-defined=_start -Wl,--export-if-defined=itk_wasm_delayed_start -Wl,--export-if-defined=itk_wasm_delayed_exit ${_link_flags}") if(NOT ITK_WASM_NO_INTERFACE_LINK) if(NOT TARGET WebAssemblyInterface) find_package(ITK QUIET COMPONENTS WebAssemblyInterface) diff --git a/src/initialization.cxx b/src/initialization.cxx new file mode 100644 index 000000000..223a9230d --- /dev/null +++ b/src/initialization.cxx @@ -0,0 +1,69 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +// itk-wasm reactor-like initialization to lower values before _start +// Based on wasi-libc. + + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +#include +extern void __wasm_call_ctors(void); +extern int __main_void(void); +extern void __wasm_call_dtors(void); +extern void _initialize(void); + +__attribute__((export_name("itk_wasm_delayed_exit"))) +void itk_wasm_delayed_exit(int returnCode) +{ + // Call atexit functions, destructors, stdio cleanup, etc. + __wasm_call_dtors(); + + // If main exited successfully, just return, otherwise call + // `__wasi_proc_exit`. + if (returnCode != 0) { + __wasi_proc_exit(returnCode); + } +} + +__attribute__((export_name("itk_wasm_delayed_start"))) +int itk_wasm_delayed_start(void) +{ + // Call `__main_void` which will either be the application's zero-argument + // `__main_void` function or a libc routine which obtains the command-line + // arguments and calls `__main_argv_argc`. + const int r = __main_void(); + + return r; +} + +__attribute__((export_name(""))) +void _start(void) +{ + _initialize(); + + const int returnCode = itk_wasm_delayed_start(); + + itk_wasm_delayed_exit(returnCode); +} + + +#ifdef __cplusplus +} +#endif // __cplusplus diff --git a/src/python/itkwasm/itkwasm/pipeline.py b/src/python/itkwasm/itkwasm/pipeline.py index 2e6485245..ba488036c 100644 --- a/src/python/itkwasm/itkwasm/pipeline.py +++ b/src/python/itkwasm/itkwasm/pipeline.py @@ -33,5 +33,11 @@ def run(self, args: List[str], outputs=[], inputs=[], preopen_directories=[], ma instance = Instance(self.module, import_object) - start = instance.exports._start - start() + _initialize = instance.exports._initialize + _initialize() + + delayed_start = instance.exports.itk_wasm_delayed_start + return_code = delayed_start() + + delayed_exit = instance.exports.itk_wasm_delayed_exit + delayed_exit(return_code) diff --git a/src/python/itkwasm/test/input/stdout-stderr-test.wasi.wasm b/src/python/itkwasm/test/input/stdout-stderr-test.wasi.wasm index 8a26b8649124adf841e413d967b7ae896035c40e..abac5d4ea15081dada98855f542e1387886ac707 100755 GIT binary patch delta 32098 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 delta 31196 zcmdVDcYIVu_dmX8?oHhgZb%_Ln*sz#Afbd_mflrFMFjyXMWtBr5fT&;kUq%Ji&PP$ z1YM*CMMOc0qM#rIumGZfq9Rg$?=yEd1%nUI^ZWeqeC6fdGwsZoGp9|tH-B6xH{zFa zljclbFvDLFLnzsz!`;cz(2aJfe$P`ErRYEY7lGsbj@2n_PG z`~vaM@(YP{`9=8!`2{7Lg8UqzhM(yl;m7}lMB*pNbU1{=5#TTaf&$F23IP==nt@@_ z0RfJHFh5R(May4|n#nOj`1?CT9RiinA~Z&X8fX~nh>I7dUu;~wY+>2=13za# zAqDwA@yHVchYS@C|6Wf$-Dk+tj;p3z=@(Dec_^d^;G zP9A!P*3)~mfi}`++M?kC+D7lw2eh3&q#g7TeN3Ndco*__)2F#qeh*DI_tIXPYpgNj zRvTN5FN`mZdB!wjyfMdk!|1S=));$f9R9ce9W=f&P8ny6pNw

;xaH{%cEPvbA+ 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 V1!ja%;Grv7?|B|7Z%pm?{{e0&D>?uG