Merge "Use WalkDeps instead of VisitDepsDepthFirst"

This commit is contained in:
Treehugger Robot
2018-06-23 00:04:42 +00:00
committed by Gerrit Code Review
5 changed files with 53 additions and 28 deletions

View File

@@ -144,7 +144,9 @@ type ModuleContext interface {
VisitDirectDeps(visit func(Module)) VisitDirectDeps(visit func(Module))
VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module))
VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) VisitDirectDepsIf(pred func(Module) bool, visit func(Module))
// Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
VisitDepsDepthFirst(visit func(Module)) VisitDepsDepthFirst(visit func(Module))
// Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
WalkDeps(visit func(Module, Module) bool) WalkDeps(visit func(Module, Module) bool)
@@ -539,6 +541,7 @@ func (a *ModuleBase) computeInstallDeps(
ctx blueprint.ModuleContext) Paths { ctx blueprint.ModuleContext) Paths {
result := Paths{} result := Paths{}
// TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
ctx.VisitDepsDepthFirstIf(isFileInstaller, ctx.VisitDepsDepthFirstIf(isFileInstaller,
func(m blueprint.Module) { func(m blueprint.Module) {
fileInstaller := m.(fileInstaller) fileInstaller := m.(fileInstaller)

View File

@@ -50,7 +50,9 @@ type SingletonContext interface {
VisitAllModules(visit func(Module)) VisitAllModules(visit func(Module))
VisitAllModulesIf(pred func(Module) bool, visit func(Module)) VisitAllModulesIf(pred func(Module) bool, visit func(Module))
// Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
VisitDepsDepthFirst(module Module, visit func(Module)) VisitDepsDepthFirst(module Module, visit func(Module))
// Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
VisitDepsDepthFirstIf(module Module, pred func(Module) bool, VisitDepsDepthFirstIf(module Module, pred func(Module) bool,
visit func(Module)) visit func(Module))

View File

@@ -52,7 +52,7 @@ func init() {
ctx.TopDown("tsan_deps", sanitizerDepsMutator(tsan)) ctx.TopDown("tsan_deps", sanitizerDepsMutator(tsan))
ctx.BottomUp("tsan", sanitizerMutator(tsan)).Parallel() ctx.BottomUp("tsan", sanitizerMutator(tsan)).Parallel()
ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator()) ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
ctx.BottomUp("coverage", coverageLinkingMutator).Parallel() ctx.BottomUp("coverage", coverageLinkingMutator).Parallel()
ctx.TopDown("vndk_deps", sabiDepsMutator) ctx.TopDown("vndk_deps", sabiDepsMutator)

View File

@@ -21,6 +21,8 @@ import (
"strings" "strings"
"sync" "sync"
"github.com/google/blueprint"
"android/soong/android" "android/soong/android"
"android/soong/cc/config" "android/soong/cc/config"
) )
@@ -610,29 +612,40 @@ func (sanitize *sanitize) isSanitizerEnabled(t sanitizerType) bool {
return sanitizerVal != nil && *sanitizerVal == true return sanitizerVal != nil && *sanitizerVal == true
} }
func isSanitizableDependencyTag(tag blueprint.DependencyTag) bool {
t, ok := tag.(dependencyTag)
return ok && t.library || t == reuseObjTag
}
// Propagate asan requirements down from binaries // Propagate asan requirements down from binaries
func sanitizerDepsMutator(t sanitizerType) func(android.TopDownMutatorContext) { func sanitizerDepsMutator(t sanitizerType) func(android.TopDownMutatorContext) {
return func(mctx android.TopDownMutatorContext) { return func(mctx android.TopDownMutatorContext) {
if c, ok := mctx.Module().(*Module); ok && c.sanitize.isSanitizerEnabled(t) { if c, ok := mctx.Module().(*Module); ok && c.sanitize.isSanitizerEnabled(t) {
mctx.VisitDepsDepthFirst(func(module android.Module) { mctx.WalkDeps(func(child, parent android.Module) bool {
if d, ok := module.(*Module); ok && d.sanitize != nil && if !isSanitizableDependencyTag(mctx.OtherModuleDependencyTag(child)) {
return false
}
if d, ok := child.(*Module); ok && d.sanitize != nil &&
!Bool(d.sanitize.Properties.Sanitize.Never) && !Bool(d.sanitize.Properties.Sanitize.Never) &&
!d.sanitize.isSanitizerExplicitlyDisabled(t) { !d.sanitize.isSanitizerExplicitlyDisabled(t) {
if (t == cfi && d.static()) || t != cfi { if (t == cfi && d.static()) || t != cfi {
d.sanitize.Properties.SanitizeDep = true d.sanitize.Properties.SanitizeDep = true
} }
} }
return true
}) })
} }
} }
} }
// Propagate the ubsan minimal runtime dependency when there are integer overflow sanitized static dependencies. // Propagate the ubsan minimal runtime dependency when there are integer overflow sanitized static dependencies.
func sanitizerRuntimeDepsMutator() func(android.TopDownMutatorContext) { func sanitizerRuntimeDepsMutator(mctx android.TopDownMutatorContext) {
return func(mctx android.TopDownMutatorContext) {
if c, ok := mctx.Module().(*Module); ok && c.sanitize != nil { if c, ok := mctx.Module().(*Module); ok && c.sanitize != nil {
mctx.VisitDepsDepthFirst(func(module android.Module) { mctx.WalkDeps(func(child, parent android.Module) bool {
if d, ok := module.(*Module); ok && d.static() && d.sanitize != nil { if !isSanitizableDependencyTag(mctx.OtherModuleDependencyTag(child)) {
return false
}
if d, ok := child.(*Module); ok && d.static() && d.sanitize != nil {
if enableMinimalRuntime(d.sanitize) { if enableMinimalRuntime(d.sanitize) {
// If a static dependency is built with the minimal runtime, // If a static dependency is built with the minimal runtime,
@@ -645,10 +658,10 @@ func sanitizerRuntimeDepsMutator() func(android.TopDownMutatorContext) {
c.sanitize.Properties.UbsanRuntimeDep = true c.sanitize.Properties.UbsanRuntimeDep = true
} }
} }
return true
}) })
} }
} }
}
// Create sanitized variants for modules that need them // Create sanitized variants for modules that need them
func sanitizerMutator(t sanitizerType) func(android.BottomUpMutatorContext) { func sanitizerMutator(t sanitizerType) func(android.BottomUpMutatorContext) {

View File

@@ -574,32 +574,39 @@ func (p *Module) walkTransitiveDeps(ctx android.ModuleContext) {
destToPyData[path.dest] = path.src.String() destToPyData[path.dest] = path.src.String()
} }
seen := make(map[android.Module]bool)
// visit all its dependencies in depth first. // visit all its dependencies in depth first.
ctx.VisitDepsDepthFirst(func(module android.Module) { ctx.WalkDeps(func(child, parent android.Module) bool {
if ctx.OtherModuleDependencyTag(module) != pythonLibTag { if ctx.OtherModuleDependencyTag(child) != pythonLibTag {
return return false
} }
if seen[child] {
return false
}
seen[child] = true
// Python modules only can depend on Python libraries. // Python modules only can depend on Python libraries.
if !isPythonLibModule(module) { if !isPythonLibModule(child) {
panic(fmt.Errorf( panic(fmt.Errorf(
"the dependency %q of module %q is not Python library!", "the dependency %q of module %q is not Python library!",
ctx.ModuleName(), ctx.OtherModuleName(module))) ctx.ModuleName(), ctx.OtherModuleName(child)))
} }
if dep, ok := module.(PythonDependency); ok { if dep, ok := child.(PythonDependency); ok {
srcs := dep.GetSrcsPathMappings() srcs := dep.GetSrcsPathMappings()
for _, path := range srcs { for _, path := range srcs {
if !fillInMap(ctx, destToPySrcs, if !fillInMap(ctx, destToPySrcs,
path.dest, path.src.String(), ctx.ModuleName(), ctx.OtherModuleName(module)) { path.dest, path.src.String(), ctx.ModuleName(), ctx.OtherModuleName(child)) {
continue continue
} }
} }
data := dep.GetDataPathMappings() data := dep.GetDataPathMappings()
for _, path := range data { for _, path := range data {
fillInMap(ctx, destToPyData, fillInMap(ctx, destToPyData,
path.dest, path.src.String(), ctx.ModuleName(), ctx.OtherModuleName(module)) path.dest, path.src.String(), ctx.ModuleName(), ctx.OtherModuleName(child))
} }
p.depsSrcsZips = append(p.depsSrcsZips, dep.GetSrcsZip()) p.depsSrcsZips = append(p.depsSrcsZips, dep.GetSrcsZip())
} }
return true
}) })
} }