github.com/ltltlt/go-source-code@v0.0.0-20190830023027-95be009773aa/cmd/compile/internal/types/sym.go (about) 1 // Copyright 2017 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package types 6 7 import ( 8 "cmd/internal/obj" 9 "cmd/internal/src" 10 ) 11 12 // Sym represents an object name. Most commonly, this is a Go identifier naming 13 // an object declared within a package, but Syms are also used to name internal 14 // synthesized objects. 15 // 16 // As an exception, field and method names that are exported use the Sym 17 // associated with localpkg instead of the package that declared them. This 18 // allows using Sym pointer equality to test for Go identifier uniqueness when 19 // handling selector expressions. 20 type Sym struct { 21 Importdef *Pkg // where imported definition was found 22 Linkname string // link name 23 24 Pkg *Pkg 25 Name string // object name 26 27 // saved and restored by dcopy 28 Def *Node // definition: ONAME OTYPE OPACK or OLITERAL 29 Block int32 // blocknumber to catch redeclaration 30 Lastlineno src.XPos // last declaration for diagnostic 31 32 flags bitset8 33 Label *Node // corresponding label (ephemeral) 34 Origpkg *Pkg // original package for . import 35 } 36 37 const ( 38 symExport = 1 << iota // added to exportlist (no need to add again) 39 symPackage 40 symExported // already written out by export 41 symUniq 42 symSiggen 43 symAsm 44 symAlgGen 45 ) 46 47 func (sym *Sym) Export() bool { return sym.flags&symExport != 0 } 48 func (sym *Sym) Package() bool { return sym.flags&symPackage != 0 } 49 func (sym *Sym) Exported() bool { return sym.flags&symExported != 0 } 50 func (sym *Sym) Uniq() bool { return sym.flags&symUniq != 0 } 51 func (sym *Sym) Siggen() bool { return sym.flags&symSiggen != 0 } 52 func (sym *Sym) Asm() bool { return sym.flags&symAsm != 0 } 53 func (sym *Sym) AlgGen() bool { return sym.flags&symAlgGen != 0 } 54 55 func (sym *Sym) SetExport(b bool) { sym.flags.set(symExport, b) } 56 func (sym *Sym) SetPackage(b bool) { sym.flags.set(symPackage, b) } 57 func (sym *Sym) SetExported(b bool) { sym.flags.set(symExported, b) } 58 func (sym *Sym) SetUniq(b bool) { sym.flags.set(symUniq, b) } 59 func (sym *Sym) SetSiggen(b bool) { sym.flags.set(symSiggen, b) } 60 func (sym *Sym) SetAsm(b bool) { sym.flags.set(symAsm, b) } 61 func (sym *Sym) SetAlgGen(b bool) { sym.flags.set(symAlgGen, b) } 62 63 func (sym *Sym) IsBlank() bool { 64 return sym != nil && sym.Name == "_" 65 } 66 67 func (sym *Sym) LinksymName() string { 68 if sym.IsBlank() { 69 return "_" 70 } 71 if sym.Linkname != "" { 72 return sym.Linkname 73 } 74 return sym.Pkg.Prefix + "." + sym.Name 75 } 76 77 func (sym *Sym) Linksym() *obj.LSym { 78 if sym == nil { 79 return nil 80 } 81 return Ctxt.Lookup(sym.LinksymName()) 82 }