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