mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-16 02:33:28 +00:00
builder: add testing for -size=full
This helps to make sure this feature continues to work and we won't accidentally introduce regressions.
This commit is contained in:
committed by
Ron Evans
parent
ca80c52df1
commit
ee6fcd76f4
+11
-5
@@ -61,6 +61,10 @@ type BuildResult struct {
|
|||||||
// correctly printing test results: the import path isn't always the same as
|
// correctly printing test results: the import path isn't always the same as
|
||||||
// the path listed on the command line.
|
// the path listed on the command line.
|
||||||
ImportPath string
|
ImportPath string
|
||||||
|
|
||||||
|
// Map from path to package name. It is needed to attribute binary size to
|
||||||
|
// the right Go package.
|
||||||
|
PackagePathMap map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// packageAction is the struct that is serialized to JSON and hashed, to work as
|
// packageAction is the struct that is serialized to JSON and hashed, to work as
|
||||||
@@ -242,6 +246,12 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe
|
|||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Store which filesystem paths map to which package name.
|
||||||
|
result.PackagePathMap = make(map[string]string, len(lprogram.Packages))
|
||||||
|
for _, pkg := range lprogram.Sorted() {
|
||||||
|
result.PackagePathMap[pkg.OriginalDir()] = pkg.Pkg.Path()
|
||||||
|
}
|
||||||
|
|
||||||
// Create the *ssa.Program. This does not yet build the entire SSA of the
|
// Create the *ssa.Program. This does not yet build the entire SSA of the
|
||||||
// program so it's pretty fast and doesn't need to be parallelized.
|
// program so it's pretty fast and doesn't need to be parallelized.
|
||||||
program := lprogram.LoadSSA()
|
program := lprogram.LoadSSA()
|
||||||
@@ -916,11 +926,7 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe
|
|||||||
|
|
||||||
// Print code size if requested.
|
// Print code size if requested.
|
||||||
if config.Options.PrintSizes == "short" || config.Options.PrintSizes == "full" {
|
if config.Options.PrintSizes == "short" || config.Options.PrintSizes == "full" {
|
||||||
packagePathMap := make(map[string]string, len(lprogram.Packages))
|
sizes, err := loadProgramSize(result.Executable, result.PackagePathMap)
|
||||||
for _, pkg := range lprogram.Sorted() {
|
|
||||||
packagePathMap[pkg.OriginalDir()] = pkg.Pkg.Path()
|
|
||||||
}
|
|
||||||
sizes, err := loadProgramSize(result.Executable, packagePathMap)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
+68
-20
@@ -1,6 +1,7 @@
|
|||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@@ -55,26 +56,7 @@ func TestBinarySize(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
// Build the binary.
|
// Build the binary.
|
||||||
options := compileopts.Options{
|
result := buildBinary(t, tc.target, tc.path)
|
||||||
Target: tc.target,
|
|
||||||
Opt: "z",
|
|
||||||
Semaphore: sema,
|
|
||||||
InterpTimeout: 60 * time.Second,
|
|
||||||
Debug: true,
|
|
||||||
VerifyIR: true,
|
|
||||||
}
|
|
||||||
target, err := compileopts.LoadTarget(&options)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("could not load target:", err)
|
|
||||||
}
|
|
||||||
config := &compileopts.Config{
|
|
||||||
Options: &options,
|
|
||||||
Target: target,
|
|
||||||
}
|
|
||||||
result, err := Build(tc.path, "", t.TempDir(), config)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("could not build:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check whether the size of the binary matches the expected size.
|
// Check whether the size of the binary matches the expected size.
|
||||||
sizes, err := loadProgramSize(result.Executable, nil)
|
sizes, err := loadProgramSize(result.Executable, nil)
|
||||||
@@ -90,3 +72,69 @@ func TestBinarySize(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check that the -size=full flag attributes binary size to the correct package
|
||||||
|
// without filesystem paths and things like that.
|
||||||
|
func TestSizeFull(t *testing.T) {
|
||||||
|
tests := []string{
|
||||||
|
"microbit",
|
||||||
|
"wasip1",
|
||||||
|
}
|
||||||
|
|
||||||
|
libMatch := regexp.MustCompile(`^C [a-z -]+$`) // example: "C interrupt vector"
|
||||||
|
pkgMatch := regexp.MustCompile(`^[a-z/]+$`) // example: "internal/task"
|
||||||
|
|
||||||
|
for _, target := range tests {
|
||||||
|
target := target
|
||||||
|
t.Run(target, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
// Build the binary.
|
||||||
|
result := buildBinary(t, target, "examples/serial")
|
||||||
|
|
||||||
|
// Check whether the binary doesn't contain any unexpected package
|
||||||
|
// names.
|
||||||
|
sizes, err := loadProgramSize(result.Executable, result.PackagePathMap)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("could not read program size:", err)
|
||||||
|
}
|
||||||
|
for _, pkg := range sizes.sortedPackageNames() {
|
||||||
|
if pkg == "(padding)" || pkg == "(unknown)" {
|
||||||
|
// TODO: correctly attribute all unknown binary size.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if libMatch.MatchString(pkg) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if pkgMatch.MatchString(pkg) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
t.Error("unexpected package name in size output:", pkg)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildBinary(t *testing.T, targetString, pkgName string) BuildResult {
|
||||||
|
options := compileopts.Options{
|
||||||
|
Target: targetString,
|
||||||
|
Opt: "z",
|
||||||
|
Semaphore: sema,
|
||||||
|
InterpTimeout: 60 * time.Second,
|
||||||
|
Debug: true,
|
||||||
|
VerifyIR: true,
|
||||||
|
}
|
||||||
|
target, err := compileopts.LoadTarget(&options)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("could not load target:", err)
|
||||||
|
}
|
||||||
|
config := &compileopts.Config{
|
||||||
|
Options: &options,
|
||||||
|
Target: target,
|
||||||
|
}
|
||||||
|
result, err := Build(pkgName, "", t.TempDir(), config)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("could not build:", err)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user