static void BuildFilterFunclet(LLVMModuleRef module, LLVMTypeRef[] funcletArgTypes) { LlvmFilterFunclet = module.AddFunction("LlvmFilterFunclet", LLVMTypeRef.CreateFunction(LLVMTypeRef.Int32, funcletArgTypes, false)); var block = LlvmFilterFunclet.AppendBasicBlock("Filter"); LLVMBuilderRef funcletBuilder = Context.CreateBuilder(); funcletBuilder.PositionAtEnd(block); LLVMValueRef filterResult = funcletBuilder.BuildCall(LlvmFilterFunclet.GetParam(0), new LLVMValueRef[] { LlvmFilterFunclet.GetParam(1) }, "callFilter"); funcletBuilder.BuildRet(filterResult); funcletBuilder.Dispose(); }
static void BuildCatchFunclet(LLVMModuleRef module, string funcletName, LLVMTypeRef[] funcletArgTypes, bool passGenericContext = false) { LlvmCatchFunclet = module.AddFunction(funcletName, LLVMTypeRef.CreateFunction(LLVMTypeRef.Int32, funcletArgTypes, false)); var block = LlvmCatchFunclet.AppendBasicBlock("Catch"); LLVMBuilderRef funcletBuilder = Context.CreateBuilder(); funcletBuilder.PositionAtEnd(block); List <LLVMValueRef> llvmArgs = new List <LLVMValueRef>(); llvmArgs.Add(LlvmCatchFunclet.GetParam(2)); if (passGenericContext) { llvmArgs.Add(LlvmCatchFunclet.GetParam(3)); } LLVMValueRef leaveToILOffset = funcletBuilder.BuildCall(LlvmCatchFunclet.GetParam(1), llvmArgs.ToArray(), string.Empty); funcletBuilder.BuildRet(leaveToILOffset); funcletBuilder.Dispose(); }
static void BuildFilterFunclet(LLVMModuleRef module, string funcletName, LLVMTypeRef[] funcletArgTypes, bool passGenericContext = false) { LlvmFilterFunclet = module.AddFunction(funcletName, LLVMTypeRef.CreateFunction(LLVMTypeRef.Int32, funcletArgTypes, false)); var block = LlvmFilterFunclet.AppendBasicBlock("Filter"); LLVMBuilderRef funcletBuilder = Context.CreateBuilder(); funcletBuilder.PositionAtEnd(block); List <LLVMValueRef> llvmArgs = new List <LLVMValueRef>(); llvmArgs.Add(LlvmFilterFunclet.GetParam(2)); //shadow stack llvmArgs.Add(LlvmFilterFunclet.GetParam(0)); // exception object if (passGenericContext) { llvmArgs.Add(LlvmFilterFunclet.GetParam(3)); } LLVMValueRef filterResult = funcletBuilder.BuildCall(LlvmFilterFunclet.GetParam(1), llvmArgs.ToArray(), string.Empty); funcletBuilder.BuildRet(filterResult); funcletBuilder.Dispose(); }
static void BuildFinallyFunclet(LLVMModuleRef module) { LlvmFinallyFunclet = module.AddFunction("LlvmFinallyFunclet", LLVMTypeRef.CreateFunction(LLVMTypeRef.Void, new LLVMTypeRef[] { LLVMTypeRef.CreatePointer(LLVMTypeRef.CreateFunction(LLVMTypeRef.Void, new LLVMTypeRef[] { LLVMTypeRef.CreatePointer(LLVMTypeRef.Int8, 0) }, false), 0), // finallyHandler LLVMTypeRef.CreatePointer(LLVMTypeRef.Int8, 0), // shadow stack }, false)); var block = LlvmFinallyFunclet.AppendBasicBlock("GenericFinally"); LLVMBuilderRef funcletBuilder = Context.CreateBuilder(); funcletBuilder.PositionAtEnd(block); var finallyFunclet = LlvmFinallyFunclet.GetParam(0); var castShadowStack = LlvmFinallyFunclet.GetParam(1); List <LLVMValueRef> llvmArgs = new List <LLVMValueRef>(); llvmArgs.Add(castShadowStack); funcletBuilder.BuildCall(finallyFunclet, llvmArgs.ToArray(), string.Empty); funcletBuilder.BuildRetVoid(); funcletBuilder.Dispose(); }