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 cc 16 17 import ( 18 "strings" 19 20 "android/soong/common" 21 ) 22 23 var ( 24 mips64Cflags = []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 // Help catch common 32/64-bit errors. 45 "-Werror=pointer-to-int-cast", 46 "-Werror=int-to-pointer-cast", 47 "-Werror=implicit-function-declaration", 48 49 // TARGET_RELEASE_CFLAGS 50 "-DNDEBUG", 51 "-g", 52 "-Wstrict-aliasing=2", 53 "-fgcse-after-reload", 54 "-frerun-cse-after-loop", 55 "-frename-registers", 56 } 57 58 mips64Cppflags = []string{ 59 "-fvisibility-inlines-hidden", 60 } 61 62 mips64Ldflags = []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 mips64ArchVariantCflags = map[string][]string{ 74 "mips64r2": []string{ 75 "-mips64r2", 76 "-msynci", 77 }, 78 "mips64r6": []string{ 79 "-mips64r6", 80 "-msynci", 81 }, 82 } 83 ) 84 85 const ( 86 mips64GccVersion = "4.9" 87 ) 88 89 func init() { 90 common.RegisterArchFeatures(common.Mips64, "mips64r6", 91 "rev6") 92 93 pctx.StaticVariable("mips64GccVersion", mips64GccVersion) 94 95 pctx.SourcePathVariable("mips64GccRoot", 96 "prebuilts/gcc/${HostPrebuiltTag}/mips/mips64el-linux-android-${mips64GccVersion}") 97 98 pctx.StaticVariable("mips64GccTriple", "mips64el-linux-android") 99 100 pctx.StaticVariable("mips64Cflags", strings.Join(mips64Cflags, " ")) 101 pctx.StaticVariable("mips64Ldflags", strings.Join(mips64Ldflags, " ")) 102 pctx.StaticVariable("mips64Cppflags", strings.Join(mips64Cppflags, " ")) 103 pctx.StaticVariable("mips64IncludeFlags", strings.Join([]string{ 104 "-isystem ${LibcRoot}/arch-mips64/include", 105 "-isystem ${LibcRoot}/include", 106 "-isystem ${LibcRoot}/kernel/uapi", 107 "-isystem ${LibcRoot}/kernel/uapi/asm-mips", 108 "-isystem ${LibmRoot}/include", 109 "-isystem ${LibmRoot}/include/mips", 110 }, " ")) 111 112 // Clang cflags 113 pctx.StaticVariable("mips64ClangTriple", "mips64el-linux-android") 114 pctx.StaticVariable("mips64ClangCflags", strings.Join(clangFilterUnknownCflags(mips64Cflags), " ")) 115 pctx.StaticVariable("mips64ClangLdflags", strings.Join(clangFilterUnknownCflags(mips64Ldflags), " ")) 116 pctx.StaticVariable("mips64ClangCppflags", strings.Join(clangFilterUnknownCflags(mips64Cppflags), " ")) 117 118 // Extended cflags 119 120 // Architecture variant cflags 121 for variant, cflags := range mips64ArchVariantCflags { 122 pctx.StaticVariable("mips64"+variant+"VariantCflags", strings.Join(cflags, " ")) 123 pctx.StaticVariable("mips64"+variant+"VariantClangCflags", 124 strings.Join(clangFilterUnknownCflags(cflags), " ")) 125 } 126 } 127 128 type toolchainMips64 struct { 129 toolchain64Bit 130 cflags, clangCflags string 131 toolchainCflags, toolchainClangCflags string 132 } 133 134 func (t *toolchainMips64) Name() string { 135 return "mips64" 136 } 137 138 func (t *toolchainMips64) GccRoot() string { 139 return "${mips64GccRoot}" 140 } 141 142 func (t *toolchainMips64) GccTriple() string { 143 return "${mips64GccTriple}" 144 } 145 146 func (t *toolchainMips64) GccVersion() string { 147 return mips64GccVersion 148 } 149 150 func (t *toolchainMips64) ToolchainLdflags() string { 151 return "" 152 } 153 154 func (t *toolchainMips64) ToolchainCflags() string { 155 return t.toolchainCflags 156 } 157 158 func (t *toolchainMips64) Cflags() string { 159 return t.cflags 160 } 161 162 func (t *toolchainMips64) Cppflags() string { 163 return "${mips64Cppflags}" 164 } 165 166 func (t *toolchainMips64) Ldflags() string { 167 return "${mips64Ldflags}" 168 } 169 170 func (t *toolchainMips64) IncludeFlags() string { 171 return "${mips64IncludeFlags}" 172 } 173 174 func (t *toolchainMips64) ClangTriple() string { 175 return "${mips64ClangTriple}" 176 } 177 178 func (t *toolchainMips64) ToolchainClangCflags() string { 179 return t.toolchainClangCflags 180 } 181 182 func (t *toolchainMips64) ClangCflags() string { 183 return t.clangCflags 184 } 185 186 func (t *toolchainMips64) ClangCppflags() string { 187 return "${mips64ClangCppflags}" 188 } 189 190 func (t *toolchainMips64) ClangLdflags() string { 191 return "${mips64ClangLdflags}" 192 } 193 194 func mips64ToolchainFactory(arch common.Arch) Toolchain { 195 return &toolchainMips64{ 196 cflags: "${mips64Cflags}", 197 clangCflags: "${mips64ClangCflags}", 198 toolchainCflags: "${mips64" + arch.ArchVariant + "VariantCflags}", 199 toolchainClangCflags: "${mips64" + arch.ArchVariant + "VariantClangCflags}", 200 } 201 } 202 203 func init() { 204 registerDeviceToolchainFactory(common.Mips64, mips64ToolchainFactory) 205 } 206