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