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 // Flags to add to gcc and clang. 18 commonFlags []string 19 // Flags to add to gcc only. 20 gccFlags []string 21 // Flags to add to clang only. 22 clangFlags []string 23 // Flags to add to clang only, AFTER user flags (cannot be overridden 24 // by the user). 25 clangPostFlags []string 26 // Toolchain root path relative to the wrapper binary. 27 rootRelPath string 28 // Directory to store errors that were prevented with -Wno-error. 29 newWarningsDir string 30 // Version. Only used for printing via -print-cmd. 31 version string 32} 33 34// Version can be set via a linker flag. 35// Values fills config.version. 36var Version = "" 37 38// UseCCache can be set via a linker flag. 39// Value will be passed to strconv.ParseBool. 40// E.g. go build -ldflags '-X config.UseCCache=true'. 41var UseCCache = "unknown" 42 43// UseLlvmNext can be set via a linker flag. 44// Value will be passed to strconv.ParseBool. 45// E.g. go build -ldflags '-X config.UseLlvmNext=true'. 46var UseLlvmNext = "unknown" 47 48// ConfigName can be set via a linker flag. 49// Value has to be one of: 50// - "cros.hardened" 51// - "cros.nonhardened" 52var ConfigName = "unknown" 53 54// Returns the configuration matching the UseCCache and ConfigName. 55func getRealConfig() (*config, error) { 56 useCCache, err := strconv.ParseBool(UseCCache) 57 if err != nil { 58 return nil, wrapErrorwithSourceLocf(err, "invalid format for UseCCache") 59 } 60 useLlvmNext, err := strconv.ParseBool(UseLlvmNext) 61 if err != nil { 62 return nil, wrapErrorwithSourceLocf(err, "invalid format for UseLLvmNext") 63 } 64 config, err := getConfig(ConfigName, useCCache, useLlvmNext, Version) 65 if err != nil { 66 return nil, err 67 } 68 return config, nil 69} 70 71func getConfig(configName string, useCCache bool, useLlvmNext bool, version string) (*config, error) { 72 cfg := config{} 73 switch configName { 74 case "cros.hardened": 75 cfg = *crosHardenedConfig 76 case "cros.nonhardened": 77 cfg = *crosNonHardenedConfig 78 case "cros.host": 79 cfg = *crosHostConfig 80 case "android": 81 cfg = *androidConfig 82 default: 83 return nil, newErrorwithSourceLocf("unknown config name: %s", configName) 84 } 85 cfg.useCCache = useCCache 86 if useLlvmNext { 87 cfg.clangFlags = append(cfg.clangFlags, llvmNextFlags...) 88 } 89 cfg.version = version 90 return &cfg, nil 91} 92 93// TODO: Enable test in config_test.go, once we have new llvm-next flags. 94var llvmNextFlags = []string{} 95 96var llvmNextPostFlags = []string{} 97 98// Full hardening. 99// Temporarily disable function splitting because of chromium:434751. 100var crosHardenedConfig = &config{ 101 rootRelPath: "../../../../..", 102 commonFlags: []string{ 103 "-fstack-protector-strong", 104 "-fPIE", 105 "-pie", 106 "-D_FORTIFY_SOURCE=2", 107 "-fno-omit-frame-pointer", 108 }, 109 gccFlags: []string{ 110 "-fno-reorder-blocks-and-partition", 111 "-Wno-unused-local-typedefs", 112 "-Wno-maybe-uninitialized", 113 }, 114 // Temporarily disable tautological-*-compare chromium:778316. 115 // Temporarily add no-unknown-warning-option to deal with old clang versions. 116 // Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867 117 // Disable "-faddrsig" since it produces object files that strip doesn't understand, chromium:915742. 118 clangFlags: []string{ 119 "-Qunused-arguments", 120 "-grecord-gcc-switches", 121 "-fno-addrsig", 122 "-Wno-tautological-constant-compare", 123 "-Wno-tautological-unsigned-enum-zero-compare", 124 "-Wno-unknown-warning-option", 125 "-Wno-section", 126 "-static-libgcc", 127 "-fuse-ld=lld", 128 "-Wno-reorder-init-list", 129 "-Wno-final-dtor-non-final-class", 130 "-Wno-return-stack-address", 131 "-Werror=poison-system-directories", 132 }, 133 clangPostFlags: []string{ 134 "-Wno-implicit-int-float-conversion", 135 }, 136 newWarningsDir: "/tmp/fatal_clang_warnings", 137} 138 139// Flags to be added to non-hardened toolchain. 140var crosNonHardenedConfig = &config{ 141 rootRelPath: "../../../../..", 142 commonFlags: []string{}, 143 gccFlags: []string{ 144 "-Wno-maybe-uninitialized", 145 "-Wno-unused-local-typedefs", 146 "-Wno-deprecated-declarations", 147 "-Wtrampolines", 148 }, 149 // Temporarily disable tautological-*-compare chromium:778316. 150 // Temporarily add no-unknown-warning-option to deal with old clang versions. 151 // Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867 152 clangFlags: []string{ 153 "-Qunused-arguments", 154 "-Wno-tautological-constant-compare", 155 "-Wno-tautological-unsigned-enum-zero-compare", 156 "-Wno-unknown-warning-option", 157 "-Wno-section", 158 "-static-libgcc", 159 "-Wno-reorder-init-list", 160 "-Wno-final-dtor-non-final-class", 161 "-Wno-return-stack-address", 162 "-Werror=poison-system-directories", 163 }, 164 clangPostFlags: []string{ 165 "-Wno-implicit-int-float-conversion", 166 }, 167 newWarningsDir: "/tmp/fatal_clang_warnings", 168} 169 170// Flags to be added to host toolchain. 171var crosHostConfig = &config{ 172 isHostWrapper: true, 173 rootRelPath: "../..", 174 commonFlags: []string{}, 175 gccFlags: []string{ 176 "-Wno-maybe-uninitialized", 177 "-Wno-unused-local-typedefs", 178 "-Wno-deprecated-declarations", 179 }, 180 // Temporarily disable tautological-*-compare chromium:778316. 181 // Temporarily add no-unknown-warning-option to deal with old clang versions. 182 clangFlags: []string{ 183 "-Qunused-arguments", 184 "-grecord-gcc-switches", 185 "-fno-addrsig", 186 "-fuse-ld=lld", 187 "-Wno-unused-local-typedefs", 188 "-Wno-deprecated-declarations", 189 "-Wno-tautological-constant-compare", 190 "-Wno-tautological-unsigned-enum-zero-compare", 191 "-Wno-reorder-init-list", 192 "-Wno-final-dtor-non-final-class", 193 "-Wno-return-stack-address", 194 "-Werror=poison-system-directories", 195 "-Wno-unknown-warning-option", 196 }, 197 clangPostFlags: []string{ 198 "-Wno-implicit-int-float-conversion", 199 }, 200 newWarningsDir: "/tmp/fatal_clang_warnings", 201} 202 203var androidConfig = &config{ 204 isHostWrapper: false, 205 isAndroidWrapper: true, 206 rootRelPath: "./", 207 commonFlags: []string{}, 208 gccFlags: []string{}, 209 clangFlags: []string{}, 210 clangPostFlags: []string{}, 211 newWarningsDir: "/tmp/fatal_clang_warnings", 212} 213