diff options
author | Kevin F. Haggerty <haggertk@lineageos.org> | 2020-06-01 21:06:21 -0600 |
---|---|---|
committer | Kevin F. Haggerty <haggertk@lineageos.org> | 2020-06-01 21:06:21 -0600 |
commit | 418b5a60d6f98e2fc34a217251a6b04dbe8fb3ab (patch) | |
tree | 3a4e9942c65c7925803598f4665a5c681afa6367 /cc | |
parent | 4dac9eee3f43e0fa62015d6f7a318ec05f63bc63 (diff) | |
parent | a4f4c0d08088a3bd8d00257e058d1bdfc093b1f8 (diff) | |
download | build_soong-lineage-17.1.tar.gz build_soong-lineage-17.1.tar.bz2 build_soong-lineage-17.1.zip |
Merge tag 'android-10.0.0_r37' into staging/lineage-17.1_merge-android-10.0.0_r37lineage-17.1
Android 10.0.0 Release 37 (QQ3A.200605.001)
* tag 'android-10.0.0_r37':
Wrap getenv when linking a coverage-enabled binary
Refactor libprofile-extras to be added as a whole static library
Package coverage files as a zip.
Build native coverage variant of APEXes when needed
Change-Id: I89b49b7f720021e528ad51ef2be9554e06189904
Diffstat (limited to 'cc')
-rw-r--r-- | cc/binary.go | 6 | ||||
-rw-r--r-- | cc/builder.go | 23 | ||||
-rw-r--r-- | cc/cc.go | 11 | ||||
-rw-r--r-- | cc/coverage.go | 64 | ||||
-rw-r--r-- | cc/library.go | 8 | ||||
-rw-r--r-- | cc/object.go | 4 |
6 files changed, 85 insertions, 31 deletions
diff --git a/cc/binary.go b/cc/binary.go index aa5b2794..2a6ceb82 100644 --- a/cc/binary.go +++ b/cc/binary.go @@ -388,7 +388,7 @@ func (binary *binaryDecorator) link(ctx ModuleContext, objs.coverageFiles = append(objs.coverageFiles, deps.StaticLibObjs.coverageFiles...) objs.coverageFiles = append(objs.coverageFiles, deps.WholeStaticLibObjs.coverageFiles...) - binary.coverageOutputFile = TransformCoverageFilesToLib(ctx, objs, builderFlags, binary.getStem(ctx)) + binary.coverageOutputFile = TransformCoverageFilesToZip(ctx, objs, binary.getStem(ctx)) // Need to determine symlinks early since some targets (ie APEX) need this // information but will not call 'install' @@ -421,6 +421,10 @@ func (binary *binaryDecorator) nativeCoverage() bool { return true } +func (binary *binaryDecorator) coverageOutputFilePath() android.OptionalPath { + return binary.coverageOutputFile +} + // /system/bin/linker -> /apex/com.android.runtime/bin/linker func (binary *binaryDecorator) installSymlinkToRuntimeApex(ctx ModuleContext, file android.Path) { dir := binary.baseInstaller.installDir(ctx) diff --git a/cc/builder.go b/cc/builder.go index fc5400c7..a9ee4e92 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -227,6 +227,14 @@ var ( blueprint.RuleParams{ Command: "gunzip -c $in > $out", }) + + zip = pctx.AndroidStaticRule("zip", + blueprint.RuleParams{ + Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp", + CommandDeps: []string{"${SoongZipCmd}"}, + Rspfile: "$out.rsp", + RspfileContent: "$in", + }) ) func init() { @@ -239,6 +247,8 @@ func init() { // Darwin doesn't have /proc pctx.StaticVariable("relPwd", "") } + + pctx.HostBinToolVariable("SoongZipCmd", "soong_zip") } type builderFlags struct { @@ -867,13 +877,18 @@ func TransformDarwinStrip(ctx android.ModuleContext, inputFile android.Path, }) } -func TransformCoverageFilesToLib(ctx android.ModuleContext, - inputs Objects, flags builderFlags, baseName string) android.OptionalPath { +func TransformCoverageFilesToZip(ctx android.ModuleContext, + inputs Objects, baseName string) android.OptionalPath { if len(inputs.coverageFiles) > 0 { - outputFile := android.PathForModuleOut(ctx, baseName+".gcnodir") + outputFile := android.PathForModuleOut(ctx, baseName+".zip") - TransformObjToStaticLib(ctx, inputs.coverageFiles, flags, outputFile, nil) + ctx.Build(pctx, android.BuildParams{ + Rule: zip, + Description: "zip " + outputFile.Base(), + Inputs: inputs.coverageFiles, + Output: outputFile, + }) return android.OptionalPathForPath(outputFile) } @@ -314,6 +314,7 @@ type linker interface { unstrippedOutputFilePath() android.Path nativeCoverage() bool + coverageOutputFilePath() android.OptionalPath } type installer interface { @@ -360,6 +361,7 @@ var ( ndkLateStubDepTag = dependencyTag{name: "ndk late stub", library: true} vndkExtDepTag = dependencyTag{name: "vndk extends", library: true} runtimeDepTag = dependencyTag{name: "runtime lib"} + coverageDepTag = dependencyTag{name: "coverage"} ) // Module contains the properties and members used by all C/C++ module types, and implements @@ -422,6 +424,13 @@ func (c *Module) UnstrippedOutputFile() android.Path { return nil } +func (c *Module) CoverageOutputFile() android.OptionalPath { + if c.linker != nil { + return c.linker.coverageOutputFilePath() + } + return android.OptionalPath{} +} + func (c *Module) RelativeInstallPath() string { if c.installer != nil { return c.installer.relativeInstallPath() @@ -955,7 +964,7 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { flags = c.sanitize.flags(ctx, flags) } if c.coverage != nil { - flags = c.coverage.flags(ctx, flags) + flags, deps = c.coverage.flags(ctx, flags, deps) } if c.lto != nil { flags = c.lto.flags(ctx, flags) diff --git a/cc/coverage.go b/cc/coverage.go index 9dc7f06b..2e81a9e4 100644 --- a/cc/coverage.go +++ b/cc/coverage.go @@ -17,6 +17,8 @@ package cc import ( "strconv" + "github.com/google/blueprint" + "android/soong/android" ) @@ -41,30 +43,28 @@ func (cov *coverage) props() []interface{} { return []interface{}{&cov.Properties} } -func (cov *coverage) deps(ctx BaseModuleContext, deps Deps) Deps { - if cov.Properties.NeedCoverageBuild { - // Link libprofile-extras/libprofile-extras_ndk when coverage - // variant is required. This is a no-op unless coverage is - // actually enabled during linking, when - // '-uinit_profile_extras' is added (in flags()) to force the - // setup code in libprofile-extras be linked into the - // binary/library. - // - // We cannot narrow it further to only the 'cov' variant since - // the mutator hasn't run (and we don't have the 'cov' variant - // yet). - if !ctx.useSdk() { - deps.LateStaticLibs = append(deps.LateStaticLibs, "libprofile-extras") - } else { - deps.LateStaticLibs = append(deps.LateStaticLibs, "libprofile-extras_ndk") - } +func getProfileLibraryName(ctx ModuleContextIntf) string { + // This function should only ever be called for a cc.Module, so the + // following statement should always succeed. + if ctx.useSdk() { + return "libprofile-extras_ndk" + } else { + return "libprofile-extras" + } +} + +func (cov *coverage) deps(ctx DepsContext, deps Deps) Deps { + if cov.Properties.NeedCoverageVariant { + ctx.AddVariationDependencies([]blueprint.Variation{ + {Mutator: "link", Variation: "static"}, + }, coverageDepTag, getProfileLibraryName(ctx)) } return deps } -func (cov *coverage) flags(ctx ModuleContext, flags Flags) Flags { +func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags, PathDeps) { if !ctx.DeviceConfig().NativeCoverageEnabled() { - return flags + return flags, deps } if cov.Properties.CoverageEnabled { @@ -114,11 +114,13 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags) Flags { if cov.linkCoverage { flags.LdFlags = append(flags.LdFlags, "--coverage") - // Force linking of constructor/setup code in libprofile-extras - flags.LdFlags = append(flags.LdFlags, "-uinit_profile_extras") + coverage := ctx.GetDirectDepWithTag(getProfileLibraryName(ctx), coverageDepTag).(*Module) + deps.WholeStaticLibs = append(deps.WholeStaticLibs, coverage.OutputFile().Path()) + + flags.LdFlags = append(flags.LdFlags, "-Wl,--wrap,getenv") } - return flags + return flags, deps } func (cov *coverage) begin(ctx BaseModuleContext) { @@ -138,7 +140,6 @@ func (cov *coverage) begin(ctx BaseModuleContext) { } else { // Check if Native_coverage is set to false. This property defaults to true. needCoverageVariant = BoolDefault(cov.Properties.Native_coverage, true) - if sdk_version := ctx.sdkVersion(); ctx.useSdk() && sdk_version != "current" { // Native coverage is not supported for SDK versions < 23 if fromApi, err := strconv.Atoi(sdk_version); err == nil && fromApi < 23 { @@ -156,6 +157,14 @@ func (cov *coverage) begin(ctx BaseModuleContext) { cov.Properties.NeedCoverageVariant = needCoverageVariant } +// Coverage is an interface for non-CC modules to implement to be mutated for coverage +type Coverage interface { + android.Module + IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool + PreventInstall() + HideFromMake() +} + func coverageMutator(mctx android.BottomUpMutatorContext) { if c, ok := mctx.Module().(*Module); ok && c.coverage != nil { needCoverageVariant := c.coverage.Properties.NeedCoverageVariant @@ -175,5 +184,14 @@ func coverageMutator(mctx android.BottomUpMutatorContext) { m[1].(*Module).coverage.Properties.CoverageEnabled = needCoverageBuild m[1].(*Module).coverage.Properties.IsCoverageVariant = true } + } else if cov, ok := mctx.Module().(Coverage); ok && cov.IsNativeCoverageNeeded(mctx) { + // APEX modules fall here + + // Note: variant "" is also created because an APEX can be depended on by another + // module which are split into "" and "cov" variants. e.g. when cc_test refers + // to an APEX via 'data' property. + m := mctx.CreateVariations("", "cov") + m[0].(Coverage).PreventInstall() + m[0].(Coverage).HideFromMake() } } diff --git a/cc/library.go b/cc/library.go index d8eb5b4e..39f7a724 100644 --- a/cc/library.go +++ b/cc/library.go @@ -629,7 +629,7 @@ func (library *libraryDecorator) linkStatic(ctx ModuleContext, TransformObjToStaticLib(ctx, library.objects.objFiles, builderFlags, outputFile, objs.tidyFiles) - library.coverageOutputFile = TransformCoverageFilesToLib(ctx, library.objects, builderFlags, + library.coverageOutputFile = TransformCoverageFilesToZip(ctx, library.objects, ctx.ModuleName()+library.MutatedProperties.VariantName) library.wholeStaticMissingDeps = ctx.GetMissingDependencies() @@ -741,7 +741,7 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, objs.sAbiDumpFiles = append(objs.sAbiDumpFiles, deps.StaticLibObjs.sAbiDumpFiles...) objs.sAbiDumpFiles = append(objs.sAbiDumpFiles, deps.WholeStaticLibObjs.sAbiDumpFiles...) - library.coverageOutputFile = TransformCoverageFilesToLib(ctx, objs, builderFlags, library.getLibName(ctx)) + library.coverageOutputFile = TransformCoverageFilesToZip(ctx, objs, library.getLibName(ctx)) library.linkSAbiDumpFiles(ctx, objs, fileName, ret) return ret @@ -758,6 +758,10 @@ func (library *libraryDecorator) nativeCoverage() bool { return true } +func (library *libraryDecorator) coverageOutputFilePath() android.OptionalPath { + return library.coverageOutputFile +} + func getRefAbiDumpFile(ctx ModuleContext, vndkVersion, fileName string) android.Path { isLlndk := inList(ctx.baseModuleName(), llndkLibraries) || inList(ctx.baseModuleName(), ndkMigratedLibs) diff --git a/cc/object.go b/cc/object.go index 50ecc38e..2fefd301 100644 --- a/cc/object.go +++ b/cc/object.go @@ -118,3 +118,7 @@ func (object *objectLinker) unstrippedOutputFilePath() android.Path { func (object *objectLinker) nativeCoverage() bool { return true } + +func (object *objectLinker) coverageOutputFilePath() android.OptionalPath { + return android.OptionalPath{} +} |