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

Commit f5f4ad3d authored by Colin Cross's avatar Colin Cross
Browse files

Convert coverageMutator to a TransitionMutator

Convert coverageMutator to a TransitionMutator as a step towards
variants-on-demand.

Bug: 319288033
Test: coverage_test.go
Test: treehugger coverage builds
Change-Id: Ic50c0040dea8b42c36b5d784221daa00b7b0d379
parent 4aa3e0ab
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1418,7 +1418,7 @@ func (a *apexBundle) TaggedOutputs() map[string]android.Paths {
var _ cc.Coverage = (*apexBundle)(nil)

// Implements cc.Coverage
func (a *apexBundle) IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool {
func (a *apexBundle) IsNativeCoverageNeeded(ctx android.IncomingTransitionContext) bool {
	return ctx.DeviceConfig().NativeCoverageEnabled()
}

+1 −1
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ func RegisterCCBuildComponents(ctx android.RegistrationContext) {

		ctx.TopDown("fuzz_deps", fuzzMutatorDeps)

		ctx.BottomUp("coverage", coverageMutator).Parallel()
		ctx.Transition("coverage", &coverageTransitionMutator{})

		ctx.TopDown("afdo_deps", afdoDepsMutator)
		ctx.BottomUp("afdo", afdoMutator).Parallel()
+68 −25
Original line number Diff line number Diff line
@@ -223,7 +223,7 @@ func SetCoverageProperties(ctx android.BaseModuleContext, properties CoveragePro

type UseCoverage interface {
	android.Module
	IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool
	IsNativeCoverageNeeded(ctx android.IncomingTransitionContext) bool
}

// Coverage is an interface for non-CC modules to implement to be mutated for coverage
@@ -235,43 +235,86 @@ type Coverage interface {
	EnableCoverageIfNeeded()
}

func coverageMutator(mctx android.BottomUpMutatorContext) {
	if c, ok := mctx.Module().(*Module); ok && c.coverage != nil {
		needCoverageVariant := c.coverage.Properties.NeedCoverageVariant
		needCoverageBuild := c.coverage.Properties.NeedCoverageBuild
		if needCoverageVariant {
			m := mctx.CreateVariations("", "cov")
type coverageTransitionMutator struct{}

var _ android.TransitionMutator = (*coverageTransitionMutator)(nil)

func (c coverageTransitionMutator) Split(ctx android.BaseModuleContext) []string {
	if c, ok := ctx.Module().(*Module); ok && c.coverage != nil {
		if c.coverage.Properties.NeedCoverageVariant {
			return []string{"", "cov"}
		}
	} else if cov, ok := ctx.Module().(Coverage); ok && cov.IsNativeCoverageNeeded(ctx) {
		// APEX and Rust modules fall here

		// Note: variant "" is also created because an APEX can be depended on by another
		// module which are split into "" and "cov" variants. e.g. when cc_test refers
		// to an APEX via 'data' property.
		return []string{"", "cov"}
	} else if cov, ok := ctx.Module().(UseCoverage); ok && cov.IsNativeCoverageNeeded(ctx) {
		// Module itself doesn't have to have "cov" variant, but it should use "cov" variants of
		// deps.
		return []string{"cov"}
	}

	return []string{""}
}

func (c coverageTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string {
	return sourceVariation
}

func (c coverageTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string {
	if c, ok := ctx.Module().(*Module); ok && c.coverage != nil {
		if !c.coverage.Properties.NeedCoverageVariant {
			return ""
		}
	} else if cov, ok := ctx.Module().(Coverage); ok {
		if !cov.IsNativeCoverageNeeded(ctx) {
			return ""
		}
	} else if cov, ok := ctx.Module().(UseCoverage); ok && cov.IsNativeCoverageNeeded(ctx) {
		// Module only has a "cov" variation, so all incoming variations should use "cov".
		return "cov"
	} else {
		return ""
	}

	return incomingVariation
}

func (c coverageTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) {
	if c, ok := ctx.Module().(*Module); ok && c.coverage != nil {
		if variation == "" && c.coverage.Properties.NeedCoverageVariant {
			// Setup the non-coverage version and set HideFromMake and
			// PreventInstall to true.
			m[0].(*Module).coverage.Properties.CoverageEnabled = false
			m[0].(*Module).coverage.Properties.IsCoverageVariant = false
			m[0].(*Module).Properties.HideFromMake = true
			m[0].(*Module).Properties.PreventInstall = true

			c.coverage.Properties.CoverageEnabled = false
			c.coverage.Properties.IsCoverageVariant = false
			c.Properties.HideFromMake = true
			c.Properties.PreventInstall = true
		} else if variation == "cov" {
			// The coverage-enabled version inherits HideFromMake,
			// PreventInstall from the original module.
			m[1].(*Module).coverage.Properties.CoverageEnabled = needCoverageBuild
			m[1].(*Module).coverage.Properties.IsCoverageVariant = true
			c.coverage.Properties.CoverageEnabled = c.coverage.Properties.NeedCoverageBuild
			c.coverage.Properties.IsCoverageVariant = true
		}
	} else if cov, ok := mctx.Module().(Coverage); ok && cov.IsNativeCoverageNeeded(mctx) {
	} else if cov, ok := ctx.Module().(Coverage); ok && cov.IsNativeCoverageNeeded(ctx) {
		// APEX and Rust modules fall here

		// Note: variant "" is also created because an APEX can be depended on by another
		// module which are split into "" and "cov" variants. e.g. when cc_test refers
		// to an APEX via 'data' property.
		m := mctx.CreateVariations("", "cov")
		m[0].(Coverage).MarkAsCoverageVariant(false)
		m[0].(Coverage).SetPreventInstall()
		m[0].(Coverage).HideFromMake()

		m[1].(Coverage).MarkAsCoverageVariant(true)
		m[1].(Coverage).EnableCoverageIfNeeded()
	} else if cov, ok := mctx.Module().(UseCoverage); ok && cov.IsNativeCoverageNeeded(mctx) {
		if variation == "" {
			cov.MarkAsCoverageVariant(false)
			cov.SetPreventInstall()
			cov.HideFromMake()
		} else if variation == "cov" {
			cov.MarkAsCoverageVariant(true)
			cov.EnableCoverageIfNeeded()
		}
	} else if cov, ok := ctx.Module().(UseCoverage); ok && cov.IsNativeCoverageNeeded(ctx) {
		// Module itself doesn't have to have "cov" variant, but it should use "cov" variants of
		// deps.
		mctx.CreateVariations("cov")
		mctx.AliasVariation("cov")
	}
}

+1 −1
Original line number Diff line number Diff line
@@ -512,6 +512,6 @@ func sha1sum(values []string) string {

var _ cc.UseCoverage = (*filesystem)(nil)

func (*filesystem) IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool {
func (*filesystem) IsNativeCoverageNeeded(ctx android.IncomingTransitionContext) bool {
	return ctx.Device() && ctx.DeviceConfig().NativeCoverageEnabled()
}
+1 −1
Original line number Diff line number Diff line
@@ -1108,7 +1108,7 @@ func (a *AndroidApp) Privileged() bool {
	return Bool(a.appProperties.Privileged)
}

func (a *AndroidApp) IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool {
func (a *AndroidApp) IsNativeCoverageNeeded(ctx android.IncomingTransitionContext) bool {
	return ctx.Device() && ctx.DeviceConfig().NativeCoverageEnabled()
}

Loading