Ctxt.DiagFunc = yyerror
Ctxt.Bso = bufio.NewWriter(os.Stdout)
- localpkg = types.NewPkg("")
+ localpkg = types.NewPkg("", "")
localpkg.Prefix = "\"\""
// pseudo-package, for scoping
- builtinpkg = types.NewPkg("go.builtin")
- builtinpkg.Prefix = "go.builtin" // not go%2ebuiltin
+ builtinpkg = types.NewPkg("go.builtin", "") // TODO(gri) name this package go.builtin?
+ builtinpkg.Prefix = "go.builtin" // not go%2ebuiltin
// pseudo-package, accessed by import "unsafe"
- unsafepkg = types.NewPkg("unsafe")
- unsafepkg.Name = "unsafe"
+ unsafepkg = types.NewPkg("unsafe", "unsafe")
// Pseudo-package that contains the compiler's builtin
// declarations for package runtime. These are declared in a
// separate package to avoid conflicts with package runtime's
// actual declarations, which may differ intentionally but
// insignificantly.
- Runtimepkg = types.NewPkg("go.runtime")
- Runtimepkg.Name = "runtime"
+ Runtimepkg = types.NewPkg("go.runtime", "runtime")
Runtimepkg.Prefix = "runtime"
// pseudo-packages used in symbol tables
- itabpkg = types.NewPkg("go.itab")
- itabpkg.Name = "go.itab"
+ itabpkg = types.NewPkg("go.itab", "go.itab")
itabpkg.Prefix = "go.itab" // not go%2eitab
- itablinkpkg = types.NewPkg("go.itablink")
- itablinkpkg.Name = "go.itablink"
+ itablinkpkg = types.NewPkg("go.itablink", "go.itablink")
itablinkpkg.Prefix = "go.itablink" // not go%2eitablink
- trackpkg = types.NewPkg("go.track")
- trackpkg.Name = "go.track"
+ trackpkg = types.NewPkg("go.track", "go.track")
trackpkg.Prefix = "go.track" // not go%2etrack
- typepkg = types.NewPkg("type")
- typepkg.Name = "type"
+ typepkg = types.NewPkg("type", "type")
// pseudo-package used for map zero values
- mappkg = types.NewPkg("go.map")
- mappkg.Name = "go.map"
+ mappkg = types.NewPkg("go.map", "go.map")
mappkg.Prefix = "go.map"
Nacl = objabi.GOOS == "nacl"
startProfile()
if flag_race {
- racepkg = types.NewPkg("runtime/race")
- racepkg.Name = "race"
+ racepkg = types.NewPkg("runtime/race", "race")
}
if flag_msan {
- msanpkg = types.NewPkg("runtime/msan")
- msanpkg.Name = "msan"
+ msanpkg = types.NewPkg("runtime/msan", "msan")
}
if flag_race && flag_msan {
log.Fatal("cannot use both -race and -msan")
errorexit()
}
- importpkg := types.NewPkg(path_)
+ importpkg := types.NewPkg(path_, "")
if importpkg.Imported {
return importpkg
}
import (
"cmd/internal/obj"
"cmd/internal/objabi"
+ "fmt"
)
type Pkg struct {
- Name string // package name, e.g. "sys"
Path string // string literal used in import statement, e.g. "runtime/internal/sys"
+ Name string // package name, e.g. "sys"
Pathsym *obj.LSym
Prefix string // escaped path for use in symbol table
Imported bool // export data of this package was parsed
var PkgMap = make(map[string]*Pkg)
var PkgList []*Pkg
-func NewPkg(path string) *Pkg {
+// NewPkg returns a new Pkg for the given package path and name.
+// Unless name is the empty string, if the package exists already,
+// the existing package name and the provided name must match.
+func NewPkg(path, name string) *Pkg {
if p := PkgMap[path]; p != nil {
+ if name != "" && p.Name != name {
+ panic(fmt.Sprintf("conflicting package names %s and %s for path %q", p.Name, name, path))
+ }
return p
}
p := new(Pkg)
p.Path = path
+ p.Name = name
p.Prefix = objabi.PathToPrefix(path)
p.Syms = make(map[string]*Sym)
PkgMap[path] = p
PkgList = append(PkgList, p)
+
return p
}