1// Copyright 2019 The Chromium OS Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5package main 6 7import ( 8 "strconv" 9) 10 11type config struct { 12 // TODO: Refactor this flag into more generic configuration properties. 13 isHostWrapper bool 14 isAndroidWrapper bool 15 // Whether to use ccache. 16 useCCache bool 17 // Whether llvmNext wrapper. 18 useLlvmNext bool 19 // Flags to add to gcc and clang. 20 commonFlags []string 21 // Flags to add to gcc only. 22 gccFlags []string 23 // Flags to add to clang only. 24 clangFlags []string 25 // Flags to add to clang only, AFTER user flags (cannot be overridden 26 // by the user). 27 clangPostFlags []string 28 // Toolchain root path relative to the wrapper binary. 29 clangRootRelPath string 30 gccRootRelPath string 31 // Directory to store errors that were prevented with -Wno-error. 32 newWarningsDir string 33 // Directory to store nits in when using `WITH_TIDY=tricium`. 34 triciumNitsDir string 35 // Directory to store crash artifacts in. 36 crashArtifactsDir string 37 // Version. Only used for printing via -print-cmd. 38 version string 39} 40 41// Version can be set via a linker flag. 42// Values fills config.version. 43var Version = "" 44 45// UseCCache can be set via a linker flag. 46// Value will be passed to strconv.ParseBool. 47// E.g. go build -ldflags '-X config.UseCCache=true'. 48var UseCCache = "unknown" 49 50// UseLlvmNext can be set via a linker flag. 51// Value will be passed to strconv.ParseBool. 52// E.g. go build -ldflags '-X config.UseLlvmNext=true'. 53var UseLlvmNext = "unknown" 54 55// ConfigName can be set via a linker flag. 56// Value has to be one of: 57// - "cros.hardened" 58// - "cros.nonhardened" 59var ConfigName = "unknown" 60 61// Returns the configuration matching the UseCCache and ConfigName. 62func getRealConfig() (*config, error) { 63 useCCache, err := strconv.ParseBool(UseCCache) 64 if err != nil { 65 return nil, wrapErrorwithSourceLocf(err, "invalid format for UseCCache") 66 } 67 useLlvmNext, err := strconv.ParseBool(UseLlvmNext) 68 if err != nil { 69 return nil, wrapErrorwithSourceLocf(err, "invalid format for UseLLvmNext") 70 } 71 config, err := getConfig(ConfigName, useCCache, useLlvmNext, Version) 72 if err != nil { 73 return nil, err 74 } 75 return config, nil 76} 77 78func isAndroidConfig() bool { 79 return ConfigName == "android" 80} 81 82func getConfig(configName string, useCCache bool, useLlvmNext bool, version string) (*config, error) { 83 cfg := config{} 84 switch configName { 85 case "cros.hardened": 86 cfg = *crosHardenedConfig 87 case "cros.nonhardened": 88 cfg = *crosNonHardenedConfig 89 case "cros.host": 90 cfg = *crosHostConfig 91 case "android": 92 cfg = *androidConfig 93 default: 94 return nil, newErrorwithSourceLocf("unknown config name: %s", configName) 95 } 96 cfg.useCCache = useCCache 97 cfg.useLlvmNext = useLlvmNext 98 if useLlvmNext { 99 cfg.clangFlags = append(cfg.clangFlags, llvmNextFlags...) 100 cfg.clangPostFlags = append(cfg.clangPostFlags, llvmNextPostFlags...) 101 } 102 cfg.version = version 103 return &cfg, nil 104} 105 106// Full hardening. 107// Temporarily disable function splitting because of chromium:434751. 108var crosHardenedConfig = &config{ 109 clangRootRelPath: "../..", 110 gccRootRelPath: "../../../../..", 111 // Pass "-fcommon" till the packages are fixed to work with new clang/gcc 112 // default of "-fno-common", crbug.com/1060413. 113 commonFlags: []string{ 114 "-fcommon", 115 "-fstack-protector-strong", 116 "-fPIE", 117 "-pie", 118 "-D_FORTIFY_SOURCE=2", 119 "-fno-omit-frame-pointer", 120 }, 121 gccFlags: []string{ 122 "-fno-reorder-blocks-and-partition", 123 "-Wno-unused-local-typedefs", 124 "-Wno-maybe-uninitialized", 125 }, 126 // Temporarily disable tautological-*-compare chromium:778316. 127 // Temporarily add no-unknown-warning-option to deal with old clang versions. 128 // Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867 129 // Disable "-faddrsig" since it produces object files that strip doesn't understand, chromium:915742. 130 // crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache; 131 // removed that flag for now. 132 // Temporarily disable Wdeprecated-declarations. b/193860318 133 134 clangFlags: []string{ 135 "-Qunused-arguments", 136 "-fno-addrsig", 137 "-fdebug-default-version=5", 138 "-Wno-tautological-constant-compare", 139 "-Wno-tautological-unsigned-enum-zero-compare", 140 "-Wno-unknown-warning-option", 141 "-Wno-section", 142 "-fuse-ld=lld", 143 "--unwindlib=libgcc", 144 "-Wno-final-dtor-non-final-class", 145 "-Werror=poison-system-directories", 146 "-fexperimental-new-pass-manager", 147 "-Wno-compound-token-split-by-macro", 148 "-Wno-deprecated-declarations", 149 }, 150 151 // Temporarily disable Wdeprecated-copy. b/191479033 152 clangPostFlags: []string{ 153 "-Wno-implicit-int-float-conversion", 154 "-Wno-compound-token-split-by-space", 155 "-Wno-string-concatenation", 156 "-Wno-deprecated-copy", 157 "-Wno-unused-but-set-variable", 158 }, 159 newWarningsDir: "/tmp/fatal_clang_warnings", 160 triciumNitsDir: "/tmp/linting_output/clang-tidy", 161 crashArtifactsDir: "/tmp/clang_crash_diagnostics", 162} 163 164// Flags to be added to non-hardened toolchain. 165var crosNonHardenedConfig = &config{ 166 clangRootRelPath: "../..", 167 gccRootRelPath: "../../../../..", 168 commonFlags: []string{}, 169 gccFlags: []string{ 170 "-Wno-maybe-uninitialized", 171 "-Wno-unused-local-typedefs", 172 "-Wno-deprecated-declarations", 173 "-Wtrampolines", 174 }, 175 // Temporarily disable tautological-*-compare chromium:778316. 176 // Temporarily add no-unknown-warning-option to deal with old clang versions. 177 // Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867 178 // Temporarily disable Wdeprecated-declarations. b/193860318 179 clangFlags: []string{ 180 "-Qunused-arguments", 181 "-fdebug-default-version=5", 182 "-Wno-tautological-constant-compare", 183 "-Wno-tautological-unsigned-enum-zero-compare", 184 "-Wno-unknown-warning-option", 185 "-Wno-section", 186 "-Wno-final-dtor-non-final-class", 187 "-Werror=poison-system-directories", 188 "-fexperimental-new-pass-manager", 189 "-Wno-compound-token-split-by-macro", 190 "-Wno-deprecated-declarations", 191 }, 192 193 // Temporarily disable Wdeprecated-copy. b/191479033 194 clangPostFlags: []string{ 195 "-Wno-implicit-int-float-conversion", 196 "-Wno-compound-token-split-by-space", 197 "-Wno-string-concatenation", 198 "-Wno-deprecated-copy", 199 "-Wno-unused-but-set-variable", 200 }, 201 newWarningsDir: "/tmp/fatal_clang_warnings", 202 triciumNitsDir: "/tmp/linting_output/clang-tidy", 203 crashArtifactsDir: "/tmp/clang_crash_diagnostics", 204} 205 206// Flags to be added to host toolchain. 207var crosHostConfig = &config{ 208 isHostWrapper: true, 209 clangRootRelPath: "../..", 210 gccRootRelPath: "../..", 211 // Pass "-fcommon" till the packages are fixed to work with new clang/gcc 212 // default of "-fno-common", crbug.com/1060413. 213 commonFlags: []string{ 214 "-fcommon", 215 }, 216 gccFlags: []string{ 217 "-Wno-maybe-uninitialized", 218 "-Wno-unused-local-typedefs", 219 "-Wno-deprecated-declarations", 220 }, 221 // Temporarily disable tautological-*-compare chromium:778316. 222 // Temporarily add no-unknown-warning-option to deal with old clang versions. 223 // crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache; 224 // removed that flag for now. 225 // Temporarily disable Wdeprecated-declarations. b/193860318 226 clangFlags: []string{ 227 "-Qunused-arguments", 228 "-fno-addrsig", 229 "-fuse-ld=lld", 230 "-fdebug-default-version=5", 231 "-Wno-unused-local-typedefs", 232 "-Wno-tautological-constant-compare", 233 "-Wno-tautological-unsigned-enum-zero-compare", 234 "-Wno-final-dtor-non-final-class", 235 "-Werror=poison-system-directories", 236 "-Wno-unknown-warning-option", 237 "-fexperimental-new-pass-manager", 238 "-Wno-compound-token-split-by-macro", 239 "-Wno-deprecated-declarations", 240 }, 241 242 // Temporarily disable Wdeprecated-copy. b/191479033 243 clangPostFlags: []string{ 244 "-Wno-implicit-int-float-conversion", 245 "-Wno-compound-token-split-by-space", 246 "-Wno-string-concatenation", 247 "-Wno-deprecated-copy", 248 "-Wno-unused-but-set-variable", 249 }, 250 newWarningsDir: "/tmp/fatal_clang_warnings", 251 triciumNitsDir: "/tmp/linting_output/clang-tidy", 252 crashArtifactsDir: "/tmp/clang_crash_diagnostics", 253} 254 255var androidConfig = &config{ 256 isHostWrapper: false, 257 isAndroidWrapper: true, 258 gccRootRelPath: "./", 259 clangRootRelPath: "./", 260 commonFlags: []string{}, 261 gccFlags: []string{}, 262 clangFlags: []string{}, 263 clangPostFlags: []string{}, 264 newWarningsDir: "", 265 triciumNitsDir: "", 266 crashArtifactsDir: "", 267} 268