@@ -63,40 +63,39 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
6363 // Create function
6464 std::string funcName = getMainFunctionName(m_procedurePrototype);
6565 llvm::FunctionType *funcType = getMainFunctionType(m_procedurePrototype);
66- llvm::Function *func;
6766
6867 if (m_procedurePrototype)
69- func = getOrCreateFunction(funcName, funcType);
68+ m_function = getOrCreateFunction(funcName, funcType);
7069 else
71- func = llvm::Function::Create(funcType, llvm::Function::ExternalLinkage, funcName, m_module);
70+ m_function = llvm::Function::Create(funcType, llvm::Function::ExternalLinkage, funcName, m_module);
7271
73- llvm::Value *executionContextPtr = func ->getArg(0);
74- llvm::Value *targetPtr = func ->getArg(1);
75- llvm::Value *targetVariables = func ->getArg(2);
76- llvm::Value *targetLists = func ->getArg(3);
72+ llvm::Value *executionContextPtr = m_function ->getArg(0);
73+ llvm::Value *targetPtr = m_function ->getArg(1);
74+ llvm::Value *targetVariables = m_function ->getArg(2);
75+ llvm::Value *targetLists = m_function ->getArg(3);
7776 llvm::Value *warpArg = nullptr;
7877
7978 if (m_procedurePrototype)
80- warpArg = func ->getArg(4);
79+ warpArg = m_function ->getArg(4);
8180
8281 if (m_procedurePrototype && m_warp)
83- func ->addFnAttr(llvm::Attribute::InlineHint);
82+ m_function ->addFnAttr(llvm::Attribute::InlineHint);
8483 else {
8584 // NOTE: These attributes will be overriden by LLVMCompilerContext
8685 // TODO: Optimize all functions, maybe it doesn't take so long
87- func ->addFnAttr(llvm::Attribute::NoInline);
88- func ->addFnAttr(llvm::Attribute::OptimizeNone);
86+ m_function ->addFnAttr(llvm::Attribute::NoInline);
87+ m_function ->addFnAttr(llvm::Attribute::OptimizeNone);
8988 }
9089
91- llvm::BasicBlock *entry = llvm::BasicBlock::Create(m_llvmCtx, "entry", func );
92- llvm::BasicBlock *endBranch = llvm::BasicBlock::Create(m_llvmCtx, "end", func );
90+ llvm::BasicBlock *entry = llvm::BasicBlock::Create(m_llvmCtx, "entry", m_function );
91+ llvm::BasicBlock *endBranch = llvm::BasicBlock::Create(m_llvmCtx, "end", m_function );
9392 m_builder.SetInsertPoint(entry);
9493
9594 // Init coroutine
9695 std::unique_ptr<LLVMCoroutine> coro;
9796
9897 if (!m_warp)
99- coro = std::make_unique<LLVMCoroutine>(m_module, &m_builder, func );
98+ coro = std::make_unique<LLVMCoroutine>(m_module, &m_builder, m_function );
10099
101100 std::vector<LLVMIfStatement> ifStatements;
102101 std::vector<LLVMLoop> loops;
@@ -677,14 +676,14 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
677676 llvm::Value *allocatedSize = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.allocatedSizePtr);
678677 llvm::Value *size = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.sizePtr);
679678 llvm::Value *isAllocated = m_builder.CreateICmpUGT(allocatedSize, size);
680- llvm::BasicBlock *ifBlock = llvm::BasicBlock::Create(m_llvmCtx, "", func );
681- llvm::BasicBlock *elseBlock = llvm::BasicBlock::Create(m_llvmCtx, "", func );
682- llvm::BasicBlock *nextBlock = llvm::BasicBlock::Create(m_llvmCtx, "", func );
679+ llvm::BasicBlock *ifBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
680+ llvm::BasicBlock *elseBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
681+ llvm::BasicBlock *nextBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
683682 m_builder.CreateCondBr(isAllocated, ifBlock, elseBlock);
684683
685684 // If there's enough space, use the allocated memory
686685 m_builder.SetInsertPoint(ifBlock);
687- llvm::Value *itemPtr = getListItem(listPtr, size, func );
686+ llvm::Value *itemPtr = getListItem(listPtr, size);
688687 createReusedValueStore(arg.second, itemPtr, type);
689688 m_builder.CreateStore(m_builder.CreateAdd(size, m_builder.getInt64(1)), listPtr.sizePtr);
690689 m_builder.CreateBr(nextBlock);
@@ -748,7 +747,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
748747 Compiler::StaticType type = optimizeRegisterType(valueArg.second);
749748 LLVMListPtr &listPtr = m_listPtrs[step.workList];
750749 llvm::Value *index = m_builder.CreateFPToUI(castValue(indexArg.second, indexArg.first), m_builder.getInt64Ty());
751- llvm::Value *itemPtr = getListItem(listPtr, index, func );
750+ llvm::Value *itemPtr = getListItem(listPtr, index);
752751 createValueStore(valueArg.second, itemPtr, type, listPtr.type);
753752
754753 auto &typeMap = m_scopeLists.back();
@@ -778,7 +777,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
778777 const auto &arg = step.args[0];
779778 const LLVMListPtr &listPtr = m_listPtrs[step.workList];
780779 llvm::Value *index = m_builder.CreateFPToUI(castValue(arg.second, arg.first), m_builder.getInt64Ty());
781- step.functionReturnReg->value = getListItem(listPtr, index, func );
780+ step.functionReturnReg->value = getListItem(listPtr, index);
782781 step.functionReturnReg->setType(listPtr.type);
783782 break;
784783 }
@@ -795,28 +794,28 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
795794 assert(step.args.size() == 1);
796795 const auto &arg = step.args[0];
797796 const LLVMListPtr &listPtr = m_listPtrs[step.workList];
798- step.functionReturnReg->value = m_builder.CreateSIToFP(getListItemIndex(listPtr, arg.second, func ), m_builder.getDoubleTy());
797+ step.functionReturnReg->value = m_builder.CreateSIToFP(getListItemIndex(listPtr, arg.second), m_builder.getDoubleTy());
799798 break;
800799 }
801800
802801 case LLVMInstruction::Type::ListContainsItem: {
803802 assert(step.args.size() == 1);
804803 const auto &arg = step.args[0];
805804 const LLVMListPtr &listPtr = m_listPtrs[step.workList];
806- llvm::Value *index = getListItemIndex(listPtr, arg.second, func );
805+ llvm::Value *index = getListItemIndex(listPtr, arg.second);
807806 step.functionReturnReg->value = m_builder.CreateICmpSGT(index, llvm::ConstantInt::get(m_builder.getInt64Ty(), -1, true));
808807 break;
809808 }
810809
811810 case LLVMInstruction::Type::Yield:
812811 // TODO: Do not allow use after suspend (use after free)
813- createSuspend(coro.get(), func, warpArg, targetVariables);
812+ createSuspend(coro.get(), warpArg, targetVariables);
814813 break;
815814
816815 case LLVMInstruction::Type::BeginIf: {
817816 LLVMIfStatement statement;
818817 statement.beforeIf = m_builder.GetInsertBlock();
819- statement.body = llvm::BasicBlock::Create(m_llvmCtx, "", func );
818+ statement.body = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
820819
821820 // Use last reg
822821 assert(step.args.size() == 1);
@@ -847,13 +846,13 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
847846
848847 // Jump to the branch after the if statement
849848 assert(!statement.afterIf);
850- statement.afterIf = llvm::BasicBlock::Create(m_llvmCtx, "", func );
849+ statement.afterIf = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
851850 freeScopeHeap();
852851 m_builder.CreateBr(statement.afterIf);
853852
854853 // Create else branch
855854 assert(!statement.elseBranch);
856- statement.elseBranch = llvm::BasicBlock::Create(m_llvmCtx, "", func );
855+ statement.elseBranch = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
857856
858857 // Since there's an else branch, the conditional instruction should jump to it
859858 m_builder.SetInsertPoint(statement.beforeIf);
@@ -871,7 +870,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
871870
872871 // Jump to the branch after the if statement
873872 if (!statement.afterIf)
874- statement.afterIf = llvm::BasicBlock::Create(m_llvmCtx, "", func );
873+ statement.afterIf = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
875874
876875 m_builder.CreateBr(statement.afterIf);
877876
@@ -900,9 +899,9 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
900899 m_builder.CreateStore(zero, loop.index);
901900
902901 // Create branches
903- llvm::BasicBlock *roundBranch = llvm::BasicBlock::Create(m_llvmCtx, "", func );
904- loop.conditionBranch = llvm::BasicBlock::Create(m_llvmCtx, "", func );
905- loop.afterLoop = llvm::BasicBlock::Create(m_llvmCtx, "", func );
902+ llvm::BasicBlock *roundBranch = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
903+ loop.conditionBranch = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
904+ loop.afterLoop = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
906905
907906 // Use last reg for count
908907 assert(step.args.size() == 1);
@@ -928,10 +927,10 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
928927 // Check index
929928 m_builder.SetInsertPoint(loop.conditionBranch);
930929
931- llvm::BasicBlock *body = llvm::BasicBlock::Create(m_llvmCtx, "", func );
930+ llvm::BasicBlock *body = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
932931
933932 if (!loop.afterLoop)
934- loop.afterLoop = llvm::BasicBlock::Create(m_llvmCtx, "", func );
933+ loop.afterLoop = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
935934
936935 llvm::Value *currentIndex = m_builder.CreateLoad(m_builder.getInt64Ty(), loop.index);
937936 comparison = m_builder.CreateOr(isInf, m_builder.CreateICmpULT(currentIndex, count));
@@ -958,8 +957,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
958957 LLVMLoop &loop = loops.back();
959958
960959 // Create branches
961- llvm::BasicBlock *body = llvm::BasicBlock::Create(m_llvmCtx, "", func );
962- loop.afterLoop = llvm::BasicBlock::Create(m_llvmCtx, "", func );
960+ llvm::BasicBlock *body = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
961+ loop.afterLoop = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
963962
964963 // Use last reg
965964 assert(step.args.size() == 1);
@@ -979,8 +978,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
979978 LLVMLoop &loop = loops.back();
980979
981980 // Create branches
982- llvm::BasicBlock *body = llvm::BasicBlock::Create(m_llvmCtx, "", func );
983- loop.afterLoop = llvm::BasicBlock::Create(m_llvmCtx, "", func );
981+ llvm::BasicBlock *body = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
982+ loop.afterLoop = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
984983
985984 // Use last reg
986985 assert(step.args.size() == 1);
@@ -998,7 +997,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
998997 case LLVMInstruction::Type::BeginLoopCondition: {
999998 LLVMLoop loop;
1000999 loop.isRepeatLoop = false;
1001- loop.conditionBranch = llvm::BasicBlock::Create(m_llvmCtx, "", func );
1000+ loop.conditionBranch = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
10021001 m_builder.CreateBr(loop.conditionBranch);
10031002 m_builder.SetInsertPoint(loop.conditionBranch);
10041003 loops.push_back(loop);
@@ -1030,7 +1029,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
10301029
10311030 case LLVMInstruction::Type::Stop: {
10321031 m_builder.CreateBr(endBranch);
1033- llvm::BasicBlock *nextBranch = llvm::BasicBlock::Create(m_llvmCtx, "", func );
1032+ llvm::BasicBlock *nextBranch = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
10341033 m_builder.SetInsertPoint(nextBranch);
10351034 break;
10361035 }
@@ -1046,7 +1045,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
10461045 std::vector<llvm::Value *> args;
10471046
10481047 for (size_t i = 0; i < m_defaultArgCount; i++)
1049- args.push_back(func ->getArg(i));
1048+ args.push_back(m_function ->getArg(i));
10501049
10511050 // Add warp arg
10521051 if (m_warp)
@@ -1065,12 +1064,12 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
10651064 llvm::Value *handle = m_builder.CreateCall(resolveFunction(name, type), args);
10661065
10671066 if (!m_warp && !step.procedurePrototype->warp()) {
1068- llvm::BasicBlock *suspendBranch = llvm::BasicBlock::Create(m_llvmCtx, "", func );
1069- llvm::BasicBlock *nextBranch = llvm::BasicBlock::Create(m_llvmCtx, "", func );
1067+ llvm::BasicBlock *suspendBranch = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
1068+ llvm::BasicBlock *nextBranch = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
10701069 m_builder.CreateCondBr(m_builder.CreateIsNull(handle), nextBranch, suspendBranch);
10711070
10721071 m_builder.SetInsertPoint(suspendBranch);
1073- createSuspend(coro.get(), func, warpArg, targetVariables);
1072+ createSuspend(coro.get(), warpArg, targetVariables);
10741073 name = getResumeFunctionName(step.procedurePrototype);
10751074 llvm::Value *done = m_builder.CreateCall(resolveFunction(name, m_resumeFuncType), { handle });
10761075 m_builder.CreateCondBr(done, nextBranch, suspendBranch);
@@ -1085,7 +1084,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
10851084
10861085 case LLVMInstruction::Type::ProcedureArg: {
10871086 assert(m_procedurePrototype);
1088- llvm::Value *arg = func ->getArg(m_defaultArgCount + 1 + step.procedureArgIndex); // omit warp arg
1087+ llvm::Value *arg = m_function ->getArg(m_defaultArgCount + 1 + step.procedureArgIndex); // omit warp arg
10891088 step.functionReturnReg->value = arg;
10901089 break;
10911090 }
@@ -1107,7 +1106,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
11071106 else
11081107 coro->end();
11091108
1110- verifyFunction(func );
1109+ verifyFunction(m_function );
11111110
11121111 // Create resume function
11131112 // bool resume(void *)
@@ -1126,7 +1125,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
11261125
11271126 verifyFunction(resumeFunc);
11281127
1129- return std::make_shared<LLVMExecutableCode>(m_ctx, func ->getName().str(), resumeFunc->getName().str());
1128+ return std::make_shared<LLVMExecutableCode>(m_ctx, m_function ->getName().str(), resumeFunc->getName().str());
11301129}
11311130
11321131CompilerValue *LLVMCodeBuilder::addFunctionCall(const std::string &functionName, Compiler::StaticType returnType, const Compiler::ArgTypes &argTypes, const Compiler::Args &args)
@@ -2029,7 +2028,7 @@ void LLVMCodeBuilder::reloadLists()
20292028 }
20302029}
20312030
2032- void LLVMCodeBuilder::updateListDataPtr(const LLVMListPtr &listPtr, llvm::Function *func )
2031+ void LLVMCodeBuilder::updateListDataPtr(const LLVMListPtr &listPtr)
20332032{
20342033 // dataPtr = dirty ? list_data(list) : dataPtr
20352034 // dirty = false
@@ -2190,21 +2189,21 @@ void LLVMCodeBuilder::copyStructField(llvm::Value *source, llvm::Value *target,
21902189 m_builder.CreateStore(m_builder.CreateLoad(fieldType, sourceField), targetField);
21912190}
21922191
2193- llvm::Value *LLVMCodeBuilder::getListItem(const LLVMListPtr &listPtr, llvm::Value *index, llvm::Function *func )
2192+ llvm::Value *LLVMCodeBuilder::getListItem(const LLVMListPtr &listPtr, llvm::Value *index)
21942193{
2195- updateListDataPtr(listPtr, func );
2194+ updateListDataPtr(listPtr);
21962195 return m_builder.CreateGEP(m_valueDataType, m_builder.CreateLoad(m_valueDataType->getPointerTo(), listPtr.dataPtr), index);
21972196}
21982197
2199- llvm::Value *LLVMCodeBuilder::getListItemIndex(const LLVMListPtr &listPtr, LLVMRegister *item, llvm::Function *func )
2198+ llvm::Value *LLVMCodeBuilder::getListItemIndex(const LLVMListPtr &listPtr, LLVMRegister *item)
22002199{
22012200 llvm::Value *size = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.sizePtr);
2202- llvm::BasicBlock *condBlock = llvm::BasicBlock::Create(m_llvmCtx, "", func );
2203- llvm::BasicBlock *bodyBlock = llvm::BasicBlock::Create(m_llvmCtx, "", func );
2204- llvm::BasicBlock *cmpIfBlock = llvm::BasicBlock::Create(m_llvmCtx, "", func );
2205- llvm::BasicBlock *cmpElseBlock = llvm::BasicBlock::Create(m_llvmCtx, "", func );
2206- llvm::BasicBlock *notFoundBlock = llvm::BasicBlock::Create(m_llvmCtx, "", func );
2207- llvm::BasicBlock *nextBlock = llvm::BasicBlock::Create(m_llvmCtx, "", func );
2201+ llvm::BasicBlock *condBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
2202+ llvm::BasicBlock *bodyBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
2203+ llvm::BasicBlock *cmpIfBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
2204+ llvm::BasicBlock *cmpElseBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
2205+ llvm::BasicBlock *notFoundBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
2206+ llvm::BasicBlock *nextBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
22082207
22092208 // index = 0
22102209 llvm::Value *index = m_builder.CreateAlloca(m_builder.getInt64Ty());
@@ -2220,7 +2219,7 @@ llvm::Value *LLVMCodeBuilder::getListItemIndex(const LLVMListPtr &listPtr, LLVMR
22202219 m_builder.SetInsertPoint(bodyBlock);
22212220 LLVMRegister currentItem(listPtr.type);
22222221 currentItem.isRawValue = false;
2223- currentItem.value = getListItem(listPtr, m_builder.CreateLoad(m_builder.getInt64Ty(), index), func );
2222+ currentItem.value = getListItem(listPtr, m_builder.CreateLoad(m_builder.getInt64Ty(), index));
22242223 llvm::Value *cmp = createComparison(¤tItem, item, Comparison::EQ);
22252224 m_builder.CreateCondBr(cmp, cmpIfBlock, cmpElseBlock);
22262225
@@ -2481,14 +2480,14 @@ llvm::Value *LLVMCodeBuilder::createComparison(LLVMRegister *arg1, LLVMRegister
24812480 }
24822481}
24832482
2484- void LLVMCodeBuilder::createSuspend(LLVMCoroutine *coro, llvm::Function *func, llvm:: Value *warpArg, llvm::Value *targetVariables)
2483+ void LLVMCodeBuilder::createSuspend(LLVMCoroutine *coro, llvm::Value *warpArg, llvm::Value *targetVariables)
24852484{
24862485 if (!m_warp) {
24872486 llvm::BasicBlock *suspendBranch, *nextBranch;
24882487
24892488 if (warpArg) {
2490- suspendBranch = llvm::BasicBlock::Create(m_llvmCtx, "", func );
2491- nextBranch = llvm::BasicBlock::Create(m_llvmCtx, "", func );
2489+ suspendBranch = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
2490+ nextBranch = llvm::BasicBlock::Create(m_llvmCtx, "", m_function );
24922491 m_builder.CreateCondBr(warpArg, nextBranch, suspendBranch);
24932492 m_builder.SetInsertPoint(suspendBranch);
24942493 }
0 commit comments