blob: 71e98fe48048943b3042d92bf45fdfcdd8500616 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// 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
Colin Crossb98c8b02016-07-29 13:44:28 -070015package config
Colin Cross3f40fa42015-01-30 17:27:36 -080016
17import (
Tim Kilbourn1a9bf262015-03-18 12:28:32 -070018 "fmt"
19
Colin Cross635c3b02016-05-18 15:37:25 -070020 "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -080021)
22
Spandan Das65503582023-05-17 22:19:53 +000023func init() {
24 exportedVars.ExportStringListStaticVariable("DarwinAvailableLibraries", darwinAvailableLibraries)
25 exportedVars.ExportStringListStaticVariable("LinuxAvailableLibraries", linuxAvailableLibraries)
26 exportedVars.ExportStringListStaticVariable("WindowsAvailableLibraries", windowsAvailableLibraries)
27}
28
Colin Cross635c3b02016-05-18 15:37:25 -070029type toolchainFactory func(arch android.Arch) Toolchain
Colin Cross3f40fa42015-01-30 17:27:36 -080030
Colin Crossa1ad8d12016-06-01 17:09:44 -070031var toolchainFactories = make(map[android.OsType]map[android.ArchType]toolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -080032
Colin Crossa1ad8d12016-06-01 17:09:44 -070033func registerToolchainFactory(os android.OsType, arch android.ArchType, factory toolchainFactory) {
34 if toolchainFactories[os] == nil {
35 toolchainFactories[os] = make(map[android.ArchType]toolchainFactory)
36 }
37 toolchainFactories[os][arch] = factory
Colin Cross3f40fa42015-01-30 17:27:36 -080038}
39
Liz Kammer356f7d42021-01-26 09:18:53 -050040type toolchainContext interface {
41 Os() android.OsType
42 Arch() android.Arch
43}
44
Liz Kammer356f7d42021-01-26 09:18:53 -050045func FindToolchainWithContext(ctx toolchainContext) Toolchain {
46 t, err := findToolchain(ctx.Os(), ctx.Arch())
47 if err != nil {
Liz Kammer3bf97bd2022-04-26 09:38:20 -040048 panic(err)
Liz Kammer356f7d42021-01-26 09:18:53 -050049 }
50 return t
51}
52
Colin Crossb98c8b02016-07-29 13:44:28 -070053func FindToolchain(os android.OsType, arch android.Arch) Toolchain {
Liz Kammer356f7d42021-01-26 09:18:53 -050054 t, err := findToolchain(os, arch)
55 if err != nil {
56 panic(err)
57 }
58 return t
59}
60
61func findToolchain(os android.OsType, arch android.Arch) (Toolchain, error) {
Colin Crossb98c8b02016-07-29 13:44:28 -070062 factory := toolchainFactories[os][arch.ArchType]
63 if factory == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -050064 return nil, fmt.Errorf("Toolchain not found for %s arch %q", os.String(), arch.String())
Colin Crossb98c8b02016-07-29 13:44:28 -070065 }
Liz Kammer356f7d42021-01-26 09:18:53 -050066 return factory(arch), nil
Colin Crossb98c8b02016-07-29 13:44:28 -070067}
68
Colin Cross97ba0732015-03-23 17:50:24 -070069type Toolchain interface {
Dan Albertbe961682015-03-18 23:38:50 -070070 Name() string
71
Colin Cross3f40fa42015-01-30 17:27:36 -080072 IncludeFlags() string
73
74 ClangTriple() string
Colin Cross33bac242021-07-14 17:03:16 -070075 ToolchainCflags() string
76 ToolchainLdflags() string
77 Asflags() string
78 Cflags() string
79 Cppflags() string
80 Ldflags() string
81 Lldflags() string
82 InstructionSetFlags(string) (string, error)
Colin Cross3f40fa42015-01-30 17:27:36 -080083
Chih-Hung Hsieh1e7d1bf2018-03-15 18:44:57 -070084 ndkTriple() string
85
Colin Cross91e90042016-12-02 17:13:24 -080086 YasmFlags() string
87
Colin Cross3f40fa42015-01-30 17:27:36 -080088 Is64Bit() bool
Dan Willemsen490fd492015-11-24 17:53:15 -080089
90 ShlibSuffix() string
91 ExecutableSuffix() string
Dan Willemsen282a4b02016-03-09 10:30:22 -080092
Yi Kong924adc42018-08-31 14:27:44 -070093 LibclangRuntimeLibraryArch() string
Dan Willemsen20acc5c2016-05-25 14:47:21 -070094
95 AvailableLibraries() []string
Dan Willemsen2e47b342016-11-17 01:02:25 -080096
Colin Crossd1a28132021-06-21 17:34:47 -070097 CrtBeginStaticBinary() []string
98 CrtBeginSharedBinary() []string
99 CrtBeginSharedLibrary() []string
100 CrtEndStaticBinary() []string
101 CrtEndSharedBinary() []string
102 CrtEndSharedLibrary() []string
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -0800103 CrtPadSegmentSharedLibrary() []string
Colin Crossd1a28132021-06-21 17:34:47 -0700104
Colin Crossc8544682021-06-21 17:31:50 -0700105 // DefaultSharedLibraries returns the list of shared libraries that will be added to all
106 // targets unless they explicitly specify system_shared_libs.
107 DefaultSharedLibraries() []string
108
Dan Willemsen2e47b342016-11-17 01:02:25 -0800109 Bionic() bool
Colin Cross528d67e2021-07-23 22:23:07 +0000110 Glibc() bool
111 Musl() bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800112}
113
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700114type toolchainBase struct {
115}
116
Chih-Hung Hsieh1e7d1bf2018-03-15 18:44:57 -0700117func (t *toolchainBase) ndkTriple() string {
118 return ""
119}
120
121func NDKTriple(toolchain Toolchain) string {
122 triple := toolchain.ndkTriple()
123 if triple == "" {
124 // Use the clang triple if there is no explicit NDK triple
125 triple = toolchain.ClangTriple()
126 }
127 return triple
128}
129
Colin Cross33bac242021-07-14 17:03:16 -0700130func (toolchainBase) InstructionSetFlags(s string) (string, error) {
Dan Willemsen6d11dd82015-11-03 14:27:00 -0800131 if s != "" {
132 return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s)
133 }
134 return "", nil
135}
136
Colin Cross33bac242021-07-14 17:03:16 -0700137func (toolchainBase) ToolchainCflags() string {
Colin Crossc4bde762015-11-23 16:11:30 -0800138 return ""
139}
140
Colin Cross33bac242021-07-14 17:03:16 -0700141func (toolchainBase) ToolchainLdflags() string {
Dan Willemsene7174922016-03-30 17:33:52 -0700142 return ""
143}
144
Colin Cross33bac242021-07-14 17:03:16 -0700145func (toolchainBase) Asflags() string {
Dan Willemsen32968a22016-01-12 22:25:34 -0800146 return ""
147}
148
Colin Cross91e90042016-12-02 17:13:24 -0800149func (toolchainBase) YasmFlags() string {
150 return ""
151}
152
Yi Kong924adc42018-08-31 14:27:44 -0700153func (toolchainBase) LibclangRuntimeLibraryArch() string {
Colin Cross16b23492016-01-06 14:41:07 -0800154 return ""
155}
156
Colin Crossfc3b0642022-09-01 11:02:15 -0700157type toolchainNoCrt struct{}
Colin Crossc8544682021-06-21 17:31:50 -0700158
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -0800159func (toolchainNoCrt) CrtBeginStaticBinary() []string { return nil }
160func (toolchainNoCrt) CrtBeginSharedBinary() []string { return nil }
161func (toolchainNoCrt) CrtBeginSharedLibrary() []string { return nil }
162func (toolchainNoCrt) CrtEndStaticBinary() []string { return nil }
163func (toolchainNoCrt) CrtEndSharedBinary() []string { return nil }
164func (toolchainNoCrt) CrtEndSharedLibrary() []string { return nil }
165func (toolchainNoCrt) CrtPadSegmentSharedLibrary() []string { return nil }
Colin Crossd1a28132021-06-21 17:34:47 -0700166
Colin Crossc8544682021-06-21 17:31:50 -0700167func (toolchainBase) DefaultSharedLibraries() []string {
168 return nil
Dan Willemsen20acc5c2016-05-25 14:47:21 -0700169}
170
Dan Willemsen2e47b342016-11-17 01:02:25 -0800171func (toolchainBase) Bionic() bool {
Colin Crosse3fee342021-06-21 17:28:25 -0700172 return false
Dan Willemsen2e47b342016-11-17 01:02:25 -0800173}
174
Colin Cross528d67e2021-07-23 22:23:07 +0000175func (toolchainBase) Glibc() bool {
176 return false
177}
178
179func (toolchainBase) Musl() bool {
180 return false
181}
182
Colin Cross3f40fa42015-01-30 17:27:36 -0800183type toolchain64Bit struct {
184}
185
186func (toolchain64Bit) Is64Bit() bool {
187 return true
188}
189
190type toolchain32Bit struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800191}
192
193func (toolchain32Bit) Is64Bit() bool {
194 return false
195}
Colin Crossb98c8b02016-07-29 13:44:28 -0700196
Colin Crossb98c8b02016-07-29 13:44:28 -0700197func variantOrDefault(variants map[string]string, choice string) string {
198 if ret, ok := variants[choice]; ok {
199 return ret
200 }
201 return variants[""]
202}
203
204func addPrefix(list []string, prefix string) []string {
205 for i := range list {
206 list[i] = prefix + list[i]
207 }
208 return list
209}
210
Yi Kong924adc42018-08-31 14:27:44 -0700211func LibclangRuntimeLibrary(t Toolchain, library string) string {
Colin Cross4c4c1be2022-02-10 11:41:18 -0800212 return "libclang_rt." + library
Yi Kong924adc42018-08-31 14:27:44 -0700213}
214
215func BuiltinsRuntimeLibrary(t Toolchain) string {
216 return LibclangRuntimeLibrary(t, "builtins")
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700217}
218
219func AddressSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700220 return LibclangRuntimeLibrary(t, "asan")
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700221}
222
Colin Crossb781d232023-02-15 12:40:20 -0800223func AddressSanitizerStaticRuntimeLibrary(t Toolchain) string {
224 return LibclangRuntimeLibrary(t, "asan.static")
225}
226
227func AddressSanitizerCXXStaticRuntimeLibrary(t Toolchain) string {
228 return LibclangRuntimeLibrary(t, "asan_cxx.static")
229}
230
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700231func HWAddressSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700232 return LibclangRuntimeLibrary(t, "hwasan")
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700233}
234
235func HWAddressSanitizerStaticLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700236 return LibclangRuntimeLibrary(t, "hwasan_static")
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700237}
238
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700239func UndefinedBehaviorSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700240 return LibclangRuntimeLibrary(t, "ubsan_standalone")
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700241}
242
Ivan Lozano30c5db22018-02-21 15:49:20 -0800243func UndefinedBehaviorSanitizerMinimalRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700244 return LibclangRuntimeLibrary(t, "ubsan_minimal")
Ivan Lozano30c5db22018-02-21 15:49:20 -0800245}
246
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700247func ThreadSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700248 return LibclangRuntimeLibrary(t, "tsan")
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700249}
Dan Willemsen300151b2017-03-13 12:40:30 -0700250
Kostya Kortchinskyd18ae5c2018-06-12 14:46:54 -0700251func ScudoRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700252 return LibclangRuntimeLibrary(t, "scudo")
Kostya Kortchinskyd18ae5c2018-06-12 14:46:54 -0700253}
254
Kostya Kortchinskyad73b2e2018-10-11 08:38:39 -0700255func ScudoMinimalRuntimeLibrary(t Toolchain) string {
256 return LibclangRuntimeLibrary(t, "scudo_minimal")
257}
258
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700259func LibFuzzerRuntimeLibrary(t Toolchain) string {
260 return LibclangRuntimeLibrary(t, "fuzzer")
261}
262
Kris Alderd406da12022-10-21 09:34:21 -0700263func LibFuzzerRuntimeInterceptors(t Toolchain) string {
264 return LibclangRuntimeLibrary(t, "fuzzer_interceptors")
265}