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