From 0f93e5b9fb969ca184e755b6e44a59a67cd65480 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Wed, 20 Jan 2021 10:28:59 -0800 Subject: [PATCH] Speed up vendor snapshot header globs The vendor snapshot header globs were repeated 9 times, once for each possible header suffix. Globbing is not a fast operation, so this took 9.68s of CPU time in my AOSP builds. Replace it instead with a single glob, followed by filtering down to the desired header extensions. Test: m checkbuild Change-Id: I9c8f8cdad8cbffc0a42217659a48dd9d676e4e4c --- cc/library.go | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/cc/library.go b/cc/library.go index af9aaca51..73ed96923 100644 --- a/cc/library.go +++ b/cc/library.go @@ -449,23 +449,37 @@ func (l *libraryDecorator) collectHeadersForSnapshot(ctx android.ModuleContext) } continue } - exts := headerExts - // Glob all files under this special directory, because of C++ headers. - if strings.HasPrefix(dir, "external/libcxx/include") { - exts = []string{""} + glob, err := ctx.GlobWithDeps(dir+"/**/*", nil) + if err != nil { + ctx.ModuleErrorf("glob failed: %#v", err) + return } - for _, ext := range exts { - glob, err := ctx.GlobWithDeps(dir+"/**/*"+ext, nil) - if err != nil { - ctx.ModuleErrorf("glob failed: %#v", err) - return - } - for _, header := range glob { - if strings.HasSuffix(header, "/") { + isLibcxx := strings.HasPrefix(dir, "external/libcxx/include") + j := 0 + for i, header := range glob { + if isLibcxx { + // Glob all files under this special directory, because of C++ headers with no + // extension. + if !strings.HasSuffix(header, "/") { + continue + } + } else { + // Filter out only the files with extensions that are headers. + found := false + for _, ext := range headerExts { + if strings.HasSuffix(header, ext) { + found = true + break + } + } + if !found { continue } - ret = append(ret, android.PathForSource(ctx, header)) } + if i != j { + glob[j] = glob[i] + } + j++ } }