1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "sync" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 21*333d2b36SAndroid Build Coastguard Worker "android/soong/cc/config" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workervar ( 25*333d2b36SAndroid Build Coastguard Worker lsdumpPathsLock sync.Mutex 26*333d2b36SAndroid Build Coastguard Worker lsdumpKey = android.NewOnceKey("lsdump") 27*333d2b36SAndroid Build Coastguard Worker) 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workerfunc lsdumpPaths(config android.Config) *[]string { 30*333d2b36SAndroid Build Coastguard Worker return config.Once(lsdumpKey, func() any { 31*333d2b36SAndroid Build Coastguard Worker return &[]string{} 32*333d2b36SAndroid Build Coastguard Worker }).(*[]string) 33*333d2b36SAndroid Build Coastguard Worker} 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workertype lsdumpTag string 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workerconst ( 38*333d2b36SAndroid Build Coastguard Worker apexLsdumpTag lsdumpTag = "APEX" 39*333d2b36SAndroid Build Coastguard Worker llndkLsdumpTag lsdumpTag = "LLNDK" 40*333d2b36SAndroid Build Coastguard Worker platformLsdumpTag lsdumpTag = "PLATFORM" 41*333d2b36SAndroid Build Coastguard Worker productLsdumpTag lsdumpTag = "PRODUCT" 42*333d2b36SAndroid Build Coastguard Worker vendorLsdumpTag lsdumpTag = "VENDOR" 43*333d2b36SAndroid Build Coastguard Worker) 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker// Return the prebuilt ABI dump directory for a tag; an empty string for an opt-in dump. 46*333d2b36SAndroid Build Coastguard Workerfunc (tag *lsdumpTag) dirName() string { 47*333d2b36SAndroid Build Coastguard Worker switch *tag { 48*333d2b36SAndroid Build Coastguard Worker case apexLsdumpTag: 49*333d2b36SAndroid Build Coastguard Worker return "platform" 50*333d2b36SAndroid Build Coastguard Worker case llndkLsdumpTag: 51*333d2b36SAndroid Build Coastguard Worker return "vndk" 52*333d2b36SAndroid Build Coastguard Worker default: 53*333d2b36SAndroid Build Coastguard Worker return "" 54*333d2b36SAndroid Build Coastguard Worker } 55*333d2b36SAndroid Build Coastguard Worker} 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Worker// Properties for ABI compatibility checker in Android.bp. 58*333d2b36SAndroid Build Coastguard Workertype headerAbiCheckerProperties struct { 59*333d2b36SAndroid Build Coastguard Worker // Enable ABI checks (even if this is not an LLNDK/VNDK lib) 60*333d2b36SAndroid Build Coastguard Worker Enabled *bool 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker // Path to a symbol file that specifies the symbols to be included in the generated 63*333d2b36SAndroid Build Coastguard Worker // ABI dump file 64*333d2b36SAndroid Build Coastguard Worker Symbol_file *string `android:"path"` 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Worker // Symbol versions that should be ignored from the symbol file 67*333d2b36SAndroid Build Coastguard Worker Exclude_symbol_versions []string 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker // Symbol tags that should be ignored from the symbol file 70*333d2b36SAndroid Build Coastguard Worker Exclude_symbol_tags []string 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker // Run checks on all APIs (in addition to the ones referred by 73*333d2b36SAndroid Build Coastguard Worker // one of exported ELF symbols.) 74*333d2b36SAndroid Build Coastguard Worker Check_all_apis *bool 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker // Extra flags passed to header-abi-diff 77*333d2b36SAndroid Build Coastguard Worker Diff_flags []string 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Worker // Opt-in reference dump directories 80*333d2b36SAndroid Build Coastguard Worker Ref_dump_dirs []string 81*333d2b36SAndroid Build Coastguard Worker} 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Workerfunc (props *headerAbiCheckerProperties) enabled() bool { 84*333d2b36SAndroid Build Coastguard Worker return Bool(props.Enabled) 85*333d2b36SAndroid Build Coastguard Worker} 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Workerfunc (props *headerAbiCheckerProperties) explicitlyDisabled() bool { 88*333d2b36SAndroid Build Coastguard Worker return !BoolDefault(props.Enabled, true) 89*333d2b36SAndroid Build Coastguard Worker} 90*333d2b36SAndroid Build Coastguard Worker 91*333d2b36SAndroid Build Coastguard Workertype SAbiProperties struct { 92*333d2b36SAndroid Build Coastguard Worker // Whether ABI dump should be created for this module. 93*333d2b36SAndroid Build Coastguard Worker // Set by `sabiTransitionMutator` if this module is a shared library that needs ABI check, 94*333d2b36SAndroid Build Coastguard Worker // or a static library that is depended on by an ABI checked library. 95*333d2b36SAndroid Build Coastguard Worker ShouldCreateSourceAbiDump bool `blueprint:"mutated"` 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Worker // Include directories that may contain ABI information exported by a library. 98*333d2b36SAndroid Build Coastguard Worker // These directories are passed to the header-abi-dumper. 99*333d2b36SAndroid Build Coastguard Worker ReexportedIncludes []string `blueprint:"mutated"` 100*333d2b36SAndroid Build Coastguard Worker ReexportedSystemIncludes []string `blueprint:"mutated"` 101*333d2b36SAndroid Build Coastguard Worker} 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Workertype sabi struct { 104*333d2b36SAndroid Build Coastguard Worker Properties SAbiProperties 105*333d2b36SAndroid Build Coastguard Worker} 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Workerfunc (sabi *sabi) props() []interface{} { 108*333d2b36SAndroid Build Coastguard Worker return []interface{}{&sabi.Properties} 109*333d2b36SAndroid Build Coastguard Worker} 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Workerfunc (sabi *sabi) flags(ctx ModuleContext, flags Flags) Flags { 112*333d2b36SAndroid Build Coastguard Worker // Filter out flags which libTooling don't understand. 113*333d2b36SAndroid Build Coastguard Worker // This is here for legacy reasons and future-proof, in case the version of libTooling and clang 114*333d2b36SAndroid Build Coastguard Worker // diverge. 115*333d2b36SAndroid Build Coastguard Worker flags.Local.ToolingCFlags = config.ClangLibToolingFilterUnknownCflags(flags.Local.CFlags) 116*333d2b36SAndroid Build Coastguard Worker flags.Global.ToolingCFlags = config.ClangLibToolingFilterUnknownCflags(flags.Global.CFlags) 117*333d2b36SAndroid Build Coastguard Worker flags.Local.ToolingCppFlags = config.ClangLibToolingFilterUnknownCflags(flags.Local.CppFlags) 118*333d2b36SAndroid Build Coastguard Worker flags.Global.ToolingCppFlags = config.ClangLibToolingFilterUnknownCflags(flags.Global.CppFlags) 119*333d2b36SAndroid Build Coastguard Worker return flags 120*333d2b36SAndroid Build Coastguard Worker} 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Worker// Returns true if ABI dump should be created for this library, either because library is ABI 123*333d2b36SAndroid Build Coastguard Worker// checked or is depended on by an ABI checked library. 124*333d2b36SAndroid Build Coastguard Worker// Could be called as a nil receiver. 125*333d2b36SAndroid Build Coastguard Workerfunc (sabi *sabi) shouldCreateSourceAbiDump() bool { 126*333d2b36SAndroid Build Coastguard Worker return sabi != nil && sabi.Properties.ShouldCreateSourceAbiDump 127*333d2b36SAndroid Build Coastguard Worker} 128*333d2b36SAndroid Build Coastguard Worker 129*333d2b36SAndroid Build Coastguard Worker// Returns a slice of strings that represent the ABI dumps generated for this module. 130*333d2b36SAndroid Build Coastguard Workerfunc classifySourceAbiDump(m *Module) []lsdumpTag { 131*333d2b36SAndroid Build Coastguard Worker result := []lsdumpTag{} 132*333d2b36SAndroid Build Coastguard Worker headerAbiChecker := m.library.getHeaderAbiCheckerProperties(m) 133*333d2b36SAndroid Build Coastguard Worker if headerAbiChecker.explicitlyDisabled() { 134*333d2b36SAndroid Build Coastguard Worker return result 135*333d2b36SAndroid Build Coastguard Worker } 136*333d2b36SAndroid Build Coastguard Worker if !m.InProduct() && !m.InVendor() { 137*333d2b36SAndroid Build Coastguard Worker if m.isImplementationForLLNDKPublic() { 138*333d2b36SAndroid Build Coastguard Worker result = append(result, llndkLsdumpTag) 139*333d2b36SAndroid Build Coastguard Worker } 140*333d2b36SAndroid Build Coastguard Worker if m.library.hasStubsVariants() { 141*333d2b36SAndroid Build Coastguard Worker result = append(result, apexLsdumpTag) 142*333d2b36SAndroid Build Coastguard Worker } 143*333d2b36SAndroid Build Coastguard Worker if headerAbiChecker.enabled() { 144*333d2b36SAndroid Build Coastguard Worker result = append(result, platformLsdumpTag) 145*333d2b36SAndroid Build Coastguard Worker } 146*333d2b36SAndroid Build Coastguard Worker } else if headerAbiChecker.enabled() { 147*333d2b36SAndroid Build Coastguard Worker if m.InProduct() { 148*333d2b36SAndroid Build Coastguard Worker result = append(result, productLsdumpTag) 149*333d2b36SAndroid Build Coastguard Worker } 150*333d2b36SAndroid Build Coastguard Worker if m.InVendor() { 151*333d2b36SAndroid Build Coastguard Worker result = append(result, vendorLsdumpTag) 152*333d2b36SAndroid Build Coastguard Worker } 153*333d2b36SAndroid Build Coastguard Worker } 154*333d2b36SAndroid Build Coastguard Worker return result 155*333d2b36SAndroid Build Coastguard Worker} 156*333d2b36SAndroid Build Coastguard Worker 157*333d2b36SAndroid Build Coastguard Workertype shouldCreateAbiDumpContext interface { 158*333d2b36SAndroid Build Coastguard Worker android.ModuleProviderContext 159*333d2b36SAndroid Build Coastguard Worker Module() android.Module 160*333d2b36SAndroid Build Coastguard Worker Config() android.Config 161*333d2b36SAndroid Build Coastguard Worker} 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Workervar _ shouldCreateAbiDumpContext = android.ModuleContext(nil) 164*333d2b36SAndroid Build Coastguard Workervar _ shouldCreateAbiDumpContext = android.OutgoingTransitionContext(nil) 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Worker// Called from sabiTransitionMutator to check whether ABI dumps should be created for this module. 167*333d2b36SAndroid Build Coastguard Worker// ctx should be wrapping a native library type module. 168*333d2b36SAndroid Build Coastguard Workerfunc shouldCreateSourceAbiDumpForLibrary(ctx shouldCreateAbiDumpContext) bool { 169*333d2b36SAndroid Build Coastguard Worker m, ok := ctx.Module().(*Module) 170*333d2b36SAndroid Build Coastguard Worker if !ok { 171*333d2b36SAndroid Build Coastguard Worker return false 172*333d2b36SAndroid Build Coastguard Worker } 173*333d2b36SAndroid Build Coastguard Worker 174*333d2b36SAndroid Build Coastguard Worker // Only generate ABI dump for device modules. 175*333d2b36SAndroid Build Coastguard Worker if !m.Device() { 176*333d2b36SAndroid Build Coastguard Worker return false 177*333d2b36SAndroid Build Coastguard Worker } 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Worker // Only create ABI dump for native library module types. 180*333d2b36SAndroid Build Coastguard Worker if m.library == nil { 181*333d2b36SAndroid Build Coastguard Worker return false 182*333d2b36SAndroid Build Coastguard Worker } 183*333d2b36SAndroid Build Coastguard Worker 184*333d2b36SAndroid Build Coastguard Worker // Don't create ABI dump for static libraries 185*333d2b36SAndroid Build Coastguard Worker // The sabi variant will be propagated to dependencies of ABI checked libraries. 186*333d2b36SAndroid Build Coastguard Worker if m.library.static() { 187*333d2b36SAndroid Build Coastguard Worker return false 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Worker // Module is shared library type. 191*333d2b36SAndroid Build Coastguard Worker 192*333d2b36SAndroid Build Coastguard Worker // Don't check uninstallable modules. 193*333d2b36SAndroid Build Coastguard Worker if m.IsHideFromMake() { 194*333d2b36SAndroid Build Coastguard Worker return false 195*333d2b36SAndroid Build Coastguard Worker } 196*333d2b36SAndroid Build Coastguard Worker 197*333d2b36SAndroid Build Coastguard Worker // Don't check ramdisk or recovery variants. Only check core, vendor or product variants. 198*333d2b36SAndroid Build Coastguard Worker if m.InRamdisk() || m.InVendorRamdisk() || m.InRecovery() { 199*333d2b36SAndroid Build Coastguard Worker return false 200*333d2b36SAndroid Build Coastguard Worker } 201*333d2b36SAndroid Build Coastguard Worker 202*333d2b36SAndroid Build Coastguard Worker // Don't create ABI dump for prebuilts. 203*333d2b36SAndroid Build Coastguard Worker if m.Prebuilt() != nil || m.IsSnapshotPrebuilt() { 204*333d2b36SAndroid Build Coastguard Worker return false 205*333d2b36SAndroid Build Coastguard Worker } 206*333d2b36SAndroid Build Coastguard Worker 207*333d2b36SAndroid Build Coastguard Worker // Coverage builds have extra symbols. 208*333d2b36SAndroid Build Coastguard Worker if m.isCoverageVariant() { 209*333d2b36SAndroid Build Coastguard Worker return false 210*333d2b36SAndroid Build Coastguard Worker } 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Worker // Some sanitizer variants may have different ABI. 213*333d2b36SAndroid Build Coastguard Worker if m.sanitize != nil && !m.sanitize.isVariantOnProductionDevice() { 214*333d2b36SAndroid Build Coastguard Worker return false 215*333d2b36SAndroid Build Coastguard Worker } 216*333d2b36SAndroid Build Coastguard Worker 217*333d2b36SAndroid Build Coastguard Worker // Don't create ABI dump for stubs. 218*333d2b36SAndroid Build Coastguard Worker if m.isNDKStubLibrary() || m.IsLlndk() || m.IsStubs() { 219*333d2b36SAndroid Build Coastguard Worker return false 220*333d2b36SAndroid Build Coastguard Worker } 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 223*333d2b36SAndroid Build Coastguard Worker if apexInfo.IsForPlatform() { 224*333d2b36SAndroid Build Coastguard Worker // Bionic libraries that are installed to the bootstrap directory are not ABI checked. 225*333d2b36SAndroid Build Coastguard Worker // Only the runtime APEX variants, which are the implementation libraries of bionic NDK stubs, 226*333d2b36SAndroid Build Coastguard Worker // are checked. 227*333d2b36SAndroid Build Coastguard Worker if InstallToBootstrap(m.BaseModuleName(), ctx.Config()) { 228*333d2b36SAndroid Build Coastguard Worker return false 229*333d2b36SAndroid Build Coastguard Worker } 230*333d2b36SAndroid Build Coastguard Worker } else { 231*333d2b36SAndroid Build Coastguard Worker // Don't create ABI dump if this library is for APEX but isn't exported. 232*333d2b36SAndroid Build Coastguard Worker if !m.HasStubsVariants() { 233*333d2b36SAndroid Build Coastguard Worker return false 234*333d2b36SAndroid Build Coastguard Worker } 235*333d2b36SAndroid Build Coastguard Worker } 236*333d2b36SAndroid Build Coastguard Worker return len(classifySourceAbiDump(m)) > 0 237*333d2b36SAndroid Build Coastguard Worker} 238*333d2b36SAndroid Build Coastguard Worker 239*333d2b36SAndroid Build Coastguard Worker// Mark the direct and transitive dependencies of libraries that need ABI check, so that ABI dumps 240*333d2b36SAndroid Build Coastguard Worker// of their dependencies would be generated. 241*333d2b36SAndroid Build Coastguard Workertype sabiTransitionMutator struct{} 242*333d2b36SAndroid Build Coastguard Worker 243*333d2b36SAndroid Build Coastguard Workerfunc (s *sabiTransitionMutator) Split(ctx android.BaseModuleContext) []string { 244*333d2b36SAndroid Build Coastguard Worker return []string{""} 245*333d2b36SAndroid Build Coastguard Worker} 246*333d2b36SAndroid Build Coastguard Worker 247*333d2b36SAndroid Build Coastguard Workerfunc (s *sabiTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { 248*333d2b36SAndroid Build Coastguard Worker // Escape hatch to not check any ABI dump. 249*333d2b36SAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") { 250*333d2b36SAndroid Build Coastguard Worker return "" 251*333d2b36SAndroid Build Coastguard Worker } 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Worker // Only create ABI dump for native shared libraries and their static library dependencies. 254*333d2b36SAndroid Build Coastguard Worker if m, ok := ctx.Module().(*Module); ok && m.sabi != nil { 255*333d2b36SAndroid Build Coastguard Worker if shouldCreateSourceAbiDumpForLibrary(ctx) { 256*333d2b36SAndroid Build Coastguard Worker if IsStaticDepTag(ctx.DepTag()) || ctx.DepTag() == reuseObjTag { 257*333d2b36SAndroid Build Coastguard Worker return "sabi" 258*333d2b36SAndroid Build Coastguard Worker } 259*333d2b36SAndroid Build Coastguard Worker } else if sourceVariation == "sabi" { 260*333d2b36SAndroid Build Coastguard Worker if IsWholeStaticLib(ctx.DepTag()) || ctx.DepTag() == reuseObjTag { 261*333d2b36SAndroid Build Coastguard Worker return "sabi" 262*333d2b36SAndroid Build Coastguard Worker } 263*333d2b36SAndroid Build Coastguard Worker } 264*333d2b36SAndroid Build Coastguard Worker } 265*333d2b36SAndroid Build Coastguard Worker 266*333d2b36SAndroid Build Coastguard Worker return "" 267*333d2b36SAndroid Build Coastguard Worker} 268*333d2b36SAndroid Build Coastguard Worker 269*333d2b36SAndroid Build Coastguard Workerfunc (s *sabiTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { 270*333d2b36SAndroid Build Coastguard Worker if incomingVariation == "" { 271*333d2b36SAndroid Build Coastguard Worker return "" 272*333d2b36SAndroid Build Coastguard Worker } 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Worker if incomingVariation == "sabi" { 275*333d2b36SAndroid Build Coastguard Worker if m, ok := ctx.Module().(*Module); ok && m.sabi != nil { 276*333d2b36SAndroid Build Coastguard Worker return "sabi" 277*333d2b36SAndroid Build Coastguard Worker } 278*333d2b36SAndroid Build Coastguard Worker } 279*333d2b36SAndroid Build Coastguard Worker 280*333d2b36SAndroid Build Coastguard Worker return "" 281*333d2b36SAndroid Build Coastguard Worker} 282*333d2b36SAndroid Build Coastguard Worker 283*333d2b36SAndroid Build Coastguard Workerfunc (s *sabiTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) { 284*333d2b36SAndroid Build Coastguard Worker if m, ok := ctx.Module().(*Module); ok && m.sabi != nil { 285*333d2b36SAndroid Build Coastguard Worker if variation == "sabi" { 286*333d2b36SAndroid Build Coastguard Worker m.sabi.Properties.ShouldCreateSourceAbiDump = true 287*333d2b36SAndroid Build Coastguard Worker m.HideFromMake() 288*333d2b36SAndroid Build Coastguard Worker m.Properties.PreventInstall = true 289*333d2b36SAndroid Build Coastguard Worker } else if shouldCreateSourceAbiDumpForLibrary(ctx) { 290*333d2b36SAndroid Build Coastguard Worker // Escape hatch to not check any ABI dump. 291*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") { 292*333d2b36SAndroid Build Coastguard Worker m.sabi.Properties.ShouldCreateSourceAbiDump = true 293*333d2b36SAndroid Build Coastguard Worker } 294*333d2b36SAndroid Build Coastguard Worker } 295*333d2b36SAndroid Build Coastguard Worker } 296*333d2b36SAndroid Build Coastguard Worker} 297*333d2b36SAndroid Build Coastguard Worker 298*333d2b36SAndroid Build Coastguard Worker// Add an entry to the global list of lsdump. The list is exported to a Make variable by 299*333d2b36SAndroid Build Coastguard Worker// `cc.makeVarsProvider`. 300*333d2b36SAndroid Build Coastguard Workerfunc addLsdumpPath(config android.Config, lsdumpPath string) { 301*333d2b36SAndroid Build Coastguard Worker lsdumpPaths := lsdumpPaths(config) 302*333d2b36SAndroid Build Coastguard Worker lsdumpPathsLock.Lock() 303*333d2b36SAndroid Build Coastguard Worker defer lsdumpPathsLock.Unlock() 304*333d2b36SAndroid Build Coastguard Worker *lsdumpPaths = append(*lsdumpPaths, lsdumpPath) 305*333d2b36SAndroid Build Coastguard Worker} 306