From 0f1bd9d3d73f1d1a673c23d5b180172c8c4605db Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Mon, 22 May 2017 10:53:24 -0700 Subject: Add arch, lib name to header-abi-diff invocation. Test: mm -j64 in platform/bionic, platform/system/core/liblog. Bug: 38325544 Merged-In: I4fa9f85c997a3832f18b81f0ecc782e7091566f0 Change-Id: Ia2098c1facf2999ef51d55212acc1317e2bf98c1 (cherry picked from commit f54e0a79e2b10a365b69a606f21333423508e965) --- cc/builder.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cc/builder.go b/cc/builder.go index 81ecd73e..01000456 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -195,11 +195,11 @@ var ( // Abidiff check turned on in advice-only mode. Builds will not fail on abi incompatibilties / extensions. sAbiDiff = pctx.AndroidStaticRule("sAbiDiff", blueprint.RuleParams{ - Command: "$sAbiDiffer -advice-only -o ${out} -new $in -old $referenceDump", + Command: "$sAbiDiffer -lib $libName -arch $arch -advice-only -o ${out} -new $in -old $referenceDump", CommandDeps: []string{"$sAbiDiffer"}, Description: "header-abi-diff -o ${out} -new $in -old $referenceDump", }, - "referenceDump") + "referenceDump", "libName", "arch") ) func init() { @@ -650,6 +650,8 @@ func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceD Implicit: referenceDump, Args: map[string]string{ "referenceDump": referenceDump.String(), + "libName": baseName, + "arch": ctx.Arch().ArchType.Name, }, }) return android.OptionalPathForPath(outputFile) -- cgit v1.2.3 From 8cede07e698cc1a15257a6b5dd653488e2bbf49e Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Thu, 20 Apr 2017 06:53:59 -0700 Subject: Optimizations to abi checking. We now add export_static_lib_headers, export_generated_headers to the filters while dumping the abi of a library using header-abi-dumper (through -I additions to the invocation of header-abi-dumper and header-abi-linker) Also add support for zipped reference source based abi dumps. Test: mm -j64 in hardware/interfaces/nfc/default/1.0 produces android.hardware.nfc@1.0.so.lsdump with abi filtered out using generated headers. Test: Copied the linked abi dumps produced by mm -j64 in bionic/libc to prebuilts/abi-dumps/ndk and gzipped them. Ran mm -j64 again in bionic/libc and verified header-abi-diff getting invoked. Bug: 32750600 Merged-In: I4fa9f85c997a3832f18b81f0ecc782e7091566f0 Change-Id: I26210af908c87a6143e39fa25f50307acb68a387 --- android/paths.go | 4 ++-- cc/androidmk.go | 1 + cc/builder.go | 20 +++++++++++++++++++- cc/cc.go | 12 ++++++++++-- cc/library.go | 39 +++++++++++++++++++++++++++++++++------ cc/makevars.go | 1 + cc/sabi.go | 5 +++-- 7 files changed, 69 insertions(+), 13 deletions(-) diff --git a/android/paths.go b/android/paths.go index 75e5980e..bd0b70c1 100644 --- a/android/paths.go +++ b/android/paths.go @@ -584,10 +584,10 @@ func PathForVndkRefAbiDump(ctx ModuleContext, version, fileName string, vndkOrNd var vndkOrNdkDir string var ext string if isSourceDump { - ext = ".lsdump" + ext = ".lsdump.gz" sourceOrBinaryDir = "source-based" } else { - ext = ".bdump" + ext = ".bdump.gz" sourceOrBinaryDir = "binary-based" } if vndkOrNdk { diff --git a/cc/androidmk.go b/cc/androidmk.go index 9fbfa801..4137373e 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -146,6 +146,7 @@ func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.An fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES += ", library.sAbiOutputFile.String()) if library.sAbiDiff.Valid() && !library.static() { fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES += ", library.sAbiDiff.String()) + fmt.Fprintln(w, "HEADER_ABI_DIFFS += ", library.sAbiDiff.String()) } } diff --git a/cc/builder.go b/cc/builder.go index 01000456..8ae35a8d 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -171,9 +171,10 @@ var ( _ = pctx.SourcePathVariable("sAbiDumper", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-dumper") + // -w has been added since header-abi-dumper does not need to produce any sort of diagnostic information. sAbiDump = pctx.AndroidStaticRule("sAbiDump", blueprint.RuleParams{ - Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -Wno-packed -Qunused-arguments -isystem ${config.RSIncludePath}", + Command: "rm -f $out && $sAbiDumper -o ${out} $in $exportDirs -- $cFlags -w -isystem ${config.RSIncludePath}", CommandDeps: []string{"$sAbiDumper"}, Description: "header-abi-dumper $in -o $out $exportDirs", }, @@ -192,6 +193,7 @@ var ( "symbolFile", "arch", "api", "exportedHeaderFlags") _ = pctx.SourcePathVariable("sAbiDiffer", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/header-abi-diff") + // Abidiff check turned on in advice-only mode. Builds will not fail on abi incompatibilties / extensions. sAbiDiff = pctx.AndroidStaticRule("sAbiDiff", blueprint.RuleParams{ @@ -200,6 +202,12 @@ var ( Description: "header-abi-diff -o ${out} -new $in -old $referenceDump", }, "referenceDump", "libName", "arch") + + unzipRefSAbiDump = pctx.AndroidStaticRule("unzipRefSAbiDump", + blueprint.RuleParams{ + Command: "gunzip -c $in > $out", + Description: "gunzip $out", + }) ) func init() { @@ -640,6 +648,16 @@ func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Path return android.OptionalPathForPath(outputFile) } +func UnzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseName string) android.Path { + outputFile := android.PathForModuleOut(ctx, baseName+"_ref.lsdump") + ctx.ModuleBuild(pctx, android.ModuleBuildParams{ + Rule: unzipRefSAbiDump, + Output: outputFile, + Input: zippedRefDump, + }) + return outputFile +} + func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path, baseName string) android.OptionalPath { outputFile := android.PathForModuleOut(ctx, baseName+".abidiff") diff --git a/cc/cc.go b/cc/cc.go index 6e2f6a50..a10aaaac 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -428,8 +428,7 @@ func (ctx *moduleContextImpl) vndk() bool { // Create source abi dumps if the module belongs to the list of VndkLibraries. func (ctx *moduleContextImpl) createVndkSourceAbiDump() bool { - return ctx.ctx.Device() && (inList(ctx.baseModuleName(), config.LLndkLibraries())) || - (inList(ctx.baseModuleName(), config.VndkLibraries())) + return ctx.ctx.Device() && ((Bool(ctx.mod.Properties.Vendor_available)) || (inList(ctx.baseModuleName(), config.LLndkLibraries()))) } func (ctx *moduleContextImpl) selectedStl() string { @@ -917,6 +916,9 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags) depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps, genRule.GeneratedSourceFiles()...) + // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library. + c.sabi.Properties.ReexportedIncludeFlags = append(c.sabi.Properties.ReexportedIncludeFlags, flags) + } } else { ctx.ModuleErrorf("module %q is not a genrule", name) @@ -963,6 +965,12 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { if t.reexportFlags { depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags...) depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps, deps...) + // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library. + // Re-exported flags from shared library dependencies are not included as those shared libraries + // will be included in the vndk set. + if tag == staticExportDepTag || tag == headerExportDepTag { + c.sabi.Properties.ReexportedIncludeFlags = append(c.sabi.Properties.ReexportedIncludeFlags, flags...) + } } } diff --git a/cc/library.go b/cc/library.go index 167a5122..8a423aae 100644 --- a/cc/library.go +++ b/cc/library.go @@ -312,6 +312,27 @@ func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) F return library.baseCompiler.compilerFlags(ctx, flags) } +func extractExportIncludesFromFlags(flags []string) []string { + // This method is used in the generation of rules which produce + // abi-dumps for source files. Exported headers are needed to infer the + // abi exported by a library and filter out the rest of the abi dumped + // from a source. We extract the include flags exported by a library. + // This includes the flags exported which are re-exported from static + // library dependencies, exported header library dependencies and + // generated header dependencies. Re-exported shared library include + // flags are not in this set since shared library dependencies will + // themselves be included in the vndk. -isystem headers are not included + // since for bionic libraries, abi-filtering is taken care of by version + // scripts. + var exportedIncludes []string + for _, flag := range flags { + if strings.HasPrefix(flag, "-I") { + exportedIncludes = append(exportedIncludes, flag) + } + } + return exportedIncludes +} + func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects { if !library.buildShared() && !library.buildStatic() { if len(library.baseCompiler.Properties.Srcs) > 0 { @@ -325,13 +346,15 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa } return Objects{} } - if ctx.createVndkSourceAbiDump() || (library.sabi.Properties.CreateSAbiDumps && ctx.Device()) { + if (ctx.createVndkSourceAbiDump() || (library.sabi.Properties.CreateSAbiDumps && ctx.Device())) && !ctx.Vendor() { exportIncludeDirs := android.PathsForModuleSrc(ctx, library.flagExporter.Properties.Export_include_dirs) var SourceAbiFlags []string for _, dir := range exportIncludeDirs.Strings() { - SourceAbiFlags = append(SourceAbiFlags, "-I "+dir) + SourceAbiFlags = append(SourceAbiFlags, "-I"+dir) + } + for _, reexportedInclude := range extractExportIncludesFromFlags(library.sabi.Properties.ReexportedIncludeFlags) { + SourceAbiFlags = append(SourceAbiFlags, reexportedInclude) } - flags.SAbiFlags = SourceAbiFlags total_length := len(library.baseCompiler.Properties.Srcs) + len(deps.GeneratedSources) + len(library.Properties.Shared.Srcs) + len(library.Properties.Static.Srcs) @@ -568,7 +591,7 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objects, fileName string) { //Also take into account object re-use. - if len(objs.sAbiDumpFiles) > 0 && ctx.createVndkSourceAbiDump() { + if len(objs.sAbiDumpFiles) > 0 && ctx.createVndkSourceAbiDump() && !ctx.Vendor() { refSourceDumpFile := android.PathForVndkRefAbiDump(ctx, "current", fileName, vndkVsNdk(ctx), true) versionScript := android.OptionalPathForModuleSrc(ctx, library.Properties.Version_script) var symbolFile android.OptionalPath @@ -578,12 +601,16 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec exportIncludeDirs := android.PathsForModuleSrc(ctx, library.flagExporter.Properties.Export_include_dirs) var SourceAbiFlags []string for _, dir := range exportIncludeDirs.Strings() { - SourceAbiFlags = append(SourceAbiFlags, "-I "+dir) + SourceAbiFlags = append(SourceAbiFlags, "-I"+dir) + } + for _, reexportedInclude := range extractExportIncludesFromFlags(library.sabi.Properties.ReexportedIncludeFlags) { + SourceAbiFlags = append(SourceAbiFlags, reexportedInclude) } exportedHeaderFlags := strings.Join(SourceAbiFlags, " ") library.sAbiOutputFile = TransformDumpToLinkedDump(ctx, objs.sAbiDumpFiles, symbolFile, "current", fileName, exportedHeaderFlags) if refSourceDumpFile.Valid() { - library.sAbiDiff = SourceAbiDiff(ctx, library.sAbiOutputFile.Path(), refSourceDumpFile.Path(), fileName) + unzippedRefDump := UnzipRefDump(ctx, refSourceDumpFile.Path(), fileName) + library.sAbiDiff = SourceAbiDiff(ctx, library.sAbiOutputFile.Path(), unzippedRefDump, fileName) } } } diff --git a/cc/makevars.go b/cc/makevars.go index 7ff16529..92feccc0 100644 --- a/cc/makevars.go +++ b/cc/makevars.go @@ -42,6 +42,7 @@ func makeVarsProvider(ctx android.MakeVarsContext) { ctx.Strict("RS_LLVM_PREBUILTS_VERSION", "${config.RSClangVersion}") ctx.Strict("RS_LLVM_PREBUILTS_BASE", "${config.RSClangBase}") ctx.Strict("RS_LLVM_PREBUILTS_PATH", "${config.RSLLVMPrebuiltsPath}") + ctx.Strict("RS_LLVM_INCLUDES", "${config.RSIncludePath}") ctx.Strict("RS_CLANG", "${config.RSLLVMPrebuiltsPath}/clang") ctx.Strict("RS_LLVM_AS", "${config.RSLLVMPrebuiltsPath}/llvm-as") ctx.Strict("RS_LLVM_LINK", "${config.RSLLVMPrebuiltsPath}/llvm-link") diff --git a/cc/sabi.go b/cc/sabi.go index 7ae31c97..01ef737f 100644 --- a/cc/sabi.go +++ b/cc/sabi.go @@ -22,7 +22,8 @@ import ( ) type SAbiProperties struct { - CreateSAbiDumps bool `blueprint:"mutated"` + CreateSAbiDumps bool `blueprint:"mutated"` + ReexportedIncludeFlags []string } type sabi struct { @@ -45,7 +46,7 @@ func (sabimod *sabi) flags(ctx ModuleContext, flags Flags) Flags { func sabiDepsMutator(mctx android.TopDownMutatorContext) { if c, ok := mctx.Module().(*Module); ok && - ((inList(c.Name(), config.VndkLibraries())) || (inList(c.Name(), config.LLndkLibraries())) || + (Bool(c.Properties.Vendor_available) || (inList(c.Name(), config.LLndkLibraries())) || (c.sabi != nil && c.sabi.Properties.CreateSAbiDumps)) { mctx.VisitDirectDeps(func(m blueprint.Module) { tag := mctx.OtherModuleDependencyTag(m) -- cgit v1.2.3