|  | // Copyright 2017 Google Inc. All rights reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | package config | 
|  |  | 
|  | import ( | 
|  | "sort" | 
|  | "strings" | 
|  |  | 
|  | "android/soong/android" | 
|  | ) | 
|  |  | 
|  | // Cflags that should be filtered out when compiling with clang | 
|  | var ClangUnknownCflags = sorted([]string{ | 
|  | "-finline-functions", | 
|  | "-finline-limit=64", | 
|  | "-fno-canonical-system-headers", | 
|  | "-Wno-clobbered", | 
|  | "-fno-devirtualize", | 
|  | "-fno-tree-sra", | 
|  | "-fprefetch-loop-arrays", | 
|  | "-funswitch-loops", | 
|  | "-Wmaybe-uninitialized", | 
|  | "-Wno-error=clobbered", | 
|  | "-Wno-error=maybe-uninitialized", | 
|  | "-Wno-extended-offsetof", | 
|  | "-Wno-free-nonheap-object", | 
|  | "-Wno-literal-suffix", | 
|  | "-Wno-maybe-uninitialized", | 
|  | "-Wno-old-style-declaration", | 
|  | "-Wno-unused-local-typedefs", | 
|  | "-fdiagnostics-color", | 
|  | // http://b/153759688 | 
|  | "-fuse-init-array", | 
|  |  | 
|  | // arm + arm64 | 
|  | "-fgcse-after-reload", | 
|  | "-frerun-cse-after-loop", | 
|  | "-frename-registers", | 
|  | "-fno-strict-volatile-bitfields", | 
|  |  | 
|  | // arm + arm64 | 
|  | "-fno-align-jumps", | 
|  |  | 
|  | // arm | 
|  | "-mthumb-interwork", | 
|  | "-fno-builtin-sin", | 
|  | "-fno-caller-saves", | 
|  | "-fno-early-inlining", | 
|  | "-fno-move-loop-invariants", | 
|  | "-fno-partial-inlining", | 
|  | "-fno-tree-copy-prop", | 
|  | "-fno-tree-loop-optimize", | 
|  |  | 
|  | // x86 + x86_64 | 
|  | "-finline-limit=300", | 
|  | "-fno-inline-functions-called-once", | 
|  | "-mfpmath=sse", | 
|  | "-mbionic", | 
|  |  | 
|  | // windows | 
|  | "--enable-stdcall-fixup", | 
|  | }) | 
|  |  | 
|  | var ClangLibToolingUnknownCflags = sorted([]string{}) | 
|  |  | 
|  | // List of tidy checks that should be disabled globally. When the compiler is | 
|  | // updated, some checks enabled by this module may be disabled if they have | 
|  | // become more strict, or if they are a new match for a wildcard group like | 
|  | // `modernize-*`. | 
|  | var ClangTidyDisableChecks = []string{ | 
|  | "misc-no-recursion", | 
|  | "readability-function-cognitive-complexity", // http://b/175055536 | 
|  | } | 
|  |  | 
|  | func ClangFilterUnknownCflags(cflags []string) []string { | 
|  | result, _ := android.FilterList(cflags, ClangUnknownCflags) | 
|  | return result | 
|  | } | 
|  |  | 
|  | func clangTidyNegateChecks(checks []string) []string { | 
|  | ret := make([]string, 0, len(checks)) | 
|  | for _, c := range checks { | 
|  | if strings.HasPrefix(c, "-") { | 
|  | ret = append(ret, c) | 
|  | } else { | 
|  | ret = append(ret, "-"+c) | 
|  | } | 
|  | } | 
|  | return ret | 
|  | } | 
|  |  | 
|  | func ClangRewriteTidyChecks(checks []string) []string { | 
|  | checks = append(checks, clangTidyNegateChecks(ClangTidyDisableChecks)...) | 
|  | // clang-tidy does not allow later arguments to override earlier arguments, | 
|  | // so if we just disabled an argument that was explicitly enabled we must | 
|  | // remove the enabling argument from the list. | 
|  | result, _ := android.FilterList(checks, ClangTidyDisableChecks) | 
|  | return result | 
|  | } | 
|  |  | 
|  | func ClangLibToolingFilterUnknownCflags(libToolingFlags []string) []string { | 
|  | return android.RemoveListFromList(libToolingFlags, ClangLibToolingUnknownCflags) | 
|  | } | 
|  |  | 
|  | func sorted(list []string) []string { | 
|  | sort.Strings(list) | 
|  | return list | 
|  | } |