@@ -562,7 +562,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
562562 break ;
563563 }
564564
565- step.functionReturnReg ->value = m_builder. CreateAlloca (type);
565+ step.functionReturnReg ->value = addAlloca (type);
566566 break ;
567567 }
568568
@@ -895,7 +895,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
895895
896896 // index = 0
897897 llvm::Constant *zero = llvm::ConstantInt::get (m_builder.getInt64Ty (), 0 , true );
898- loop.index = m_builder. CreateAlloca (m_builder.getInt64Ty ());
898+ loop.index = addAlloca (m_builder.getInt64Ty ());
899899 m_builder.CreateStore (zero, loop.index );
900900
901901 // Create branches
@@ -1718,6 +1718,16 @@ LLVMRegister *LLVMCodeBuilder::addReg(std::shared_ptr<LLVMRegister> reg)
17181718 return reg.get ();
17191719}
17201720
1721+ llvm::Value *LLVMCodeBuilder::addAlloca (llvm::Type *type)
1722+ {
1723+ // Add an alloca to the entry block because allocas must be there (to avoid stack overflow)
1724+ llvm::BasicBlock *block = m_builder.GetInsertBlock ();
1725+ m_builder.SetInsertPointPastAllocas (m_function);
1726+ llvm::Value *ret = m_builder.CreateAlloca (type);
1727+ m_builder.SetInsertPoint (block);
1728+ return ret;
1729+ }
1730+
17211731void LLVMCodeBuilder::freeLater (llvm::Value *value)
17221732{
17231733 assert (!m_heap.empty ());
@@ -2206,7 +2216,7 @@ llvm::Value *LLVMCodeBuilder::getListItemIndex(const LLVMListPtr &listPtr, LLVMR
22062216 llvm::BasicBlock *nextBlock = llvm::BasicBlock::Create (m_llvmCtx, " " , m_function);
22072217
22082218 // index = 0
2209- llvm::Value *index = m_builder. CreateAlloca (m_builder.getInt64Ty ());
2219+ llvm::Value *index = addAlloca (m_builder.getInt64Ty ());
22102220 m_builder.CreateStore (m_builder.getInt64 (0 ), index);
22112221 m_builder.CreateBr (condBlock);
22122222
@@ -2250,7 +2260,7 @@ llvm::Value *LLVMCodeBuilder::createValue(LLVMRegister *reg)
22502260 if (reg->isConst ()) {
22512261 // Create a constant ValueData instance and store it
22522262 llvm::Constant *value = castConstValue (reg->constValue (), TYPE_MAP[reg->constValue ().type ()]);
2253- llvm::Value *ret = m_builder. CreateAlloca (m_valueDataType);
2263+ llvm::Value *ret = addAlloca (m_valueDataType);
22542264
22552265 switch (reg->constValue ().type ()) {
22562266 case ValueType::Number:
@@ -2279,7 +2289,7 @@ llvm::Value *LLVMCodeBuilder::createValue(LLVMRegister *reg)
22792289 return ret;
22802290 } else if (reg->isRawValue ) {
22812291 llvm::Value *value = castRawValue (reg, reg->type ());
2282- llvm::Value *ret = m_builder. CreateAlloca (m_valueDataType);
2292+ llvm::Value *ret = addAlloca (m_valueDataType);
22832293
22842294 // Store value
22852295 llvm::Value *valueField = m_builder.CreateStructGEP (m_valueDataType, ret, 0 );
0 commit comments