compiler: align and zero-initialize stack allocated values
Этот коммит содержится в:
родитель
2917347ff5
коммит
25e73a5439
1 изменённых файлов: 5 добавлений и 2 удалений
|
@ -139,9 +139,12 @@ func (c *Compiler) OptimizeAllocs() {
|
||||||
// promote it to a SSA value.
|
// promote it to a SSA value.
|
||||||
fn := bitcast.InstructionParent().Parent()
|
fn := bitcast.InstructionParent().Parent()
|
||||||
c.builder.SetInsertPointBefore(fn.EntryBasicBlock().FirstInstruction())
|
c.builder.SetInsertPointBefore(fn.EntryBasicBlock().FirstInstruction())
|
||||||
allocaType := llvm.ArrayType(llvm.Int8Type(), int(size))
|
alignment := c.targetData.ABITypeAlignment(c.i8ptrType)
|
||||||
// TODO: alignment?
|
sizeInWords := (size + uint64(alignment) - 1) / uint64(alignment)
|
||||||
|
allocaType := llvm.ArrayType(c.ctx.IntType(alignment*8), int(sizeInWords))
|
||||||
alloca := c.builder.CreateAlloca(allocaType, "stackalloc.alloca")
|
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")
|
stackalloc := c.builder.CreateBitCast(alloca, bitcast.Type(), "stackalloc")
|
||||||
bitcast.ReplaceAllUsesWith(stackalloc)
|
bitcast.ReplaceAllUsesWith(stackalloc)
|
||||||
if heapalloc != bitcast {
|
if heapalloc != bitcast {
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче