Are you saying LLVM optimizations cause try-catch to appear? That seems odd
to me. Unless it really is simply because of inlining - in that case
[[noinline]] can help.

Otherwise I think try-catch like those, which are really just to call
std::terminate() on an exception, are added by clang in some cases, see
details here:

https://github.com/emscripten-core/emscripten/issues/9185

If nothing else works, the Binaryen pass mentioned there might be modified
to manually remove try-catches perhaps.

On Fri, Jan 27, 2023 at 2:01 AM Александр Гурьянов <caiiiy...@gmail.com>
wrote:

> 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
> <https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVH9DWG4WvMnrddZRJAgbBM-PU5poaoPeN7CopTE0xKi9w%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
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/CAEX4NpRAhQayUD8aPHr7%2BSrpDf1Kzp93717W49i7UXYQEuen3w%40mail.gmail.com.

Reply via email to