From 33e0c810937b05a4b4ecad446490d38383b94b8f Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 23 Jan 2024 16:36:07 -0800 Subject: [PATCH] Convert orderfile mutators to TransitionMutator Convert orderfileDepsMutator and orderfileMutator to a TransitionMutator as a step towards variants-on-demand. Bug: 319288033 Test: orderfile_test.go Change-Id: I27df65b7264a5b059a900e7ea04c18dfb2787a84 --- cc/cc.go | 3 +- cc/orderfile.go | 103 +++++++++++++++++++++++------------------------- 2 files changed, 51 insertions(+), 55 deletions(-) diff --git a/cc/cc.go b/cc/cc.go index 31fa4fdcd..1a9c7bf66 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -73,8 +73,7 @@ func RegisterCCBuildComponents(ctx android.RegistrationContext) { ctx.TopDown("afdo_deps", afdoDepsMutator) ctx.BottomUp("afdo", afdoMutator).Parallel() - ctx.TopDown("orderfile_deps", orderfileDepsMutator) - ctx.BottomUp("orderfile", orderfileMutator).Parallel() + ctx.Transition("orderfile", &orderfileTransitionMutator{}) ctx.Transition("lto", <oTransitionMutator{}) diff --git a/cc/orderfile.go b/cc/orderfile.go index 9192e8168..38b89059b 100644 --- a/cc/orderfile.go +++ b/cc/orderfile.go @@ -20,6 +20,8 @@ package cc import ( "fmt" + "github.com/google/blueprint" + "android/soong/android" ) @@ -190,66 +192,61 @@ func (orderfile *orderfile) flags(ctx ModuleContext, flags Flags) Flags { return flags } -// Propagate profile orderfile flags down from binaries and shared libraries -// We do not allow propagation for load flags because the orderfile is specific -// to the module (binary / shared library) -func orderfileDepsMutator(mctx android.TopDownMutatorContext) { - if m, ok := mctx.Module().(*Module); ok { - if !m.orderfile.orderfileLinkEnabled() { - return - } - mctx.WalkDeps(func(dep android. - Module, parent android.Module) bool { - tag := mctx.OtherModuleDependencyTag(dep) - libTag, isLibTag := tag.(libraryDependencyTag) - - // Do not recurse down non-static dependencies - if isLibTag { - if !libTag.static() { - return false - } - } else { - if tag != objDepTag && tag != reuseObjTag { - return false - } - } - - if dep, ok := dep.(*Module); ok { - if m.orderfile.Properties.OrderfileInstrLink { - dep.orderfile.Properties.OrderfileInstrLink = true - } - } - - return true - }) +func orderfilePropagateViaDepTag(tag blueprint.DependencyTag) bool { + libTag, isLibTag := tag.(libraryDependencyTag) + // Do not recurse down non-static dependencies + if isLibTag { + return libTag.static() + } else { + return tag == objDepTag || tag == reuseObjTag || tag == staticVariantTag } } -// Create orderfile variants for modules that need them -func orderfileMutator(mctx android.BottomUpMutatorContext) { - if m, ok := mctx.Module().(*Module); ok && m.orderfile != nil { - if !m.static() && m.orderfile.orderfileEnabled() { - mctx.SetDependencyVariation("orderfile") - return +// orderfileTransitionMutator creates orderfile variants of cc modules. +type orderfileTransitionMutator struct{} + +const ORDERFILE_VARIATION = "orderfile" + +func (o *orderfileTransitionMutator) Split(ctx android.BaseModuleContext) []string { + return []string{""} +} + +func (o *orderfileTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + if m, ok := ctx.Module().(*Module); ok && m.orderfile != nil { + if !orderfilePropagateViaDepTag(ctx.DepTag()) { + return "" } - variationNames := []string{""} - if m.orderfile.Properties.OrderfileInstrLink { - variationNames = append(variationNames, "orderfile") + if sourceVariation != "" { + return sourceVariation } - if len(variationNames) > 1 { - modules := mctx.CreateVariations(variationNames...) - for i, name := range variationNames { - if name == "" { - continue - } - variation := modules[i].(*Module) - variation.Properties.PreventInstall = true - variation.Properties.HideFromMake = true - variation.orderfile.Properties.ShouldProfileModule = true - variation.orderfile.Properties.OrderfileLoad = false - } + // Propagate profile orderfile flags down from binaries and shared libraries + if m.orderfile.orderfileLinkEnabled() { + return ORDERFILE_VARIATION } } + return "" +} + +func (o *orderfileTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { + if m, ok := ctx.Module().(*Module); ok && m.orderfile != nil { + return incomingVariation + } + return "" +} + +func (o *orderfileTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) { + if variation == "" { + return + } + + if m, ok := ctx.Module().(*Module); ok && m.orderfile != nil { + m.Properties.PreventInstall = true + m.Properties.HideFromMake = true + m.orderfile.Properties.ShouldProfileModule = true + // We do not allow propagation for load flags because the orderfile is specific + // to the module (binary / shared library) + m.orderfile.Properties.OrderfileLoad = false + } }