internal static void GeneratePromisePollAndBranch(IRBuilder builder, ICodeGenValueStorage valueStorage, int pollResultIsSomeIndex) { var functionCompiler = (FunctionCompiler)valueStorage; LLVMBasicBlockRef promiseNotDoneBlock = functionCompiler.CurrentFunction.AppendBasicBlock("promiseNotDone"), promiseDoneBlock = functionCompiler.CurrentFunction.AppendBasicBlock("promiseDone"); LLVMValueRef pollResultIsSome = valueStorage[pollResultIsSomeIndex]; builder.CreateCondBr(pollResultIsSome, promiseDoneBlock, promiseNotDoneBlock); builder.PositionBuilderAtEnd(promiseNotDoneBlock); builder.CreateRetVoid(); builder.PositionBuilderAtEnd(promiseDoneBlock); }
internal static void GeneratePanicOrContinueBranch(IRBuilder builder, ICodeGenValueStorage valueSource, int panicOrContinueId, int shouldContinueIndex) { var functionCompiler = (FunctionCompiler)valueSource; LLVMBasicBlockRef continueBlock = functionCompiler.CurrentFunction.AppendBasicBlock($"continue_{panicOrContinueId}"), panicBlock = functionCompiler.CurrentFunction.AppendBasicBlock($"panic_{panicOrContinueId}"); LLVMValueRef shouldContinue = valueSource[shouldContinueIndex]; builder.CreateCondBr(shouldContinue, continueBlock, panicBlock); builder.PositionBuilderAtEnd(panicBlock); functionCompiler._moduleBuilder.GenerateStoreCompletionState(RuntimeConstants.FunctionPanickedStatus); builder.CreateBr(functionCompiler._moduleBuilder.CurrentGroupData.ExitBasicBlock); builder.PositionBuilderAtEnd(continueBlock); }
internal static void GenerateWakerFromCurrentGroup(IRBuilder builder, ICodeGenValueStorage valueStorage, int outputIndex) { var functionCompiler = (FunctionCompiler)valueStorage; LLVMValueRef bitCastCurrentGroupFunction = builder.CreateBitCast( functionCompiler._moduleBuilder.CurrentGroupData.Function, LLVMTypeRef.PointerType(functionCompiler.Context.ScheduledTaskFunctionType(), 0u), "bitCastCurrentGroupFunction"), bitCastStatePtr = builder.CreateBitCast( functionCompiler.AllocationSet.StatePointer, functionCompiler.Context.VoidPointerType(), "bitCastStatePtr"), waker = builder.BuildStructValue( functionCompiler.Context.AsLLVMType(DataTypes.WakerType), new LLVMValueRef[] { bitCastCurrentGroupFunction, bitCastStatePtr }, "waker"); valueStorage[outputIndex] = waker; }