• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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