LLVM  16.0.0git
Macros | Functions | Variables
WebAssemblyLowerEmscriptenEHSjLj.cpp File Reference
#include "Utils/WebAssemblyUtilities.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 dependency graph for WebAssemblyLowerEmscriptenEHSjLj.cpp:

Go to the source code of this file.


#define DEBUG_TYPE   "wasm-lower-em-ehsjlj"


 INITIALIZE_PASS (WebAssemblyLowerEmscriptenEHSjLj, DEBUG_TYPE, "WebAssembly Lower Emscripten Exceptions / Setjmp / Longjmp", false, false) ModulePass *llvm
static bool canThrow (const Value *V)
static GlobalVariablegetGlobalVariable (Module &M, Type *Ty, WebAssemblyTargetMachine &TM, const char *Name)
static std::string getSignature (FunctionType *FTy)
static FunctiongetEmscriptenFunction (FunctionType *Ty, const Twine &Name, Module *M)
static TypegetAddrIntType (Module *M)
static TypegetAddrPtrType (Module *M)
static ValuegetAddrSizeInt (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 BasicBlockgetCleanupRetUnwindDest (const CleanupPadInst *CPI)


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)

Detailed Description

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.

Macro Definition Documentation


#define DEBUG_TYPE   "wasm-lower-em-ehsjlj"

Definition at line 288 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

Function Documentation

◆ canLongjmp()

static bool canLongjmp ( const Value Callee)

◆ canThrow()

static bool canThrow ( const Value V)

Definition at line 394 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

References F.

◆ containsLongjmpableCalls()

static bool containsLongjmpableCalls ( const Function F)

Definition at line 852 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

References BB, canLongjmp(), F, and I.

◆ getAddrIntType()

static Type* getAddrIntType ( Module M)

Definition at line 468 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

References llvm::IRBuilderBase::getIntNTy(), and M.

◆ getAddrPtrType()

static Type* getAddrPtrType ( Module M)

Definition at line 475 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

References llvm::Type::getIntNPtrTy(), and M.

◆ getAddrSizeInt()

static Value* getAddrSizeInt ( Module M,
uint64_t  C 

Definition at line 483 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

References llvm::IRBuilderBase::getIntN(), and M.

◆ getCleanupRetUnwindDest()

static BasicBlock* getCleanupRetUnwindDest ( const CleanupPadInst CPI)

Definition at line 1654 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

References llvm::Value::users().

◆ getEmscriptenFunction()

static Function* getEmscriptenFunction ( FunctionType Ty,
const Twine Name,
Module M 

◆ getGlobalVariable()

static GlobalVariable* getGlobalVariable ( Module M,
Type Ty,
WebAssemblyTargetMachine TM,
const char *  Name 

◆ getOrCreateDebugLoc()

static DebugLoc getOrCreateDebugLoc ( const Instruction InsertBefore,
DISubprogram SP 

◆ getSignature()

static std::string getSignature ( FunctionType FTy)


INITIALIZE_PASS ( WebAssemblyLowerEmscriptenEHSjLj  ,
"WebAssembly Lower Emscripten Exceptions / Setjmp / Longjmp"  ,
false  ,

Definition at line 386 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

◆ isEmAsmCall()

static bool isEmAsmCall ( const Value Callee)

Definition at line 679 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

References Callee.

◆ nullifySetjmp()

static void nullifySetjmp ( Function F)

Variable Documentation

◆ EHAllowlist

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)