Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d587ec22 authored by Jeffrey Vander Stoep's avatar Jeffrey Vander Stoep Committed by Gerrit Code Review
Browse files

Merge changes from topic "rust_benchmark"

* changes:
  Attach rust_benchmark to atest and tradefed.
  Add rust_benchmark module to soong.
parents c11f2699 546ccd56
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ bootstrap_go_package {
    ],
    srcs: [
        "androidmk.go",
        "benchmark.go",
        "binary.go",
        "bindgen.go",
        "builder.go",
@@ -35,6 +36,7 @@ bootstrap_go_package {
        "testing.go",
    ],
    testSrcs: [
        "benchmark_test.go",
        "binary_test.go",
        "bindgen_test.go",
        "builder_test.go",
+14 −0
Original line number Diff line number Diff line
@@ -107,6 +107,20 @@ func (test *testDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidM
	cc.AndroidMkWriteTestData(test.data, ret)
}

func (benchmark *benchmarkDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
	benchmark.binaryDecorator.AndroidMk(ctx, ret)
	ret.Class = "NATIVE_TESTS"
	ret.ExtraEntries = append(ret.ExtraEntries,
		func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
			entries.AddCompatibilityTestSuites(benchmark.Properties.Test_suites...)
			if benchmark.testConfig != nil {
				entries.SetString("LOCAL_FULL_TEST_CONFIG", benchmark.testConfig.String())
			}
			entries.SetBool("LOCAL_NATIVE_BENCHMARK", true)
			entries.SetBoolIfTrue("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", !BoolDefault(benchmark.Properties.Auto_gen_config, true))
		})
}

func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
	ctx.SubAndroidMk(ret, library.baseCompiler)

rust/benchmark.go

0 → 100644
+129 −0
Original line number Diff line number Diff line
// Copyright 2020 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package rust

import (
	"android/soong/android"
	"android/soong/tradefed"
)

type BenchmarkProperties struct {
	// Disables the creation of a test-specific directory when used with
	// relative_install_path. Useful if several tests need to be in the same
	// directory, but test_per_src doesn't work.
	No_named_install_directory *bool

	// the name of the test configuration (for example "AndroidBenchmark.xml") that should be
	// installed with the module.
	Test_config *string `android:"path,arch_variant"`

	// the name of the test configuration template (for example "AndroidBenchmarkTemplate.xml") that
	// should be installed with the module.
	Test_config_template *string `android:"path,arch_variant"`

	// list of compatibility suites (for example "cts", "vts") that the module should be
	// installed into.
	Test_suites []string `android:"arch_variant"`

	// Flag to indicate whether or not to create test config automatically. If AndroidTest.xml
	// doesn't exist next to the Android.bp, this attribute doesn't need to be set to true
	// explicitly.
	Auto_gen_config *bool
}

type benchmarkDecorator struct {
	*binaryDecorator
	Properties BenchmarkProperties
	testConfig android.Path
}

func NewRustBenchmark(hod android.HostOrDeviceSupported) (*Module, *benchmarkDecorator) {
	// Build both 32 and 64 targets for device benchmarks.
	// Cannot build both for host benchmarks yet if the benchmark depends on
	// something like proc-macro2 that cannot be built for both.
	multilib := android.MultilibBoth
	if hod != android.DeviceSupported && hod != android.HostAndDeviceSupported {
		multilib = android.MultilibFirst
	}
	module := newModule(hod, multilib)

	benchmark := &benchmarkDecorator{
		binaryDecorator: &binaryDecorator{
			baseCompiler: NewBaseCompiler("nativebench", "nativebench64", InstallInData),
		},
	}

	module.compiler = benchmark
	module.AddProperties(&benchmark.Properties)
	return module, benchmark
}

func init() {
	android.RegisterModuleType("rust_benchmark", RustBenchmarkFactory)
	android.RegisterModuleType("rust_benchmark_host", RustBenchmarkHostFactory)
}

func RustBenchmarkFactory() android.Module {
	module, _ := NewRustBenchmark(android.HostAndDeviceSupported)
	return module.Init()
}

func RustBenchmarkHostFactory() android.Module {
	module, _ := NewRustBenchmark(android.HostSupported)
	return module.Init()
}

func (benchmark *benchmarkDecorator) autoDep(ctx android.BottomUpMutatorContext) autoDep {
	return rlibAutoDep
}

func (benchmark *benchmarkDecorator) stdLinkage(ctx *depsContext) RustLinkage {
	return RlibLinkage
}

func (benchmark *benchmarkDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags {
	flags = benchmark.binaryDecorator.compilerFlags(ctx, flags)
	return flags
}

func (benchmark *benchmarkDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps {
	deps = benchmark.binaryDecorator.compilerDeps(ctx, deps)

	deps.Rustlibs = append(deps.Rustlibs, "libcriterion")

	return deps
}

func (benchmark *benchmarkDecorator) compilerProps() []interface{} {
	return append(benchmark.binaryDecorator.compilerProps(), &benchmark.Properties)
}

func (benchmark *benchmarkDecorator) install(ctx ModuleContext) {
	benchmark.testConfig = tradefed.AutoGenRustBenchmarkConfig(ctx,
		benchmark.Properties.Test_config,
		benchmark.Properties.Test_config_template,
		benchmark.Properties.Test_suites,
		nil,
		benchmark.Properties.Auto_gen_config)

	// default relative install path is module name
	if !Bool(benchmark.Properties.No_named_install_directory) {
		benchmark.baseCompiler.relative = ctx.ModuleName()
	} else if String(benchmark.baseCompiler.Properties.Relative_install_path) == "" {
		ctx.PropertyErrorf("no_named_install_directory", "Module install directory may only be disabled if relative_install_path is set")
	}

	benchmark.binaryDecorator.install(ctx)
}

rust/benchmark_test.go

0 → 100644
+54 −0
Original line number Diff line number Diff line
// Copyright 2021 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package rust

import (
	"strings"
	"testing"

	"android/soong/android"
)

func TestRustBenchmark(t *testing.T) {
	ctx := testRust(t, `
		rust_benchmark_host {
			name: "my_bench",
			srcs: ["foo.rs"],
		}`)

	testingModule := ctx.ModuleForTests("my_bench", "linux_glibc_x86_64")
	expectedOut := "my_bench/linux_glibc_x86_64/my_bench"
	outPath := testingModule.Output("my_bench").Output.String()
	if !strings.Contains(outPath, expectedOut) {
		t.Errorf("wrong output path: %v;  expected: %v", outPath, expectedOut)
	}
}

func TestRustBenchmarkLinkage(t *testing.T) {
	ctx := testRust(t, `
		rust_benchmark {
			name: "my_bench",
			srcs: ["foo.rs"],
		}`)

	testingModule := ctx.ModuleForTests("my_bench", "android_arm64_armv8-a").Module().(*Module)

	if !android.InList("libcriterion.rlib-std", testingModule.Properties.AndroidMkRlibs) {
		t.Errorf("rlib-std variant for libcriterion not detected as a rustlib-defined rlib dependency for device rust_benchmark module")
	}
	if !android.InList("libstd", testingModule.Properties.AndroidMkRlibs) {
		t.Errorf("Device rust_benchmark module 'my_bench' does not link libstd as an rlib")
	}
}
+1 −0
Original line number Diff line number Diff line
@@ -434,6 +434,7 @@ func DefaultsFactory(props ...interface{}) android.Module {
	module.AddProperties(
		&BaseProperties{},
		&cc.VendorProperties{},
		&BenchmarkProperties{},
		&BindgenProperties{},
		&BaseCompilerProperties{},
		&BinaryCompilerProperties{},
Loading