1 // Copyright 2017 Google Inc. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package cc 16 17 import ( 18 "strings" 19 "sync" 20 21 "android/soong/android" 22 "android/soong/cc/config" 23 ) 24 25 var ( 26 lsdumpPaths []string 27 sabiLock sync.Mutex 28 ) 29 30 type SAbiProperties struct { 31 CreateSAbiDumps bool `blueprint:"mutated"` 32 ReexportedIncludeFlags []string 33 } 34 35 type sabi struct { 36 Properties SAbiProperties 37 } 38 39 func (sabimod *sabi) props() []interface{} { 40 return []interface{}{&sabimod.Properties} 41 } 42 43 func (sabimod *sabi) begin(ctx BaseModuleContext) {} 44 45 func (sabimod *sabi) deps(ctx BaseModuleContext, deps Deps) Deps { 46 return deps 47 } 48 49 func inListWithPrefixSearch(flag string, filter []string) bool { 50 // Assuming the filter is small enough. 51 // If the suffix of a filter element is *, try matching prefixes as well. 52 for _, f := range filter { 53 if (f == flag) || (strings.HasSuffix(f, "*") && strings.HasPrefix(flag, strings.TrimSuffix(f, "*"))) { 54 return true 55 } 56 } 57 return false 58 } 59 60 func filterOutWithPrefix(list []string, filter []string) (remainder []string) { 61 // Go through the filter, matching and optionally doing a prefix search for list elements. 62 for _, l := range list { 63 if !inListWithPrefixSearch(l, filter) { 64 remainder = append(remainder, l) 65 } 66 } 67 return 68 } 69 70 func (sabimod *sabi) flags(ctx ModuleContext, flags Flags) Flags { 71 // Assuming that the cflags which clang LibTooling tools cannot 72 // understand have not been converted to ninja variables yet. 73 flags.ToolingCFlags = filterOutWithPrefix(flags.CFlags, config.ClangLibToolingUnknownCflags) 74 75 // RSClang does not support recent mcpu option likes exynos-m2. 76 // So we need overriding mcpu option when we want to use it. 77 if ctx.Arch().CpuVariant == "exynos-m2" { 78 flags.ToolingCFlags = append(flags.ToolingCFlags, "-mcpu=cortex-a53") 79 } 80 81 return flags 82 } 83 84 func sabiDepsMutator(mctx android.TopDownMutatorContext) { 85 if c, ok := mctx.Module().(*Module); ok && 86 ((c.isVndk() && c.useVndk()) || inList(c.Name(), llndkLibraries) || 87 (c.sabi != nil && c.sabi.Properties.CreateSAbiDumps)) { 88 mctx.VisitDirectDeps(func(m android.Module) { 89 tag := mctx.OtherModuleDependencyTag(m) 90 switch tag { 91 case staticDepTag, staticExportDepTag, lateStaticDepTag, wholeStaticDepTag: 92 93 cc, _ := m.(*Module) 94 if cc == nil { 95 return 96 } 97 cc.sabi.Properties.CreateSAbiDumps = true 98 } 99 }) 100 } 101 } 102