• 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	// 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