Implement constant slice

It's used somewhere in the sync package, but I'm not sure where.
This commit is contained in:
Ayke van Laethem
2018-08-25 02:58:59 +02:00
parent 9f2bcfe5e3
commit c9e6a52d05
+16
View File
@@ -1964,6 +1964,22 @@ func (c *Compiler) parseConst(expr *ssa.Const) (llvm.Value, error) {
return llvm.Value{}, err
}
return llvm.ConstPointerNull(llvmType), nil
case *types.Slice:
if expr.Value != nil {
return llvm.Value{}, errors.New("non-nil slice constant")
}
elemType, err := c.getLLVMType(typ.Elem())
if err != nil {
return llvm.Value{}, err
}
llvmPtr := llvm.ConstPointerNull(llvm.PointerType(elemType, 0))
llvmLen := llvm.ConstInt(c.lenType, 0, false)
slice := llvm.ConstStruct([]llvm.Value{
llvmPtr, // backing array
llvmLen, // len
llvmLen, // cap
}, false)
return slice, nil
default:
return llvm.Value{}, errors.New("todo: unknown constant: " + expr.String())
}