Fix __clang_call_termiante's argument for foreign exceptions
authorHeejin Ahn <aheejin@gmail.com>
Sun, 11 Aug 2019 06:24:07 +0000 (06:24 +0000)
committerHeejin Ahn <aheejin@gmail.com>
Sun, 11 Aug 2019 06:24:07 +0000 (06:24 +0000)
commit831efe0e0f0ce56b63fb6a07e2cc4844e7c47a34
treee241c11858a0ebaf5337dda6f8a6038b0c038906
parent7e71aa24bc0788690fea7f0d7eab400c6a784deb
Fix __clang_call_termiante's argument for foreign exceptions

Summary:
When exceptions are repeatedly thrown in the middle of handling another
exception, we call `__clang_call_terminate` with the exception pointer
(i32) as an argument. But in case of foreign exceptions, we don't have
the pointer, so we call the function with 0. (This requires
`__clang_call_terminate` can deal with 0 argument, which will be done
later)

But previously the 0 argument was not added as a `i32.const 0` but an
immediate by mistake, causing the `call` instruction to take not an i32
but rather an exnref, because an `exnref` is left on top of the value
stack if `br_on_exn` is not taken.

```
block i32
  br_on_exn 0, __cpp_exception
                               ;; exnref is on top of stack now
  i32.const 0                  ;; This was missing!
  call __clang_call_terminate
  unreachable
end
call __clang_call_terminate    ;; This takes i32 extracted by br_on_exn
```

Reviewers: dschuff

Subscribers: sbc100, jgravelle-google, hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D65475

llvm-svn: 368527
llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp
llvm/test/CodeGen/WebAssembly/exception.ll