xref: /aosp_15_r20/build/soong/cc/config/x86_device.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package config
16
17import (
18	"fmt"
19	"strings"
20
21	"android/soong/android"
22)
23
24var (
25	x86Cflags = []string{
26		"-msse3",
27
28		// -mstackrealign is needed to realign stack in native code
29		// that could be called from JNI, so that movaps instruction
30		// will work on assumed stack aligned local variables.
31		"-mstackrealign",
32	}
33
34	x86Cppflags = []string{}
35
36	x86Ldflags = []string{}
37
38	x86ArchVariantCflags = map[string][]string{
39		"": []string{
40			"-march=prescott",
41		},
42		"x86_64": []string{
43			"-march=prescott",
44		},
45		"alderlake": []string{
46			"-march=alderlake",
47		},
48		"atom": []string{
49			"-march=atom",
50		},
51		"broadwell": []string{
52			"-march=broadwell",
53		},
54		"goldmont": []string{
55			"-march=goldmont",
56		},
57		"goldmont-plus": []string{
58			"-march=goldmont-plus",
59		},
60		"goldmont-without-sha-xsaves": []string{
61			"-march=goldmont",
62			"-mno-sha",
63			"-mno-xsaves",
64		},
65		"haswell": []string{
66			"-march=core-avx2",
67		},
68		"ivybridge": []string{
69			"-march=core-avx-i",
70		},
71		"sandybridge": []string{
72			"-march=corei7",
73		},
74		"silvermont": []string{
75			"-march=slm",
76		},
77		"skylake": []string{
78			"-march=skylake",
79		},
80		"stoneyridge": []string{
81			"-march=bdver4",
82		},
83		"tremont": []string{
84			"-march=tremont",
85		},
86	}
87
88	x86ArchFeatureCflags = map[string][]string{
89		"ssse3":  []string{"-mssse3"},
90		"sse4":   []string{"-msse4"},
91		"sse4_1": []string{"-msse4.1"},
92		"sse4_2": []string{"-msse4.2"},
93
94		// Not all cases there is performance gain by enabling -mavx -mavx2
95		// flags so these flags are not enabled by default.
96		// if there is performance gain in individual library components,
97		// the compiler flags can be set in corresponding bp files.
98		// "avx":    []string{"-mavx"},
99		// "avx2":   []string{"-mavx2"},
100		// "avx512": []string{"-mavx512"}
101
102		"aes_ni": []string{"-maes"},
103	}
104)
105
106func init() {
107	pctx.StaticVariable("X86ToolchainCflags", "-m32")
108	pctx.StaticVariable("X86ToolchainLdflags", "-m32")
109
110	pctx.StaticVariable("X86Ldflags", strings.Join(x86Ldflags, " "))
111	pctx.StaticVariable("X86Lldflags", strings.Join(x86Ldflags, " "))
112
113	// Clang cflags
114	pctx.StaticVariable("X86Cflags", strings.Join(x86Cflags, " "))
115	pctx.StaticVariable("X86Cppflags", strings.Join(x86Cppflags, " "))
116
117	// Yasm flags
118	pctx.StaticVariable("X86YasmFlags", "-f elf32 -m x86")
119
120	// Architecture variant cflags
121	for variant, cflags := range x86ArchVariantCflags {
122		pctx.StaticVariable("X86"+variant+"VariantCflags", strings.Join(cflags, " "))
123	}
124}
125
126type toolchainX86 struct {
127	toolchainBionic
128	toolchain32Bit
129	toolchainCflags string
130}
131
132func (t *toolchainX86) Name() string {
133	return "x86"
134}
135
136func (t *toolchainX86) IncludeFlags() string {
137	return ""
138}
139
140func (t *toolchainX86) ClangTriple() string {
141	return "i686-linux-android"
142}
143
144func (t *toolchainX86) ToolchainLdflags() string {
145	return "${config.X86ToolchainLdflags}"
146}
147
148func (t *toolchainX86) ToolchainCflags() string {
149	return t.toolchainCflags
150}
151
152func (t *toolchainX86) Cflags() string {
153	return "${config.X86Cflags}"
154}
155
156func (t *toolchainX86) Cppflags() string {
157	return "${config.X86Cppflags}"
158}
159
160func (t *toolchainX86) Ldflags() string {
161	return "${config.X86Ldflags}"
162}
163
164func (t *toolchainX86) Lldflags() string {
165	return "${config.X86Lldflags}"
166}
167
168func (t *toolchainX86) YasmFlags() string {
169	return "${config.X86YasmFlags}"
170}
171
172func (toolchainX86) LibclangRuntimeLibraryArch() string {
173	return "i686"
174}
175
176func x86ToolchainFactory(arch android.Arch) Toolchain {
177	// Error now rather than having a confusing Ninja error
178	if _, ok := x86ArchVariantCflags[arch.ArchVariant]; !ok {
179		panic(fmt.Sprintf("Unknown x86 architecture version: %q", arch.ArchVariant))
180	}
181
182	toolchainCflags := []string{
183		"${config.X86ToolchainCflags}",
184		"${config.X86" + arch.ArchVariant + "VariantCflags}",
185	}
186
187	for _, feature := range arch.ArchFeatures {
188		toolchainCflags = append(toolchainCflags, x86ArchFeatureCflags[feature]...)
189	}
190
191	return &toolchainX86{
192		toolchainCflags: strings.Join(toolchainCflags, " "),
193	}
194}
195
196func init() {
197	registerToolchainFactory(android.Android, android.X86, x86ToolchainFactory)
198}
199