Merge "Ignore USE_RBE when on glinux laptops"
diff --git a/aconfig/Android.bp b/aconfig/Android.bp
index d19b543..ae8276f 100644
--- a/aconfig/Android.bp
+++ b/aconfig/Android.bp
@@ -19,6 +19,7 @@
"aconfig_declarations.go",
"aconfig_values.go",
"aconfig_value_set.go",
+ "all_aconfig_declarations.go",
"init.go",
"java_aconfig_library.go",
"testing.go",
diff --git a/aconfig/all_aconfig_declarations.go b/aconfig/all_aconfig_declarations.go
new file mode 100644
index 0000000..6096c6c
--- /dev/null
+++ b/aconfig/all_aconfig_declarations.go
@@ -0,0 +1,63 @@
+// Copyright 2023 Google Inc. All rights reserved.
+//
+// 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 aconfig
+
+import (
+ "android/soong/android"
+)
+
+// A singleton module that collects all of the aconfig flags declared in the
+// tree into a single combined file for export to the external flag setting
+// server (inside Google it's Gantry).
+//
+// Note that this is ALL aconfig_declarations modules present in the tree, not just
+// ones that are relevant to the product currently being built, so that that infra
+// doesn't need to pull from multiple builds and merge them.
+func AllAconfigDeclarationsFactory() android.Singleton {
+ return &allAconfigDeclarationsSingleton{}
+}
+
+type allAconfigDeclarationsSingleton struct {
+ intermediatePath android.OutputPath
+}
+
+func (this *allAconfigDeclarationsSingleton) GenerateBuildActions(ctx android.SingletonContext) {
+ // Find all of the aconfig_declarations modules
+ var cacheFiles android.Paths
+ ctx.VisitAllModules(func(module android.Module) {
+ if !ctx.ModuleHasProvider(module, declarationsProviderKey) {
+ return
+ }
+ decl := ctx.ModuleProvider(module, declarationsProviderKey).(declarationsProviderData)
+ cacheFiles = append(cacheFiles, decl.IntermediatePath)
+ })
+
+ // Generate build action for aconfig
+ this.intermediatePath = android.PathForIntermediates(ctx, "all_aconfig_declarations.pb")
+ ctx.Build(pctx, android.BuildParams{
+ Rule: allDeclarationsRule,
+ Inputs: cacheFiles,
+ Output: this.intermediatePath,
+ Description: "all_aconfig_declarations",
+ Args: map[string]string{
+ "cache_files": android.JoinPathsWithPrefix(cacheFiles, "--cache "),
+ },
+ })
+ ctx.Phony("all_aconfig_declarations", this.intermediatePath)
+}
+
+func (this *allAconfigDeclarationsSingleton) MakeVars(ctx android.MakeVarsContext) {
+ ctx.DistForGoal("droid", this.intermediatePath)
+}
diff --git a/aconfig/init.go b/aconfig/init.go
index 6b433c9..161fd42 100644
--- a/aconfig/init.go
+++ b/aconfig/init.go
@@ -54,6 +54,15 @@
},
Restat: true,
})
+
+ // For all_aconfig_declarations
+ allDeclarationsRule = pctx.AndroidStaticRule("all_aconfig_declarations_dump",
+ blueprint.RuleParams{
+ Command: `${aconfig} dump --format protobuf --out ${out} ${cache_files}`,
+ CommandDeps: []string{
+ "${aconfig}",
+ },
+ }, "cache_files")
)
func init() {
@@ -67,4 +76,5 @@
ctx.RegisterModuleType("aconfig_values", ValuesFactory)
ctx.RegisterModuleType("aconfig_value_set", ValueSetFactory)
ctx.RegisterModuleType("java_aconfig_library", JavaDeclarationsLibraryFactory)
+ ctx.RegisterParallelSingletonType("all_aconfig_declarations", AllAconfigDeclarationsFactory)
}
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go
index 34a6860..1882cab 100644
--- a/android/allowlists/allowlists.go
+++ b/android/allowlists/allowlists.go
@@ -131,6 +131,7 @@
"external/brotli": Bp2BuildDefaultTrue,
"external/bsdiff": Bp2BuildDefaultTrueRecursively,
"external/bzip2": Bp2BuildDefaultTrueRecursively,
+ "external/clang/lib": Bp2BuildDefaultTrue,
"external/conscrypt": Bp2BuildDefaultTrue,
"external/e2fsprogs": Bp2BuildDefaultTrueRecursively,
"external/eigen": Bp2BuildDefaultTrueRecursively,
@@ -429,6 +430,7 @@
// e.g. ERROR: Analysis of target '@soong_injection//mixed_builds:buildroot' failed
"external/bazelbuild-rules_android":/* recursive = */ true,
"external/bazelbuild-rules_license":/* recursive = */ true,
+ "external/bazelbuild-rules_go":/* recursive = */ true,
"external/bazelbuild-kotlin-rules":/* recursive = */ true,
"external/bazel-skylib":/* recursive = */ true,
"external/protobuf":/* recursive = */ false,
@@ -796,6 +798,13 @@
// for platform_compat_config
"process-compat-config",
+
+ // cc_* modules with rscript srcs
+ "rstest-latency",
+ "libRScpp_static",
+ "rs-headers",
+ "rs_script_api",
+ "libRSDispatch",
}
Bp2buildModuleTypeAlwaysConvertList = []string{
diff --git a/android/sdk_version.go b/android/sdk_version.go
index 80aeb2e..1fadda0 100644
--- a/android/sdk_version.go
+++ b/android/sdk_version.go
@@ -84,25 +84,6 @@
}
}
-// JavaApiLibraryName returns the name of .txt equivalent of a java_library, but does
-// not check if either module exists.
-// TODO: Return .txt (single-tree or multi-tree equivalents) based on config
-func JavaApiLibraryName(c Config, name string) string {
- if c.BuildFromTextStub() {
- return name + ".from-text"
- }
- return name
-}
-
-// JavaApiLibraryNames applies JavaApiLibraryName to the list of java_library names.
-func JavaApiLibraryNames(c Config, names []string) []string {
- apiLibs := make([]string, len(names))
- for i, name := range names {
- apiLibs[i] = JavaApiLibraryName(c, name)
- }
- return apiLibs
-}
-
func (k SdkKind) DefaultJavaLibraryName() string {
switch k {
case SdkPublic:
diff --git a/android/util.go b/android/util.go
index c4ce71a..9695454 100644
--- a/android/util.go
+++ b/android/util.go
@@ -42,6 +42,16 @@
return res
}
+// JoinPathsWithPrefix converts the paths to strings, prefixes them
+// with prefix and then joins them separated by " ".
+func JoinPathsWithPrefix(paths []Path, prefix string) string {
+ strs := make([]string, len(paths))
+ for i := range paths {
+ strs[i] = paths[i].String()
+ }
+ return JoinWithPrefixAndSeparator(strs, prefix, " ")
+}
+
// JoinWithPrefix prepends the prefix to each string in the list and
// returns them joined together with " " as separator.
func JoinWithPrefix(strs []string, prefix string) string {
diff --git a/bp2build/cc_binary_conversion_test.go b/bp2build/cc_binary_conversion_test.go
index ab6e4a5..18cb9e1 100644
--- a/bp2build/cc_binary_conversion_test.go
+++ b/bp2build/cc_binary_conversion_test.go
@@ -1182,3 +1182,35 @@
},
})
}
+
+func TestCCBinaryRscriptSrc(t *testing.T) {
+ runCcBinaryTests(t, ccBinaryBp2buildTestCase{
+ description: `cc_binary with rscript files in sources`,
+ blueprint: `
+{rule_name} {
+ name : "foo",
+ srcs : [
+ "ccSrc.cc",
+ "rsSrc.rscript",
+ ],
+ include_build_directory: false,
+}
+`,
+ targets: []testBazelTarget{
+ {"rscript_to_cpp", "foo_renderscript", AttrNameToString{
+ "srcs": `["rsSrc.rscript"]`,
+ }},
+ {"cc_binary", "foo", AttrNameToString{
+ "absolute_includes": `[
+ "frameworks/rs",
+ "frameworks/rs/cpp",
+ ]`,
+ "local_includes": `["."]`,
+ "srcs": `[
+ "ccSrc.cc",
+ "foo_renderscript",
+ ]`,
+ }},
+ },
+ })
+}
diff --git a/bp2build/cc_library_shared_conversion_test.go b/bp2build/cc_library_shared_conversion_test.go
index a16cfb3..2d61d53 100644
--- a/bp2build/cc_library_shared_conversion_test.go
+++ b/bp2build/cc_library_shared_conversion_test.go
@@ -1555,3 +1555,33 @@
},
})
}
+
+func TestCCLibrarySharedRscriptSrc(t *testing.T) {
+ runCcLibrarySharedTestCase(t, Bp2buildTestCase{
+ Description: ``,
+ Blueprint: `
+cc_library_shared{
+ name : "foo",
+ srcs : [
+ "ccSrc.cc",
+ "rsSrc.rscript",
+ ],
+ include_build_directory: false,
+}
+`,
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("rscript_to_cpp", "foo_renderscript", AttrNameToString{
+ "srcs": `["rsSrc.rscript"]`,
+ }),
+ MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+ "absolute_includes": `[
+ "frameworks/rs",
+ "frameworks/rs/cpp",
+ ]`,
+ "local_includes": `["."]`,
+ "srcs": `[
+ "ccSrc.cc",
+ "foo_renderscript",
+ ]`,
+ })}})
+}
diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go
index b473f27..18225df 100644
--- a/bp2build/cc_library_static_conversion_test.go
+++ b/bp2build/cc_library_static_conversion_test.go
@@ -2185,3 +2185,33 @@
},
})
}
+
+func TestCCLibraryStaticRscriptSrc(t *testing.T) {
+ runCcLibraryStaticTestCase(t, Bp2buildTestCase{
+ Description: `cc_library_static with rscript files in sources`,
+ Blueprint: `
+cc_library_static{
+ name : "foo",
+ srcs : [
+ "ccSrc.cc",
+ "rsSrc.rscript",
+ ],
+ include_build_directory: false,
+}
+`,
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("rscript_to_cpp", "foo_renderscript", AttrNameToString{
+ "srcs": `["rsSrc.rscript"]`,
+ }),
+ MakeBazelTarget("cc_library_static", "foo", AttrNameToString{
+ "absolute_includes": `[
+ "frameworks/rs",
+ "frameworks/rs/cpp",
+ ]`,
+ "local_includes": `["."]`,
+ "srcs": `[
+ "ccSrc.cc",
+ "foo_renderscript",
+ ]`,
+ })}})
+}
diff --git a/cc/bp2build.go b/cc/bp2build.go
index d09cdcd..1c5b832 100644
--- a/cc/bp2build.go
+++ b/cc/bp2build.go
@@ -38,7 +38,10 @@
protoSrcPartition = "proto"
aidlSrcPartition = "aidl"
syspropSrcPartition = "sysprop"
- yaccSrcPartition = "yacc"
+
+ yaccSrcPartition = "yacc"
+
+ rScriptSrcPartition = "renderScript"
stubsSuffix = "_stub_libs_current"
)
@@ -149,8 +152,9 @@
// contains .l or .ll files we will need to find a way to add a
// LabelMapper for these that identifies these filegroups and
// converts them appropriately
- lSrcPartition: bazel.LabelPartition{Extensions: []string{".l"}},
- llSrcPartition: bazel.LabelPartition{Extensions: []string{".ll"}},
+ lSrcPartition: bazel.LabelPartition{Extensions: []string{".l"}},
+ llSrcPartition: bazel.LabelPartition{Extensions: []string{".ll"}},
+ rScriptSrcPartition: bazel.LabelPartition{Extensions: []string{".fs", ".rscript"}},
// C++ is the "catch-all" group, and comprises generated sources because we don't
// know the language of these sources until the genrule is executed.
cppSrcPartition: bazel.LabelPartition{Extensions: []string{".cpp", ".cc", ".cxx", ".mm"}, LabelMapper: addSuffixForFilegroup("_cpp_srcs"), Keep_remainder: true},
@@ -412,6 +416,8 @@
yaccGenLocationHeader bazel.BoolAttribute
yaccGenPositionHeader bazel.BoolAttribute
+ rsSrcs bazel.LabelListAttribute
+
hdrs bazel.LabelListAttribute
rtti bazel.BoolAttribute
@@ -426,8 +432,9 @@
includes BazelIncludes
- protoSrcs bazel.LabelListAttribute
- aidlSrcs bazel.LabelListAttribute
+ protoSrcs bazel.LabelListAttribute
+ aidlSrcs bazel.LabelListAttribute
+ rscriptSrcs bazel.LabelListAttribute
stubsSymbolFile *string
stubsVersions bazel.StringListAttribute
@@ -582,6 +589,7 @@
ca.yaccSrc = bazel.MakeLabelAttribute(yacc.Value.Includes[0].Label)
}
ca.syspropSrcs = partitionedSrcs[syspropSrcPartition]
+ ca.rscriptSrcs = partitionedSrcs[rScriptSrcPartition]
ca.absoluteIncludes.DeduplicateAxesFromBase()
ca.localIncludes.DeduplicateAxesFromBase()
@@ -903,6 +911,12 @@
compilerAttrs.absoluteIncludes.Prepend = true
compilerAttrs.hdrs.Prepend = true
+ convertedRsSrcs, rsAbsIncludes, rsLocalIncludes := bp2buildRScript(ctx, module, compilerAttrs)
+ (&compilerAttrs).srcs.Add(&convertedRsSrcs)
+ (&compilerAttrs).absoluteIncludes.Append(rsAbsIncludes)
+ (&compilerAttrs).localIncludes.Append(rsLocalIncludes)
+ (&compilerAttrs).localIncludes.Value = android.FirstUniqueStrings(compilerAttrs.localIncludes.Value)
+
features := compilerAttrs.features.Clone().Append(linkerAttrs.features).Append(bp2buildSanitizerFeatures(ctx, module))
features = features.Append(bp2buildLtoFeatures(ctx, module))
features = features.Append(convertHiddenVisibilityToFeatureBase(ctx, module))
diff --git a/cc/config/global.go b/cc/config/global.go
index 8ff5f55..e450ba7 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -448,11 +448,12 @@
pctx.StaticVariable("RSLLVMPrebuiltsPath", "${RSClangBase}/${HostPrebuiltTag}/${RSClangVersion}/bin")
pctx.StaticVariable("RSIncludePath", "${RSLLVMPrebuiltsPath}/../lib64/clang/${RSReleaseVersion}/include")
- pctx.PrefixedExistentPathsForSourcesVariable("RsGlobalIncludes", "-I",
- []string{
- "external/clang/lib/Headers",
- "frameworks/rs/script_api/include",
- })
+ rsGlobalIncludes := []string{
+ "external/clang/lib/Headers",
+ "frameworks/rs/script_api/include",
+ }
+ pctx.PrefixedExistentPathsForSourcesVariable("RsGlobalIncludes", "-I", rsGlobalIncludes)
+ exportedVars.ExportStringList("RsGlobalIncludes", rsGlobalIncludes)
pctx.VariableFunc("CcWrapper", func(ctx android.PackageVarContext) string {
if override := ctx.Config().Getenv("CC_WRAPPER"); override != "" {
diff --git a/cc/rs.go b/cc/rs.go
index fbc86e2..6507259 100644
--- a/cc/rs.go
+++ b/cc/rs.go
@@ -15,11 +15,12 @@
package cc
import (
- "android/soong/android"
"path/filepath"
"runtime"
"strings"
+ "android/soong/android"
+ "android/soong/bazel"
"github.com/google/blueprint"
)
@@ -132,3 +133,35 @@
return flags
}
+
+type rscriptAttributes struct {
+ // Renderscript source files
+ Srcs bazel.LabelListAttribute
+}
+
+func bp2buildRScript(ctx android.Bp2buildMutatorContext, m *Module, ca compilerAttributes) (bazel.LabelAttribute, bazel.StringListAttribute, bazel.StringListAttribute) {
+ var rscriptAttrs rscriptAttributes
+ var rsAbsIncludes bazel.StringListAttribute
+ var localIncludes bazel.StringListAttribute
+ var rsModuleName string
+ var convertedRsSrcsLabel bazel.LabelAttribute
+
+ if !ca.rscriptSrcs.IsEmpty() {
+ rscriptAttrs.Srcs = ca.rscriptSrcs
+ rsModuleName = m.Name() + "_renderscript"
+
+ localIncludes.Value = []string{"."}
+ rsAbsIncludes.Value = []string{"frameworks/rs", "frameworks/rs/cpp"}
+ convertedRsSrcsLabel = bazel.LabelAttribute{Value: &bazel.Label{Label: rsModuleName}}
+
+ ctx.CreateBazelTargetModule(
+ bazel.BazelTargetModuleProperties{
+ Rule_class: "rscript_to_cpp",
+ Bzl_load_location: "//build/bazel/rules/cc:rscript_to_cpp.bzl",
+ },
+ android.CommonAttributes{Name: rsModuleName},
+ &rscriptAttrs)
+ }
+
+ return convertedRsSrcsLabel, rsAbsIncludes, localIncludes
+}
diff --git a/cc/sanitize.go b/cc/sanitize.go
index 7dedd60..62e31d1 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -104,6 +104,7 @@
Fuzzer
Memtag_heap
Memtag_stack
+ Memtag_globals
cfi // cfi is last to prevent it running before incompatible mutators
)
@@ -116,6 +117,7 @@
Fuzzer,
Memtag_heap,
Memtag_stack,
+ Memtag_globals,
cfi, // cfi is last to prevent it running before incompatible mutators
}
@@ -138,6 +140,8 @@
return "memtag_heap"
case Memtag_stack:
return "memtag_stack"
+ case Memtag_globals:
+ return "memtag_globals"
case Fuzzer:
return "fuzzer"
default:
@@ -156,6 +160,8 @@
return "memtag_heap"
case Memtag_stack:
return "memtag_stack"
+ case Memtag_globals:
+ return "memtag_globals"
case tsan:
return "thread"
case intOverflow:
@@ -177,7 +183,7 @@
sanitizer := &sanitizerSplitMutator{t}
ctx.TopDown(t.variationName()+"_markapexes", sanitizer.markSanitizableApexesMutator)
ctx.Transition(t.variationName(), sanitizer)
- case Memtag_heap, Memtag_stack, intOverflow:
+ case Memtag_heap, Memtag_stack, Memtag_globals, intOverflow:
// do nothing
default:
panic(fmt.Errorf("unknown SanitizerType %d", t))
@@ -218,6 +224,8 @@
return true
case Memtag_stack:
return true
+ case Memtag_globals:
+ return true
default:
return false
}
@@ -272,6 +280,9 @@
// Memory-tagging stack instrumentation, only available on arm64
// Adds instrumentation to detect stack buffer overflows and use-after-scope using MTE.
Memtag_stack *bool `android:"arch_variant"`
+ // Memory-tagging globals instrumentation, only available on arm64
+ // Adds instrumentation to detect global buffer overflows using MTE.
+ Memtag_globals *bool `android:"arch_variant"`
// A modifier for ASAN and HWASAN for write only instrumentation
Writeonly *bool `android:"arch_variant"`
@@ -347,6 +358,8 @@
Memtag_heap *bool `blueprint:"mutated"`
// Whether Memory-tagging stack instrumentation is enabled for this module
Memtag_stack *bool `blueprint:"mutated"`
+ // Whether Memory-tagging globals instrumentation is enabled for this module
+ Memtag_globals *bool `android:"arch_variant"`
// Whether a modifier for ASAN and HWASAN for write only instrumentation is enabled for this
// module
@@ -431,6 +444,7 @@
p.Integer_overflow = userProps.Integer_overflow
p.Memtag_heap = userProps.Memtag_heap
p.Memtag_stack = userProps.Memtag_stack
+ p.Memtag_globals = userProps.Memtag_globals
p.Safestack = userProps.Safestack
p.Scs = userProps.Scs
p.Scudo = userProps.Scudo
@@ -558,6 +572,10 @@
s.Memtag_stack = proptools.BoolPtr(true)
}
+ if found, globalSanitizers = removeFromList("memtag_globals", globalSanitizers); found && s.Memtag_globals == nil {
+ s.Memtag_globals = proptools.BoolPtr(true)
+ }
+
if len(globalSanitizers) > 0 {
ctx.ModuleErrorf("unknown global sanitizer option %s", globalSanitizers[0])
}
@@ -638,6 +656,7 @@
if ctx.Arch().ArchType != android.Arm64 || !ctx.toolchain().Bionic() || ctx.Host() {
s.Memtag_heap = nil
s.Memtag_stack = nil
+ s.Memtag_globals = nil
}
// Also disable CFI if ASAN is enabled.
@@ -647,6 +666,7 @@
// HWASAN and ASAN win against MTE.
s.Memtag_heap = nil
s.Memtag_stack = nil
+ s.Memtag_globals = nil
}
// Disable sanitizers that depend on the UBSan runtime for windows/darwin builds.
@@ -717,7 +737,8 @@
if ctx.Os() != android.Windows && (Bool(s.All_undefined) || Bool(s.Undefined) || Bool(s.Address) || Bool(s.Thread) ||
Bool(s.Fuzzer) || Bool(s.Safestack) || Bool(s.Cfi) || Bool(s.Integer_overflow) || len(s.Misc_undefined) > 0 ||
- Bool(s.Scudo) || Bool(s.Hwaddress) || Bool(s.Scs) || Bool(s.Memtag_heap) || Bool(s.Memtag_stack)) {
+ Bool(s.Scudo) || Bool(s.Hwaddress) || Bool(s.Scs) || Bool(s.Memtag_heap) || Bool(s.Memtag_stack) ||
+ Bool(s.Memtag_globals)) {
sanitize.Properties.SanitizerEnabled = true
}
@@ -888,7 +909,7 @@
flags.Local.LdFlags = append(flags.Local.LdFlags, memtagStackCommonFlags...)
}
- if (Bool(sanProps.Memtag_heap) || Bool(sanProps.Memtag_stack)) && ctx.binary() {
+ if (Bool(sanProps.Memtag_heap) || Bool(sanProps.Memtag_stack) || Bool(sanProps.Memtag_globals)) && ctx.binary() {
if Bool(sanProps.Diag.Memtag_heap) {
flags.Local.LdFlags = append(flags.Local.LdFlags, "-fsanitize-memtag-mode=sync")
} else {
@@ -1011,6 +1032,8 @@
return s.Properties.SanitizeMutated.Memtag_heap
case Memtag_stack:
return s.Properties.SanitizeMutated.Memtag_stack
+ case Memtag_globals:
+ return s.Properties.SanitizeMutated.Memtag_globals
case Fuzzer:
return s.Properties.SanitizeMutated.Fuzzer
default:
@@ -1027,6 +1050,7 @@
!sanitize.isSanitizerEnabled(scs) &&
!sanitize.isSanitizerEnabled(Memtag_heap) &&
!sanitize.isSanitizerEnabled(Memtag_stack) &&
+ !sanitize.isSanitizerEnabled(Memtag_globals) &&
!sanitize.isSanitizerEnabled(Fuzzer)
}
@@ -1048,10 +1072,12 @@
sanitize.Properties.SanitizeMutated.Address = bPtr
// For ASAN variant, we need to disable Memtag_stack
sanitize.Properties.SanitizeMutated.Memtag_stack = nil
+ sanitize.Properties.SanitizeMutated.Memtag_globals = nil
case Hwasan:
sanitize.Properties.SanitizeMutated.Hwaddress = bPtr
// For HWAsan variant, we need to disable Memtag_stack
sanitize.Properties.SanitizeMutated.Memtag_stack = nil
+ sanitize.Properties.SanitizeMutated.Memtag_globals = nil
case tsan:
sanitize.Properties.SanitizeMutated.Thread = bPtr
case intOverflow:
@@ -1065,6 +1091,8 @@
case Memtag_stack:
sanitize.Properties.SanitizeMutated.Memtag_stack = bPtr
// We do not need to disable ASAN or HWASan here, as there is no Memtag_stack variant.
+ case Memtag_globals:
+ sanitize.Properties.Sanitize.Memtag_globals = bPtr
case Fuzzer:
sanitize.Properties.SanitizeMutated.Fuzzer = bPtr
default:
@@ -1552,6 +1580,13 @@
sanitizers = append(sanitizers, "memtag-stack")
}
+ if Bool(sanProps.Memtag_globals) {
+ sanitizers = append(sanitizers, "memtag-globals")
+ // TODO(mitchp): For now, enable memtag-heap with memtag-globals because the linker
+ // isn't new enough (https://reviews.llvm.org/differential/changeset/?ref=4243566).
+ sanitizers = append(sanitizers, "memtag-heap")
+ }
+
if Bool(sanProps.Fuzzer) {
sanitizers = append(sanitizers, "fuzzer-no-link")
}
diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go
index 108fdd4..50429b0 100644
--- a/java/bootclasspath_fragment.go
+++ b/java/bootclasspath_fragment.go
@@ -479,8 +479,6 @@
for _, apiScope := range hiddenAPISdkLibrarySupportedScopes {
// Add a dependency onto a possibly scope specific stub library.
scopeSpecificDependency := apiScope.scopeSpecificStubModule(ctx, additionalStubModule)
- // Use JavaApiLibraryName function to be redirected to stubs generated from .txt if applicable
- scopeSpecificDependency = android.JavaApiLibraryName(ctx.Config(), scopeSpecificDependency)
tag := hiddenAPIStubsDependencyTag{apiScope: apiScope, fromAdditionalDependency: true}
ctx.AddVariationDependencies(nil, tag, scopeSpecificDependency)
}
diff --git a/java/bootclasspath_fragment_test.go b/java/bootclasspath_fragment_test.go
index 9bdef74..2541f14 100644
--- a/java/bootclasspath_fragment_test.go
+++ b/java/bootclasspath_fragment_test.go
@@ -432,39 +432,3 @@
fragment = result.Module("a_test_fragment", "android_common").(*BootclasspathFragmentModule)
android.AssertBoolEquals(t, "is a test fragment by type", true, fragment.isTestFragment())
}
-
-func TestBootclassFragment_LinkTextStub(t *testing.T) {
- result := android.GroupFixturePreparers(
- prepareForJavaTest,
- prepareForTestWithBootclasspathFragment,
- PrepareForTestWithJavaSdkLibraryFiles,
- FixtureWithLastReleaseApis("mysdklibrary"),
- android.FixtureModifyConfig(func(config android.Config) {
- config.SetBuildFromTextStub(true)
- }),
- ).RunTestWithBp(t, `
- bootclasspath_fragment {
- name: "myfragment",
- contents: ["mysdklibrary"],
- hidden_api: {split_packages: ["*"]},
- additional_stubs: [
- "android-non-updatable",
- ],
- }
- java_sdk_library {
- name: "mysdklibrary",
- srcs: ["a.java"],
- shared_library: false,
- public: {enabled: true},
- system: {enabled: true},
- }
- `)
-
- fragment := result.ModuleForTests("myfragment", "android_common")
- ruleCommand := fragment.Rule("modularHiddenAPIStubFlagsFile").RuleParams.Command
- android.AssertStringDoesContain(t, "Command expected to contain library as dependency stub dex",
- ruleCommand, "--dependency-stub-dex=out/soong/.intermediates/default/java/android-non-updatable.stubs.module_lib.from-text/android_common/dex/android-non-updatable.stubs.module_lib.from-text.jar")
- android.AssertStringDoesNotContain(t,
- "Command not expected to contain multiple api_library as dependency stub dex", ruleCommand,
- "--dependency-stub-dex=out/soong/.intermediates/default/java/android-non-updatable.stubs.from-text/android_common/dex/android-non-updatable.stubs.from-text.jar")
-}
diff --git a/java/config/makevars.go b/java/config/makevars.go
index d383d98..4e09195 100644
--- a/java/config/makevars.go
+++ b/java/config/makevars.go
@@ -29,10 +29,8 @@
// These are used by make when LOCAL_PRIVATE_PLATFORM_APIS is set (equivalent to platform_apis in blueprint):
ctx.Strict("LEGACY_CORE_PLATFORM_BOOTCLASSPATH_LIBRARIES",
- strings.Join(android.JavaApiLibraryNames(ctx.Config(), LegacyCorePlatformBootclasspathLibraries), " "))
- ctx.Strict("LEGACY_CORE_PLATFORM_SYSTEM_MODULES",
- android.JavaApiLibraryName(ctx.Config(), LegacyCorePlatformSystemModules),
- )
+ strings.Join(LegacyCorePlatformBootclasspathLibraries, " "))
+ ctx.Strict("LEGACY_CORE_PLATFORM_SYSTEM_MODULES", LegacyCorePlatformSystemModules)
ctx.Strict("ANDROID_JAVA_HOME", "${JavaHome}")
ctx.Strict("ANDROID_JAVA8_HOME", "prebuilts/jdk/jdk8/${hostPrebuiltTag}")
diff --git a/java/hiddenapi_modular.go b/java/hiddenapi_modular.go
index da9c997..c6b921b 100644
--- a/java/hiddenapi_modular.go
+++ b/java/hiddenapi_modular.go
@@ -647,7 +647,7 @@
// public version is provided by the art.module.public.api module. In those cases it is necessary
// to treat all those modules as they were the same name, otherwise it will result in multiple
// definitions of a single class being passed to hidden API processing which will cause an error.
- if name == scope.nonUpdatablePrebuiltModule || name == android.JavaApiLibraryName(ctx.Config(), scope.nonUpdatableSourceModule) {
+ if name == scope.nonUpdatablePrebuiltModule || name == scope.nonUpdatableSourceModule {
// Treat all *android-non-updatable* modules as if they were part of an android-non-updatable
// java_sdk_library.
// TODO(b/192067200): Remove once android-non-updatable is a java_sdk_library or equivalent.
diff --git a/java/java.go b/java/java.go
index 3e6b96b..caafaa2 100644
--- a/java/java.go
+++ b/java/java.go
@@ -459,7 +459,7 @@
ctx.AddVariationDependencies(nil, sdkLibTag, sdkDep.classpath...)
if d.effectiveOptimizeEnabled() && sdkDep.hasStandardLibs() {
ctx.AddVariationDependencies(nil, proguardRaiseTag,
- android.JavaApiLibraryNames(ctx.Config(), config.LegacyCorePlatformBootclasspathLibraries)...,
+ config.LegacyCorePlatformBootclasspathLibraries...,
)
}
if d.effectiveOptimizeEnabled() && sdkDep.hasFrameworkLibs() {
diff --git a/java/legacy_core_platform_api_usage.go b/java/legacy_core_platform_api_usage.go
index 04c6d05..6cb549e 100644
--- a/java/legacy_core_platform_api_usage.go
+++ b/java/legacy_core_platform_api_usage.go
@@ -93,16 +93,16 @@
func corePlatformSystemModules(ctx android.EarlyModuleContext) string {
if useLegacyCorePlatformApi(ctx, ctx.ModuleName()) {
- return android.JavaApiLibraryName(ctx.Config(), config.LegacyCorePlatformSystemModules)
+ return config.LegacyCorePlatformSystemModules
} else {
- return android.JavaApiLibraryName(ctx.Config(), config.StableCorePlatformSystemModules)
+ return config.StableCorePlatformSystemModules
}
}
func corePlatformBootclasspathLibraries(ctx android.EarlyModuleContext) []string {
if useLegacyCorePlatformApi(ctx, ctx.ModuleName()) {
- return android.JavaApiLibraryNames(ctx.Config(), config.LegacyCorePlatformBootclasspathLibraries)
+ return config.LegacyCorePlatformBootclasspathLibraries
} else {
- return android.JavaApiLibraryNames(ctx.Config(), config.StableCorePlatformBootclasspathLibraries)
+ return config.StableCorePlatformBootclasspathLibraries
}
}
diff --git a/java/sdk.go b/java/sdk.go
index 7699aab..7c702c4 100644
--- a/java/sdk.go
+++ b/java/sdk.go
@@ -148,7 +148,7 @@
toModule := func(module string, aidl android.Path) sdkDep {
// Select the kind of system modules needed for the sdk version.
systemModulesKind := systemModuleKind(sdkVersion.Kind, android.FutureApiLevel)
- systemModules := android.JavaApiLibraryName(ctx.Config(), fmt.Sprintf("core-%s-stubs-system-modules", systemModulesKind))
+ systemModules := fmt.Sprintf("core-%s-stubs-system-modules", systemModulesKind)
return sdkDep{
useModule: true,
bootclasspath: []string{module, config.DefaultLambdaStubsLibrary},
@@ -198,7 +198,7 @@
return sdkDep{
useModule: true,
bootclasspath: []string{android.SdkCore.DefaultJavaLibraryName(), config.DefaultLambdaStubsLibrary},
- systemModules: android.JavaApiLibraryName(ctx.Config(), "core-public-stubs-system-modules"),
+ systemModules: "core-public-stubs-system-modules",
noFrameworksLibs: true,
}
case android.SdkModule:
diff --git a/tests/lib.sh b/tests/lib.sh
index b5dea99..4aaf272 100644
--- a/tests/lib.sh
+++ b/tests/lib.sh
@@ -144,6 +144,7 @@
symlink_directory prebuilts/jdk
symlink_directory external/bazel-skylib
symlink_directory external/bazelbuild-rules_android
+ symlink_directory external/bazelbuild-rules_go
symlink_directory external/bazelbuild-rules_license
symlink_directory external/bazelbuild-kotlin-rules
diff --git a/ui/status/kati.go b/ui/status/kati.go
index 1485c8d..dbb0ce3 100644
--- a/ui/status/kati.go
+++ b/ui/status/kati.go
@@ -24,7 +24,7 @@
)
var katiError = regexp.MustCompile(`^(\033\[1m)?[^ ]+:[0-9]+: (\033\[31m)?error:`)
-var katiIncludeRe = regexp.MustCompile(`^(\[(\d+)/(\d+)] )?((including [^ ]+|initializing (build|packaging) system|finishing (build|packaging) rules|writing (build|packaging) rules) ...)$`)
+var katiIncludeRe = regexp.MustCompile(`^(\[(\d+)/(\d+)] )?((including [^ ]+|initializing (legacy Make module parser|packaging system)|finishing (legacy Make module parsing|packaging rules)|writing (legacy Make module|packaging) rules) ...)$`)
var katiLogRe = regexp.MustCompile(`^\*kati\*: `)
var katiNinjaMissing = regexp.MustCompile("^[^ ]+ is missing, regenerating...$")
diff --git a/ui/status/kati_test.go b/ui/status/kati_test.go
index f2cb813..fd1b4b5 100644
--- a/ui/status/kati_test.go
+++ b/ui/status/kati_test.go
@@ -65,7 +65,7 @@
parser.parseLine("out/build-aosp_arm.ninja is missing, regenerating...")
output.Expect(t, Counts{})
- parser.parseLine("[1/1] initializing build system ...")
+ parser.parseLine("[1/1] initializing legacy Make module parser ...")
output.Expect(t, Counts{
TotalActions: 1,
RunningActions: 1,
@@ -86,14 +86,14 @@
parser.parseLine(msg)
// Start the next line to flush the previous result
- parser.parseLine("[4/5] finishing build rules ...")
+ parser.parseLine("[4/5] finishing legacy Make module parsing ...")
msg += "\n"
if output.result.Output != msg {
t.Errorf("output for action did not match:\nwant: %q\n got: %q\n", msg, output.result.Output)
}
- parser.parseLine("[5/5] writing build rules ...")
+ parser.parseLine("[5/5] writing legacy Make module rules ...")
parser.parseLine("*kati*: verbose msg")
parser.flushAction()
@@ -118,7 +118,7 @@
st: status.StartTool(),
}
- parser.parseLine("[1/1] initializing build system ...")
+ parser.parseLine("[1/1] initializing legacy Make module parser ...")
parser.parseLine("[2/5] including out/soong/Android-aosp_arm.mk ...")
output.Expect(t, Counts{
TotalActions: 5,
@@ -145,7 +145,7 @@
FinishedActions: 3,
})
- parser.parseLine("[3/5] finishing build rules ...")
+ parser.parseLine("[3/5] finishing legacy Make module parsing ...")
output.Expect(t, Counts{
TotalActions: 7,
@@ -164,7 +164,7 @@
st: status.StartTool(),
}
- parser.parseLine("[1/1] initializing build system ...")
+ parser.parseLine("[1/1] initializing legacy Make module parser ...")
parser.parseLine("[2/5] inclduing out/soong/Android-aosp_arm.mk ...")
parser.parseLine("build/make/tools/Android.mk:19: error: testing")
parser.flushAction()
diff --git a/ui/terminal/smart_status.go b/ui/terminal/smart_status.go
index 06a4064..3880b04 100644
--- a/ui/terminal/smart_status.go
+++ b/ui/terminal/smart_status.go
@@ -53,6 +53,13 @@
done chan bool
sigwinch chan os.Signal
sigwinchHandled chan bool
+
+ // Once there is a failure, we stop printing command output so the error
+ // is easier to find
+ haveFailures bool
+ // If we are dropping errors, then at the end, we report a message to go
+ // look in the verbose log if you want that command output.
+ postFailureActionCount int
}
// NewSmartStatusOutput returns a StatusOutput that represents the
@@ -165,12 +172,20 @@
}
}
+ s.statusLine(progress)
+
+ // Stop printing when there are failures, but don't skip actions that also have their own errors.
if output != "" {
- s.statusLine(progress)
- s.requestLine()
- s.print(output)
- } else {
- s.statusLine(progress)
+ if !s.haveFailures || result.Error != nil {
+ s.requestLine()
+ s.print(output)
+ } else {
+ s.postFailureActionCount++
+ }
+ }
+
+ if result.Error != nil {
+ s.haveFailures = true
}
}
@@ -187,6 +202,15 @@
s.stopSigwinch()
+ if s.postFailureActionCount > 0 {
+ s.requestLine()
+ if s.postFailureActionCount == 1 {
+ s.print(fmt.Sprintf("There was 1 action that completed after the action that failed. See verbose.log.gz for its output."))
+ } else {
+ s.print(fmt.Sprintf("There were %d actions that completed after the action that failed. See verbose.log.gz for their output.", s.postFailureActionCount))
+ }
+ }
+
s.requestLine()
s.runningActions = nil
diff --git a/ui/terminal/status_test.go b/ui/terminal/status_test.go
index b9057d2..8dd1809 100644
--- a/ui/terminal/status_test.go
+++ b/ui/terminal/status_test.go
@@ -295,3 +295,159 @@
t.Errorf("want:\n%q\ngot:\n%q", w, g)
}
}
+
+func TestSmartStatusDoesntHideAfterSucecss(t *testing.T) {
+ os.Setenv(tableHeightEnVar, "")
+
+ smart := &fakeSmartTerminal{termWidth: 40}
+ stat := NewStatusOutput(smart, "", false, false, false)
+ smartStat := stat.(*smartStatusOutput)
+ smartStat.sigwinchHandled = make(chan bool)
+
+ runner := newRunner(stat, 2)
+
+ action1 := &status.Action{Description: "action1"}
+ result1 := status.ActionResult{
+ Action: action1,
+ Output: "Output1",
+ }
+
+ action2 := &status.Action{Description: "action2"}
+ result2 := status.ActionResult{
+ Action: action2,
+ Output: "Output2",
+ }
+
+ runner.startAction(action1)
+ runner.startAction(action2)
+ runner.finishAction(result1)
+ runner.finishAction(result2)
+
+ stat.Flush()
+
+ w := "\r\x1b[1m[ 0% 0/2] action1\x1b[0m\x1b[K\r\x1b[1m[ 0% 0/2] action2\x1b[0m\x1b[K\r\x1b[1m[ 50% 1/2] action1\x1b[0m\x1b[K\nOutput1\n\r\x1b[1m[100% 2/2] action2\x1b[0m\x1b[K\nOutput2\n"
+
+ if g := smart.String(); g != w {
+ t.Errorf("want:\n%q\ngot:\n%q", w, g)
+ }
+}
+
+func TestSmartStatusHideAfterFailure(t *testing.T) {
+ os.Setenv(tableHeightEnVar, "")
+
+ smart := &fakeSmartTerminal{termWidth: 40}
+ stat := NewStatusOutput(smart, "", false, false, false)
+ smartStat := stat.(*smartStatusOutput)
+ smartStat.sigwinchHandled = make(chan bool)
+
+ runner := newRunner(stat, 2)
+
+ action1 := &status.Action{Description: "action1"}
+ result1 := status.ActionResult{
+ Action: action1,
+ Output: "Output1",
+ Error: fmt.Errorf("Error1"),
+ }
+
+ action2 := &status.Action{Description: "action2"}
+ result2 := status.ActionResult{
+ Action: action2,
+ Output: "Output2",
+ }
+
+ runner.startAction(action1)
+ runner.startAction(action2)
+ runner.finishAction(result1)
+ runner.finishAction(result2)
+
+ stat.Flush()
+
+ w := "\r\x1b[1m[ 0% 0/2] action1\x1b[0m\x1b[K\r\x1b[1m[ 0% 0/2] action2\x1b[0m\x1b[K\r\x1b[1m[ 50% 1/2] action1\x1b[0m\x1b[K\nFAILED: \nOutput1\n\r\x1b[1m[100% 2/2] action2\x1b[0m\x1b[K\nThere was 1 action that completed after the action that failed. See verbose.log.gz for its output.\n"
+
+ if g := smart.String(); g != w {
+ t.Errorf("want:\n%q\ngot:\n%q", w, g)
+ }
+}
+
+func TestSmartStatusHideAfterFailurePlural(t *testing.T) {
+ os.Setenv(tableHeightEnVar, "")
+
+ smart := &fakeSmartTerminal{termWidth: 40}
+ stat := NewStatusOutput(smart, "", false, false, false)
+ smartStat := stat.(*smartStatusOutput)
+ smartStat.sigwinchHandled = make(chan bool)
+
+ runner := newRunner(stat, 2)
+
+ action1 := &status.Action{Description: "action1"}
+ result1 := status.ActionResult{
+ Action: action1,
+ Output: "Output1",
+ Error: fmt.Errorf("Error1"),
+ }
+
+ action2 := &status.Action{Description: "action2"}
+ result2 := status.ActionResult{
+ Action: action2,
+ Output: "Output2",
+ }
+
+ action3 := &status.Action{Description: "action3"}
+ result3 := status.ActionResult{
+ Action: action3,
+ Output: "Output3",
+ }
+
+ runner.startAction(action1)
+ runner.startAction(action2)
+ runner.startAction(action3)
+ runner.finishAction(result1)
+ runner.finishAction(result2)
+ runner.finishAction(result3)
+
+ stat.Flush()
+
+ w := "\r\x1b[1m[ 0% 0/2] action1\x1b[0m\x1b[K\r\x1b[1m[ 0% 0/2] action2\x1b[0m\x1b[K\r\x1b[1m[ 0% 0/2] action3\x1b[0m\x1b[K\r\x1b[1m[ 50% 1/2] action1\x1b[0m\x1b[K\nFAILED: \nOutput1\n\r\x1b[1m[100% 2/2] action2\x1b[0m\x1b[K\r\x1b[1m[150% 3/2] action3\x1b[0m\x1b[K\nThere were 2 actions that completed after the action that failed. See verbose.log.gz for their output.\n"
+
+ if g := smart.String(); g != w {
+ t.Errorf("want:\n%q\ngot:\n%q", w, g)
+ }
+}
+
+func TestSmartStatusDontHideErrorAfterFailure(t *testing.T) {
+ os.Setenv(tableHeightEnVar, "")
+
+ smart := &fakeSmartTerminal{termWidth: 40}
+ stat := NewStatusOutput(smart, "", false, false, false)
+ smartStat := stat.(*smartStatusOutput)
+ smartStat.sigwinchHandled = make(chan bool)
+
+ runner := newRunner(stat, 2)
+
+ action1 := &status.Action{Description: "action1"}
+ result1 := status.ActionResult{
+ Action: action1,
+ Output: "Output1",
+ Error: fmt.Errorf("Error1"),
+ }
+
+ action2 := &status.Action{Description: "action2"}
+ result2 := status.ActionResult{
+ Action: action2,
+ Output: "Output2",
+ Error: fmt.Errorf("Error1"),
+ }
+
+ runner.startAction(action1)
+ runner.startAction(action2)
+ runner.finishAction(result1)
+ runner.finishAction(result2)
+
+ stat.Flush()
+
+ w := "\r\x1b[1m[ 0% 0/2] action1\x1b[0m\x1b[K\r\x1b[1m[ 0% 0/2] action2\x1b[0m\x1b[K\r\x1b[1m[ 50% 1/2] action1\x1b[0m\x1b[K\nFAILED: \nOutput1\n\r\x1b[1m[100% 2/2] action2\x1b[0m\x1b[K\nFAILED: \nOutput2\n"
+
+ if g := smart.String(); g != w {
+ t.Errorf("want:\n%q\ngot:\n%q", w, g)
+ }
+}