blob: 12f3e6fa2ecf0bf2dba575c29a522c05c6642a48 [file] [log] [blame]
Colin Cross6371b382015-11-23 14:53:57 -08001// 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
Colin Crossb98c8b02016-07-29 13:44:28 -070015package config
Colin Cross6371b382015-11-23 14:53:57 -080016
17import (
18 "strings"
19
Colin Cross635c3b02016-05-18 15:37:25 -070020 "android/soong/android"
Colin Cross6371b382015-11-23 14:53:57 -080021)
22
23var (
24 x86_64Cflags = []string{
Colin Cross6371b382015-11-23 14:53:57 -080025 // Help catch common 32/64-bit errors.
Colin Cross6371b382015-11-23 14:53:57 -080026 "-Werror=implicit-function-declaration",
Colin Cross6371b382015-11-23 14:53:57 -080027 }
28
29 x86_64Cppflags = []string{}
30
31 x86_64Ldflags = []string{
Colin Cross6371b382015-11-23 14:53:57 -080032 "-Wl,--hash-style=gnu",
33 }
34
35 x86_64ArchVariantCflags = map[string][]string{
36 "": []string{
37 "-march=x86-64",
38 },
39 "haswell": []string{
40 "-march=core-avx2",
41 },
42 "ivybridge": []string{
43 "-march=core-avx-i",
44 },
45 "sandybridge": []string{
Dan Willemsenb77bd792016-02-29 15:26:26 -080046 "-march=corei7",
Colin Cross6371b382015-11-23 14:53:57 -080047 },
48 "silvermont": []string{
49 "-march=slm",
50 },
51 }
52
53 x86_64ArchFeatureCflags = map[string][]string{
54 "ssse3": []string{"-DUSE_SSSE3", "-mssse3"},
55 "sse4": []string{"-msse4"},
56 "sse4_1": []string{"-msse4.1"},
57 "sse4_2": []string{"-msse4.2"},
Dan Willemsen4ce47032016-05-06 17:20:53 -070058 "popcnt": []string{"-mpopcnt"},
Colin Cross6371b382015-11-23 14:53:57 -080059 "avx": []string{"-mavx"},
60 "aes_ni": []string{"-maes"},
61 }
62)
63
Dan Willemsen34fc3b12015-12-07 12:30:44 -080064const (
65 x86_64GccVersion = "4.9"
66)
67
Colin Cross6371b382015-11-23 14:53:57 -080068func init() {
Dan Willemsenb1957a52016-06-23 23:44:54 -070069 android.RegisterArchVariants(android.X86_64,
70 "haswell",
71 "ivybridge",
72 "sandybridge",
73 "silvermont")
74 android.RegisterArchFeatures(android.X86_64,
Colin Cross6371b382015-11-23 14:53:57 -080075 "ssse3",
76 "sse4",
77 "sse4_1",
78 "sse4_2",
79 "aes_ni",
80 "avx",
81 "popcnt")
Dan Willemsenb1957a52016-06-23 23:44:54 -070082 android.RegisterArchVariantFeatures(android.X86_64, "",
83 "ssse3",
84 "sse4",
85 "sse4_1",
86 "sse4_2",
87 "popcnt")
88 android.RegisterArchVariantFeatures(android.X86_64, "haswell",
Colin Cross6371b382015-11-23 14:53:57 -080089 "ssse3",
90 "sse4",
91 "sse4_1",
92 "sse4_2",
93 "aes_ni",
94 "avx",
95 "popcnt")
Dan Willemsenb1957a52016-06-23 23:44:54 -070096 android.RegisterArchVariantFeatures(android.X86_64, "ivybridge",
97 "ssse3",
98 "sse4",
99 "sse4_1",
100 "sse4_2",
101 "aes_ni",
102 "avx",
103 "popcnt")
104 android.RegisterArchVariantFeatures(android.X86_64, "sandybridge",
Colin Cross6371b382015-11-23 14:53:57 -0800105 "ssse3",
106 "sse4",
107 "sse4_1",
108 "sse4_2",
Colin Cross6371b382015-11-23 14:53:57 -0800109 "popcnt")
Dan Willemsenb1957a52016-06-23 23:44:54 -0700110 android.RegisterArchVariantFeatures(android.X86_64, "silvermont",
Colin Cross6371b382015-11-23 14:53:57 -0800111 "ssse3",
112 "sse4",
113 "sse4_1",
114 "sse4_2",
115 "aes_ni",
116 "popcnt")
117
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800118 pctx.StaticVariable("x86_64GccVersion", x86_64GccVersion)
Colin Cross6371b382015-11-23 14:53:57 -0800119
Colin Crossb98c8b02016-07-29 13:44:28 -0700120 pctx.SourcePathVariable("X86_64GccRoot",
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800121 "prebuilts/gcc/${HostPrebuiltTag}/x86/x86_64-linux-android-${x86_64GccVersion}")
Colin Cross6371b382015-11-23 14:53:57 -0800122
Colin Crossb98c8b02016-07-29 13:44:28 -0700123 pctx.StaticVariable("X86_64ToolchainCflags", "-m64")
124 pctx.StaticVariable("X86_64ToolchainLdflags", "-m64")
Colin Cross6371b382015-11-23 14:53:57 -0800125
Colin Crossb98c8b02016-07-29 13:44:28 -0700126 pctx.StaticVariable("X86_64Cflags", strings.Join(x86_64Cflags, " "))
127 pctx.StaticVariable("X86_64Ldflags", strings.Join(x86_64Ldflags, " "))
128 pctx.StaticVariable("X86_64Cppflags", strings.Join(x86_64Cppflags, " "))
Elliott Hughesde28deb2017-10-12 09:07:53 -0700129 pctx.StaticVariable("X86_64IncludeFlags", bionicHeaders("x86"))
Colin Cross6371b382015-11-23 14:53:57 -0800130
131 // Clang cflags
Colin Crossb98c8b02016-07-29 13:44:28 -0700132 pctx.StaticVariable("X86_64ClangCflags", strings.Join(ClangFilterUnknownCflags(x86_64Cflags), " "))
133 pctx.StaticVariable("X86_64ClangLdflags", strings.Join(ClangFilterUnknownCflags(x86_64Ldflags), " "))
134 pctx.StaticVariable("X86_64ClangCppflags", strings.Join(ClangFilterUnknownCflags(x86_64Cppflags), " "))
Colin Cross6371b382015-11-23 14:53:57 -0800135
Colin Cross91e90042016-12-02 17:13:24 -0800136 // Yasm flags
137 pctx.StaticVariable("X86_64YasmFlags", "-f elf64 -m amd64")
138
Colin Cross6371b382015-11-23 14:53:57 -0800139 // Extended cflags
140
141 // Architecture variant cflags
142 for variant, cflags := range x86_64ArchVariantCflags {
Colin Crossb98c8b02016-07-29 13:44:28 -0700143 pctx.StaticVariable("X86_64"+variant+"VariantCflags", strings.Join(cflags, " "))
144 pctx.StaticVariable("X86_64"+variant+"VariantClangCflags",
145 strings.Join(ClangFilterUnknownCflags(cflags), " "))
Colin Cross6371b382015-11-23 14:53:57 -0800146 }
147}
148
149type toolchainX86_64 struct {
150 toolchain64Bit
151 toolchainCflags, toolchainClangCflags string
152}
153
154func (t *toolchainX86_64) Name() string {
155 return "x86_64"
156}
157
158func (t *toolchainX86_64) GccRoot() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700159 return "${config.X86_64GccRoot}"
Colin Cross6371b382015-11-23 14:53:57 -0800160}
161
162func (t *toolchainX86_64) GccTriple() string {
Dan Albert84f431f2016-07-20 14:44:26 -0700163 return "x86_64-linux-android"
Colin Cross6371b382015-11-23 14:53:57 -0800164}
165
166func (t *toolchainX86_64) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800167 return x86_64GccVersion
Colin Cross6371b382015-11-23 14:53:57 -0800168}
169
170func (t *toolchainX86_64) ToolchainLdflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700171 return "${config.X86_64ToolchainLdflags}"
Colin Cross6371b382015-11-23 14:53:57 -0800172}
173
174func (t *toolchainX86_64) ToolchainCflags() string {
175 return t.toolchainCflags
176}
177
178func (t *toolchainX86_64) Cflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700179 return "${config.X86_64Cflags}"
Colin Cross6371b382015-11-23 14:53:57 -0800180}
181
182func (t *toolchainX86_64) Cppflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700183 return "${config.X86_64Cppflags}"
Colin Cross6371b382015-11-23 14:53:57 -0800184}
185
186func (t *toolchainX86_64) Ldflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700187 return "${config.X86_64Ldflags}"
Colin Cross6371b382015-11-23 14:53:57 -0800188}
189
190func (t *toolchainX86_64) IncludeFlags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700191 return "${config.X86_64IncludeFlags}"
Colin Cross6371b382015-11-23 14:53:57 -0800192}
193
194func (t *toolchainX86_64) ClangTriple() string {
Dan Albert84f431f2016-07-20 14:44:26 -0700195 return t.GccTriple()
Colin Cross6371b382015-11-23 14:53:57 -0800196}
197
Dan Willemsen569b0fa2016-05-08 20:04:20 -0700198func (t *toolchainX86_64) ToolchainClangLdflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700199 return "${config.X86_64ToolchainLdflags}"
Dan Willemsen569b0fa2016-05-08 20:04:20 -0700200}
201
Colin Cross6371b382015-11-23 14:53:57 -0800202func (t *toolchainX86_64) ToolchainClangCflags() string {
203 return t.toolchainClangCflags
204}
205
206func (t *toolchainX86_64) ClangCflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700207 return "${config.X86_64ClangCflags}"
Colin Cross6371b382015-11-23 14:53:57 -0800208}
209
210func (t *toolchainX86_64) ClangCppflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700211 return "${config.X86_64ClangCppflags}"
Colin Cross6371b382015-11-23 14:53:57 -0800212}
213
214func (t *toolchainX86_64) ClangLdflags() string {
Colin Crossb98c8b02016-07-29 13:44:28 -0700215 return "${config.X86_64Ldflags}"
Colin Cross6371b382015-11-23 14:53:57 -0800216}
217
Colin Cross91e90042016-12-02 17:13:24 -0800218func (t *toolchainX86_64) YasmFlags() string {
219 return "${config.X86_64YasmFlags}"
220}
221
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700222func (toolchainX86_64) SanitizerRuntimeLibraryArch() string {
223 return "x86_64"
224}
225
Colin Cross635c3b02016-05-18 15:37:25 -0700226func x86_64ToolchainFactory(arch android.Arch) Toolchain {
Colin Cross6371b382015-11-23 14:53:57 -0800227 toolchainCflags := []string{
Colin Crossb98c8b02016-07-29 13:44:28 -0700228 "${config.X86_64ToolchainCflags}",
229 "${config.X86_64" + arch.ArchVariant + "VariantCflags}",
Colin Cross6371b382015-11-23 14:53:57 -0800230 }
231
232 toolchainClangCflags := []string{
Colin Crossb98c8b02016-07-29 13:44:28 -0700233 "${config.X86_64ToolchainCflags}",
234 "${config.X86_64" + arch.ArchVariant + "VariantClangCflags}",
Colin Cross6371b382015-11-23 14:53:57 -0800235 }
236
237 for _, feature := range arch.ArchFeatures {
238 toolchainCflags = append(toolchainCflags, x86_64ArchFeatureCflags[feature]...)
239 toolchainClangCflags = append(toolchainClangCflags, x86_64ArchFeatureCflags[feature]...)
240 }
241
242 return &toolchainX86_64{
243 toolchainCflags: strings.Join(toolchainCflags, " "),
244 toolchainClangCflags: strings.Join(toolchainClangCflags, " "),
245 }
246}
247
248func init() {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700249 registerToolchainFactory(android.Android, android.X86_64, x86_64ToolchainFactory)
Colin Cross6371b382015-11-23 14:53:57 -0800250}