From 25e73a5439da084dc338e7cebb7f398224670219 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Fri, 12 Oct 2018 16:57:17 +0200 Subject: [PATCH] compiler: align and zero-initialize stack allocated values --- compiler/optimizer.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/optimizer.go b/compiler/optimizer.go index 6716a222..0c4f998d 100644 --- a/compiler/optimizer.go +++ b/compiler/optimizer.go @@ -139,9 +139,12 @@ func (c *Compiler) OptimizeAllocs() { // promote it to a SSA value. fn := bitcast.InstructionParent().Parent() c.builder.SetInsertPointBefore(fn.EntryBasicBlock().FirstInstruction()) - allocaType := llvm.ArrayType(llvm.Int8Type(), int(size)) - // TODO: alignment? + alignment := c.targetData.ABITypeAlignment(c.i8ptrType) + sizeInWords := (size + uint64(alignment) - 1) / uint64(alignment) + allocaType := llvm.ArrayType(c.ctx.IntType(alignment*8), int(sizeInWords)) alloca := c.builder.CreateAlloca(allocaType, "stackalloc.alloca") + zero, _ := c.getZeroValue(alloca.Type().ElementType()) + c.builder.CreateStore(zero, alloca) stackalloc := c.builder.CreateBitCast(alloca, bitcast.Type(), "stackalloc") bitcast.ReplaceAllUsesWith(stackalloc) if heapalloc != bitcast {