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 "-Wl,--hash-style=gnu", 38 } 39 40 x86ArchVariantCflags = map[string][]string{ 41 "": []string{ 42 "-march=prescott", 43 }, 44 "x86_64": []string{ 45 "-march=prescott", 46 }, 47 "atom": []string{ 48 "-march=atom", 49 }, 50 "broadwell": []string{ 51 "-march=broadwell", 52 }, 53 "haswell": []string{ 54 "-march=core-avx2", 55 }, 56 "ivybridge": []string{ 57 "-march=core-avx-i", 58 }, 59 "sandybridge": []string{ 60 "-march=corei7", 61 }, 62 "silvermont": []string{ 63 "-march=slm", 64 }, 65 "skylake": []string{ 66 "-march=skylake", 67 }, 68 "stoneyridge": []string{ 69 "-march=bdver4", 70 }, 71 } 72 73 x86ArchFeatureCflags = 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 "aes_ni": []string{"-maes"}, 88 } 89) 90 91const ( 92 x86GccVersion = "4.9" 93) 94 95func init() { 96 pctx.StaticVariable("x86GccVersion", x86GccVersion) 97 98 pctx.SourcePathVariable("X86GccRoot", 99 "prebuilts/gcc/${HostPrebuiltTag}/x86/x86_64-linux-android-${x86GccVersion}") 100 101 exportedVars.ExportStringListStaticVariable("X86ToolchainCflags", []string{"-m32"}) 102 exportedVars.ExportStringListStaticVariable("X86ToolchainLdflags", []string{"-m32"}) 103 104 exportedVars.ExportStringListStaticVariable("X86Ldflags", x86Ldflags) 105 exportedVars.ExportStringListStaticVariable("X86Lldflags", x86Ldflags) 106 107 // Clang cflags 108 exportedVars.ExportStringListStaticVariable("X86Cflags", x86Cflags) 109 exportedVars.ExportStringListStaticVariable("X86Cppflags", x86Cppflags) 110 111 // Yasm flags 112 exportedVars.ExportStringListStaticVariable("X86YasmFlags", []string{ 113 "-f elf32", 114 "-m x86", 115 }) 116 117 // Extended cflags 118 exportedVars.ExportStringListDict("X86ArchVariantCflags", x86ArchVariantCflags) 119 exportedVars.ExportStringListDict("X86ArchFeatureCflags", x86ArchFeatureCflags) 120 121 // Architecture variant cflags 122 for variant, cflags := range x86ArchVariantCflags { 123 pctx.StaticVariable("X86"+variant+"VariantCflags", strings.Join(cflags, " ")) 124 } 125} 126 127type toolchainX86 struct { 128 toolchainBionic 129 toolchain32Bit 130 toolchainCflags string 131} 132 133func (t *toolchainX86) Name() string { 134 return "x86" 135} 136 137func (t *toolchainX86) GccRoot() string { 138 return "${config.X86GccRoot}" 139} 140 141func (t *toolchainX86) GccTriple() string { 142 return "x86_64-linux-android" 143} 144 145func (t *toolchainX86) GccVersion() string { 146 return x86GccVersion 147} 148 149func (t *toolchainX86) IncludeFlags() string { 150 return "" 151} 152 153func (t *toolchainX86) ClangTriple() string { 154 return "i686-linux-android" 155} 156 157func (t *toolchainX86) ToolchainLdflags() string { 158 return "${config.X86ToolchainLdflags}" 159} 160 161func (t *toolchainX86) ToolchainCflags() string { 162 return t.toolchainCflags 163} 164 165func (t *toolchainX86) Cflags() string { 166 return "${config.X86Cflags}" 167} 168 169func (t *toolchainX86) Cppflags() string { 170 return "${config.X86Cppflags}" 171} 172 173func (t *toolchainX86) Ldflags() string { 174 return "${config.X86Ldflags}" 175} 176 177func (t *toolchainX86) Lldflags() string { 178 return "${config.X86Lldflags}" 179} 180 181func (t *toolchainX86) YasmFlags() string { 182 return "${config.X86YasmFlags}" 183} 184 185func (toolchainX86) LibclangRuntimeLibraryArch() string { 186 return "i686" 187} 188 189func x86ToolchainFactory(arch android.Arch) Toolchain { 190 // Error now rather than having a confusing Ninja error 191 if _, ok := x86ArchVariantCflags[arch.ArchVariant]; !ok { 192 panic(fmt.Sprintf("Unknown x86 architecture version: %q", arch.ArchVariant)) 193 } 194 195 toolchainCflags := []string{ 196 "${config.X86ToolchainCflags}", 197 "${config.X86" + arch.ArchVariant + "VariantCflags}", 198 } 199 200 for _, feature := range arch.ArchFeatures { 201 toolchainCflags = append(toolchainCflags, x86ArchFeatureCflags[feature]...) 202 } 203 204 return &toolchainX86{ 205 toolchainCflags: strings.Join(toolchainCflags, " "), 206 } 207} 208 209func init() { 210 registerToolchainFactory(android.Android, android.X86, x86ToolchainFactory) 211} 212