LLVM 20.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/IR/Module.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 284 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 593 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::WebAssembly::WasmEnableSjLj.
Referenced by containsLongjmpableCalls().
Definition at line 389 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 847 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References canLongjmp(), F, and I.
Definition at line 463 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::IRBuilderBase::getIntNTy().
Definition at line 471 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 478 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::CallingConv::C, and llvm::IRBuilderBase::getIntN().
|
static |
Definition at line 1542 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::Value::users().
|
static |
Definition at line 443 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References B, llvm::Function::Create(), llvm::GlobalValue::ExternalLinkage, F, and Name.
|
static |
Definition at line 407 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 1247 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 427 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 381 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
Definition at line 674 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
|
static |
Definition at line 860 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.
References llvm::changeToCall(), F, llvm::IRBuilderBase::getInt32(), llvm::BasicBlock::getParent(), I, II, llvm::make_early_inc_range(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Value::replaceAllUsesWith(), and llvm::Value::users().
|
static |