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