Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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;
        }