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