@@ -31,8 +31,14 @@ LLVMCodeBuilder::LLVMCodeBuilder(const std::string &id) :
3131
3232std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize ()
3333{
34- size_t functionIndex = 0 ;
35- llvm::Function *currentFunc = beginFunction (functionIndex);
34+ // Create function
35+ // void f(Target *)
36+ llvm::FunctionType *funcType = llvm::FunctionType::get (m_builder.getVoidTy (), llvm::PointerType::get (llvm::Type::getInt8Ty (m_ctx), 0 ), false );
37+ llvm::Function *func = llvm::Function::Create (funcType, llvm::Function::ExternalLinkage, " f" , m_module.get ());
38+
39+ llvm::BasicBlock *entry = llvm::BasicBlock::Create (m_ctx, " entry" , func);
40+ m_builder.SetInsertPoint (entry);
41+
3642 std::vector<IfStatement> ifStatements;
3743 std::vector<Loop> loops;
3844 m_heap.clear ();
@@ -45,9 +51,9 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
4551 std::vector<llvm::Value *> args;
4652
4753 // Add target pointer arg
48- assert (currentFunc ->arg_size () == 1 );
54+ assert (func ->arg_size () == 1 );
4955 types.push_back (llvm::PointerType::get (llvm::Type::getInt8Ty (m_ctx), 0 ));
50- args.push_back (currentFunc ->getArg (0 ));
56+ args.push_back (func ->getArg (0 ));
5157
5258 // Args
5359 for (auto &arg : step.args ) {
@@ -69,14 +75,13 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
6975
7076 case Step::Type::Yield:
7177 freeHeap ();
72- endFunction (currentFunc, functionIndex);
73- currentFunc = beginFunction (++functionIndex);
78+ // TODO: Implement yielding
7479 break ;
7580
7681 case Step::Type::BeginIf: {
7782 IfStatement statement;
7883 statement.beforeIf = m_builder.GetInsertBlock ();
79- statement.body = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
84+ statement.body = llvm::BasicBlock::Create (m_ctx, " " , func );
8085
8186 // Use last reg
8287 assert (step.args .size () == 1 );
@@ -98,13 +103,13 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
98103
99104 // Jump to the branch after the if statement
100105 assert (!statement.afterIf );
101- statement.afterIf = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
106+ statement.afterIf = llvm::BasicBlock::Create (m_ctx, " " , func );
102107 freeHeap ();
103108 m_builder.CreateBr (statement.afterIf );
104109
105110 // Create else branch
106111 assert (!statement.elseBranch );
107- statement.elseBranch = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
112+ statement.elseBranch = llvm::BasicBlock::Create (m_ctx, " " , func );
108113
109114 // Since there's an else branch, the conditional instruction should jump to it
110115 m_builder.SetInsertPoint (statement.beforeIf );
@@ -121,7 +126,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
121126
122127 // Jump to the branch after the if statement
123128 if (!statement.afterIf )
124- statement.afterIf = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
129+ statement.afterIf = llvm::BasicBlock::Create (m_ctx, " " , func );
125130
126131 freeHeap ();
127132 m_builder.CreateBr (statement.afterIf );
@@ -150,9 +155,9 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
150155 m_builder.CreateStore (zero, loop.index );
151156
152157 // Create branches
153- llvm::BasicBlock *roundBranch = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
154- loop.conditionBranch = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
155- loop.afterLoop = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
158+ llvm::BasicBlock *roundBranch = llvm::BasicBlock::Create (m_ctx, " " , func );
159+ loop.conditionBranch = llvm::BasicBlock::Create (m_ctx, " " , func );
160+ loop.afterLoop = llvm::BasicBlock::Create (m_ctx, " " , func );
156161
157162 // Use last reg for count
158163 assert (step.args .size () == 1 );
@@ -177,10 +182,10 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
177182 // Check index
178183 m_builder.SetInsertPoint (loop.conditionBranch );
179184
180- llvm::BasicBlock *body = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
185+ llvm::BasicBlock *body = llvm::BasicBlock::Create (m_ctx, " " , func );
181186
182187 if (!loop.afterLoop )
183- loop.afterLoop = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
188+ loop.afterLoop = llvm::BasicBlock::Create (m_ctx, " " , func );
184189
185190 llvm::Value *currentIndex = m_builder.CreateLoad (m_builder.getInt64Ty (), loop.index );
186191 comparison = m_builder.CreateICmpULT (currentIndex, count);
@@ -198,8 +203,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
198203 Loop &loop = loops.back ();
199204
200205 // Create branches
201- llvm::BasicBlock *body = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
202- loop.afterLoop = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
206+ llvm::BasicBlock *body = llvm::BasicBlock::Create (m_ctx, " " , func );
207+ loop.afterLoop = llvm::BasicBlock::Create (m_ctx, " " , func );
203208
204209 // Use last reg
205210 assert (step.args .size () == 1 );
@@ -219,8 +224,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
219224 Loop &loop = loops.back ();
220225
221226 // Create branches
222- llvm::BasicBlock *body = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
223- loop.afterLoop = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
227+ llvm::BasicBlock *body = llvm::BasicBlock::Create (m_ctx, " " , func );
228+ loop.afterLoop = llvm::BasicBlock::Create (m_ctx, " " , func );
224229
225230 // Use last reg
226231 assert (step.args .size () == 1 );
@@ -238,7 +243,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
238243 case Step::Type::BeginLoopCondition: {
239244 Loop loop;
240245 loop.isRepeatLoop = false ;
241- loop.conditionBranch = llvm::BasicBlock::Create (m_ctx, " " , currentFunc );
246+ loop.conditionBranch = llvm::BasicBlock::Create (m_ctx, " " , func );
242247 freeHeap ();
243248 m_builder.CreateBr (loop.conditionBranch );
244249 m_builder.SetInsertPoint (loop.conditionBranch );
@@ -272,7 +277,19 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
272277
273278 freeHeap ();
274279
275- endFunction (currentFunc, functionIndex);
280+ // End and verify the function
281+ if (!m_tmpRegs.empty ()) {
282+ std::cout
283+ << " warning: " << m_tmpRegs.size () << " registers were leaked by script '" << m_module->getName ().str () << " ', function '" << func->getName ().str ()
284+ << " ' (if you see this as a regular user, this is a bug and should be reported)" << std::endl;
285+ }
286+
287+ m_builder.CreateRetVoid ();
288+
289+ if (llvm::verifyFunction (*func, &llvm::errs ())) {
290+ llvm::errs () << " error: LLVM function verficiation failed!\n " ;
291+ llvm::errs () << " script hat ID: " << m_id << " \n " ;
292+ }
276293
277294#ifdef PRINT_LLVM_IR
278295 std::cout << std::endl << " === LLVM IR (" << m_module->getName ().str () << " ) ===" << std::endl;
@@ -414,36 +431,6 @@ void LLVMCodeBuilder::initTypes()
414431 m_valueDataType->setBody ({ unionType, valueType, sizeType });
415432}
416433
417- llvm::Function *LLVMCodeBuilder::beginFunction (size_t index)
418- {
419- // size_t f#(Target *)
420- llvm::FunctionType *funcType = llvm::FunctionType::get (m_builder.getInt64Ty (), llvm::PointerType::get (llvm::Type::getInt8Ty (m_ctx), 0 ), false );
421- llvm::Function *func = llvm::Function::Create (funcType, llvm::Function::ExternalLinkage, " f" + std::to_string (index), m_module.get ());
422-
423- llvm::BasicBlock *entry = llvm::BasicBlock::Create (m_ctx, " entry" , func);
424- m_builder.SetInsertPoint (entry);
425-
426- return func;
427- }
428-
429- void LLVMCodeBuilder::endFunction (llvm::Function *func, size_t index)
430- {
431- if (!m_tmpRegs.empty ()) {
432- std::cout
433- << " warning: " << m_tmpRegs.size () << " registers were leaked by script '" << m_module->getName ().str () << " ', function '" << func->getName ().str ()
434- << " ' (if you see this as a regular user, this is a bug and should be reported)" << std::endl;
435- }
436-
437- // Return next function index
438- m_builder.CreateRet (m_builder.getInt64 (index + 1 ));
439-
440- if (llvm::verifyFunction (*func, &llvm::errs ())) {
441- llvm::errs () << " error: LLVM function verficiation failed!\n " ;
442- llvm::errs () << " script hat ID: " << m_id << " \n " ;
443- llvm::errs () << " function name: " << func->getName ().data () << " \n " ;
444- }
445- }
446-
447434void LLVMCodeBuilder::freeHeap ()
448435{
449436 // Free dynamically allocated memory
0 commit comments