xref: /aosp_15_r20/build/soong/cc/config/x86_64_device.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage config
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"strings"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workervar (
25*333d2b36SAndroid Build Coastguard Worker	x86_64Cflags = []string{
26*333d2b36SAndroid Build Coastguard Worker		// Help catch common 32/64-bit errors.
27*333d2b36SAndroid Build Coastguard Worker		"-Werror=implicit-function-declaration",
28*333d2b36SAndroid Build Coastguard Worker	}
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker	x86_64Cppflags = []string{}
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Worker	x86_64Ldflags = []string{
33*333d2b36SAndroid Build Coastguard Worker		"-Wl,-z,separate-loadable-segments",
34*333d2b36SAndroid Build Coastguard Worker	}
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Worker	X86_64Lldflags = x86_64Ldflags
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker	x86_64ArchVariantCflags = map[string][]string{
39*333d2b36SAndroid Build Coastguard Worker		"": []string{
40*333d2b36SAndroid Build Coastguard Worker			"-march=x86-64",
41*333d2b36SAndroid Build Coastguard Worker		},
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker		"alderlake": []string{
44*333d2b36SAndroid Build Coastguard Worker			"-march=alderlake",
45*333d2b36SAndroid Build Coastguard Worker		},
46*333d2b36SAndroid Build Coastguard Worker		"broadwell": []string{
47*333d2b36SAndroid Build Coastguard Worker			"-march=broadwell",
48*333d2b36SAndroid Build Coastguard Worker		},
49*333d2b36SAndroid Build Coastguard Worker		"goldmont": []string{
50*333d2b36SAndroid Build Coastguard Worker			"-march=goldmont",
51*333d2b36SAndroid Build Coastguard Worker		},
52*333d2b36SAndroid Build Coastguard Worker		"goldmont-plus": []string{
53*333d2b36SAndroid Build Coastguard Worker			"-march=goldmont-plus",
54*333d2b36SAndroid Build Coastguard Worker		},
55*333d2b36SAndroid Build Coastguard Worker		"goldmont-without-sha-xsaves": []string{
56*333d2b36SAndroid Build Coastguard Worker			"-march=goldmont",
57*333d2b36SAndroid Build Coastguard Worker			"-mno-sha",
58*333d2b36SAndroid Build Coastguard Worker			"-mno-xsaves",
59*333d2b36SAndroid Build Coastguard Worker		},
60*333d2b36SAndroid Build Coastguard Worker		"haswell": []string{
61*333d2b36SAndroid Build Coastguard Worker			"-march=core-avx2",
62*333d2b36SAndroid Build Coastguard Worker		},
63*333d2b36SAndroid Build Coastguard Worker		"ivybridge": []string{
64*333d2b36SAndroid Build Coastguard Worker			"-march=core-avx-i",
65*333d2b36SAndroid Build Coastguard Worker		},
66*333d2b36SAndroid Build Coastguard Worker		"sandybridge": []string{
67*333d2b36SAndroid Build Coastguard Worker			"-march=corei7",
68*333d2b36SAndroid Build Coastguard Worker		},
69*333d2b36SAndroid Build Coastguard Worker		"silvermont": []string{
70*333d2b36SAndroid Build Coastguard Worker			"-march=slm",
71*333d2b36SAndroid Build Coastguard Worker		},
72*333d2b36SAndroid Build Coastguard Worker		"skylake": []string{
73*333d2b36SAndroid Build Coastguard Worker			"-march=skylake",
74*333d2b36SAndroid Build Coastguard Worker		},
75*333d2b36SAndroid Build Coastguard Worker		"stoneyridge": []string{
76*333d2b36SAndroid Build Coastguard Worker			"-march=bdver4",
77*333d2b36SAndroid Build Coastguard Worker		},
78*333d2b36SAndroid Build Coastguard Worker		"tremont": []string{
79*333d2b36SAndroid Build Coastguard Worker			"-march=tremont",
80*333d2b36SAndroid Build Coastguard Worker		},
81*333d2b36SAndroid Build Coastguard Worker	}
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker	x86_64ArchFeatureCflags = map[string][]string{
84*333d2b36SAndroid Build Coastguard Worker		"ssse3":  []string{"-mssse3"},
85*333d2b36SAndroid Build Coastguard Worker		"sse4":   []string{"-msse4"},
86*333d2b36SAndroid Build Coastguard Worker		"sse4_1": []string{"-msse4.1"},
87*333d2b36SAndroid Build Coastguard Worker		"sse4_2": []string{"-msse4.2"},
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker		// Not all cases there is performance gain by enabling -mavx -mavx2
90*333d2b36SAndroid Build Coastguard Worker		// flags so these flags are not enabled by default.
91*333d2b36SAndroid Build Coastguard Worker		// if there is performance gain in individual library components,
92*333d2b36SAndroid Build Coastguard Worker		// the compiler flags can be set in corresponding bp files.
93*333d2b36SAndroid Build Coastguard Worker		// "avx":    []string{"-mavx"},
94*333d2b36SAndroid Build Coastguard Worker		// "avx2":   []string{"-mavx2"},
95*333d2b36SAndroid Build Coastguard Worker		// "avx512": []string{"-mavx512"}
96*333d2b36SAndroid Build Coastguard Worker
97*333d2b36SAndroid Build Coastguard Worker		"popcnt": []string{"-mpopcnt"},
98*333d2b36SAndroid Build Coastguard Worker		"aes_ni": []string{"-maes"},
99*333d2b36SAndroid Build Coastguard Worker	}
100*333d2b36SAndroid Build Coastguard Worker)
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Workerfunc init() {
103*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86_64ToolchainCflags", "-m64")
104*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86_64ToolchainLdflags", "-m64")
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86_64Ldflags", strings.Join(x86_64Ldflags, " "))
107*333d2b36SAndroid Build Coastguard Worker	pctx.VariableFunc("X86_64Lldflags", func(ctx android.PackageVarContext) string {
108*333d2b36SAndroid Build Coastguard Worker		maxPageSizeFlag := "-Wl,-z,max-page-size=" + ctx.Config().MaxPageSizeSupported()
109*333d2b36SAndroid Build Coastguard Worker		flags := append(X86_64Lldflags, maxPageSizeFlag)
110*333d2b36SAndroid Build Coastguard Worker		return strings.Join(flags, " ")
111*333d2b36SAndroid Build Coastguard Worker	})
112*333d2b36SAndroid Build Coastguard Worker
113*333d2b36SAndroid Build Coastguard Worker	// Clang cflags
114*333d2b36SAndroid Build Coastguard Worker	pctx.VariableFunc("X86_64Cflags", func(ctx android.PackageVarContext) string {
115*333d2b36SAndroid Build Coastguard Worker		flags := x86_64Cflags
116*333d2b36SAndroid Build Coastguard Worker		if ctx.Config().NoBionicPageSizeMacro() {
117*333d2b36SAndroid Build Coastguard Worker			flags = append(flags, "-D__BIONIC_NO_PAGE_SIZE_MACRO")
118*333d2b36SAndroid Build Coastguard Worker		} else {
119*333d2b36SAndroid Build Coastguard Worker			flags = append(flags, "-D__BIONIC_DEPRECATED_PAGE_SIZE_MACRO")
120*333d2b36SAndroid Build Coastguard Worker		}
121*333d2b36SAndroid Build Coastguard Worker		return strings.Join(flags, " ")
122*333d2b36SAndroid Build Coastguard Worker	})
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86_64Cppflags", strings.Join(x86_64Cppflags, " "))
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Worker	// Yasm flags
127*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86_64YasmFlags", "-f elf64 -m amd64")
128*333d2b36SAndroid Build Coastguard Worker
129*333d2b36SAndroid Build Coastguard Worker	// Architecture variant cflags
130*333d2b36SAndroid Build Coastguard Worker	for variant, cflags := range x86_64ArchVariantCflags {
131*333d2b36SAndroid Build Coastguard Worker		pctx.StaticVariable("X86_64"+variant+"VariantCflags", strings.Join(cflags, " "))
132*333d2b36SAndroid Build Coastguard Worker	}
133*333d2b36SAndroid Build Coastguard Worker}
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Workertype toolchainX86_64 struct {
136*333d2b36SAndroid Build Coastguard Worker	toolchainBionic
137*333d2b36SAndroid Build Coastguard Worker	toolchain64Bit
138*333d2b36SAndroid Build Coastguard Worker	toolchainCflags string
139*333d2b36SAndroid Build Coastguard Worker}
140*333d2b36SAndroid Build Coastguard Worker
141*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86_64) Name() string {
142*333d2b36SAndroid Build Coastguard Worker	return "x86_64"
143*333d2b36SAndroid Build Coastguard Worker}
144*333d2b36SAndroid Build Coastguard Worker
145*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86_64) IncludeFlags() string {
146*333d2b36SAndroid Build Coastguard Worker	return ""
147*333d2b36SAndroid Build Coastguard Worker}
148*333d2b36SAndroid Build Coastguard Worker
149*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86_64) ClangTriple() string {
150*333d2b36SAndroid Build Coastguard Worker	return "x86_64-linux-android"
151*333d2b36SAndroid Build Coastguard Worker}
152*333d2b36SAndroid Build Coastguard Worker
153*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86_64) ToolchainLdflags() string {
154*333d2b36SAndroid Build Coastguard Worker	return "${config.X86_64ToolchainLdflags}"
155*333d2b36SAndroid Build Coastguard Worker}
156*333d2b36SAndroid Build Coastguard Worker
157*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86_64) ToolchainCflags() string {
158*333d2b36SAndroid Build Coastguard Worker	return t.toolchainCflags
159*333d2b36SAndroid Build Coastguard Worker}
160*333d2b36SAndroid Build Coastguard Worker
161*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86_64) Cflags() string {
162*333d2b36SAndroid Build Coastguard Worker	return "${config.X86_64Cflags}"
163*333d2b36SAndroid Build Coastguard Worker}
164*333d2b36SAndroid Build Coastguard Worker
165*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86_64) Cppflags() string {
166*333d2b36SAndroid Build Coastguard Worker	return "${config.X86_64Cppflags}"
167*333d2b36SAndroid Build Coastguard Worker}
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86_64) Ldflags() string {
170*333d2b36SAndroid Build Coastguard Worker	return "${config.X86_64Ldflags}"
171*333d2b36SAndroid Build Coastguard Worker}
172*333d2b36SAndroid Build Coastguard Worker
173*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86_64) Lldflags() string {
174*333d2b36SAndroid Build Coastguard Worker	return "${config.X86_64Lldflags}"
175*333d2b36SAndroid Build Coastguard Worker}
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86_64) YasmFlags() string {
178*333d2b36SAndroid Build Coastguard Worker	return "${config.X86_64YasmFlags}"
179*333d2b36SAndroid Build Coastguard Worker}
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Workerfunc (toolchainX86_64) LibclangRuntimeLibraryArch() string {
182*333d2b36SAndroid Build Coastguard Worker	return "x86_64"
183*333d2b36SAndroid Build Coastguard Worker}
184*333d2b36SAndroid Build Coastguard Worker
185*333d2b36SAndroid Build Coastguard Workerfunc x86_64ToolchainFactory(arch android.Arch) Toolchain {
186*333d2b36SAndroid Build Coastguard Worker	// Error now rather than having a confusing Ninja error
187*333d2b36SAndroid Build Coastguard Worker	if _, ok := x86_64ArchVariantCflags[arch.ArchVariant]; !ok {
188*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Sprintf("Unknown x86_64 architecture version: %q", arch.ArchVariant))
189*333d2b36SAndroid Build Coastguard Worker	}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Worker	toolchainCflags := []string{
192*333d2b36SAndroid Build Coastguard Worker		"${config.X86_64ToolchainCflags}",
193*333d2b36SAndroid Build Coastguard Worker		"${config.X86_64" + arch.ArchVariant + "VariantCflags}",
194*333d2b36SAndroid Build Coastguard Worker	}
195*333d2b36SAndroid Build Coastguard Worker
196*333d2b36SAndroid Build Coastguard Worker	for _, feature := range arch.ArchFeatures {
197*333d2b36SAndroid Build Coastguard Worker		toolchainCflags = append(toolchainCflags, x86_64ArchFeatureCflags[feature]...)
198*333d2b36SAndroid Build Coastguard Worker	}
199*333d2b36SAndroid Build Coastguard Worker
200*333d2b36SAndroid Build Coastguard Worker	return &toolchainX86_64{
201*333d2b36SAndroid Build Coastguard Worker		toolchainCflags: strings.Join(toolchainCflags, " "),
202*333d2b36SAndroid Build Coastguard Worker	}
203*333d2b36SAndroid Build Coastguard Worker}
204*333d2b36SAndroid Build Coastguard Worker
205*333d2b36SAndroid Build Coastguard Workerfunc init() {
206*333d2b36SAndroid Build Coastguard Worker	registerToolchainFactory(android.Android, android.X86_64, x86_64ToolchainFactory)
207*333d2b36SAndroid Build Coastguard Worker}
208