LLVM
8.0.1
|
This file lowers exception-related instructions and setjmp/longjmp function calls in order to use Emscripten's JavaScript try and catch mechanism. More...
#include "WebAssembly.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/SSAUpdater.h"
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "wasm-lower-em-ehsjlj" |
Functions | |
INITIALIZE_PASS (WebAssemblyLowerEmscriptenEHSjLj, DEBUG_TYPE, "WebAssembly Lower Emscripten Exceptions / Setjmp / Longjmp", false, false) ModulePass *llvm | |
static bool | canThrow (const Value *V) |
static GlobalVariable * | getGlobalVariableI32 (Module &M, IRBuilder<> &IRB, const char *Name) |
static std::string | getSignature (FunctionType *FTy) |
Variables | |
static cl::list< std::string > | EHWhitelist ("emscripten-cxx-exceptions-whitelist", cl::desc("The list of function names in which Emscripten-style " "exception handling is enabled (see emscripten " "EMSCRIPTEN_CATCHING_WHITELIST options)"), cl::CommaSeparated) |
This file lowers exception-related instructions and setjmp/longjmp function calls in order to use Emscripten's JavaScript try and catch mechanism.
To handle exceptions and setjmp/longjmps, this scheme relies on JavaScript's try and catch syntax and relevant exception-related libraries implemented in JavaScript glue code that will be produced by Emscripten. This is similar to the current Emscripten asm.js exception handling in fastcomp. For fastcomp's EH / SjLj scheme, see these files in fastcomp LLVM branch: (Location: https://github.com/kripken/emscripten-fastcomp) lib/Target/JSBackend/NaCl/LowerEmExceptionsPass.cpp lib/Target/JSBackend/NaCl/LowerEmSetjmp.cpp lib/Target/JSBackend/JSBackend.cpp lib/Target/JSBackend/CallHandlers.h
In detail, this pass does following things:
1) Assumes the existence of global variables: THREW, threwValue __THREW and threwValue will be set in invoke wrappers in JS glue code. For what invoke wrappers are, refer to 3). These variables are used for both exceptions and setjmp/longjmps. __THREW indicates whether an exception or a longjmp occurred or not. 0 means nothing occurred, 1 means an exception occurred, and other numbers mean a longjmp occurred. In the case of longjmp, __threwValue variable indicates the corresponding setjmp buffer the longjmp corresponds to.
2) We assume the existence of setThrew and setTempRet0/getTempRet0 functions at link time. The global variables in 1) will exist in wasm address space, but their values should be set in JS code, so these functions as interfaces to JS glue code. These functions are equivalent to the following JS functions, which actually exist in asm.js version of JS library.
function setThrew(threw, value) { if (THREW == 0) { THREW = threw; __threwValue = value; } }
Definition in file WebAssemblyLowerEmscriptenEHSjLj.cpp.
#define DEBUG_TYPE "wasm-lower-em-ehsjlj" |
Definition at line 220 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 323 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Referenced by getSignature().
|
static |
Definition at line 340 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::GlobalValue::ExternalLinkage, llvm::IRBuilderBase::getInt32Ty(), llvm::Module::getNamedGlobal(), Name, and llvm::report_fatal_error().
Referenced by getSignature().
|
static |
Definition at line 354 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::MCID::Add, llvm::SSAUpdater::AddAvailableValue(), llvm::SwitchInst::addCase(), llvm::PHINode::addIncoming(), llvm::SmallVectorImpl< T >::append(), llvm::AMDGPU::HSAMD::Kernel::Key::Args, assert(), C, Callee, canThrow(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::BasicBlock::Create(), llvm::BinaryOperator::Create(), llvm::Function::Create(), llvm::IRBuilder< T, Inserter >::CreateAnd(), llvm::IRBuilder< T, Inserter >::CreateBr(), llvm::IRBuilder< T, Inserter >::CreateCall(), llvm::IRBuilder< T, Inserter >::CreateCondBr(), llvm::IRBuilder< T, Inserter >::CreateExtractValue(), llvm::CallInst::CreateFree(), llvm::IRBuilder< T, Inserter >::CreateICmpEQ(), llvm::IRBuilder< T, Inserter >::CreateICmpNE(), llvm::IRBuilder< T, Inserter >::CreateInsertValue(), llvm::IRBuilder< T, Inserter >::CreateIntToPtr(), llvm::IRBuilder< T, Inserter >::CreateLoad(), llvm::CallInst::CreateMalloc(), llvm::IRBuilder< T, Inserter >::CreatePHI(), llvm::IRBuilder< T, Inserter >::CreateStore(), llvm::IRBuilder< T, Inserter >::CreateSwitch(), llvm::IRBuilder< T, Inserter >::CreateUnreachable(), llvm::dbgs(), llvm::DominatorTree::dominates(), llvm::dyn_cast(), llvm::Intrinsic::eh_typeid_for, llvm::StringMap< ValueTy, AllocatorTy >::end(), llvm::Function::eraseFromParent(), llvm::GlobalValue::ExternalLinkage, F(), llvm::StringMap< ValueTy, AllocatorTy >::find(), llvm::AttributeList::FunctionIndex, llvm::FunctionType::get(), llvm::AttributeList::get(), llvm::UndefValue::get(), llvm::AttributeList::getAttributes(), llvm::Function::getContext(), llvm::Module::getContext(), llvm::Function::getEntryBlock(), llvm::BasicBlock::getFirstInsertionPt(), llvm::BasicBlock::getFirstNonPHI(), llvm::AttributeList::getFnAttributes(), llvm::Module::getFunction(), llvm::Function::getFunctionType(), getGlobalVariableI32(), llvm::IRBuilderBase::getInt32(), llvm::Type::getInt32PtrTy(), llvm::IRBuilderBase::getInt32Ty(), llvm::Type::getInt32Ty(), llvm::IRBuilderBase::getInt8PtrTy(), llvm::Type::getInt8PtrTy(), llvm::Function::getIntrinsicID(), llvm::Instruction::getModule(), llvm::BasicBlock::getModule(), llvm::Value::getName(), llvm::ilist_node_with_parent< NodeTy, ParentTy, Options >::getNextNode(), llvm::AttributeList::getParamAttributes(), llvm::FunctionType::getParamType(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::GlobalValue::getParent(), llvm::AttributeList::getRetAttributes(), llvm::FunctionType::getReturnType(), llvm::BasicBlock::getTerminator(), llvm::Value::getType(), llvm::PointerType::getUnqual(), llvm::Use::getUser(), llvm::IRBuilderBase::getVoidTy(), I, llvm::ARM_PROC::IE, llvm::SSAUpdater::Initialize(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::GlobalValue::isDeclaration(), llvm::FunctionType::isVarArg(), LLVM_DEBUG, llvm::makeArrayRef(), llvm::None, llvm::Attribute::NoReturn, llvm::FunctionType::param_begin(), llvm::FunctionType::param_end(), llvm::FunctionType::params(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::DominatorTreeBase< NodeT, IsPostDom >::recalculate(), llvm::remove_if(), replace(), llvm::Value::replaceAllUsesWith(), llvm::report_fatal_error(), llvm::SSAUpdater::RewriteUse(), llvm::SSAUpdater::RewriteUseAfterInsertions(), llvm::CallBase::setAttributes(), llvm::CallBase::setCallingConv(), llvm::Instruction::setDebugLoc(), llvm::Function::setDoesNotThrow(), llvm::IRBuilderBase::SetInsertPoint(), SI, llvm::SmallVectorBase::size(), llvm::BasicBlock::size(), llvm::SplitBlock(), SSA, llvm::StringRef::startswith(), llvm::raw_string_ostream::str(), llvm::Value::takeName(), llvm::RegState::Undef, llvm::Value::use_begin(), llvm::Value::use_empty(), llvm::Value::use_end(), and llvm::Value::users().
Referenced by llvm::DWARFUnitIndex::getFromHash().
INITIALIZE_PASS | ( | WebAssemblyLowerEmscriptenEHSjLj | , |
DEBUG_TYPE | , | ||
"WebAssembly Lower Emscripten Exceptions / Setjmp / Longjmp" | , | ||
false | , | ||
false | |||
) |
Definition at line 314 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
|
static |