LLVM  14.0.0git
Macros | Functions | Variables
WebAssemblyLowerEmscriptenEHSjLj.cpp File Reference
#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/SSAUpdater.h"
#include "llvm/Transforms/Utils/SSAUpdaterBulk.h"
Include dependency graph for WebAssemblyLowerEmscriptenEHSjLj.cpp:

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 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 DebugLoc getOrCreateDebugLoc (const Instruction *InsertBefore, DISubprogram *SP)
 

Variables

cl::opt< bool > WasmEnableEmEH
 
cl::opt< bool > WasmEnableEmSjLj
 
cl::opt< bool > WasmEnableSjLj
 
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

◆ DEBUG_TYPE

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

Definition at line 286 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

Function Documentation

◆ canLongjmp()

static bool canLongjmp ( const Value Callee)
static

Definition at line 605 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

References Callee.

Referenced by containsLongjmpableCalls().

◆ canThrow()

static bool canThrow ( const Value V)
static

Definition at line 398 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

References F.

◆ containsLongjmpableCalls()

static bool containsLongjmpableCalls ( const Function F)
static

Definition at line 816 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

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

◆ getAddrIntType()

static Type* getAddrIntType ( Module M)
static

Definition at line 476 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

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

◆ getAddrPtrType()

static Type* getAddrPtrType ( Module M)
static

Definition at line 483 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

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

◆ getAddrSizeInt()

static Value* getAddrSizeInt ( Module M,
uint64_t  C 
)
static

Definition at line 491 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

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

◆ getEmscriptenFunction()

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

◆ getGlobalVariable()

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

◆ getOrCreateDebugLoc()

static DebugLoc getOrCreateDebugLoc ( const Instruction InsertBefore,
DISubprogram SP 
)
static

◆ getSignature()

static std::string getSignature ( FunctionType FTy)
static

◆ INITIALIZE_PASS()

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

Definition at line 390 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

◆ isEmAsmCall()

static bool isEmAsmCall ( const Value Callee)
static

Definition at line 643 of file WebAssemblyLowerEmscriptenEHSjLj.cpp.

References Callee.

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)
static

◆ WasmEnableEmEH

cl::opt<bool> WasmEnableEmEH

◆ WasmEnableEmSjLj

cl::opt<bool> WasmEnableEmSjLj

◆ WasmEnableSjLj

cl::opt<bool> WasmEnableSjLj

Referenced by checkSanityForEHAndSjLj().