mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
d9006dde10
Summary: This adds support for LSDA (exception table) generation for wasm EH. Wasm EH mostly follows the structure of Itanium-style exception tables, with one exception: a call site table entry in wasm EH corresponds to not a call site but a landing pad. In wasm EH, the VM is responsible for stack unwinding. After an exception occurs and the stack is unwound, the control flow is transferred to wasm 'catch' instruction by the VM, after which the personality function is called from the compiler-generated code. (Refer to WasmEHPrepare pass for more information on this part.) This patch: - Changes wasm.landingpad.index intrinsic to take a token argument, to make this 1:1 match with a catchpad instruction - Stores landingpad index info and catch type info MachineFunction in before instruction selection - Lowers wasm.lsda intrinsic to an MCSymbol pointing to the start of an exception table - Adds WasmException class with overridden methods for table generation - Adds support for LSDA section in Wasm object writer Reviewers: dschuff, sbc100, rnk Subscribers: mgorny, jgravelle-google, sunfish, llvm-commits Differential Revision: https://reviews.llvm.org/D52748 llvm-svn: 345345
128 lines
5.6 KiB
TableGen
128 lines
5.6 KiB
TableGen
//===- IntrinsicsWebAssembly.td - Defines wasm intrinsics --*- tablegen -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// This file defines all of the WebAssembly-specific intrinsics.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
let TargetPrefix = "wasm" in { // All intrinsics start with "llvm.wasm.".
|
|
|
|
// Query the current memory size, and increase the current memory size.
|
|
// Note that memory.size is not IntrNoMem because it must be sequenced with
|
|
// respect to memory.grow calls.
|
|
def int_wasm_memory_size : Intrinsic<[llvm_anyint_ty],
|
|
[llvm_i32_ty],
|
|
[IntrReadMem]>;
|
|
def int_wasm_memory_grow : Intrinsic<[llvm_anyint_ty],
|
|
[llvm_i32_ty, LLVMMatchType<0>],
|
|
[]>;
|
|
|
|
// These are the old names.
|
|
def int_wasm_mem_size : Intrinsic<[llvm_anyint_ty],
|
|
[llvm_i32_ty],
|
|
[IntrReadMem]>;
|
|
def int_wasm_mem_grow : Intrinsic<[llvm_anyint_ty],
|
|
[llvm_i32_ty, LLVMMatchType<0>],
|
|
[]>;
|
|
|
|
// These are the old old names. They also lack the immediate field.
|
|
def int_wasm_current_memory : Intrinsic<[llvm_anyint_ty], [], [IntrReadMem]>;
|
|
def int_wasm_grow_memory : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], []>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Saturating float-to-int conversions
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
def int_wasm_trunc_saturate_signed : Intrinsic<[llvm_anyint_ty],
|
|
[llvm_anyfloat_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_trunc_saturate_unsigned : Intrinsic<[llvm_anyint_ty],
|
|
[llvm_anyfloat_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Exception handling intrinsics
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// throw / rethrow
|
|
def int_wasm_throw : Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty],
|
|
[Throws, IntrNoReturn]>;
|
|
def int_wasm_rethrow : Intrinsic<[], [], [Throws, IntrNoReturn]>;
|
|
|
|
// Since wasm does not use landingpad instructions, these instructions return
|
|
// exception pointer and selector values until we lower them in WasmEHPrepare.
|
|
def int_wasm_get_exception : Intrinsic<[llvm_ptr_ty], [llvm_token_ty],
|
|
[IntrHasSideEffects]>;
|
|
def int_wasm_get_ehselector : Intrinsic<[llvm_i32_ty], [llvm_token_ty],
|
|
[IntrHasSideEffects]>;
|
|
|
|
// wasm.catch returns the pointer to the exception object caught by wasm 'catch'
|
|
// instruction.
|
|
def int_wasm_catch : Intrinsic<[llvm_ptr_ty], [llvm_i32_ty],
|
|
[IntrHasSideEffects]>;
|
|
|
|
// WebAssembly EH must maintain the landingpads in the order assigned to them
|
|
// by WasmEHPrepare pass to generate landingpad table in EHStreamer. This is
|
|
// used in order to give them the indices in WasmEHPrepare.
|
|
def int_wasm_landingpad_index: Intrinsic<[], [llvm_token_ty, llvm_i32_ty],
|
|
[IntrNoMem]>;
|
|
|
|
// Returns LSDA address of the current function.
|
|
def int_wasm_lsda : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Atomic intrinsics
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// wait / notify
|
|
def int_wasm_atomic_wait_i32 :
|
|
Intrinsic<[llvm_i32_ty],
|
|
[LLVMPointerType<llvm_i32_ty>, llvm_i32_ty, llvm_i64_ty],
|
|
[IntrInaccessibleMemOrArgMemOnly, ReadOnly<0>, NoCapture<0>,
|
|
IntrHasSideEffects],
|
|
"", [SDNPMemOperand]>;
|
|
def int_wasm_atomic_wait_i64 :
|
|
Intrinsic<[llvm_i32_ty],
|
|
[LLVMPointerType<llvm_i64_ty>, llvm_i64_ty, llvm_i64_ty],
|
|
[IntrInaccessibleMemOrArgMemOnly, ReadOnly<0>, NoCapture<0>,
|
|
IntrHasSideEffects],
|
|
"", [SDNPMemOperand]>;
|
|
def int_wasm_atomic_notify:
|
|
Intrinsic<[llvm_i32_ty], [LLVMPointerType<llvm_i32_ty>, llvm_i32_ty],
|
|
[IntrInaccessibleMemOnly, NoCapture<0>, IntrHasSideEffects], "",
|
|
[SDNPMemOperand]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// SIMD intrinsics
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
def int_wasm_sub_saturate_signed :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[LLVMMatchType<0>, LLVMMatchType<0>],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_sub_saturate_unsigned :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[LLVMMatchType<0>, LLVMMatchType<0>],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_bitselect :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_anytrue :
|
|
Intrinsic<[llvm_i32_ty],
|
|
[llvm_anyvector_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_alltrue :
|
|
Intrinsic<[llvm_i32_ty],
|
|
[llvm_anyvector_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
|
|
} // TargetPrefix = "wasm"
|