Rollup merge of #131418 - coolreader18:wasm-exc-use-stdarch, r=bjorn3 · qinheping/verify-rust-std@b6c0376 (original) (raw)

`@@ -40,29 +40,25 @@ pub unsafe fn _Unwind_DeleteException(exception: *mut _Unwind_Exception) {

`

40

40

`}

`

41

41

``

42

42

`pub unsafe fn _Unwind_RaiseException(exception: *mut _Unwind_Exception) -> _Unwind_Reason_Code {

`

43

``

`-

#[cfg(panic = "unwind")]

`

44

``

`-

extern "C" {

`

45

``

`` -

/// LLVM lowers this intrinsic to the throw instruction.

``

46

``

`-

// FIXME(coolreader18): move to stdarch

`

47

``

`-

#[link_name = "llvm.wasm.throw"]

`

48

``

`-

fn wasm_throw(tag: i32, ptr: *mut u8) -> !;

`

49

``

`-

}

`

50

``

-

51

43

`` // The wasm throw instruction takes a "tag", which differentiates certain

``

52

44

`// types of exceptions from others. LLVM currently just identifies these

`

53

45

`// via integers, with 0 corresponding to C++ exceptions and 1 to C setjmp()/longjmp().

`

54

46

`// Ideally, we'd be able to choose something unique for Rust, but for now,

`

55

47

`// we pretend to be C++ and implement the Itanium exception-handling ABI.

`

56

48

` cfg_if::cfg_if! {

`

57

``

`-

// for now, unless we're -Zbuild-std with panic=unwind, never codegen a throw.

`

``

49

`+

// panic=abort is default for wasm targets. Because an unknown instruction is a load-time

`

``

50

`+

// error on wasm, instead of a runtime error like on traditional architectures, we never

`

``

51

`` +

// want to codegen a throw instruction, as that would break users using runtimes that

``

``

52

`+

// don't yet support exceptions. The only time this first branch would be selected is if

`

``

53

`+

// the user explicitly opts in to wasm exceptions, via -Zbuild-std with -Cpanic=unwind.

`

58

54

`if #[cfg(panic = "unwind")] {

`

59

``

`-

wasm_throw(0, exception.cast())

`

``

55

`+

// corresponds with llvm::WebAssembly::Tag::CPP_EXCEPTION

`

``

56

`+

// in llvm-project/llvm/include/llvm/CodeGen/WasmEHFuncInfo.h

`

``

57

`+

const CPP_EXCEPTION_TAG: i32 = 0;

`

``

58

`+

core::arch::wasm::throw::(exception.cast())

`

60

59

`} else {

`

61

60

`let _ = exception;

`

62

``

`-

#[cfg(target_arch = "wasm32")]

`

63

``

`-

core::arch::wasm32::unreachable();

`

64

``

`-

#[cfg(target_arch = "wasm64")]

`

65

``

`-

core::arch::wasm64::unreachable();

`

``

61

`+

core::arch::wasm::unreachable()

`

66

62

`}

`

67

63

`}

`

68

64

`}

`