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 20 "android/soong/android" 21) 22 23type toolchainFactory func(arch android.Arch) Toolchain 24 25var toolchainFactories = make(map[android.OsType]map[android.ArchType]toolchainFactory) 26 27func registerToolchainFactory(os android.OsType, arch android.ArchType, factory toolchainFactory) { 28 if toolchainFactories[os] == nil { 29 toolchainFactories[os] = make(map[android.ArchType]toolchainFactory) 30 } 31 toolchainFactories[os][arch] = factory 32} 33 34type toolchainContext interface { 35 Os() android.OsType 36 Arch() android.Arch 37} 38 39func FindToolchainWithContext(ctx toolchainContext) Toolchain { 40 t, err := findToolchain(ctx.Os(), ctx.Arch()) 41 if err != nil { 42 panic(err) 43 } 44 return t 45} 46 47func FindToolchain(os android.OsType, arch android.Arch) Toolchain { 48 t, err := findToolchain(os, arch) 49 if err != nil { 50 panic(err) 51 } 52 return t 53} 54 55func findToolchain(os android.OsType, arch android.Arch) (Toolchain, error) { 56 factory := toolchainFactories[os][arch.ArchType] 57 if factory == nil { 58 return nil, fmt.Errorf("Toolchain not found for %s arch %q", os.String(), arch.String()) 59 } 60 return factory(arch), nil 61} 62 63type Toolchain interface { 64 Name() string 65 66 IncludeFlags() string 67 68 ClangTriple() string 69 ToolchainCflags() string 70 ToolchainLdflags() string 71 Asflags() string 72 Cflags() string 73 Cppflags() string 74 Ldflags() string 75 Lldflags() string 76 InstructionSetFlags(string) (string, error) 77 78 ndkTriple() string 79 80 YasmFlags() string 81 82 Is64Bit() bool 83 84 ShlibSuffix() string 85 ExecutableSuffix() string 86 87 LibclangRuntimeLibraryArch() string 88 89 AvailableLibraries() []string 90 91 CrtBeginStaticBinary() []string 92 CrtBeginSharedBinary() []string 93 CrtBeginSharedLibrary() []string 94 CrtEndStaticBinary() []string 95 CrtEndSharedBinary() []string 96 CrtEndSharedLibrary() []string 97 98 // DefaultSharedLibraries returns the list of shared libraries that will be added to all 99 // targets unless they explicitly specify system_shared_libs. 100 DefaultSharedLibraries() []string 101 102 Bionic() bool 103 Glibc() bool 104 Musl() bool 105} 106 107type toolchainBase struct { 108} 109 110func (t *toolchainBase) ndkTriple() string { 111 return "" 112} 113 114func NDKTriple(toolchain Toolchain) string { 115 triple := toolchain.ndkTriple() 116 if triple == "" { 117 // Use the clang triple if there is no explicit NDK triple 118 triple = toolchain.ClangTriple() 119 } 120 return triple 121} 122 123func (toolchainBase) InstructionSetFlags(s string) (string, error) { 124 if s != "" { 125 return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s) 126 } 127 return "", nil 128} 129 130func (toolchainBase) ToolchainCflags() string { 131 return "" 132} 133 134func (toolchainBase) ToolchainLdflags() string { 135 return "" 136} 137 138func (toolchainBase) Asflags() string { 139 return "" 140} 141 142func (toolchainBase) YasmFlags() string { 143 return "" 144} 145 146func (toolchainBase) LibclangRuntimeLibraryArch() string { 147 return "" 148} 149 150type toolchainNoCrt struct{} 151 152func (toolchainNoCrt) CrtBeginStaticBinary() []string { return nil } 153func (toolchainNoCrt) CrtBeginSharedBinary() []string { return nil } 154func (toolchainNoCrt) CrtBeginSharedLibrary() []string { return nil } 155func (toolchainNoCrt) CrtEndStaticBinary() []string { return nil } 156func (toolchainNoCrt) CrtEndSharedBinary() []string { return nil } 157func (toolchainNoCrt) CrtEndSharedLibrary() []string { return nil } 158 159func (toolchainBase) DefaultSharedLibraries() []string { 160 return nil 161} 162 163func (toolchainBase) Bionic() bool { 164 return false 165} 166 167func (toolchainBase) Glibc() bool { 168 return false 169} 170 171func (toolchainBase) Musl() bool { 172 return false 173} 174 175type toolchain64Bit struct { 176} 177 178func (toolchain64Bit) Is64Bit() bool { 179 return true 180} 181 182type toolchain32Bit struct { 183} 184 185func (toolchain32Bit) Is64Bit() bool { 186 return false 187} 188 189func variantOrDefault(variants map[string]string, choice string) string { 190 if ret, ok := variants[choice]; ok { 191 return ret 192 } 193 return variants[""] 194} 195 196func addPrefix(list []string, prefix string) []string { 197 for i := range list { 198 list[i] = prefix + list[i] 199 } 200 return list 201} 202 203func LibclangRuntimeLibrary(t Toolchain, library string) string { 204 return "libclang_rt." + library 205} 206 207func BuiltinsRuntimeLibrary(t Toolchain) string { 208 return LibclangRuntimeLibrary(t, "builtins") 209} 210 211func AddressSanitizerRuntimeLibrary(t Toolchain) string { 212 return LibclangRuntimeLibrary(t, "asan") 213} 214 215func AddressSanitizerStaticRuntimeLibrary(t Toolchain) string { 216 return LibclangRuntimeLibrary(t, "asan.static") 217} 218 219func AddressSanitizerCXXStaticRuntimeLibrary(t Toolchain) string { 220 return LibclangRuntimeLibrary(t, "asan_cxx.static") 221} 222 223func HWAddressSanitizerRuntimeLibrary(t Toolchain) string { 224 return LibclangRuntimeLibrary(t, "hwasan") 225} 226 227func HWAddressSanitizerStaticLibrary(t Toolchain) string { 228 return LibclangRuntimeLibrary(t, "hwasan_static") 229} 230 231func UndefinedBehaviorSanitizerRuntimeLibrary(t Toolchain) string { 232 return LibclangRuntimeLibrary(t, "ubsan_standalone") 233} 234 235func UndefinedBehaviorSanitizerMinimalRuntimeLibrary(t Toolchain) string { 236 return LibclangRuntimeLibrary(t, "ubsan_minimal") 237} 238 239func ThreadSanitizerRuntimeLibrary(t Toolchain) string { 240 return LibclangRuntimeLibrary(t, "tsan") 241} 242 243func ScudoRuntimeLibrary(t Toolchain) string { 244 return LibclangRuntimeLibrary(t, "scudo") 245} 246 247func ScudoMinimalRuntimeLibrary(t Toolchain) string { 248 return LibclangRuntimeLibrary(t, "scudo_minimal") 249} 250 251func LibFuzzerRuntimeLibrary(t Toolchain) string { 252 return LibclangRuntimeLibrary(t, "fuzzer") 253} 254 255func LibFuzzerRuntimeInterceptors(t Toolchain) string { 256 return LibclangRuntimeLibrary(t, "fuzzer_interceptors") 257} 258 259var inList = android.InList 260