blob: 7175fdc1a441ec101a7ea6e9067f958a6f3d3dc4 [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
39type conversionContext interface {
40 BazelConversionMode() bool
41}
42
43func FindToolchainWithContext(ctx toolchainContext) Toolchain {
44 t, err := findToolchain(ctx.Os(), ctx.Arch())
45 if err != nil {
46 if c, ok := ctx.(conversionContext); ok && c.BazelConversionMode() {
47 // TODO(b/179123288): determine conversion for toolchain
48 return &toolchainX86_64{}
49 } else {
50 panic(err)
51 }
52 }
53 return t
54}
55
Colin Crossb98c8b02016-07-29 13:44:28 -070056func FindToolchain(os android.OsType, arch android.Arch) Toolchain {
Liz Kammer356f7d42021-01-26 09:18:53 -050057 t, err := findToolchain(os, arch)
58 if err != nil {
59 panic(err)
60 }
61 return t
62}
63
64func findToolchain(os android.OsType, arch android.Arch) (Toolchain, error) {
Colin Crossb98c8b02016-07-29 13:44:28 -070065 factory := toolchainFactories[os][arch.ArchType]
66 if factory == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -050067 return nil, fmt.Errorf("Toolchain not found for %s arch %q", os.String(), arch.String())
Colin Crossb98c8b02016-07-29 13:44:28 -070068 }
Liz Kammer356f7d42021-01-26 09:18:53 -050069 return factory(arch), nil
Colin Crossb98c8b02016-07-29 13:44:28 -070070}
71
Colin Cross97ba0732015-03-23 17:50:24 -070072type Toolchain interface {
Dan Albertbe961682015-03-18 23:38:50 -070073 Name() string
74
Colin Cross3f40fa42015-01-30 17:27:36 -080075 GccRoot() string
76 GccTriple() string
Dan Willemsen34fc3b12015-12-07 12:30:44 -080077 // GccVersion should return a real value, not a ninja reference
Dan Albertbe961682015-03-18 23:38:50 -070078 GccVersion() string
Dan Willemsen34fc3b12015-12-07 12:30:44 -080079
Colin Cross3f40fa42015-01-30 17:27:36 -080080 IncludeFlags() string
81
82 ClangTriple() string
Colin Cross33bac242021-07-14 17:03:16 -070083 ToolchainCflags() string
84 ToolchainLdflags() string
85 Asflags() string
86 Cflags() string
87 Cppflags() string
88 Ldflags() string
89 Lldflags() string
90 InstructionSetFlags(string) (string, error)
Colin Cross3f40fa42015-01-30 17:27:36 -080091
Chih-Hung Hsieh1e7d1bf2018-03-15 18:44:57 -070092 ndkTriple() string
93
Colin Cross91e90042016-12-02 17:13:24 -080094 YasmFlags() string
95
Colin Cross3f40fa42015-01-30 17:27:36 -080096 Is64Bit() bool
Dan Willemsen490fd492015-11-24 17:53:15 -080097
98 ShlibSuffix() string
99 ExecutableSuffix() string
Dan Willemsen282a4b02016-03-09 10:30:22 -0800100
Yi Kong924adc42018-08-31 14:27:44 -0700101 LibclangRuntimeLibraryArch() string
Dan Willemsen20acc5c2016-05-25 14:47:21 -0700102
103 AvailableLibraries() []string
Dan Willemsen2e47b342016-11-17 01:02:25 -0800104
Colin Crossd1a28132021-06-21 17:34:47 -0700105 CrtBeginStaticBinary() []string
106 CrtBeginSharedBinary() []string
107 CrtBeginSharedLibrary() []string
108 CrtEndStaticBinary() []string
109 CrtEndSharedBinary() []string
110 CrtEndSharedLibrary() []string
111
Colin Crossc8544682021-06-21 17:31:50 -0700112 // DefaultSharedLibraries returns the list of shared libraries that will be added to all
113 // targets unless they explicitly specify system_shared_libs.
114 DefaultSharedLibraries() []string
115
Dan Willemsen2e47b342016-11-17 01:02:25 -0800116 Bionic() bool
Colin Cross528d67e2021-07-23 22:23:07 +0000117 Glibc() bool
118 Musl() bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800119}
120
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700121type toolchainBase struct {
122}
123
Chih-Hung Hsieh1e7d1bf2018-03-15 18:44:57 -0700124func (t *toolchainBase) ndkTriple() string {
125 return ""
126}
127
128func NDKTriple(toolchain Toolchain) string {
129 triple := toolchain.ndkTriple()
130 if triple == "" {
131 // Use the clang triple if there is no explicit NDK triple
132 triple = toolchain.ClangTriple()
133 }
134 return triple
135}
136
Colin Cross33bac242021-07-14 17:03:16 -0700137func (toolchainBase) InstructionSetFlags(s string) (string, error) {
Dan Willemsen6d11dd82015-11-03 14:27:00 -0800138 if s != "" {
139 return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s)
140 }
141 return "", nil
142}
143
Colin Cross33bac242021-07-14 17:03:16 -0700144func (toolchainBase) ToolchainCflags() string {
Colin Crossc4bde762015-11-23 16:11:30 -0800145 return ""
146}
147
Colin Cross33bac242021-07-14 17:03:16 -0700148func (toolchainBase) ToolchainLdflags() string {
Dan Willemsene7174922016-03-30 17:33:52 -0700149 return ""
150}
151
Dan Willemsen490fd492015-11-24 17:53:15 -0800152func (toolchainBase) ShlibSuffix() string {
153 return ".so"
154}
155
156func (toolchainBase) ExecutableSuffix() string {
157 return ""
158}
159
Colin Cross33bac242021-07-14 17:03:16 -0700160func (toolchainBase) Asflags() string {
Dan Willemsen32968a22016-01-12 22:25:34 -0800161 return ""
162}
163
Colin Cross91e90042016-12-02 17:13:24 -0800164func (toolchainBase) YasmFlags() string {
165 return ""
166}
167
Yi Kong924adc42018-08-31 14:27:44 -0700168func (toolchainBase) LibclangRuntimeLibraryArch() string {
Colin Cross16b23492016-01-06 14:41:07 -0800169 return ""
170}
171
Dan Willemsen20acc5c2016-05-25 14:47:21 -0700172func (toolchainBase) AvailableLibraries() []string {
Colin Crossc8544682021-06-21 17:31:50 -0700173 return nil
174}
175
Colin Crossd1a28132021-06-21 17:34:47 -0700176func (toolchainBase) CrtBeginStaticBinary() []string { return nil }
177func (toolchainBase) CrtBeginSharedBinary() []string { return nil }
178func (toolchainBase) CrtBeginSharedLibrary() []string { return nil }
179func (toolchainBase) CrtEndStaticBinary() []string { return nil }
180func (toolchainBase) CrtEndSharedBinary() []string { return nil }
181func (toolchainBase) CrtEndSharedLibrary() []string { return nil }
182
Colin Crossc8544682021-06-21 17:31:50 -0700183func (toolchainBase) DefaultSharedLibraries() []string {
184 return nil
Dan Willemsen20acc5c2016-05-25 14:47:21 -0700185}
186
Dan Willemsen2e47b342016-11-17 01:02:25 -0800187func (toolchainBase) Bionic() bool {
Colin Crosse3fee342021-06-21 17:28:25 -0700188 return false
Dan Willemsen2e47b342016-11-17 01:02:25 -0800189}
190
Colin Cross528d67e2021-07-23 22:23:07 +0000191func (toolchainBase) Glibc() bool {
192 return false
193}
194
195func (toolchainBase) Musl() bool {
196 return false
197}
198
Colin Cross3f40fa42015-01-30 17:27:36 -0800199type toolchain64Bit struct {
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700200 toolchainBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800201}
202
203func (toolchain64Bit) Is64Bit() bool {
204 return true
205}
206
207type toolchain32Bit struct {
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700208 toolchainBase
Colin Cross3f40fa42015-01-30 17:27:36 -0800209}
210
211func (toolchain32Bit) Is64Bit() bool {
212 return false
213}
Colin Crossb98c8b02016-07-29 13:44:28 -0700214
Colin Crossb98c8b02016-07-29 13:44:28 -0700215func variantOrDefault(variants map[string]string, choice string) string {
216 if ret, ok := variants[choice]; ok {
217 return ret
218 }
219 return variants[""]
220}
221
222func addPrefix(list []string, prefix string) []string {
223 for i := range list {
224 list[i] = prefix + list[i]
225 }
226 return list
227}
228
Yi Kong924adc42018-08-31 14:27:44 -0700229func LibclangRuntimeLibrary(t Toolchain, library string) string {
Colin Cross4c4c1be2022-02-10 11:41:18 -0800230 return "libclang_rt." + library
Yi Kong924adc42018-08-31 14:27:44 -0700231}
232
233func BuiltinsRuntimeLibrary(t Toolchain) string {
234 return LibclangRuntimeLibrary(t, "builtins")
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700235}
236
237func AddressSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700238 return LibclangRuntimeLibrary(t, "asan")
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700239}
240
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700241func HWAddressSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700242 return LibclangRuntimeLibrary(t, "hwasan")
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700243}
244
245func HWAddressSanitizerStaticLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700246 return LibclangRuntimeLibrary(t, "hwasan_static")
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700247}
248
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700249func UndefinedBehaviorSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700250 return LibclangRuntimeLibrary(t, "ubsan_standalone")
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700251}
252
Ivan Lozano30c5db22018-02-21 15:49:20 -0800253func UndefinedBehaviorSanitizerMinimalRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700254 return LibclangRuntimeLibrary(t, "ubsan_minimal")
Ivan Lozano30c5db22018-02-21 15:49:20 -0800255}
256
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700257func ThreadSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700258 return LibclangRuntimeLibrary(t, "tsan")
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700259}
Dan Willemsen300151b2017-03-13 12:40:30 -0700260
Kostya Kortchinskyd18ae5c2018-06-12 14:46:54 -0700261func ScudoRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700262 return LibclangRuntimeLibrary(t, "scudo")
Kostya Kortchinskyd18ae5c2018-06-12 14:46:54 -0700263}
264
Kostya Kortchinskyad73b2e2018-10-11 08:38:39 -0700265func ScudoMinimalRuntimeLibrary(t Toolchain) string {
266 return LibclangRuntimeLibrary(t, "scudo_minimal")
267}
268
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700269func LibFuzzerRuntimeLibrary(t Toolchain) string {
270 return LibclangRuntimeLibrary(t, "fuzzer")
271}
272
Colin Cross0d0ba592018-02-20 13:33:42 -0800273var inList = android.InList