• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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