xref: /aosp_15_r20/build/soong/cc/config/x86_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	x86Cflags = []string{
26*333d2b36SAndroid Build Coastguard Worker		"-msse3",
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Worker		// -mstackrealign is needed to realign stack in native code
29*333d2b36SAndroid Build Coastguard Worker		// that could be called from JNI, so that movaps instruction
30*333d2b36SAndroid Build Coastguard Worker		// will work on assumed stack aligned local variables.
31*333d2b36SAndroid Build Coastguard Worker		"-mstackrealign",
32*333d2b36SAndroid Build Coastguard Worker	}
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Worker	x86Cppflags = []string{}
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Worker	x86Ldflags = []string{}
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker	x86ArchVariantCflags = map[string][]string{
39*333d2b36SAndroid Build Coastguard Worker		"": []string{
40*333d2b36SAndroid Build Coastguard Worker			"-march=prescott",
41*333d2b36SAndroid Build Coastguard Worker		},
42*333d2b36SAndroid Build Coastguard Worker		"x86_64": []string{
43*333d2b36SAndroid Build Coastguard Worker			"-march=prescott",
44*333d2b36SAndroid Build Coastguard Worker		},
45*333d2b36SAndroid Build Coastguard Worker		"alderlake": []string{
46*333d2b36SAndroid Build Coastguard Worker			"-march=alderlake",
47*333d2b36SAndroid Build Coastguard Worker		},
48*333d2b36SAndroid Build Coastguard Worker		"atom": []string{
49*333d2b36SAndroid Build Coastguard Worker			"-march=atom",
50*333d2b36SAndroid Build Coastguard Worker		},
51*333d2b36SAndroid Build Coastguard Worker		"broadwell": []string{
52*333d2b36SAndroid Build Coastguard Worker			"-march=broadwell",
53*333d2b36SAndroid Build Coastguard Worker		},
54*333d2b36SAndroid Build Coastguard Worker		"goldmont": []string{
55*333d2b36SAndroid Build Coastguard Worker			"-march=goldmont",
56*333d2b36SAndroid Build Coastguard Worker		},
57*333d2b36SAndroid Build Coastguard Worker		"goldmont-plus": []string{
58*333d2b36SAndroid Build Coastguard Worker			"-march=goldmont-plus",
59*333d2b36SAndroid Build Coastguard Worker		},
60*333d2b36SAndroid Build Coastguard Worker		"goldmont-without-sha-xsaves": []string{
61*333d2b36SAndroid Build Coastguard Worker			"-march=goldmont",
62*333d2b36SAndroid Build Coastguard Worker			"-mno-sha",
63*333d2b36SAndroid Build Coastguard Worker			"-mno-xsaves",
64*333d2b36SAndroid Build Coastguard Worker		},
65*333d2b36SAndroid Build Coastguard Worker		"haswell": []string{
66*333d2b36SAndroid Build Coastguard Worker			"-march=core-avx2",
67*333d2b36SAndroid Build Coastguard Worker		},
68*333d2b36SAndroid Build Coastguard Worker		"ivybridge": []string{
69*333d2b36SAndroid Build Coastguard Worker			"-march=core-avx-i",
70*333d2b36SAndroid Build Coastguard Worker		},
71*333d2b36SAndroid Build Coastguard Worker		"sandybridge": []string{
72*333d2b36SAndroid Build Coastguard Worker			"-march=corei7",
73*333d2b36SAndroid Build Coastguard Worker		},
74*333d2b36SAndroid Build Coastguard Worker		"silvermont": []string{
75*333d2b36SAndroid Build Coastguard Worker			"-march=slm",
76*333d2b36SAndroid Build Coastguard Worker		},
77*333d2b36SAndroid Build Coastguard Worker		"skylake": []string{
78*333d2b36SAndroid Build Coastguard Worker			"-march=skylake",
79*333d2b36SAndroid Build Coastguard Worker		},
80*333d2b36SAndroid Build Coastguard Worker		"stoneyridge": []string{
81*333d2b36SAndroid Build Coastguard Worker			"-march=bdver4",
82*333d2b36SAndroid Build Coastguard Worker		},
83*333d2b36SAndroid Build Coastguard Worker		"tremont": []string{
84*333d2b36SAndroid Build Coastguard Worker			"-march=tremont",
85*333d2b36SAndroid Build Coastguard Worker		},
86*333d2b36SAndroid Build Coastguard Worker	}
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Worker	x86ArchFeatureCflags = map[string][]string{
89*333d2b36SAndroid Build Coastguard Worker		"ssse3":  []string{"-mssse3"},
90*333d2b36SAndroid Build Coastguard Worker		"sse4":   []string{"-msse4"},
91*333d2b36SAndroid Build Coastguard Worker		"sse4_1": []string{"-msse4.1"},
92*333d2b36SAndroid Build Coastguard Worker		"sse4_2": []string{"-msse4.2"},
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker		// Not all cases there is performance gain by enabling -mavx -mavx2
95*333d2b36SAndroid Build Coastguard Worker		// flags so these flags are not enabled by default.
96*333d2b36SAndroid Build Coastguard Worker		// if there is performance gain in individual library components,
97*333d2b36SAndroid Build Coastguard Worker		// the compiler flags can be set in corresponding bp files.
98*333d2b36SAndroid Build Coastguard Worker		// "avx":    []string{"-mavx"},
99*333d2b36SAndroid Build Coastguard Worker		// "avx2":   []string{"-mavx2"},
100*333d2b36SAndroid Build Coastguard Worker		// "avx512": []string{"-mavx512"}
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker		"aes_ni": []string{"-maes"},
103*333d2b36SAndroid Build Coastguard Worker	}
104*333d2b36SAndroid Build Coastguard Worker)
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Workerfunc init() {
107*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86ToolchainCflags", "-m32")
108*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86ToolchainLdflags", "-m32")
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86Ldflags", strings.Join(x86Ldflags, " "))
111*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86Lldflags", strings.Join(x86Ldflags, " "))
112*333d2b36SAndroid Build Coastguard Worker
113*333d2b36SAndroid Build Coastguard Worker	// Clang cflags
114*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86Cflags", strings.Join(x86Cflags, " "))
115*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86Cppflags", strings.Join(x86Cppflags, " "))
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Worker	// Yasm flags
118*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("X86YasmFlags", "-f elf32 -m x86")
119*333d2b36SAndroid Build Coastguard Worker
120*333d2b36SAndroid Build Coastguard Worker	// Architecture variant cflags
121*333d2b36SAndroid Build Coastguard Worker	for variant, cflags := range x86ArchVariantCflags {
122*333d2b36SAndroid Build Coastguard Worker		pctx.StaticVariable("X86"+variant+"VariantCflags", strings.Join(cflags, " "))
123*333d2b36SAndroid Build Coastguard Worker	}
124*333d2b36SAndroid Build Coastguard Worker}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Workertype toolchainX86 struct {
127*333d2b36SAndroid Build Coastguard Worker	toolchainBionic
128*333d2b36SAndroid Build Coastguard Worker	toolchain32Bit
129*333d2b36SAndroid Build Coastguard Worker	toolchainCflags string
130*333d2b36SAndroid Build Coastguard Worker}
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) Name() string {
133*333d2b36SAndroid Build Coastguard Worker	return "x86"
134*333d2b36SAndroid Build Coastguard Worker}
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) IncludeFlags() string {
137*333d2b36SAndroid Build Coastguard Worker	return ""
138*333d2b36SAndroid Build Coastguard Worker}
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) ClangTriple() string {
141*333d2b36SAndroid Build Coastguard Worker	return "i686-linux-android"
142*333d2b36SAndroid Build Coastguard Worker}
143*333d2b36SAndroid Build Coastguard Worker
144*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) ToolchainLdflags() string {
145*333d2b36SAndroid Build Coastguard Worker	return "${config.X86ToolchainLdflags}"
146*333d2b36SAndroid Build Coastguard Worker}
147*333d2b36SAndroid Build Coastguard Worker
148*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) ToolchainCflags() string {
149*333d2b36SAndroid Build Coastguard Worker	return t.toolchainCflags
150*333d2b36SAndroid Build Coastguard Worker}
151*333d2b36SAndroid Build Coastguard Worker
152*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) Cflags() string {
153*333d2b36SAndroid Build Coastguard Worker	return "${config.X86Cflags}"
154*333d2b36SAndroid Build Coastguard Worker}
155*333d2b36SAndroid Build Coastguard Worker
156*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) Cppflags() string {
157*333d2b36SAndroid Build Coastguard Worker	return "${config.X86Cppflags}"
158*333d2b36SAndroid Build Coastguard Worker}
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) Ldflags() string {
161*333d2b36SAndroid Build Coastguard Worker	return "${config.X86Ldflags}"
162*333d2b36SAndroid Build Coastguard Worker}
163*333d2b36SAndroid Build Coastguard Worker
164*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) Lldflags() string {
165*333d2b36SAndroid Build Coastguard Worker	return "${config.X86Lldflags}"
166*333d2b36SAndroid Build Coastguard Worker}
167*333d2b36SAndroid Build Coastguard Worker
168*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) YasmFlags() string {
169*333d2b36SAndroid Build Coastguard Worker	return "${config.X86YasmFlags}"
170*333d2b36SAndroid Build Coastguard Worker}
171*333d2b36SAndroid Build Coastguard Worker
172*333d2b36SAndroid Build Coastguard Workerfunc (toolchainX86) LibclangRuntimeLibraryArch() string {
173*333d2b36SAndroid Build Coastguard Worker	return "i686"
174*333d2b36SAndroid Build Coastguard Worker}
175*333d2b36SAndroid Build Coastguard Worker
176*333d2b36SAndroid Build Coastguard Workerfunc x86ToolchainFactory(arch android.Arch) Toolchain {
177*333d2b36SAndroid Build Coastguard Worker	// Error now rather than having a confusing Ninja error
178*333d2b36SAndroid Build Coastguard Worker	if _, ok := x86ArchVariantCflags[arch.ArchVariant]; !ok {
179*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Sprintf("Unknown x86 architecture version: %q", arch.ArchVariant))
180*333d2b36SAndroid Build Coastguard Worker	}
181*333d2b36SAndroid Build Coastguard Worker
182*333d2b36SAndroid Build Coastguard Worker	toolchainCflags := []string{
183*333d2b36SAndroid Build Coastguard Worker		"${config.X86ToolchainCflags}",
184*333d2b36SAndroid Build Coastguard Worker		"${config.X86" + arch.ArchVariant + "VariantCflags}",
185*333d2b36SAndroid Build Coastguard Worker	}
186*333d2b36SAndroid Build Coastguard Worker
187*333d2b36SAndroid Build Coastguard Worker	for _, feature := range arch.ArchFeatures {
188*333d2b36SAndroid Build Coastguard Worker		toolchainCflags = append(toolchainCflags, x86ArchFeatureCflags[feature]...)
189*333d2b36SAndroid Build Coastguard Worker	}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Worker	return &toolchainX86{
192*333d2b36SAndroid Build Coastguard Worker		toolchainCflags: strings.Join(toolchainCflags, " "),
193*333d2b36SAndroid Build Coastguard Worker	}
194*333d2b36SAndroid Build Coastguard Worker}
195*333d2b36SAndroid Build Coastguard Worker
196*333d2b36SAndroid Build Coastguard Workerfunc init() {
197*333d2b36SAndroid Build Coastguard Worker	registerToolchainFactory(android.Android, android.X86, x86ToolchainFactory)
198*333d2b36SAndroid Build Coastguard Worker}
199