LLVM 18.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"
#include <set>
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 289 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 599 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::WebAssembly::WasmEnableSjLj.
Referenced by containsLongjmpableCalls().
Definition at line 395 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 852 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References canLongjmp(), F, and I.
Definition at line 469 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::IRBuilderBase::getIntNTy().
Definition at line 477 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 484 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::CallingConv::C, and llvm::IRBuilderBase::getIntN().
|
static |
Definition at line 1648 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::Value::users().
|
static |
Definition at line 449 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References B, llvm::Function::Create(), llvm::GlobalValue::ExternalLinkage, F, and Name.
|
static |
Definition at line 413 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 433 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 387 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 680 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
|
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 |