blob: 052832d7669147fc686cb51e49ce4468cc42af22 [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
Colin Cross635c3b02016-05-18 15:37:25 -070023type toolchainFactory func(arch android.Arch) Toolchain
Colin Cross3f40fa42015-01-30 17:27:36 -080024
Colin Crossa1ad8d12016-06-01 17:09:44 -070025var toolchainFactories = make(map[android.OsType]map[android.ArchType]toolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -080026
Colin Crossa1ad8d12016-06-01 17:09:44 -070027func 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
Colin Cross3f40fa42015-01-30 17:27:36 -080032}
33
Liz Kammer356f7d42021-01-26 09:18:53 -050034type toolchainContext interface {
35 Os() android.OsType
36 Arch() android.Arch
37}
38
Liz Kammer356f7d42021-01-26 09:18:53 -050039func FindToolchainWithContext(ctx toolchainContext) Toolchain {
40 t, err := findToolchain(ctx.Os(), ctx.Arch())
41 if err != nil {
Liz Kammer3bf97bd2022-04-26 09:38:20 -040042 panic(err)
Liz Kammer356f7d42021-01-26 09:18:53 -050043 }
44 return t
45}
46
Colin Crossb98c8b02016-07-29 13:44:28 -070047func FindToolchain(os android.OsType, arch android.Arch) Toolchain {
Liz Kammer356f7d42021-01-26 09:18:53 -050048 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) {
Colin Crossb98c8b02016-07-29 13:44:28 -070056 factory := toolchainFactories[os][arch.ArchType]
57 if factory == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -050058 return nil, fmt.Errorf("Toolchain not found for %s arch %q", os.String(), arch.String())
Colin Crossb98c8b02016-07-29 13:44:28 -070059 }
Liz Kammer356f7d42021-01-26 09:18:53 -050060 return factory(arch), nil
Colin Crossb98c8b02016-07-29 13:44:28 -070061}
62
Colin Cross97ba0732015-03-23 17:50:24 -070063type Toolchain interface {
Dan Albertbe961682015-03-18 23:38:50 -070064 Name() string
65
Colin Cross3f40fa42015-01-30 17:27:36 -080066 IncludeFlags() string
67
68 ClangTriple() string
Colin Cross33bac242021-07-14 17:03:16 -070069 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)
Colin Cross3f40fa42015-01-30 17:27:36 -080077
Chih-Hung Hsieh1e7d1bf2018-03-15 18:44:57 -070078 ndkTriple() string
79
Colin Cross91e90042016-12-02 17:13:24 -080080 YasmFlags() string
81
Colin Cross3f40fa42015-01-30 17:27:36 -080082 Is64Bit() bool
Dan Willemsen490fd492015-11-24 17:53:15 -080083
84 ShlibSuffix() string
85 ExecutableSuffix() string
Dan Willemsen282a4b02016-03-09 10:30:22 -080086
Yi Kong924adc42018-08-31 14:27:44 -070087 LibclangRuntimeLibraryArch() string
Dan Willemsen20acc5c2016-05-25 14:47:21 -070088
89 AvailableLibraries() []string
Dan Willemsen2e47b342016-11-17 01:02:25 -080090
Colin Crossd1a28132021-06-21 17:34:47 -070091 CrtBeginStaticBinary() []string
92 CrtBeginSharedBinary() []string
93 CrtBeginSharedLibrary() []string
94 CrtEndStaticBinary() []string
95 CrtEndSharedBinary() []string
96 CrtEndSharedLibrary() []string
97
Colin Crossc8544682021-06-21 17:31:50 -070098 // 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
Dan Willemsen2e47b342016-11-17 01:02:25 -0800102 Bionic() bool
Colin Cross528d67e2021-07-23 22:23:07 +0000103 Glibc() bool
104 Musl() bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800105}
106
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700107type toolchainBase struct {
108}
109
Chih-Hung Hsieh1e7d1bf2018-03-15 18:44:57 -0700110func (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
Colin Cross33bac242021-07-14 17:03:16 -0700123func (toolchainBase) InstructionSetFlags(s string) (string, error) {
Dan Willemsen6d11dd82015-11-03 14:27:00 -0800124 if s != "" {
125 return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s)
126 }
127 return "", nil
128}
129
Colin Cross33bac242021-07-14 17:03:16 -0700130func (toolchainBase) ToolchainCflags() string {
Colin Crossc4bde762015-11-23 16:11:30 -0800131 return ""
132}
133
Colin Cross33bac242021-07-14 17:03:16 -0700134func (toolchainBase) ToolchainLdflags() string {
Dan Willemsene7174922016-03-30 17:33:52 -0700135 return ""
136}
137
Colin Cross33bac242021-07-14 17:03:16 -0700138func (toolchainBase) Asflags() string {
Dan Willemsen32968a22016-01-12 22:25:34 -0800139 return ""
140}
141
Colin Cross91e90042016-12-02 17:13:24 -0800142func (toolchainBase) YasmFlags() string {
143 return ""
144}
145
Yi Kong924adc42018-08-31 14:27:44 -0700146func (toolchainBase) LibclangRuntimeLibraryArch() string {
Colin Cross16b23492016-01-06 14:41:07 -0800147 return ""
148}
149
Colin Crossfc3b0642022-09-01 11:02:15 -0700150type toolchainNoCrt struct{}
Colin Crossc8544682021-06-21 17:31:50 -0700151
Colin Crossfc3b0642022-09-01 11:02:15 -0700152func (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 }
Colin Crossd1a28132021-06-21 17:34:47 -0700158
Colin Crossc8544682021-06-21 17:31:50 -0700159func (toolchainBase) DefaultSharedLibraries() []string {
160 return nil
Dan Willemsen20acc5c2016-05-25 14:47:21 -0700161}
162
Dan Willemsen2e47b342016-11-17 01:02:25 -0800163func (toolchainBase) Bionic() bool {
Colin Crosse3fee342021-06-21 17:28:25 -0700164 return false
Dan Willemsen2e47b342016-11-17 01:02:25 -0800165}
166
Colin Cross528d67e2021-07-23 22:23:07 +0000167func (toolchainBase) Glibc() bool {
168 return false
169}
170
171func (toolchainBase) Musl() bool {
172 return false
173}
174
Colin Cross3f40fa42015-01-30 17:27:36 -0800175type toolchain64Bit struct {
176}
177
178func (toolchain64Bit) Is64Bit() bool {
179 return true
180}
181
182type toolchain32Bit struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800183}
184
185func (toolchain32Bit) Is64Bit() bool {
186 return false
187}
Colin Crossb98c8b02016-07-29 13:44:28 -0700188
Colin Crossb98c8b02016-07-29 13:44:28 -0700189func 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
Yi Kong924adc42018-08-31 14:27:44 -0700203func LibclangRuntimeLibrary(t Toolchain, library string) string {
Colin Cross4c4c1be2022-02-10 11:41:18 -0800204 return "libclang_rt." + library
Yi Kong924adc42018-08-31 14:27:44 -0700205}
206
207func BuiltinsRuntimeLibrary(t Toolchain) string {
208 return LibclangRuntimeLibrary(t, "builtins")
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700209}
210
211func AddressSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700212 return LibclangRuntimeLibrary(t, "asan")
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700213}
214
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700215func HWAddressSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700216 return LibclangRuntimeLibrary(t, "hwasan")
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700217}
218
219func HWAddressSanitizerStaticLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700220 return LibclangRuntimeLibrary(t, "hwasan_static")
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700221}
222
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700223func UndefinedBehaviorSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700224 return LibclangRuntimeLibrary(t, "ubsan_standalone")
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700225}
226
Ivan Lozano30c5db22018-02-21 15:49:20 -0800227func UndefinedBehaviorSanitizerMinimalRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700228 return LibclangRuntimeLibrary(t, "ubsan_minimal")
Ivan Lozano30c5db22018-02-21 15:49:20 -0800229}
230
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700231func ThreadSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700232 return LibclangRuntimeLibrary(t, "tsan")
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700233}
Dan Willemsen300151b2017-03-13 12:40:30 -0700234
Kostya Kortchinskyd18ae5c2018-06-12 14:46:54 -0700235func ScudoRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700236 return LibclangRuntimeLibrary(t, "scudo")
Kostya Kortchinskyd18ae5c2018-06-12 14:46:54 -0700237}
238
Kostya Kortchinskyad73b2e2018-10-11 08:38:39 -0700239func ScudoMinimalRuntimeLibrary(t Toolchain) string {
240 return LibclangRuntimeLibrary(t, "scudo_minimal")
241}
242
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700243func LibFuzzerRuntimeLibrary(t Toolchain) string {
244 return LibclangRuntimeLibrary(t, "fuzzer")
245}
246
Kris Alderd406da12022-10-21 09:34:21 -0700247func LibFuzzerRuntimeInterceptors(t Toolchain) string {
248 return LibclangRuntimeLibrary(t, "fuzzer_interceptors")
249}
250
Colin Cross0d0ba592018-02-20 13:33:42 -0800251var inList = android.InList