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 "strings" 19 20 "android/soong/android" 21) 22 23var ( 24 mipsCflags = []string{ 25 "-fno-exceptions", // from build/core/combo/select.mk 26 "-Wno-multichar", // from build/core/combo/select.mk 27 "-O2", 28 "-fomit-frame-pointer", 29 "-fno-strict-aliasing", 30 "-funswitch-loops", 31 "-U__unix", 32 "-U__unix__", 33 "-Umips", 34 "-ffunction-sections", 35 "-fdata-sections", 36 "-funwind-tables", 37 "-fstack-protector-strong", 38 "-Wa,--noexecstack", 39 "-Werror=format-security", 40 "-D_FORTIFY_SOURCE=2", 41 "-no-canonical-prefixes", 42 "-fno-canonical-system-headers", 43 44 // TARGET_RELEASE_CFLAGS 45 "-DNDEBUG", 46 "-g", 47 "-Wstrict-aliasing=2", 48 "-fgcse-after-reload", 49 "-frerun-cse-after-loop", 50 "-frename-registers", 51 } 52 53 mipsClangCflags = append(mipsCflags, []string{ 54 "-fPIC", 55 "-fno-integrated-as", 56 }...) 57 58 mipsCppflags = []string{ 59 "-fvisibility-inlines-hidden", 60 } 61 62 mipsLdflags = []string{ 63 "-Wl,-z,noexecstack", 64 "-Wl,-z,relro", 65 "-Wl,-z,now", 66 "-Wl,--build-id=md5", 67 "-Wl,--warn-shared-textrel", 68 "-Wl,--fatal-warnings", 69 "-Wl,--allow-shlib-undefined", 70 "-Wl,--no-undefined-version", 71 } 72 73 mipsToolchainLdflags = []string{ 74 "-Wl,-melf32ltsmip", 75 } 76 77 mipsArchVariantCflags = map[string][]string{ 78 "mips32-fp": []string{ 79 "-mips32", 80 "-mfp32", 81 "-modd-spreg", 82 "-mno-synci", 83 }, 84 "mips32r2-fp": []string{ 85 "-mips32r2", 86 "-mfp32", 87 "-modd-spreg", 88 "-msynci", 89 }, 90 "mips32r2-fp-xburst": []string{ 91 "-mips32r2", 92 "-mfp32", 93 "-modd-spreg", 94 "-mno-fused-madd", 95 "-Wa,-mmxu", 96 "-mno-synci", 97 }, 98 "mips32r2dsp-fp": []string{ 99 "-mips32r2", 100 "-mfp32", 101 "-modd-spreg", 102 "-mdsp", 103 "-msynci", 104 }, 105 "mips32r2dspr2-fp": []string{ 106 "-mips32r2", 107 "-mfp32", 108 "-modd-spreg", 109 "-mdspr2", 110 "-msynci", 111 }, 112 "mips32r6": []string{ 113 "-mips32r6", 114 "-mfp64", 115 "-mno-odd-spreg", 116 "-msynci", 117 118 // revert once clang picks up r278824 119 "-mcompact-branches=never", 120 }, 121 } 122) 123 124const ( 125 mipsGccVersion = "4.9" 126) 127 128func init() { 129 android.RegisterArchVariants(android.Mips, 130 "mips32_fp", 131 "mips32r2_fp", 132 "mips32r2_fp_xburst", 133 "mips32r2dsp_fp", 134 "mips32r2dspr2_fp", 135 "mips32r6") 136 android.RegisterArchFeatures(android.Mips, "rev6") 137 android.RegisterArchVariantFeatures(android.Mips, "mips32r6", 138 "rev6") 139 140 pctx.StaticVariable("mipsGccVersion", mipsGccVersion) 141 142 pctx.SourcePathVariable("MipsGccRoot", 143 "prebuilts/gcc/${HostPrebuiltTag}/mips/mips64el-linux-android-${mipsGccVersion}") 144 145 pctx.StaticVariable("MipsToolchainLdflags", strings.Join(mipsToolchainLdflags, " ")) 146 pctx.StaticVariable("MipsCflags", strings.Join(mipsCflags, " ")) 147 pctx.StaticVariable("MipsLdflags", strings.Join(mipsLdflags, " ")) 148 pctx.StaticVariable("MipsCppflags", strings.Join(mipsCppflags, " ")) 149 pctx.StaticVariable("MipsIncludeFlags", bionicHeaders("mips", "mips")) 150 151 // Clang cflags 152 pctx.StaticVariable("MipsClangCflags", strings.Join(ClangFilterUnknownCflags(mipsClangCflags), " ")) 153 pctx.StaticVariable("MipsClangLdflags", strings.Join(ClangFilterUnknownCflags(mipsLdflags), " ")) 154 pctx.StaticVariable("MipsClangCppflags", strings.Join(ClangFilterUnknownCflags(mipsCppflags), " ")) 155 156 // Extended cflags 157 158 // Architecture variant cflags 159 for variant, cflags := range mipsArchVariantCflags { 160 pctx.StaticVariable("Mips"+variant+"VariantCflags", strings.Join(cflags, " ")) 161 pctx.StaticVariable("Mips"+variant+"VariantClangCflags", 162 strings.Join(ClangFilterUnknownCflags(cflags), " ")) 163 } 164} 165 166type toolchainMips struct { 167 toolchain32Bit 168 cflags, clangCflags string 169 toolchainCflags, toolchainClangCflags string 170} 171 172func (t *toolchainMips) Name() string { 173 return "mips" 174} 175 176func (t *toolchainMips) GccRoot() string { 177 return "${config.MipsGccRoot}" 178} 179 180func (t *toolchainMips) GccTriple() string { 181 return "mips64el-linux-android" 182} 183 184func (t *toolchainMips) GccVersion() string { 185 return mipsGccVersion 186} 187 188func (t *toolchainMips) ToolchainLdflags() string { 189 return "${config.MipsToolchainLdflags}" 190} 191 192func (t *toolchainMips) ToolchainCflags() string { 193 return t.toolchainCflags 194} 195 196func (t *toolchainMips) Cflags() string { 197 return t.cflags 198} 199 200func (t *toolchainMips) Cppflags() string { 201 return "${config.MipsCppflags}" 202} 203 204func (t *toolchainMips) Ldflags() string { 205 return "${config.MipsLdflags}" 206} 207 208func (t *toolchainMips) IncludeFlags() string { 209 return "${config.MipsIncludeFlags}" 210} 211 212func (t *toolchainMips) ClangTriple() string { 213 return "mipsel-linux-android" 214} 215 216func (t *toolchainMips) ToolchainClangLdflags() string { 217 return "${config.MipsToolchainLdflags}" 218} 219 220func (t *toolchainMips) ToolchainClangCflags() string { 221 return t.toolchainClangCflags 222} 223 224func (t *toolchainMips) ClangAsflags() string { 225 return "-fPIC -fno-integrated-as" 226} 227 228func (t *toolchainMips) ClangCflags() string { 229 return t.clangCflags 230} 231 232func (t *toolchainMips) ClangCppflags() string { 233 return "${config.MipsClangCppflags}" 234} 235 236func (t *toolchainMips) ClangLdflags() string { 237 return "${config.MipsClangLdflags}" 238} 239 240func (toolchainMips) SanitizerRuntimeLibraryArch() string { 241 return "mips" 242} 243 244func mipsToolchainFactory(arch android.Arch) Toolchain { 245 return &toolchainMips{ 246 cflags: "${config.MipsCflags}", 247 clangCflags: "${config.MipsClangCflags}", 248 toolchainCflags: "${config.Mips" + arch.ArchVariant + "VariantCflags}", 249 toolchainClangCflags: "${config.Mips" + arch.ArchVariant + "VariantClangCflags}", 250 } 251} 252 253func init() { 254 registerToolchainFactory(android.Android, android.Mips, mipsToolchainFactory) 255} 256