func (tm *TypeMap) chanRuntimeType(c *types.Chan) (global, ptr llvm.Value) { rtype := tm.makeRtype(c, reflect.Chan) chanType := llvm.ConstNull(tm.runtimeChanType) chanType = llvm.ConstInsertValue(chanType, rtype, []uint32{0}) chanType = llvm.ConstInsertValue(chanType, tm.ToRuntime(c.Elem()), []uint32{1}) // go/ast and reflect disagree on values for direction. var dir reflect.ChanDir if c.Dir()&ast.SEND != 0 { dir = reflect.SendDir } if c.Dir()&ast.RECV != 0 { dir |= reflect.RecvDir } uintptrdir := llvm.ConstInt(tm.target.IntPtrType(), uint64(dir), false) chanType = llvm.ConstInsertValue(chanType, uintptrdir, []uint32{2}) return tm.makeRuntimeTypeGlobal(chanType) }
func (tm *TypeMap) chanRuntimeType(c *types.Chan) (global, ptr llvm.Value) { rtype := tm.makeRtype(c, reflect.Chan) chanType := llvm.ConstNull(tm.runtime.chanType.llvm) chanType = llvm.ConstInsertValue(chanType, rtype, []uint32{0}) chanType = llvm.ConstInsertValue(chanType, tm.ToRuntime(c.Elem()), []uint32{1}) // go/ast and reflect disagree on values for direction. var dir reflect.ChanDir switch c.Dir() { case types.SendOnly: dir = reflect.SendDir case types.RecvOnly: dir = reflect.RecvDir case types.SendRecv: dir = reflect.SendDir | reflect.RecvDir } uintptrdir := llvm.ConstInt(tm.target.IntPtrType(), uint64(dir), false) chanType = llvm.ConstInsertValue(chanType, uintptrdir, []uint32{2}) return tm.makeRuntimeTypeGlobal(chanType, typeString(c)) }