1// Copyright 2019 The ChromiumOS Authors 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 exposed via -print-config. 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 106func crosCommonClangFlags() []string { 107 // Temporarily disable tautological-*-compare chromium:778316. 108 // Temporarily add no-unknown-warning-option to deal with old clang versions. 109 // Temporarily disable Wdeprecated-declarations. b/193860318 110 // b/230345382: Temporarily disable Wimplicit-function-declaration. 111 // b/231987783: Temporarily disable Wimplicit-int. 112 return []string{ 113 "-Qunused-arguments", 114 "-Werror=poison-system-directories", 115 "-Wno-compound-token-split-by-macro", 116 "-Wno-deprecated-declarations", 117 "-Wno-error=implicit-function-declaration", 118 "-Wno-error=implicit-int", 119 "-Wno-final-dtor-non-final-class", 120 "-Wno-tautological-constant-compare", 121 "-Wno-tautological-unsigned-enum-zero-compare", 122 "-Wno-unknown-warning-option", 123 "-fdebug-default-version=5", 124 "-fexperimental-new-pass-manager", 125 } 126} 127 128func crosCommonClangPostFlags() []string { 129 // Temporarily disable Wdeprecated-copy. b/191479033 130 return []string{ 131 "-Wno-compound-token-split-by-space", 132 "-Wno-deprecated-copy", 133 "-Wno-unused-but-set-variable", 134 "-Wno-implicit-int-float-conversion", 135 "-Wno-string-concatenation", 136 } 137} 138 139// Full hardening. 140// Temporarily disable function splitting because of chromium:434751. 141var crosHardenedConfig = config{ 142 clangRootRelPath: "../..", 143 gccRootRelPath: "../../../../..", 144 // Pass "-fcommon" till the packages are fixed to work with new clang/gcc 145 // default of "-fno-common", crbug.com/1060413. 146 commonFlags: []string{ 147 "-fcommon", 148 "-fstack-protector-strong", 149 "-D_FORTIFY_SOURCE=2", 150 "-fno-omit-frame-pointer", 151 }, 152 gccFlags: []string{ 153 "-fno-reorder-blocks-and-partition", 154 "-Wno-unused-local-typedefs", 155 "-Wno-maybe-uninitialized", 156 }, 157 // Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867 158 // Disable "-faddrsig" since it produces object files that strip doesn't understand, chromium:915742. 159 // crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache; 160 // removed that flag for now. 161 clangFlags: append( 162 crosCommonClangFlags(), 163 "--unwindlib=libunwind", 164 "-Wno-section", 165 "-fno-addrsig", 166 "-fuse-ld=lld", 167 "-ftrivial-auto-var-init=zero", 168 "-enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang", 169 ), 170 clangPostFlags: crosCommonClangPostFlags(), 171 newWarningsDir: "/tmp/fatal_clang_warnings", 172 triciumNitsDir: "/tmp/linting_output/clang-tidy", 173 crashArtifactsDir: "/tmp/clang_crash_diagnostics", 174} 175 176// Flags to be added to non-hardened toolchain. 177var crosNonHardenedConfig = config{ 178 clangRootRelPath: "../..", 179 gccRootRelPath: "../../../../..", 180 commonFlags: []string{}, 181 gccFlags: []string{ 182 "-Wno-maybe-uninitialized", 183 "-Wno-unused-local-typedefs", 184 "-Wno-deprecated-declarations", 185 "-Wtrampolines", 186 }, 187 // Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867 188 clangFlags: append( 189 crosCommonClangFlags(), 190 "-Wno-section", 191 ), 192 clangPostFlags: crosCommonClangPostFlags(), 193 newWarningsDir: "/tmp/fatal_clang_warnings", 194 triciumNitsDir: "/tmp/linting_output/clang-tidy", 195 crashArtifactsDir: "/tmp/clang_crash_diagnostics", 196} 197 198// Flags to be added to host toolchain. 199var crosHostConfig = config{ 200 isHostWrapper: true, 201 clangRootRelPath: "../..", 202 gccRootRelPath: "../..", 203 // Pass "-fcommon" till the packages are fixed to work with new clang/gcc 204 // default of "-fno-common", crbug.com/1060413. 205 commonFlags: []string{ 206 "-fcommon", 207 }, 208 gccFlags: []string{ 209 "-Wno-maybe-uninitialized", 210 "-Wno-unused-local-typedefs", 211 "-Wno-deprecated-declarations", 212 }, 213 // crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache; 214 // removed that flag for now. 215 clangFlags: append( 216 crosCommonClangFlags(), 217 "-Wno-unused-local-typedefs", 218 "-fno-addrsig", 219 "-fuse-ld=lld", 220 ), 221 // Temporarily disable Wdeprecated-copy. b/191479033 222 clangPostFlags: crosCommonClangPostFlags(), 223 newWarningsDir: "/tmp/fatal_clang_warnings", 224 triciumNitsDir: "/tmp/linting_output/clang-tidy", 225 crashArtifactsDir: "/tmp/clang_crash_diagnostics", 226} 227 228var androidConfig = config{ 229 isHostWrapper: false, 230 isAndroidWrapper: true, 231 gccRootRelPath: "./", 232 clangRootRelPath: "./", 233 commonFlags: []string{}, 234 gccFlags: []string{}, 235 clangFlags: []string{}, 236 clangPostFlags: []string{}, 237 newWarningsDir: "", 238 triciumNitsDir: "", 239 crashArtifactsDir: "", 240} 241