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 // Version. Only exposed via -print-config. 32 version string 33} 34 35// Version can be set via a linker flag. 36// Values fills config.version. 37var Version = "" 38 39// UseCCache can be set via a linker flag. 40// Value will be passed to strconv.ParseBool. 41// E.g. go build -ldflags '-X config.UseCCache=true'. 42var UseCCache = "unknown" 43 44// UseLlvmNext can be set via a linker flag. 45// Value will be passed to strconv.ParseBool. 46// E.g. go build -ldflags '-X config.UseLlvmNext=true'. 47var UseLlvmNext = "unknown" 48 49// ConfigName can be set via a linker flag. 50// Value has to be one of: 51// - "cros.hardened" 52// - "cros.nonhardened" 53var ConfigName = "unknown" 54 55// Returns the configuration matching the UseCCache and ConfigName. 56func getRealConfig() (*config, error) { 57 useCCache, err := strconv.ParseBool(UseCCache) 58 if err != nil { 59 return nil, wrapErrorwithSourceLocf(err, "invalid format for UseCCache") 60 } 61 useLlvmNext, err := strconv.ParseBool(UseLlvmNext) 62 if err != nil { 63 return nil, wrapErrorwithSourceLocf(err, "invalid format for UseLLvmNext") 64 } 65 config, err := getConfig(ConfigName, useCCache, useLlvmNext, Version) 66 if err != nil { 67 return nil, err 68 } 69 return config, nil 70} 71 72func isAndroidConfig() bool { 73 return ConfigName == "android" 74} 75 76func getConfig(configName string, useCCache bool, useLlvmNext bool, version string) (*config, error) { 77 cfg := config{} 78 switch configName { 79 case "cros.hardened": 80 cfg = crosHardenedConfig 81 case "cros.nonhardened": 82 cfg = crosNonHardenedConfig 83 case "cros.host": 84 cfg = crosHostConfig 85 case "android": 86 cfg = androidConfig 87 default: 88 return nil, newErrorwithSourceLocf("unknown config name: %s", configName) 89 } 90 cfg.useCCache = useCCache 91 cfg.useLlvmNext = useLlvmNext 92 if useLlvmNext { 93 cfg.clangFlags = append(cfg.clangFlags, llvmNextFlags...) 94 cfg.clangPostFlags = append(cfg.clangPostFlags, llvmNextPostFlags...) 95 } 96 cfg.version = version 97 return &cfg, nil 98} 99 100func crosCommonClangFlags() []string { 101 // Temporarily disable tautological-*-compare chromium:778316. 102 // Temporarily add no-unknown-warning-option to deal with old clang versions. 103 // Temporarily disable Wdeprecated-declarations. b/193860318 104 // b/230345382: Temporarily disable Wimplicit-function-declaration. 105 // b/231987783: Temporarily disable Wimplicit-int. 106 return []string{ 107 "-Qunused-arguments", 108 "-Werror=poison-system-directories", 109 "-Wno-deprecated-declarations", 110 "-Wno-enum-constexpr-conversion", 111 "-Wno-error=implicit-function-declaration", 112 "-Wno-error=implicit-int", 113 "-Wno-final-dtor-non-final-class", 114 "-Wno-single-bit-bitfield-constant-conversion", 115 "-Wno-tautological-constant-compare", 116 "-Wno-tautological-unsigned-enum-zero-compare", 117 "-Wno-unknown-warning-option", 118 "-fdebug-default-version=5", 119 "-Wno-int-conversion", 120 "-Wno-incompatible-function-pointer-types", 121 // TODO(b/316021385): Temporarily disables warnings for variable length arrays. 122 "-Wno-error=vla-cxx-extension", 123 "-D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES", 124 // TODO(b/315504245): Temporarily prevents new mangling rules from taking effect. 125 "-fclang-abi-compat=17", 126 } 127} 128 129func crosCommonClangPostFlags() []string { 130 // Flags added to the _end_ of every build command. If a flag is added here, file a bug at 131 // go/crostc-bug to clean it up. Use of postflags is discouraged, since it prevents users 132 // from determining their own preferences for warnings/etc. 133 return []string{} 134} 135 136// Full hardening. 137// Temporarily disable function splitting because of chromium:434751. 138var crosHardenedConfig = config{ 139 clangRootRelPath: "../..", 140 gccRootRelPath: "../../../../..", 141 // Pass "-fcommon" till the packages are fixed to work with new clang/gcc 142 // default of "-fno-common", crbug.com/1060413. 143 commonFlags: []string{ 144 "-fcommon", 145 "-fstack-protector-strong", 146 "-D_FORTIFY_SOURCE=3", 147 "-fno-omit-frame-pointer", 148 }, 149 gccFlags: []string{ 150 "-fno-reorder-blocks-and-partition", 151 "-Wno-unused-local-typedefs", 152 "-Wno-maybe-uninitialized", 153 }, 154 // Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867 155 // Disable "-faddrsig" since it produces object files that strip doesn't understand, chromium:915742. 156 // crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache; 157 // removed that flag for now. 158 clangFlags: append( 159 crosCommonClangFlags(), 160 "--unwindlib=libunwind", 161 "-Wno-section", 162 "-fno-addrsig", 163 "-ftrivial-auto-var-init=zero", 164 ), 165 clangPostFlags: crosCommonClangPostFlags(), 166} 167 168// Flags to be added to non-hardened toolchain. 169var crosNonHardenedConfig = config{ 170 clangRootRelPath: "../..", 171 gccRootRelPath: "../../../../..", 172 commonFlags: []string{}, 173 gccFlags: []string{ 174 "-Wno-maybe-uninitialized", 175 "-Wno-unused-local-typedefs", 176 "-Wno-deprecated-declarations", 177 "-Wtrampolines", 178 }, 179 // Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867 180 clangFlags: append( 181 crosCommonClangFlags(), 182 "-Wno-section", 183 ), 184 clangPostFlags: crosCommonClangPostFlags(), 185} 186 187// Flags to be added to host toolchain. 188var crosHostConfig = config{ 189 isHostWrapper: true, 190 clangRootRelPath: "../..", 191 gccRootRelPath: "../..", 192 // Pass "-fcommon" till the packages are fixed to work with new clang/gcc 193 // default of "-fno-common", crbug.com/1060413. 194 commonFlags: []string{ 195 "-fcommon", 196 }, 197 gccFlags: []string{ 198 "-Wno-maybe-uninitialized", 199 "-Wno-unused-local-typedefs", 200 "-Wno-deprecated-declarations", 201 }, 202 // crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache; 203 // removed that flag for now. 204 clangFlags: append( 205 crosCommonClangFlags(), 206 "-Wno-unused-local-typedefs", 207 "-fno-addrsig", 208 ), 209 // Temporarily disable Wdeprecated-copy. b/191479033 210 clangPostFlags: crosCommonClangPostFlags(), 211} 212 213var androidConfig = config{ 214 isHostWrapper: false, 215 isAndroidWrapper: true, 216 gccRootRelPath: "./", 217 clangRootRelPath: "./", 218 commonFlags: []string{}, 219 gccFlags: []string{}, 220 clangFlags: []string{}, 221 clangPostFlags: []string{}, 222} 223