1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage config 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workervar ( 25*333d2b36SAndroid Build Coastguard Worker x86Cflags = []string{ 26*333d2b36SAndroid Build Coastguard Worker "-msse3", 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Worker // -mstackrealign is needed to realign stack in native code 29*333d2b36SAndroid Build Coastguard Worker // that could be called from JNI, so that movaps instruction 30*333d2b36SAndroid Build Coastguard Worker // will work on assumed stack aligned local variables. 31*333d2b36SAndroid Build Coastguard Worker "-mstackrealign", 32*333d2b36SAndroid Build Coastguard Worker } 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Worker x86Cppflags = []string{} 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Worker x86Ldflags = []string{} 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker x86ArchVariantCflags = map[string][]string{ 39*333d2b36SAndroid Build Coastguard Worker "": []string{ 40*333d2b36SAndroid Build Coastguard Worker "-march=prescott", 41*333d2b36SAndroid Build Coastguard Worker }, 42*333d2b36SAndroid Build Coastguard Worker "x86_64": []string{ 43*333d2b36SAndroid Build Coastguard Worker "-march=prescott", 44*333d2b36SAndroid Build Coastguard Worker }, 45*333d2b36SAndroid Build Coastguard Worker "alderlake": []string{ 46*333d2b36SAndroid Build Coastguard Worker "-march=alderlake", 47*333d2b36SAndroid Build Coastguard Worker }, 48*333d2b36SAndroid Build Coastguard Worker "atom": []string{ 49*333d2b36SAndroid Build Coastguard Worker "-march=atom", 50*333d2b36SAndroid Build Coastguard Worker }, 51*333d2b36SAndroid Build Coastguard Worker "broadwell": []string{ 52*333d2b36SAndroid Build Coastguard Worker "-march=broadwell", 53*333d2b36SAndroid Build Coastguard Worker }, 54*333d2b36SAndroid Build Coastguard Worker "goldmont": []string{ 55*333d2b36SAndroid Build Coastguard Worker "-march=goldmont", 56*333d2b36SAndroid Build Coastguard Worker }, 57*333d2b36SAndroid Build Coastguard Worker "goldmont-plus": []string{ 58*333d2b36SAndroid Build Coastguard Worker "-march=goldmont-plus", 59*333d2b36SAndroid Build Coastguard Worker }, 60*333d2b36SAndroid Build Coastguard Worker "goldmont-without-sha-xsaves": []string{ 61*333d2b36SAndroid Build Coastguard Worker "-march=goldmont", 62*333d2b36SAndroid Build Coastguard Worker "-mno-sha", 63*333d2b36SAndroid Build Coastguard Worker "-mno-xsaves", 64*333d2b36SAndroid Build Coastguard Worker }, 65*333d2b36SAndroid Build Coastguard Worker "haswell": []string{ 66*333d2b36SAndroid Build Coastguard Worker "-march=core-avx2", 67*333d2b36SAndroid Build Coastguard Worker }, 68*333d2b36SAndroid Build Coastguard Worker "ivybridge": []string{ 69*333d2b36SAndroid Build Coastguard Worker "-march=core-avx-i", 70*333d2b36SAndroid Build Coastguard Worker }, 71*333d2b36SAndroid Build Coastguard Worker "sandybridge": []string{ 72*333d2b36SAndroid Build Coastguard Worker "-march=corei7", 73*333d2b36SAndroid Build Coastguard Worker }, 74*333d2b36SAndroid Build Coastguard Worker "silvermont": []string{ 75*333d2b36SAndroid Build Coastguard Worker "-march=slm", 76*333d2b36SAndroid Build Coastguard Worker }, 77*333d2b36SAndroid Build Coastguard Worker "skylake": []string{ 78*333d2b36SAndroid Build Coastguard Worker "-march=skylake", 79*333d2b36SAndroid Build Coastguard Worker }, 80*333d2b36SAndroid Build Coastguard Worker "stoneyridge": []string{ 81*333d2b36SAndroid Build Coastguard Worker "-march=bdver4", 82*333d2b36SAndroid Build Coastguard Worker }, 83*333d2b36SAndroid Build Coastguard Worker "tremont": []string{ 84*333d2b36SAndroid Build Coastguard Worker "-march=tremont", 85*333d2b36SAndroid Build Coastguard Worker }, 86*333d2b36SAndroid Build Coastguard Worker } 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Worker x86ArchFeatureCflags = map[string][]string{ 89*333d2b36SAndroid Build Coastguard Worker "ssse3": []string{"-mssse3"}, 90*333d2b36SAndroid Build Coastguard Worker "sse4": []string{"-msse4"}, 91*333d2b36SAndroid Build Coastguard Worker "sse4_1": []string{"-msse4.1"}, 92*333d2b36SAndroid Build Coastguard Worker "sse4_2": []string{"-msse4.2"}, 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker // Not all cases there is performance gain by enabling -mavx -mavx2 95*333d2b36SAndroid Build Coastguard Worker // flags so these flags are not enabled by default. 96*333d2b36SAndroid Build Coastguard Worker // if there is performance gain in individual library components, 97*333d2b36SAndroid Build Coastguard Worker // the compiler flags can be set in corresponding bp files. 98*333d2b36SAndroid Build Coastguard Worker // "avx": []string{"-mavx"}, 99*333d2b36SAndroid Build Coastguard Worker // "avx2": []string{"-mavx2"}, 100*333d2b36SAndroid Build Coastguard Worker // "avx512": []string{"-mavx512"} 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Worker "aes_ni": []string{"-maes"}, 103*333d2b36SAndroid Build Coastguard Worker } 104*333d2b36SAndroid Build Coastguard Worker) 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Workerfunc init() { 107*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("X86ToolchainCflags", "-m32") 108*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("X86ToolchainLdflags", "-m32") 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("X86Ldflags", strings.Join(x86Ldflags, " ")) 111*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("X86Lldflags", strings.Join(x86Ldflags, " ")) 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Worker // Clang cflags 114*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("X86Cflags", strings.Join(x86Cflags, " ")) 115*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("X86Cppflags", strings.Join(x86Cppflags, " ")) 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker // Yasm flags 118*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("X86YasmFlags", "-f elf32 -m x86") 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Worker // Architecture variant cflags 121*333d2b36SAndroid Build Coastguard Worker for variant, cflags := range x86ArchVariantCflags { 122*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("X86"+variant+"VariantCflags", strings.Join(cflags, " ")) 123*333d2b36SAndroid Build Coastguard Worker } 124*333d2b36SAndroid Build Coastguard Worker} 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Workertype toolchainX86 struct { 127*333d2b36SAndroid Build Coastguard Worker toolchainBionic 128*333d2b36SAndroid Build Coastguard Worker toolchain32Bit 129*333d2b36SAndroid Build Coastguard Worker toolchainCflags string 130*333d2b36SAndroid Build Coastguard Worker} 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) Name() string { 133*333d2b36SAndroid Build Coastguard Worker return "x86" 134*333d2b36SAndroid Build Coastguard Worker} 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) IncludeFlags() string { 137*333d2b36SAndroid Build Coastguard Worker return "" 138*333d2b36SAndroid Build Coastguard Worker} 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) ClangTriple() string { 141*333d2b36SAndroid Build Coastguard Worker return "i686-linux-android" 142*333d2b36SAndroid Build Coastguard Worker} 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) ToolchainLdflags() string { 145*333d2b36SAndroid Build Coastguard Worker return "${config.X86ToolchainLdflags}" 146*333d2b36SAndroid Build Coastguard Worker} 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) ToolchainCflags() string { 149*333d2b36SAndroid Build Coastguard Worker return t.toolchainCflags 150*333d2b36SAndroid Build Coastguard Worker} 151*333d2b36SAndroid Build Coastguard Worker 152*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) Cflags() string { 153*333d2b36SAndroid Build Coastguard Worker return "${config.X86Cflags}" 154*333d2b36SAndroid Build Coastguard Worker} 155*333d2b36SAndroid Build Coastguard Worker 156*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) Cppflags() string { 157*333d2b36SAndroid Build Coastguard Worker return "${config.X86Cppflags}" 158*333d2b36SAndroid Build Coastguard Worker} 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) Ldflags() string { 161*333d2b36SAndroid Build Coastguard Worker return "${config.X86Ldflags}" 162*333d2b36SAndroid Build Coastguard Worker} 163*333d2b36SAndroid Build Coastguard Worker 164*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) Lldflags() string { 165*333d2b36SAndroid Build Coastguard Worker return "${config.X86Lldflags}" 166*333d2b36SAndroid Build Coastguard Worker} 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainX86) YasmFlags() string { 169*333d2b36SAndroid Build Coastguard Worker return "${config.X86YasmFlags}" 170*333d2b36SAndroid Build Coastguard Worker} 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Workerfunc (toolchainX86) LibclangRuntimeLibraryArch() string { 173*333d2b36SAndroid Build Coastguard Worker return "i686" 174*333d2b36SAndroid Build Coastguard Worker} 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Workerfunc x86ToolchainFactory(arch android.Arch) Toolchain { 177*333d2b36SAndroid Build Coastguard Worker // Error now rather than having a confusing Ninja error 178*333d2b36SAndroid Build Coastguard Worker if _, ok := x86ArchVariantCflags[arch.ArchVariant]; !ok { 179*333d2b36SAndroid Build Coastguard Worker panic(fmt.Sprintf("Unknown x86 architecture version: %q", arch.ArchVariant)) 180*333d2b36SAndroid Build Coastguard Worker } 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Worker toolchainCflags := []string{ 183*333d2b36SAndroid Build Coastguard Worker "${config.X86ToolchainCflags}", 184*333d2b36SAndroid Build Coastguard Worker "${config.X86" + arch.ArchVariant + "VariantCflags}", 185*333d2b36SAndroid Build Coastguard Worker } 186*333d2b36SAndroid Build Coastguard Worker 187*333d2b36SAndroid Build Coastguard Worker for _, feature := range arch.ArchFeatures { 188*333d2b36SAndroid Build Coastguard Worker toolchainCflags = append(toolchainCflags, x86ArchFeatureCflags[feature]...) 189*333d2b36SAndroid Build Coastguard Worker } 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Worker return &toolchainX86{ 192*333d2b36SAndroid Build Coastguard Worker toolchainCflags: strings.Join(toolchainCflags, " "), 193*333d2b36SAndroid Build Coastguard Worker } 194*333d2b36SAndroid Build Coastguard Worker} 195*333d2b36SAndroid Build Coastguard Worker 196*333d2b36SAndroid Build Coastguard Workerfunc init() { 197*333d2b36SAndroid Build Coastguard Worker registerToolchainFactory(android.Android, android.X86, x86ToolchainFactory) 198*333d2b36SAndroid Build Coastguard Worker} 199