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 "strings" 19 20 "android/soong/android" 21) 22 23var ( 24 x86_64Cflags = []string{ 25 "-fno-exceptions", // from build/core/combo/select.mk 26 "-Wno-multichar", // from build/core/combo/select.mk 27 "-O2", 28 "-Wa,--noexecstack", 29 "-Werror=format-security", 30 "-D_FORTIFY_SOURCE=2", 31 "-Wstrict-aliasing=2", 32 "-ffunction-sections", 33 "-finline-functions", 34 "-finline-limit=300", 35 "-fno-short-enums", 36 "-fstrict-aliasing", 37 "-funswitch-loops", 38 "-funwind-tables", 39 "-fstack-protector-strong", 40 "-no-canonical-prefixes", 41 "-fno-canonical-system-headers", 42 43 // Help catch common 32/64-bit errors. 44 "-Werror=pointer-to-int-cast", 45 "-Werror=int-to-pointer-cast", 46 "-Werror=implicit-function-declaration", 47 48 // TARGET_RELEASE_CFLAGS from build/core/combo/select.mk 49 "-O2", 50 "-g", 51 "-fno-strict-aliasing", 52 } 53 54 x86_64Cppflags = []string{} 55 56 x86_64Ldflags = []string{ 57 "-Wl,-z,noexecstack", 58 "-Wl,-z,relro", 59 "-Wl,-z,now", 60 "-Wl,--build-id=md5", 61 "-Wl,--warn-shared-textrel", 62 "-Wl,--fatal-warnings", 63 "-Wl,--gc-sections", 64 "-Wl,--hash-style=gnu", 65 "-Wl,--no-undefined-version", 66 } 67 68 x86_64ArchVariantCflags = map[string][]string{ 69 "": []string{ 70 "-march=x86-64", 71 }, 72 "haswell": []string{ 73 "-march=core-avx2", 74 }, 75 "ivybridge": []string{ 76 "-march=core-avx-i", 77 }, 78 "sandybridge": []string{ 79 "-march=corei7", 80 }, 81 "silvermont": []string{ 82 "-march=slm", 83 }, 84 } 85 86 x86_64ArchFeatureCflags = map[string][]string{ 87 "ssse3": []string{"-DUSE_SSSE3", "-mssse3"}, 88 "sse4": []string{"-msse4"}, 89 "sse4_1": []string{"-msse4.1"}, 90 "sse4_2": []string{"-msse4.2"}, 91 "popcnt": []string{"-mpopcnt"}, 92 "avx": []string{"-mavx"}, 93 "aes_ni": []string{"-maes"}, 94 } 95) 96 97const ( 98 x86_64GccVersion = "4.9" 99) 100 101func init() { 102 android.RegisterArchVariants(android.X86_64, 103 "haswell", 104 "ivybridge", 105 "sandybridge", 106 "silvermont") 107 android.RegisterArchFeatures(android.X86_64, 108 "ssse3", 109 "sse4", 110 "sse4_1", 111 "sse4_2", 112 "aes_ni", 113 "avx", 114 "popcnt") 115 android.RegisterArchVariantFeatures(android.X86_64, "", 116 "ssse3", 117 "sse4", 118 "sse4_1", 119 "sse4_2", 120 "popcnt") 121 android.RegisterArchVariantFeatures(android.X86_64, "haswell", 122 "ssse3", 123 "sse4", 124 "sse4_1", 125 "sse4_2", 126 "aes_ni", 127 "avx", 128 "popcnt") 129 android.RegisterArchVariantFeatures(android.X86_64, "ivybridge", 130 "ssse3", 131 "sse4", 132 "sse4_1", 133 "sse4_2", 134 "aes_ni", 135 "avx", 136 "popcnt") 137 android.RegisterArchVariantFeatures(android.X86_64, "sandybridge", 138 "ssse3", 139 "sse4", 140 "sse4_1", 141 "sse4_2", 142 "popcnt") 143 android.RegisterArchVariantFeatures(android.X86_64, "silvermont", 144 "ssse3", 145 "sse4", 146 "sse4_1", 147 "sse4_2", 148 "aes_ni", 149 "popcnt") 150 151 pctx.StaticVariable("x86_64GccVersion", x86_64GccVersion) 152 153 pctx.SourcePathVariable("X86_64GccRoot", 154 "prebuilts/gcc/${HostPrebuiltTag}/x86/x86_64-linux-android-${x86_64GccVersion}") 155 156 pctx.StaticVariable("X86_64ToolchainCflags", "-m64") 157 pctx.StaticVariable("X86_64ToolchainLdflags", "-m64") 158 159 pctx.StaticVariable("X86_64Cflags", strings.Join(x86_64Cflags, " ")) 160 pctx.StaticVariable("X86_64Ldflags", strings.Join(x86_64Ldflags, " ")) 161 pctx.StaticVariable("X86_64Cppflags", strings.Join(x86_64Cppflags, " ")) 162 pctx.StaticVariable("X86_64IncludeFlags", bionicHeaders("x86_64", "x86")) 163 164 // Clang cflags 165 pctx.StaticVariable("X86_64ClangCflags", strings.Join(ClangFilterUnknownCflags(x86_64Cflags), " ")) 166 pctx.StaticVariable("X86_64ClangLdflags", strings.Join(ClangFilterUnknownCflags(x86_64Ldflags), " ")) 167 pctx.StaticVariable("X86_64ClangCppflags", strings.Join(ClangFilterUnknownCflags(x86_64Cppflags), " ")) 168 169 // Yasm flags 170 pctx.StaticVariable("X86_64YasmFlags", "-f elf64 -m amd64") 171 172 // Extended cflags 173 174 // Architecture variant cflags 175 for variant, cflags := range x86_64ArchVariantCflags { 176 pctx.StaticVariable("X86_64"+variant+"VariantCflags", strings.Join(cflags, " ")) 177 pctx.StaticVariable("X86_64"+variant+"VariantClangCflags", 178 strings.Join(ClangFilterUnknownCflags(cflags), " ")) 179 } 180} 181 182type toolchainX86_64 struct { 183 toolchain64Bit 184 toolchainCflags, toolchainClangCflags string 185} 186 187func (t *toolchainX86_64) Name() string { 188 return "x86_64" 189} 190 191func (t *toolchainX86_64) GccRoot() string { 192 return "${config.X86_64GccRoot}" 193} 194 195func (t *toolchainX86_64) GccTriple() string { 196 return "x86_64-linux-android" 197} 198 199func (t *toolchainX86_64) GccVersion() string { 200 return x86_64GccVersion 201} 202 203func (t *toolchainX86_64) ToolchainLdflags() string { 204 return "${config.X86_64ToolchainLdflags}" 205} 206 207func (t *toolchainX86_64) ToolchainCflags() string { 208 return t.toolchainCflags 209} 210 211func (t *toolchainX86_64) Cflags() string { 212 return "${config.X86_64Cflags}" 213} 214 215func (t *toolchainX86_64) Cppflags() string { 216 return "${config.X86_64Cppflags}" 217} 218 219func (t *toolchainX86_64) Ldflags() string { 220 return "${config.X86_64Ldflags}" 221} 222 223func (t *toolchainX86_64) IncludeFlags() string { 224 return "${config.X86_64IncludeFlags}" 225} 226 227func (t *toolchainX86_64) ClangTriple() string { 228 return t.GccTriple() 229} 230 231func (t *toolchainX86_64) ToolchainClangLdflags() string { 232 return "${config.X86_64ToolchainLdflags}" 233} 234 235func (t *toolchainX86_64) ToolchainClangCflags() string { 236 return t.toolchainClangCflags 237} 238 239func (t *toolchainX86_64) ClangCflags() string { 240 return "${config.X86_64ClangCflags}" 241} 242 243func (t *toolchainX86_64) ClangCppflags() string { 244 return "${config.X86_64ClangCppflags}" 245} 246 247func (t *toolchainX86_64) ClangLdflags() string { 248 return "${config.X86_64Ldflags}" 249} 250 251func (t *toolchainX86_64) YasmFlags() string { 252 return "${config.X86_64YasmFlags}" 253} 254 255func (toolchainX86_64) SanitizerRuntimeLibraryArch() string { 256 return "x86_64" 257} 258 259func x86_64ToolchainFactory(arch android.Arch) Toolchain { 260 toolchainCflags := []string{ 261 "${config.X86_64ToolchainCflags}", 262 "${config.X86_64" + arch.ArchVariant + "VariantCflags}", 263 } 264 265 toolchainClangCflags := []string{ 266 "${config.X86_64ToolchainCflags}", 267 "${config.X86_64" + arch.ArchVariant + "VariantClangCflags}", 268 } 269 270 for _, feature := range arch.ArchFeatures { 271 toolchainCflags = append(toolchainCflags, x86_64ArchFeatureCflags[feature]...) 272 toolchainClangCflags = append(toolchainClangCflags, x86_64ArchFeatureCflags[feature]...) 273 } 274 275 return &toolchainX86_64{ 276 toolchainCflags: strings.Join(toolchainCflags, " "), 277 toolchainClangCflags: strings.Join(toolchainClangCflags, " "), 278 } 279} 280 281func init() { 282 registerToolchainFactory(android.Android, android.X86_64, x86_64ToolchainFactory) 283} 284