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 15 package config 16 17 import ( 18 "fmt" 19 "strings" 20 21 "android/soong/android" 22 ) 23 24 var ( 25 arm64Cflags = []string{ 26 "-fno-exceptions", // from build/core/combo/select.mk 27 "-Wno-multichar", // from build/core/combo/select.mk 28 "-fno-strict-aliasing", 29 "-fstack-protector-strong", 30 "-ffunction-sections", 31 "-fdata-sections", 32 "-funwind-tables", 33 "-Wa,--noexecstack", 34 "-Werror=format-security", 35 "-D_FORTIFY_SOURCE=2", 36 "-fno-short-enums", 37 "-no-canonical-prefixes", 38 "-fno-canonical-system-headers", 39 40 // Help catch common 32/64-bit errors. 41 "-Werror=pointer-to-int-cast", 42 "-Werror=int-to-pointer-cast", 43 "-Werror=implicit-function-declaration", 44 45 "-fno-strict-volatile-bitfields", 46 47 // TARGET_RELEASE_CFLAGS 48 "-DNDEBUG", 49 "-O2 -g", 50 "-Wstrict-aliasing=2", 51 "-fgcse-after-reload", 52 "-frerun-cse-after-loop", 53 "-frename-registers", 54 } 55 56 arm64Ldflags = []string{ 57 "-Wl,-z,noexecstack", 58 "-Wl,-z,relro", 59 "-Wl,-z,now", 60 "-Wl,--build-id=md5", 61 "-Wl,--warn-shared-textrel", 62 "-Wl,--fatal-warnings", 63 "-Wl,-maarch64linux", 64 "-Wl,--hash-style=gnu", 65 "-Wl,--fix-cortex-a53-843419", 66 "-fuse-ld=gold", 67 "-Wl,--icf=safe", 68 "-Wl,--no-undefined-version", 69 } 70 71 arm64Cppflags = []string{ 72 "-fvisibility-inlines-hidden", 73 } 74 75 arm64CpuVariantCflags = map[string][]string{ 76 "cortex-a53": []string{ 77 "-mcpu=cortex-a53", 78 }, 79 } 80 81 arm64ClangCpuVariantCflags = copyVariantFlags(arm64CpuVariantCflags) 82 ) 83 84 const ( 85 arm64GccVersion = "4.9" 86 ) 87 88 func init() { 89 android.RegisterArchVariants(android.Arm64, 90 "armv8_a", 91 "cortex_a53", 92 "denver64") 93 94 pctx.StaticVariable("arm64GccVersion", arm64GccVersion) 95 96 pctx.SourcePathVariable("Arm64GccRoot", 97 "prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}") 98 99 pctx.StaticVariable("Arm64Cflags", strings.Join(arm64Cflags, " ")) 100 pctx.StaticVariable("Arm64Ldflags", strings.Join(arm64Ldflags, " ")) 101 pctx.StaticVariable("Arm64Cppflags", strings.Join(arm64Cppflags, " ")) 102 pctx.StaticVariable("Arm64IncludeFlags", bionicHeaders("arm64", "arm64")) 103 104 pctx.StaticVariable("Arm64ClangCflags", strings.Join(ClangFilterUnknownCflags(arm64Cflags), " ")) 105 pctx.StaticVariable("Arm64ClangLdflags", strings.Join(ClangFilterUnknownCflags(arm64Ldflags), " ")) 106 pctx.StaticVariable("Arm64ClangCppflags", strings.Join(ClangFilterUnknownCflags(arm64Cppflags), " ")) 107 108 pctx.StaticVariable("Arm64CortexA53Cflags", 109 strings.Join(arm64CpuVariantCflags["cortex-a53"], " ")) 110 pctx.StaticVariable("Arm64ClangCortexA53Cflags", 111 strings.Join(arm64ClangCpuVariantCflags["cortex-a53"], " ")) 112 } 113 114 var ( 115 arm64CpuVariantCflagsVar = map[string]string{ 116 "": "", 117 "cortex-a53": "${config.Arm64CortexA53Cflags}", 118 } 119 120 arm64ClangCpuVariantCflagsVar = map[string]string{ 121 "": "", 122 "cortex-a53": "${config.Arm64ClangCortexA53Cflags}", 123 } 124 ) 125 126 type toolchainArm64 struct { 127 toolchain64Bit 128 129 toolchainCflags string 130 toolchainClangCflags string 131 } 132 133 func (t *toolchainArm64) Name() string { 134 return "arm64" 135 } 136 137 func (t *toolchainArm64) GccRoot() string { 138 return "${config.Arm64GccRoot}" 139 } 140 141 func (t *toolchainArm64) GccTriple() string { 142 return "aarch64-linux-android" 143 } 144 145 func (t *toolchainArm64) GccVersion() string { 146 return arm64GccVersion 147 } 148 149 func (t *toolchainArm64) ToolchainCflags() string { 150 return t.toolchainCflags 151 } 152 153 func (t *toolchainArm64) Cflags() string { 154 return "${config.Arm64Cflags}" 155 } 156 157 func (t *toolchainArm64) Cppflags() string { 158 return "${config.Arm64Cppflags}" 159 } 160 161 func (t *toolchainArm64) Ldflags() string { 162 return "${config.Arm64Ldflags}" 163 } 164 165 func (t *toolchainArm64) IncludeFlags() string { 166 return "${config.Arm64IncludeFlags}" 167 } 168 169 func (t *toolchainArm64) ClangTriple() string { 170 return t.GccTriple() 171 } 172 173 func (t *toolchainArm64) ClangCflags() string { 174 return "${config.Arm64ClangCflags}" 175 } 176 177 func (t *toolchainArm64) ClangCppflags() string { 178 return "${config.Arm64ClangCppflags}" 179 } 180 181 func (t *toolchainArm64) ClangLdflags() string { 182 return "${config.Arm64Ldflags}" 183 } 184 185 func (t *toolchainArm64) ToolchainClangCflags() string { 186 return t.toolchainClangCflags 187 } 188 189 func (toolchainArm64) SanitizerRuntimeLibraryArch() string { 190 return "aarch64" 191 } 192 193 func arm64ToolchainFactory(arch android.Arch) Toolchain { 194 if arch.ArchVariant != "armv8-a" { 195 panic(fmt.Sprintf("Unknown ARM architecture version: %q", arch.ArchVariant)) 196 } 197 198 return &toolchainArm64{ 199 toolchainCflags: variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant), 200 toolchainClangCflags: variantOrDefault(arm64ClangCpuVariantCflagsVar, arch.CpuVariant), 201 } 202 } 203 204 func init() { 205 registerToolchainFactory(android.Android, android.Arm64, arm64ToolchainFactory) 206 } 207