@@ -63,40 +63,39 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
63
63
// Create function
64
64
std::string funcName = getMainFunctionName (m_procedurePrototype);
65
65
llvm::FunctionType *funcType = getMainFunctionType (m_procedurePrototype);
66
- llvm::Function *func;
67
66
68
67
if (m_procedurePrototype)
69
- func = getOrCreateFunction (funcName, funcType);
68
+ m_function = getOrCreateFunction (funcName, funcType);
70
69
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);
72
71
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 );
77
76
llvm::Value *warpArg = nullptr ;
78
77
79
78
if (m_procedurePrototype)
80
- warpArg = func ->getArg (4 );
79
+ warpArg = m_function ->getArg (4 );
81
80
82
81
if (m_procedurePrototype && m_warp)
83
- func ->addFnAttr (llvm::Attribute::InlineHint);
82
+ m_function ->addFnAttr (llvm::Attribute::InlineHint);
84
83
else {
85
84
// NOTE: These attributes will be overriden by LLVMCompilerContext
86
85
// 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);
89
88
}
90
89
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 );
93
92
m_builder.SetInsertPoint (entry);
94
93
95
94
// Init coroutine
96
95
std::unique_ptr<LLVMCoroutine> coro;
97
96
98
97
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 );
100
99
101
100
std::vector<LLVMIfStatement> ifStatements;
102
101
std::vector<LLVMLoop> loops;
@@ -677,14 +676,14 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
677
676
llvm::Value *allocatedSize = m_builder.CreateLoad (m_builder.getInt64Ty (), listPtr.allocatedSizePtr );
678
677
llvm::Value *size = m_builder.CreateLoad (m_builder.getInt64Ty (), listPtr.sizePtr );
679
678
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 );
683
682
m_builder.CreateCondBr (isAllocated, ifBlock, elseBlock);
684
683
685
684
// If there's enough space, use the allocated memory
686
685
m_builder.SetInsertPoint (ifBlock);
687
- llvm::Value *itemPtr = getListItem (listPtr, size, func );
686
+ llvm::Value *itemPtr = getListItem (listPtr, size);
688
687
createReusedValueStore (arg.second , itemPtr, type);
689
688
m_builder.CreateStore (m_builder.CreateAdd (size, m_builder.getInt64 (1 )), listPtr.sizePtr );
690
689
m_builder.CreateBr (nextBlock);
@@ -748,7 +747,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
748
747
Compiler::StaticType type = optimizeRegisterType (valueArg.second );
749
748
LLVMListPtr &listPtr = m_listPtrs[step.workList ];
750
749
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);
752
751
createValueStore (valueArg.second , itemPtr, type, listPtr.type );
753
752
754
753
auto &typeMap = m_scopeLists.back ();
@@ -778,7 +777,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
778
777
const auto &arg = step.args [0 ];
779
778
const LLVMListPtr &listPtr = m_listPtrs[step.workList ];
780
779
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);
782
781
step.functionReturnReg ->setType (listPtr.type );
783
782
break ;
784
783
}
@@ -795,28 +794,28 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
795
794
assert (step.args .size () == 1 );
796
795
const auto &arg = step.args [0 ];
797
796
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 ());
799
798
break ;
800
799
}
801
800
802
801
case LLVMInstruction::Type::ListContainsItem: {
803
802
assert (step.args .size () == 1 );
804
803
const auto &arg = step.args [0 ];
805
804
const LLVMListPtr &listPtr = m_listPtrs[step.workList ];
806
- llvm::Value *index = getListItemIndex (listPtr, arg.second , func );
805
+ llvm::Value *index = getListItemIndex (listPtr, arg.second );
807
806
step.functionReturnReg ->value = m_builder.CreateICmpSGT (index, llvm::ConstantInt::get (m_builder.getInt64Ty (), -1 , true ));
808
807
break ;
809
808
}
810
809
811
810
case LLVMInstruction::Type::Yield:
812
811
// TODO: Do not allow use after suspend (use after free)
813
- createSuspend (coro.get (), func, warpArg, targetVariables);
812
+ createSuspend (coro.get (), warpArg, targetVariables);
814
813
break ;
815
814
816
815
case LLVMInstruction::Type::BeginIf: {
817
816
LLVMIfStatement statement;
818
817
statement.beforeIf = m_builder.GetInsertBlock ();
819
- statement.body = llvm::BasicBlock::Create (m_llvmCtx, " " , func );
818
+ statement.body = llvm::BasicBlock::Create (m_llvmCtx, " " , m_function );
820
819
821
820
// Use last reg
822
821
assert (step.args .size () == 1 );
@@ -847,13 +846,13 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
847
846
848
847
// Jump to the branch after the if statement
849
848
assert (!statement.afterIf );
850
- statement.afterIf = llvm::BasicBlock::Create (m_llvmCtx, " " , func );
849
+ statement.afterIf = llvm::BasicBlock::Create (m_llvmCtx, " " , m_function );
851
850
freeScopeHeap ();
852
851
m_builder.CreateBr (statement.afterIf );
853
852
854
853
// Create else branch
855
854
assert (!statement.elseBranch );
856
- statement.elseBranch = llvm::BasicBlock::Create (m_llvmCtx, " " , func );
855
+ statement.elseBranch = llvm::BasicBlock::Create (m_llvmCtx, " " , m_function );
857
856
858
857
// Since there's an else branch, the conditional instruction should jump to it
859
858
m_builder.SetInsertPoint (statement.beforeIf );
@@ -871,7 +870,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
871
870
872
871
// Jump to the branch after the if statement
873
872
if (!statement.afterIf )
874
- statement.afterIf = llvm::BasicBlock::Create (m_llvmCtx, " " , func );
873
+ statement.afterIf = llvm::BasicBlock::Create (m_llvmCtx, " " , m_function );
875
874
876
875
m_builder.CreateBr (statement.afterIf );
877
876
@@ -900,9 +899,9 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
900
899
m_builder.CreateStore (zero, loop.index );
901
900
902
901
// 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 );
906
905
907
906
// Use last reg for count
908
907
assert (step.args .size () == 1 );
@@ -928,10 +927,10 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
928
927
// Check index
929
928
m_builder.SetInsertPoint (loop.conditionBranch );
930
929
931
- llvm::BasicBlock *body = llvm::BasicBlock::Create (m_llvmCtx, " " , func );
930
+ llvm::BasicBlock *body = llvm::BasicBlock::Create (m_llvmCtx, " " , m_function );
932
931
933
932
if (!loop.afterLoop )
934
- loop.afterLoop = llvm::BasicBlock::Create (m_llvmCtx, " " , func );
933
+ loop.afterLoop = llvm::BasicBlock::Create (m_llvmCtx, " " , m_function );
935
934
936
935
llvm::Value *currentIndex = m_builder.CreateLoad (m_builder.getInt64Ty (), loop.index );
937
936
comparison = m_builder.CreateOr (isInf, m_builder.CreateICmpULT (currentIndex, count));
@@ -958,8 +957,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
958
957
LLVMLoop &loop = loops.back ();
959
958
960
959
// 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 );
963
962
964
963
// Use last reg
965
964
assert (step.args .size () == 1 );
@@ -979,8 +978,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
979
978
LLVMLoop &loop = loops.back ();
980
979
981
980
// 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 );
984
983
985
984
// Use last reg
986
985
assert (step.args .size () == 1 );
@@ -998,7 +997,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
998
997
case LLVMInstruction::Type::BeginLoopCondition: {
999
998
LLVMLoop loop;
1000
999
loop.isRepeatLoop = false ;
1001
- loop.conditionBranch = llvm::BasicBlock::Create (m_llvmCtx, " " , func );
1000
+ loop.conditionBranch = llvm::BasicBlock::Create (m_llvmCtx, " " , m_function );
1002
1001
m_builder.CreateBr (loop.conditionBranch );
1003
1002
m_builder.SetInsertPoint (loop.conditionBranch );
1004
1003
loops.push_back (loop);
@@ -1030,7 +1029,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
1030
1029
1031
1030
case LLVMInstruction::Type::Stop: {
1032
1031
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 );
1034
1033
m_builder.SetInsertPoint (nextBranch);
1035
1034
break ;
1036
1035
}
@@ -1046,7 +1045,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
1046
1045
std::vector<llvm::Value *> args;
1047
1046
1048
1047
for (size_t i = 0 ; i < m_defaultArgCount; i++)
1049
- args.push_back (func ->getArg (i));
1048
+ args.push_back (m_function ->getArg (i));
1050
1049
1051
1050
// Add warp arg
1052
1051
if (m_warp)
@@ -1065,12 +1064,12 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
1065
1064
llvm::Value *handle = m_builder.CreateCall (resolveFunction (name, type), args);
1066
1065
1067
1066
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 );
1070
1069
m_builder.CreateCondBr (m_builder.CreateIsNull (handle), nextBranch, suspendBranch);
1071
1070
1072
1071
m_builder.SetInsertPoint (suspendBranch);
1073
- createSuspend (coro.get (), func, warpArg, targetVariables);
1072
+ createSuspend (coro.get (), warpArg, targetVariables);
1074
1073
name = getResumeFunctionName (step.procedurePrototype );
1075
1074
llvm::Value *done = m_builder.CreateCall (resolveFunction (name, m_resumeFuncType), { handle });
1076
1075
m_builder.CreateCondBr (done, nextBranch, suspendBranch);
@@ -1085,7 +1084,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
1085
1084
1086
1085
case LLVMInstruction::Type::ProcedureArg: {
1087
1086
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
1089
1088
step.functionReturnReg ->value = arg;
1090
1089
break ;
1091
1090
}
@@ -1107,7 +1106,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
1107
1106
else
1108
1107
coro->end ();
1109
1108
1110
- verifyFunction (func );
1109
+ verifyFunction (m_function );
1111
1110
1112
1111
// Create resume function
1113
1112
// bool resume(void *)
@@ -1126,7 +1125,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
1126
1125
1127
1126
verifyFunction (resumeFunc);
1128
1127
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 ());
1130
1129
}
1131
1130
1132
1131
CompilerValue *LLVMCodeBuilder::addFunctionCall (const std::string &functionName, Compiler::StaticType returnType, const Compiler::ArgTypes &argTypes, const Compiler::Args &args)
@@ -2029,7 +2028,7 @@ void LLVMCodeBuilder::reloadLists()
2029
2028
}
2030
2029
}
2031
2030
2032
- void LLVMCodeBuilder::updateListDataPtr (const LLVMListPtr &listPtr, llvm::Function *func )
2031
+ void LLVMCodeBuilder::updateListDataPtr (const LLVMListPtr &listPtr)
2033
2032
{
2034
2033
// dataPtr = dirty ? list_data(list) : dataPtr
2035
2034
// dirty = false
@@ -2190,21 +2189,21 @@ void LLVMCodeBuilder::copyStructField(llvm::Value *source, llvm::Value *target,
2190
2189
m_builder.CreateStore (m_builder.CreateLoad (fieldType, sourceField), targetField);
2191
2190
}
2192
2191
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)
2194
2193
{
2195
- updateListDataPtr (listPtr, func );
2194
+ updateListDataPtr (listPtr);
2196
2195
return m_builder.CreateGEP (m_valueDataType, m_builder.CreateLoad (m_valueDataType->getPointerTo (), listPtr.dataPtr ), index);
2197
2196
}
2198
2197
2199
- llvm::Value *LLVMCodeBuilder::getListItemIndex (const LLVMListPtr &listPtr, LLVMRegister *item, llvm::Function *func )
2198
+ llvm::Value *LLVMCodeBuilder::getListItemIndex (const LLVMListPtr &listPtr, LLVMRegister *item)
2200
2199
{
2201
2200
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 );
2208
2207
2209
2208
// index = 0
2210
2209
llvm::Value *index = m_builder.CreateAlloca (m_builder.getInt64Ty ());
@@ -2220,7 +2219,7 @@ llvm::Value *LLVMCodeBuilder::getListItemIndex(const LLVMListPtr &listPtr, LLVMR
2220
2219
m_builder.SetInsertPoint (bodyBlock);
2221
2220
LLVMRegister currentItem (listPtr.type );
2222
2221
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));
2224
2223
llvm::Value *cmp = createComparison (¤tItem, item, Comparison::EQ);
2225
2224
m_builder.CreateCondBr (cmp, cmpIfBlock, cmpElseBlock);
2226
2225
@@ -2481,14 +2480,14 @@ llvm::Value *LLVMCodeBuilder::createComparison(LLVMRegister *arg1, LLVMRegister
2481
2480
}
2482
2481
}
2483
2482
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)
2485
2484
{
2486
2485
if (!m_warp) {
2487
2486
llvm::BasicBlock *suspendBranch, *nextBranch;
2488
2487
2489
2488
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 );
2492
2491
m_builder.CreateCondBr (warpArg, nextBranch, suspendBranch);
2493
2492
m_builder.SetInsertPoint (suspendBranch);
2494
2493
}
0 commit comments