| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Indexed package import. |
| // See iexport.go for the export data format. |
| |
| package typecheck |
| |
| import ( |
| "cmd/compile/internal/base" |
| "cmd/compile/internal/ir" |
| "cmd/compile/internal/types" |
| ) |
| |
| // HaveInlineBody reports whether we have fn's inline body available |
| // for inlining. |
| // |
| // It's a function literal so that it can be overridden for |
| // GOEXPERIMENT=unified. |
| var HaveInlineBody = func(fn *ir.Func) bool { |
| base.Fatalf("HaveInlineBody not overridden") |
| panic("unreachable") |
| } |
| |
| func SetBaseTypeIndex(t *types.Type, i, pi int64) { |
| if t.Obj() == nil { |
| base.Fatalf("SetBaseTypeIndex on non-defined type %v", t) |
| } |
| if i != -1 && pi != -1 { |
| typeSymIdx[t] = [2]int64{i, pi} |
| } |
| } |
| |
| // Map imported type T to the index of type descriptor symbols of T and *T, |
| // so we can use index to reference the symbol. |
| // TODO(mdempsky): Store this information directly in the Type's Name. |
| var typeSymIdx = make(map[*types.Type][2]int64) |
| |
| func BaseTypeIndex(t *types.Type) int64 { |
| tbase := t |
| if t.IsPtr() && t.Sym() == nil && t.Elem().Sym() != nil { |
| tbase = t.Elem() |
| } |
| i, ok := typeSymIdx[tbase] |
| if !ok { |
| return -1 |
| } |
| if t != tbase { |
| return i[1] |
| } |
| return i[0] |
| } |