| // 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 |
| } |