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  }