loader: fix linkname in test binaries
This is an issue in particular in the math package, of which most functions are defined in the runtime package.
Этот коммит содержится в:
родитель
ec54e7763d
коммит
7b601b3e3c
1 изменённых файлов: 36 добавлений и 7 удалений
|
@ -51,8 +51,7 @@ type PackageJSON struct {
|
||||||
CFiles []string
|
CFiles []string
|
||||||
|
|
||||||
// Dependency information
|
// Dependency information
|
||||||
Imports []string
|
Imports []string
|
||||||
ImportMap map[string]string
|
|
||||||
|
|
||||||
// Error information
|
// Error information
|
||||||
Error *struct {
|
Error *struct {
|
||||||
|
@ -169,6 +168,41 @@ func Load(config *compileopts.Config, inputPkgs []string, clangHeaders string, t
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if config.TestConfig.CompileTestBinary {
|
||||||
|
// When creating a test binary, `go list` will list two or three
|
||||||
|
// packages used for testing the package. The first is the original
|
||||||
|
// package as if it were built normally, the second is the same
|
||||||
|
// package but with the *_test.go files included. A possible third
|
||||||
|
// may be included for _test packages (such as math_test), used to
|
||||||
|
// test the external API with no access to internal functions.
|
||||||
|
// All packages that are necessary for testing (including the to be
|
||||||
|
// tested package with *_test.go files, but excluding the original
|
||||||
|
// unmodified package) have a suffix added to the import path, for
|
||||||
|
// example the math package has import path "math [math.test]" and
|
||||||
|
// test dependencies such as fmt will have an import path of the
|
||||||
|
// form "fmt [math.test]".
|
||||||
|
// The code below removes this suffix, and if this results in a
|
||||||
|
// duplicate (which happens with the to-be-tested package without
|
||||||
|
// *.test.go files) the previous package is removed from the list of
|
||||||
|
// packages included in this build.
|
||||||
|
// This is necessary because the change in import paths results in
|
||||||
|
// breakage to //go:linkname. Additionally, the duplicated package
|
||||||
|
// slows down the build and so is best removed.
|
||||||
|
if pkg.ForTest != "" && strings.HasSuffix(pkg.ImportPath, " ["+pkg.ForTest+".test]") {
|
||||||
|
newImportPath := pkg.ImportPath[:len(pkg.ImportPath)-len(" ["+pkg.ForTest+".test]")]
|
||||||
|
if _, ok := p.Packages[newImportPath]; ok {
|
||||||
|
// Delete the previous package (that this package overrides).
|
||||||
|
delete(p.Packages, newImportPath)
|
||||||
|
for i, pkg := range p.sorted {
|
||||||
|
if pkg.ImportPath == newImportPath {
|
||||||
|
p.sorted = append(p.sorted[:i], p.sorted[i+1:]...) // remove element from slice
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pkg.ImportPath = newImportPath
|
||||||
|
}
|
||||||
|
}
|
||||||
p.sorted = append(p.sorted, pkg)
|
p.sorted = append(p.sorted, pkg)
|
||||||
p.Packages[pkg.ImportPath] = pkg
|
p.Packages[pkg.ImportPath] = pkg
|
||||||
}
|
}
|
||||||
|
@ -367,11 +401,6 @@ func (p *Package) Import(to string) (*types.Package, error) {
|
||||||
if to == "unsafe" {
|
if to == "unsafe" {
|
||||||
return types.Unsafe, nil
|
return types.Unsafe, nil
|
||||||
}
|
}
|
||||||
if replace, ok := p.ImportMap[to]; ok {
|
|
||||||
// This import path should be replaced by another import path, according
|
|
||||||
// to `go list`.
|
|
||||||
to = replace
|
|
||||||
}
|
|
||||||
if imported, ok := p.program.Packages[to]; ok {
|
if imported, ok := p.program.Packages[to]; ok {
|
||||||
return imported.Pkg, nil
|
return imported.Pkg, nil
|
||||||
} else {
|
} else {
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче