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