xref: /aosp_15_r20/build/soong/cc/config/x86_64_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	x86_64Cflags = []string{
26		// Help catch common 32/64-bit errors.
27		"-Werror=implicit-function-declaration",
28	}
29
30	x86_64Cppflags = []string{}
31
32	x86_64Ldflags = []string{
33		"-Wl,-z,separate-loadable-segments",
34	}
35
36	X86_64Lldflags = x86_64Ldflags
37
38	x86_64ArchVariantCflags = map[string][]string{
39		"": []string{
40			"-march=x86-64",
41		},
42
43		"alderlake": []string{
44			"-march=alderlake",
45		},
46		"broadwell": []string{
47			"-march=broadwell",
48		},
49		"goldmont": []string{
50			"-march=goldmont",
51		},
52		"goldmont-plus": []string{
53			"-march=goldmont-plus",
54		},
55		"goldmont-without-sha-xsaves": []string{
56			"-march=goldmont",
57			"-mno-sha",
58			"-mno-xsaves",
59		},
60		"haswell": []string{
61			"-march=core-avx2",
62		},
63		"ivybridge": []string{
64			"-march=core-avx-i",
65		},
66		"sandybridge": []string{
67			"-march=corei7",
68		},
69		"silvermont": []string{
70			"-march=slm",
71		},
72		"skylake": []string{
73			"-march=skylake",
74		},
75		"stoneyridge": []string{
76			"-march=bdver4",
77		},
78		"tremont": []string{
79			"-march=tremont",
80		},
81	}
82
83	x86_64ArchFeatureCflags = map[string][]string{
84		"ssse3":  []string{"-mssse3"},
85		"sse4":   []string{"-msse4"},
86		"sse4_1": []string{"-msse4.1"},
87		"sse4_2": []string{"-msse4.2"},
88
89		// Not all cases there is performance gain by enabling -mavx -mavx2
90		// flags so these flags are not enabled by default.
91		// if there is performance gain in individual library components,
92		// the compiler flags can be set in corresponding bp files.
93		// "avx":    []string{"-mavx"},
94		// "avx2":   []string{"-mavx2"},
95		// "avx512": []string{"-mavx512"}
96
97		"popcnt": []string{"-mpopcnt"},
98		"aes_ni": []string{"-maes"},
99	}
100)
101
102func init() {
103	pctx.StaticVariable("X86_64ToolchainCflags", "-m64")
104	pctx.StaticVariable("X86_64ToolchainLdflags", "-m64")
105
106	pctx.StaticVariable("X86_64Ldflags", strings.Join(x86_64Ldflags, " "))
107	pctx.VariableFunc("X86_64Lldflags", func(ctx android.PackageVarContext) string {
108		maxPageSizeFlag := "-Wl,-z,max-page-size=" + ctx.Config().MaxPageSizeSupported()
109		flags := append(X86_64Lldflags, maxPageSizeFlag)
110		return strings.Join(flags, " ")
111	})
112
113	// Clang cflags
114	pctx.VariableFunc("X86_64Cflags", func(ctx android.PackageVarContext) string {
115		flags := x86_64Cflags
116		if ctx.Config().NoBionicPageSizeMacro() {
117			flags = append(flags, "-D__BIONIC_NO_PAGE_SIZE_MACRO")
118		} else {
119			flags = append(flags, "-D__BIONIC_DEPRECATED_PAGE_SIZE_MACRO")
120		}
121		return strings.Join(flags, " ")
122	})
123
124	pctx.StaticVariable("X86_64Cppflags", strings.Join(x86_64Cppflags, " "))
125
126	// Yasm flags
127	pctx.StaticVariable("X86_64YasmFlags", "-f elf64 -m amd64")
128
129	// Architecture variant cflags
130	for variant, cflags := range x86_64ArchVariantCflags {
131		pctx.StaticVariable("X86_64"+variant+"VariantCflags", strings.Join(cflags, " "))
132	}
133}
134
135type toolchainX86_64 struct {
136	toolchainBionic
137	toolchain64Bit
138	toolchainCflags string
139}
140
141func (t *toolchainX86_64) Name() string {
142	return "x86_64"
143}
144
145func (t *toolchainX86_64) IncludeFlags() string {
146	return ""
147}
148
149func (t *toolchainX86_64) ClangTriple() string {
150	return "x86_64-linux-android"
151}
152
153func (t *toolchainX86_64) ToolchainLdflags() string {
154	return "${config.X86_64ToolchainLdflags}"
155}
156
157func (t *toolchainX86_64) ToolchainCflags() string {
158	return t.toolchainCflags
159}
160
161func (t *toolchainX86_64) Cflags() string {
162	return "${config.X86_64Cflags}"
163}
164
165func (t *toolchainX86_64) Cppflags() string {
166	return "${config.X86_64Cppflags}"
167}
168
169func (t *toolchainX86_64) Ldflags() string {
170	return "${config.X86_64Ldflags}"
171}
172
173func (t *toolchainX86_64) Lldflags() string {
174	return "${config.X86_64Lldflags}"
175}
176
177func (t *toolchainX86_64) YasmFlags() string {
178	return "${config.X86_64YasmFlags}"
179}
180
181func (toolchainX86_64) LibclangRuntimeLibraryArch() string {
182	return "x86_64"
183}
184
185func x86_64ToolchainFactory(arch android.Arch) Toolchain {
186	// Error now rather than having a confusing Ninja error
187	if _, ok := x86_64ArchVariantCflags[arch.ArchVariant]; !ok {
188		panic(fmt.Sprintf("Unknown x86_64 architecture version: %q", arch.ArchVariant))
189	}
190
191	toolchainCflags := []string{
192		"${config.X86_64ToolchainCflags}",
193		"${config.X86_64" + arch.ArchVariant + "VariantCflags}",
194	}
195
196	for _, feature := range arch.ArchFeatures {
197		toolchainCflags = append(toolchainCflags, x86_64ArchFeatureCflags[feature]...)
198	}
199
200	return &toolchainX86_64{
201		toolchainCflags: strings.Join(toolchainCflags, " "),
202	}
203}
204
205func init() {
206	registerToolchainFactory(android.Android, android.X86_64, x86_64ToolchainFactory)
207}
208