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