From c9e6a52d0578bb1cba1e53afc29a41f08d04d125 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sat, 25 Aug 2018 02:58:59 +0200 Subject: [PATCH] Implement constant slice It's used somewhere in the sync package, but I'm not sure where. --- compiler.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/compiler.go b/compiler.go index 637bb82c..d9cf4dfa 100644 --- a/compiler.go +++ b/compiler.go @@ -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()) }