Checked other optimization flags, defenitly this happens befcause of -Oz.
-O0, -O1 - works fine, I even can run Windows 95 that hardly uses
exceptions code 🥳🥳🥳
-Oz, -O2 - not working (assertion "unexpected expression type")

So I need somehow exclude this two functions from optimization and then I
will have optimized code with exceptiosn that works fine with asyncify. How
I can do this?



пт, 27 янв. 2023 г. в 12:30, Александр Гурьянов <caiiiy...@gmail.com>:

> Hi, I trying to add asyncify into project that uses exceptions (dosbox-x).
> I know that asyncify currently does not support exceptions. My idea is
> asyncify only "top level" functions that does not have exceptions code. My
> current asyncify call stack is:
>
> js -> $runJsdos (asyncify) -> $jsdos_main (asyncify) -> $loopNoThrow ->
> $loop -> ...
>
> $loop can throw exception, so  I impelemtned loopNoThrow like this:
>
> int loopThrownNum = -1;
> int loopNoThrow() {
>     try {
>         return (*loop)();
>     } catch (int x) {
>         loopThrownNum = x;
>         return 0;
>     } catch (...) {
>         printf("throwing out loopNoThrow is not supported by asyncify\n");
>         abort();
>     }
> }
>
> I turning the exception into ret val, and the $jsdos_main is last asyncify
> function:
>
> while (true) {
>   sleep(0);
>   int ret = loopNoThrow();
>   // rest logic
> }
>
> To be sure that I don't use exceptions in async function, I mark them as
> noexcept, and compile with -fno-exceptions.
>
> However, at link stage wasm-opt fail on assertion "unexpected expression
> type", because in function $runJsdos there are exception handling code.
>
> The code of $runJsdos before wasm-opt:
>
> (func $runJsdos (param $0 i32) (result i32)
>   (drop
>    (call $jsdos_main\28Config*\29
>     (local.get $0)
>    )
>   )
>   (call $jsdos::destroyAsyncify\28\29)
>   (block $label$1
>    (br_if $label$1
>     (i32.eqz
>      (local.get $0)
>     )
>    )
>    (drop
>     (call $Config::~Config\28\29
>      (local.get $0)
>     )
>    )
>   )
>   (call $operator\20delete\28void*\29
>    (local.get $0)
>   )
>   (unreachable)
>  )
>
> As you can see there is nothing related to exceptions, but AsyncifyFlow
> reports that $runJsdos have following code:
> (try
>  (do
>   (local.set $3
>    (i32.load $0
>     (i32.const 1889704)
>    )
>   )
>   (nop)
>   (local.set $3
>    (call_indirect $0 (type $none_=>_i32)
>     (local.get $3)
>    )
>   )
>  )
>  (catch $tag$0
>   (local.set $0
>    (pop i32)
>   )
>   (nop)
>   (nop)
>   (nop)
>   (global.set $__stack_pointer
>    (local.get $2)
>   )
>   (i32.store $0
>    (i32.const 40043732)
>    (i32.const 1052)
>   )
>   (i32.store $0
>    (i32.const 40043728)
>    (i32.const 0)
>   )
>   (nop)
>   (call $_Unwind_CallPersonality
>    (local.get $0)
>   )
>   (nop)
>   (local.set $1
>    (i32.load $0
>     (i32.const 40043736)
>    )
>   )
>   (nop)
>   (nop)
>   (local.set $0
>    (call $__cxa_begin_catch
>     (local.get $0)
>    )
>   )
>   (nop)
>   (local.set $1
>    (i32.eq
>     (local.get $1)
>     (i32.const 2)
>    )
>   )
>   (if
>    (local.get $1)
>    (block
>     (nop)
>     (local.set $0
>      (i32.load $0
>       (local.get $0)
>      )
>     )
>     (i32.store $0
>      (i32.const 1149424)
>      (local.get $0)
>     )
>     (call $__cxa_end_catch)
>     (unreachable)
>    )
>   )
>   (call $puts
>    (i32.const 5497)
>   )
>   (try $label$938
>    (do
>     (call $abort)
>    )
>    (catch_all
>     (nop)
>     (global.set $__stack_pointer
>      (local.get $2)
>     )
>     (try
>      (do
>       (call $__cxa_end_catch)
>      )
>      (catch_all
>       (nop)
>       (global.set $__stack_pointer
>        (local.get $2)
>       )
>       (call $std::terminate\28\29)
>       (unreachable)
>      )
>     )
>     (rethrow $label$938)
>    )
>   )
>   (unreachable)
>  )
> )
>
> Probably this happens because of some inlining, I compile with -Oz, but I
> am not sure. How I can avoid injection of exception handling code into this
> functions?
>
> Thank you!
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to emscripten-discuss+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVH9DWG4WvMnrddZRJAgbBM-PU5poaoPeN7CopTE0xKi9w%40mail.gmail.com.

Reply via email to