diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-08-17 23:03:02 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-08-17 23:03:02 +0000 |
commit | 796862580f897ba91503a3c2c8ad63473a7768f9 (patch) | |
tree | 9ee384e3a1cacca5707240f78aec4c460bf3138b | |
parent | 58986b02c697cd86ed6a9c94f8432b03d62cdd64 (diff) | |
parent | d5bd6d36768200e9085c2406cdde718f0b0c72aa (diff) | |
download | build_soong-796862580f897ba91503a3c2c8ad63473a7768f9.tar.gz build_soong-796862580f897ba91503a3c2c8ad63473a7768f9.tar.bz2 build_soong-796862580f897ba91503a3c2c8ad63473a7768f9.zip |
Snap for 5811135 from d5bd6d36768200e9085c2406cdde718f0b0c72aa to qt-qpr1-release
Change-Id: I862c7d512b3e214454c8b6008d9eca1582fd39ba
-rw-r--r-- | android/mutator.go | 1 | ||||
-rw-r--r-- | cc/cc.go | 16 | ||||
-rw-r--r-- | cc/llndk_library.go | 2 | ||||
-rw-r--r-- | cc/sanitize.go | 163 | ||||
-rw-r--r-- | java/droiddoc.go | 42 |
5 files changed, 125 insertions, 99 deletions
diff --git a/android/mutator.go b/android/mutator.go index 71237a1c..e003f0bb 100644 --- a/android/mutator.go +++ b/android/mutator.go @@ -160,6 +160,7 @@ type BottomUpMutatorContext interface { CreateVariations(...string) []blueprint.Module CreateLocalVariations(...string) []blueprint.Module SetDependencyVariation(string) + SetDefaultDependencyVariation(*string) AddVariationDependencies([]blueprint.Variation, blueprint.DependencyTag, ...string) AddFarVariationDependencies([]blueprint.Variation, blueprint.DependencyTag, ...string) AddInterVariantDependency(tag blueprint.DependencyTag, from, to blueprint.Module) @@ -51,6 +51,8 @@ func init() { ctx.TopDown("hwasan_deps", sanitizerDepsMutator(hwasan)) ctx.BottomUp("hwasan", sanitizerMutator(hwasan)).Parallel() + // cfi mutator shouldn't run before sanitizers that return true for + // incompatibleWithCfi() ctx.TopDown("cfi_deps", sanitizerDepsMutator(cfi)) ctx.BottomUp("cfi", sanitizerMutator(cfi)).Parallel() @@ -239,6 +241,7 @@ type VendorProperties struct { type ModuleContextIntf interface { static() bool staticBinary() bool + header() bool toolchain() config.Toolchain useSdk() bool sdkVersion() string @@ -662,6 +665,10 @@ func (ctx *moduleContextImpl) staticBinary() bool { return ctx.mod.staticBinary() } +func (ctx *moduleContextImpl) header() bool { + return ctx.mod.header() +} + func (ctx *moduleContextImpl) useSdk() bool { if ctx.ctx.Device() && !ctx.useVndk() && !ctx.inRecovery() && !ctx.ctx.Fuchsia() { return String(ctx.mod.Properties.Sdk_version) != "" @@ -1925,6 +1932,15 @@ func (c *Module) staticBinary() bool { return false } +func (c *Module) header() bool { + if h, ok := c.linker.(interface { + header() bool + }); ok { + return h.header() + } + return false +} + func (c *Module) getMakeLinkType() string { if c.useVndk() { if inList(c.Name(), vndkCoreLibraries) || inList(c.Name(), vndkSpLibraries) || inList(c.Name(), llndkLibraries) { diff --git a/cc/llndk_library.go b/cc/llndk_library.go index 56ef2b67..52c58eb7 100644 --- a/cc/llndk_library.go +++ b/cc/llndk_library.go @@ -221,7 +221,7 @@ func llndkHeadersFactory() android.Module { &library.MutatedProperties, &library.flagExporter.Properties) - android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibBoth) + module.Init() return module } diff --git a/cc/sanitize.go b/cc/sanitize.go index b7a36a60..c1b055af 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -120,6 +120,10 @@ func (t sanitizerType) name() string { } } +func (t sanitizerType) incompatibleWithCfi() bool { + return t == asan || t == hwasan +} + type SanitizeProperties struct { // enable AddressSanitizer, ThreadSanitizer, or UndefinedBehaviorSanitizer Sanitize struct { @@ -543,16 +547,18 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags { } func (sanitize *sanitize) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { - // Add a suffix for CFI-enabled static libraries to allow surfacing both to make without a - // name conflict. - if ret.Class == "STATIC_LIBRARIES" && Bool(sanitize.Properties.Sanitize.Cfi) { - ret.SubName += ".cfi" - } - if ret.Class == "STATIC_LIBRARIES" && Bool(sanitize.Properties.Sanitize.Hwaddress) { - ret.SubName += ".hwasan" - } - if ret.Class == "STATIC_LIBRARIES" && Bool(sanitize.Properties.Sanitize.Scs) { - ret.SubName += ".scs" + // Add a suffix for cfi/hwasan/scs-enabled static/header libraries to allow surfacing + // both the sanitized and non-sanitized variants to make without a name conflict. + if ret.Class == "STATIC_LIBRARIES" || ret.Class == "HEADER_LIBRARIES" { + if Bool(sanitize.Properties.Sanitize.Cfi) { + ret.SubName += ".cfi" + } + if Bool(sanitize.Properties.Sanitize.Hwaddress) { + ret.SubName += ".hwasan" + } + if Bool(sanitize.Properties.Sanitize.Scs) { + ret.SubName += ".scs" + } } } @@ -841,7 +847,7 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { {Mutator: "image", Variation: c.imageVariation()}, {Mutator: "arch", Variation: mctx.Target().String()}, }, staticDepTag, runtimeLibrary) - } else if !c.static() { + } else if !c.static() && !c.header() { // dynamic executable and shared libs get shared runtime libs mctx.AddFarVariationDependencies([]blueprint.Variation{ {Mutator: "link", Variation: "shared"}, @@ -870,60 +876,37 @@ func sanitizerMutator(t sanitizerType) func(android.BottomUpMutatorContext) { modules := mctx.CreateVariations(t.variationName()) modules[0].(*Module).sanitize.SetSanitizer(t, true) } else if c.sanitize.isSanitizerEnabled(t) || c.sanitize.Properties.SanitizeDep { - // Save original sanitizer status before we assign values to variant - // 0 as that overwrites the original. isSanitizerEnabled := c.sanitize.isSanitizerEnabled(t) - - modules := mctx.CreateVariations("", t.variationName()) - modules[0].(*Module).sanitize.SetSanitizer(t, false) - modules[1].(*Module).sanitize.SetSanitizer(t, true) - - modules[0].(*Module).sanitize.Properties.SanitizeDep = false - modules[1].(*Module).sanitize.Properties.SanitizeDep = false - - // We don't need both variants active for anything but CFI-enabled - // target static libraries, so suppress the appropriate variant in - // all other cases. - if t == cfi { - if c.static() { - if !mctx.Device() { - if isSanitizerEnabled { - modules[0].(*Module).Properties.PreventInstall = true - modules[0].(*Module).Properties.HideFromMake = true - } else { - modules[1].(*Module).Properties.PreventInstall = true - modules[1].(*Module).Properties.HideFromMake = true - } - } else { - cfiStaticLibs := cfiStaticLibs(mctx.Config()) - - cfiStaticLibsMutex.Lock() - *cfiStaticLibs = append(*cfiStaticLibs, c.Name()) - cfiStaticLibsMutex.Unlock() - } - } else { - modules[0].(*Module).Properties.PreventInstall = true - modules[0].(*Module).Properties.HideFromMake = true - } - } else if t == asan { - if mctx.Device() { - // CFI and ASAN are currently mutually exclusive so disable - // CFI if this is an ASAN variant. - modules[1].(*Module).sanitize.Properties.InSanitizerDir = true - modules[1].(*Module).sanitize.SetSanitizer(cfi, false) - } - if isSanitizerEnabled { - modules[0].(*Module).Properties.PreventInstall = true - modules[0].(*Module).Properties.HideFromMake = true - } else { - modules[1].(*Module).Properties.PreventInstall = true - modules[1].(*Module).Properties.HideFromMake = true - } - } else if t == scs { - // We don't currently link any static libraries built with make into - // libraries built with SCS, so we don't need logic for propagating - // SCSness of dependencies into make. - if !c.static() { + if mctx.Device() && t.incompatibleWithCfi() { + // TODO: Make sure that cfi mutator runs "after" any of the sanitizers that + // are incompatible with cfi + c.sanitize.SetSanitizer(cfi, false) + } + if c.static() || c.header() || t == asan { + // Static and header libs are split into non-sanitized and sanitized variants. + // Shared libs are not split. However, for asan, we split even for shared + // libs because a library sanitized for asan can't be linked from a library + // that isn't sanitized for asan. + // + // Note for defaultVariation: since we don't split for shared libs but for static/header + // libs, it is possible for the sanitized variant of a static/header lib to depend + // on non-sanitized variant of a shared lib. Such unfulfilled variation causes an + // error when the module is split. defaultVariation is the name of the variation that + // will be used when such a dangling dependency occurs during the split of the current + // module. By setting it to the name of the sanitized variation, the dangling dependency + // is redirected to the sanitized variant of the dependent module. + defaultVariation := t.variationName() + mctx.SetDefaultDependencyVariation(&defaultVariation) + modules := mctx.CreateVariations("", t.variationName()) + modules[0].(*Module).sanitize.SetSanitizer(t, false) + modules[1].(*Module).sanitize.SetSanitizer(t, true) + modules[0].(*Module).sanitize.Properties.SanitizeDep = false + modules[1].(*Module).sanitize.Properties.SanitizeDep = false + + // For cfi/scs/hwasan, we can export both sanitized and un-sanitized variants + // to Make, because the sanitized version has a different suffix in name. + // For other types of sanitizers, suppress the variation that is disabled. + if t != cfi && t != scs && t != hwasan { if isSanitizerEnabled { modules[0].(*Module).Properties.PreventInstall = true modules[0].(*Module).Properties.HideFromMake = true @@ -932,34 +915,30 @@ func sanitizerMutator(t sanitizerType) func(android.BottomUpMutatorContext) { modules[1].(*Module).Properties.HideFromMake = true } } - } else if t == hwasan { - if mctx.Device() { - // CFI and HWASAN are currently mutually exclusive so disable - // CFI if this is an HWASAN variant. - modules[1].(*Module).sanitize.SetSanitizer(cfi, false) - } - + // Export the static lib name to make if c.static() { - if c.useVndk() { - hwasanVendorStaticLibs := hwasanVendorStaticLibs(mctx.Config()) - hwasanStaticLibsMutex.Lock() - *hwasanVendorStaticLibs = append(*hwasanVendorStaticLibs, c.Name()) - hwasanStaticLibsMutex.Unlock() - } else { - hwasanStaticLibs := hwasanStaticLibs(mctx.Config()) - hwasanStaticLibsMutex.Lock() - *hwasanStaticLibs = append(*hwasanStaticLibs, c.Name()) - hwasanStaticLibsMutex.Unlock() - } - } else { - if isSanitizerEnabled { - modules[0].(*Module).Properties.PreventInstall = true - modules[0].(*Module).Properties.HideFromMake = true - } else { - modules[1].(*Module).Properties.PreventInstall = true - modules[1].(*Module).Properties.HideFromMake = true + if t == cfi { + appendStringSync(c.Name(), cfiStaticLibs(mctx.Config()), &cfiStaticLibsMutex) + } else if t == hwasan { + if c.useVndk() { + appendStringSync(c.Name(), hwasanVendorStaticLibs(mctx.Config()), + &hwasanStaticLibsMutex) + } else { + appendStringSync(c.Name(), hwasanStaticLibs(mctx.Config()), + &hwasanStaticLibsMutex) + } } } + } else { + // Shared libs are not split. Only the sanitized variant is created. + modules := mctx.CreateVariations(t.variationName()) + modules[0].(*Module).sanitize.SetSanitizer(t, true) + modules[0].(*Module).sanitize.Properties.SanitizeDep = false + + // locate the asan libraries under /data/asan + if mctx.Device() && t == asan && isSanitizerEnabled { + modules[0].(*Module).sanitize.Properties.InSanitizerDir = true + } } } c.sanitize.Properties.SanitizeDep = false @@ -994,6 +973,12 @@ func hwasanVendorStaticLibs(config android.Config) *[]string { }).(*[]string) } +func appendStringSync(item string, list *[]string, mutex *sync.Mutex) { + mutex.Lock() + *list = append(*list, item) + mutex.Unlock() +} + func enableMinimalRuntime(sanitize *sanitize) bool { if !Bool(sanitize.Properties.Sanitize.Address) && !Bool(sanitize.Properties.Sanitize.Hwaddress) && diff --git a/java/droiddoc.go b/java/droiddoc.go index fd7e2a48..6bac5bb7 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -227,6 +227,9 @@ type ApiToCheck struct { // :module syntax). Removed_api_file *string `android:"path"` + // If not blank, path to the baseline txt file for approved API check violations. + Baseline_file *string `android:"path"` + // Arguments to the apicheck tool. Args *string } @@ -1562,16 +1565,25 @@ func (d *Droidstubs) transformMetalava(ctx android.ModuleContext, implicits andr } func (d *Droidstubs) transformCheckApi(ctx android.ModuleContext, - apiFile, removedApiFile android.Path, implicits android.Paths, + apiFile, removedApiFile android.Path, baselineFile android.OptionalPath, updatedBaselineOut android.WritablePath, implicits android.Paths, javaVersion, bootclasspathArgs, classpathArgs, sourcepathArgs, opts, subdir, msg string, output android.WritablePath) { + + implicits = append(android.Paths{apiFile, removedApiFile, d.apiFile, d.removedApiFile}, implicits...) + var implicitOutputs android.WritablePaths + + if baselineFile.Valid() { + implicits = append(implicits, baselineFile.Path()) + implicitOutputs = append(implicitOutputs, updatedBaselineOut) + } + ctx.Build(pctx, android.BuildParams{ - Rule: metalavaApiCheck, - Description: "Metalava Check API", - Output: output, - Inputs: d.Javadoc.srcFiles, - Implicits: append(android.Paths{apiFile, removedApiFile, d.apiFile, d.removedApiFile}, - implicits...), + Rule: metalavaApiCheck, + Description: "Metalava Check API", + Output: output, + Inputs: d.Javadoc.srcFiles, + Implicits: implicits, + ImplicitOutputs: implicitOutputs, Args: map[string]string{ "srcJarDir": android.PathForModuleOut(ctx, subdir, "srcjars").String(), "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "), @@ -1655,13 +1667,19 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { "check_api.current.api_file") removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Current.Removed_api_file), "check_api.current_removed_api_file") + baselineFile := ctx.ExpandOptionalSource(d.properties.Check_api.Current.Baseline_file, + "check_api.current.baseline_file") d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp") opts := " " + d.Javadoc.args + " --check-compatibility:api:current " + apiFile.String() + " --check-compatibility:removed:current " + removedApiFile.String() + flags.metalavaInclusionAnnotationsFlags + flags.metalavaMergeAnnoDirFlags + " " + baselineOut := android.PathForModuleOut(ctx, "current_baseline.txt") + if baselineFile.Valid() { + opts = opts + "--baseline " + baselineFile.String() + " --update-baseline " + baselineOut.String() + " " + } - d.transformCheckApi(ctx, apiFile, removedApiFile, metalavaCheckApiImplicits, + d.transformCheckApi(ctx, apiFile, removedApiFile, baselineFile, baselineOut, metalavaCheckApiImplicits, javaVersion, flags.bootClasspathArgs, flags.classpathArgs, flags.sourcepathArgs, opts, "current-apicheck", fmt.Sprintf(`\n******************************\n`+ `You have tried to change the API from what has been previously approved.\n\n`+ @@ -1686,13 +1704,19 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { "check_api.last_released.api_file") removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Removed_api_file), "check_api.last_released.removed_api_file") + baselineFile := ctx.ExpandOptionalSource(d.properties.Check_api.Last_released.Baseline_file, + "check_api.last_released.baseline_file") d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, "check_last_released_api.timestamp") opts := " " + d.Javadoc.args + " --check-compatibility:api:released " + apiFile.String() + flags.metalavaInclusionAnnotationsFlags + " --check-compatibility:removed:released " + removedApiFile.String() + flags.metalavaMergeAnnoDirFlags + " " + baselineOut := android.PathForModuleOut(ctx, "last_released_baseline.txt") + if baselineFile.Valid() { + opts = opts + "--baseline " + baselineFile.String() + " --update-baseline " + baselineOut.String() + " " + } - d.transformCheckApi(ctx, apiFile, removedApiFile, metalavaCheckApiImplicits, + d.transformCheckApi(ctx, apiFile, removedApiFile, baselineFile, baselineOut, metalavaCheckApiImplicits, javaVersion, flags.bootClasspathArgs, flags.classpathArgs, flags.sourcepathArgs, opts, "last-apicheck", `\n******************************\n`+ `You have tried to change the API from what has been previously released in\n`+ |