LLVM 17.0.0git
|
This file lowers exception-related instructions and setjmp/longjmp function calls to use Emscripten's library functions. More...
#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
#include "WebAssembly.h"
#include "WebAssemblyTargetMachine.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/CodeGen/WasmEHFuncInfo.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/IntrinsicsWebAssembly.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/SSAUpdater.h"
#include "llvm/Transforms/Utils/SSAUpdaterBulk.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 * | getGlobalVariable (Module &M, Type *Ty, WebAssemblyTargetMachine &TM, const char *Name) |
static std::string | getSignature (FunctionType *FTy) |
static Function * | getEmscriptenFunction (FunctionType *Ty, const Twine &Name, Module *M) |
static Type * | getAddrIntType (Module *M) |
static Type * | getAddrPtrType (Module *M) |
static Value * | getAddrSizeInt (Module *M, uint64_t C) |
static bool | canLongjmp (const Value *Callee) |
static bool | isEmAsmCall (const Value *Callee) |
static bool | containsLongjmpableCalls (const Function *F) |
static void | nullifySetjmp (Function *F) |
static DebugLoc | getOrCreateDebugLoc (const Instruction *InsertBefore, DISubprogram *SP) |
static BasicBlock * | getCleanupRetUnwindDest (const CleanupPadInst *CPI) |
Variables | |
static cl::list< std::string > | EHAllowlist ("emscripten-cxx-exceptions-allowed", cl::desc("The list of function names in which Emscripten-style " "exception handling is enabled (see emscripten " "EMSCRIPTEN_CATCHING_ALLOWED options)"), cl::CommaSeparated) |
This file lowers exception-related instructions and setjmp/longjmp function calls to use Emscripten's library functions.
The pass uses JavaScript's try and catch mechanism in case of Emscripten EH/SjLj and Wasm EH intrinsics in case of Emscripten SjLJ.
In detail, this pass does following things:
1) Assumes the existence of global variables: THREW, threwValue __THREW and threwValue are defined in compiler-rt in Emscripten. 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, THREW variable indicates the corresponding setjmp buffer the longjmp corresponds to. __threwValue is 0 for exceptions, and the argument to longjmp in case of longjmp.
2) We assume the existence of setThrew and setTempRet0/getTempRet0 functions at link time. setThrew exists in Emscripten's compiler-rt:
void setThrew(uintptr_t threw, int value) { if (THREW == 0) { THREW = threw; __threwValue = value; } }
Definition in file WebAssemblyLowerEmscriptenEHSjLj.cpp.
#define DEBUG_TYPE "wasm-lower-em-ehsjlj" |
Definition at line 288 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 598 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References Callee, and llvm::WebAssembly::WasmEnableSjLj.
Referenced by containsLongjmpableCalls().
Definition at line 394 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 852 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References canLongjmp(), F, and I.
Definition at line 468 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::IRBuilderBase::getIntNTy().
Definition at line 475 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::Type::getIntNPtrTy().
Definition at line 483 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::CallingConv::C, and llvm::IRBuilderBase::getIntN().
|
static |
Definition at line 1654 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::Value::users().
|
static |
Definition at line 448 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References B, llvm::Function::Create(), llvm::GlobalValue::ExternalLinkage, F, and Name.
|
static |
Definition at line 412 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::GlobalValue::GeneralDynamicTLSModel, Name, and llvm::report_fatal_error().
Referenced by llvm::Module::getGlobalVariable(), and llvm::Module::getNamedGlobal().
|
static |
Definition at line 1252 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References assert(), llvm::MDNode::getContext(), llvm::Instruction::getDebugLoc(), and llvm::ilist_node_with_parent< NodeTy, ParentTy, Options >::getPrevNode().
|
static |
Definition at line 432 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::erase_if(), and OS.
Referenced by llvm::DWARFUnitIndex::getFromHash().
INITIALIZE_PASS | ( | WebAssemblyLowerEmscriptenEHSjLj | , |
DEBUG_TYPE | , | ||
"WebAssembly Lower Emscripten Exceptions / Setjmp / Longjmp" | , | ||
false | , | ||
false | |||
) |
Definition at line 386 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 679 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References Callee.
|
static |
Definition at line 865 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::changeToCall(), F, llvm::IRBuilderBase::getInt32(), llvm::BasicBlock::getParent(), I, llvm::make_early_inc_range(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Value::replaceAllUsesWith(), and llvm::Value::users().
|
static |