| // Copyright 2022 Google Inc. All rights reserved. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | package config | 
 |  | 
 | import ( | 
 | 	"strings" | 
 |  | 
 | 	"android/soong/android" | 
 | ) | 
 |  | 
 | var ( | 
 | 	linuxArmRustflags   = []string{} | 
 | 	linuxArmLinkflags   = []string{} | 
 | 	linuxArm64Rustflags = []string{} | 
 | 	linuxArm64Linkflags = []string{} | 
 | ) | 
 |  | 
 | func init() { | 
 | 	registerToolchainFactory(android.LinuxMusl, android.Arm64, linuxMuslArm64ToolchainFactory) | 
 | 	registerToolchainFactory(android.LinuxMusl, android.Arm, linuxMuslArmToolchainFactory) | 
 |  | 
 | 	pctx.StaticVariable("LinuxToolchainArmRustFlags", strings.Join(linuxArmRustflags, " ")) | 
 | 	pctx.StaticVariable("LinuxToolchainArmLinkFlags", strings.Join(linuxArmLinkflags, " ")) | 
 | 	pctx.StaticVariable("LinuxToolchainArm64RustFlags", strings.Join(linuxArm64Rustflags, " ")) | 
 | 	pctx.StaticVariable("LinuxToolchainArm64LinkFlags", strings.Join(linuxArm64Linkflags, " ")) | 
 | } | 
 |  | 
 | // Base 64-bit linux rust toolchain | 
 | type toolchainLinuxArm64 struct { | 
 | 	toolchain64Bit | 
 | } | 
 |  | 
 | func (toolchainLinuxArm64) Supported() bool { | 
 | 	return true | 
 | } | 
 |  | 
 | func (toolchainLinuxArm64) Bionic() bool { | 
 | 	return false | 
 | } | 
 |  | 
 | func (t *toolchainLinuxArm64) Name() string { | 
 | 	return "arm64" | 
 | } | 
 |  | 
 | func (t *toolchainLinuxArm64) ToolchainLinkFlags() string { | 
 | 	// Prepend the lld flags from cc_config so we stay in sync with cc | 
 | 	return "${cc_config.LinuxLldflags} ${cc_config.LinuxArm64Lldflags} " + | 
 | 		"${config.LinuxToolchainLinkFlags} ${config.LinuxToolchainArm64LinkFlags}" | 
 | } | 
 |  | 
 | func (t *toolchainLinuxArm64) ToolchainRustFlags() string { | 
 | 	return "${config.LinuxToolchainRustFlags} ${config.LinuxToolchainArm64RustFlags}" | 
 | } | 
 |  | 
 | // Specialization of the 64-bit linux rust toolchain for musl.  Adds the musl rust triple and | 
 | // linker flags to avoid using the host sysroot. | 
 | type toolchainLinuxMuslArm64 struct { | 
 | 	toolchainLinuxArm64 | 
 | } | 
 |  | 
 | func (t *toolchainLinuxMuslArm64) RustTriple() string { | 
 | 	return "aarch64-unknown-linux-musl" | 
 | } | 
 |  | 
 | func (t *toolchainLinuxMuslArm64) ToolchainLinkFlags() string { | 
 | 	return t.toolchainLinuxArm64.ToolchainLinkFlags() + " " + "${config.LinuxMuslToolchainLinkFlags}" | 
 | } | 
 |  | 
 | func (t *toolchainLinuxMuslArm64) ToolchainRustFlags() string { | 
 | 	return t.toolchainLinuxArm64.ToolchainRustFlags() + " " + "${config.LinuxMuslToolchainRustFlags}" | 
 | } | 
 |  | 
 | func linuxMuslArm64ToolchainFactory(arch android.Arch) Toolchain { | 
 | 	return toolchainLinuxMuslArm64Singleton | 
 | } | 
 |  | 
 | // Base 32-bit linux rust toolchain | 
 | type toolchainLinuxArm struct { | 
 | 	toolchain32Bit | 
 | } | 
 |  | 
 | func (toolchainLinuxArm) Supported() bool { | 
 | 	return true | 
 | } | 
 |  | 
 | func (toolchainLinuxArm) Bionic() bool { | 
 | 	return false | 
 | } | 
 |  | 
 | func (t *toolchainLinuxArm) Name() string { | 
 | 	return "arm" | 
 | } | 
 |  | 
 | func (toolchainLinuxArm) LibclangRuntimeLibraryArch() string { | 
 | 	return "arm" | 
 | } | 
 |  | 
 | func (toolchainLinuxArm64) LibclangRuntimeLibraryArch() string { | 
 | 	return "arm64" | 
 | } | 
 |  | 
 | func (t *toolchainLinuxArm) ToolchainLinkFlags() string { | 
 | 	// Prepend the lld flags from cc_config so we stay in sync with cc | 
 | 	return "${cc_config.LinuxLldflags} ${cc_config.LinuxArmLldflags} " + | 
 | 		"${config.LinuxToolchainLinkFlags} ${config.LinuxToolchainArmLinkFlags}" | 
 | } | 
 |  | 
 | func (t *toolchainLinuxArm) ToolchainRustFlags() string { | 
 | 	return "${config.LinuxToolchainRustFlags} ${config.LinuxToolchainArmRustFlags}" | 
 | } | 
 |  | 
 | // Specialization of the 32-bit linux rust toolchain for musl.  Adds the musl rust triple and | 
 | // linker flags to avoid using the host sysroot. | 
 | type toolchainLinuxMuslArm struct { | 
 | 	toolchainLinuxArm | 
 | } | 
 |  | 
 | func (t *toolchainLinuxMuslArm) RustTriple() string { | 
 | 	return "arm-unknown-linux-musleabihf" | 
 | } | 
 |  | 
 | func (t *toolchainLinuxMuslArm) ToolchainLinkFlags() string { | 
 | 	return t.toolchainLinuxArm.ToolchainLinkFlags() + " " + "${config.LinuxMuslToolchainLinkFlags}" | 
 | } | 
 |  | 
 | func (t *toolchainLinuxMuslArm) ToolchainRustFlags() string { | 
 | 	return t.toolchainLinuxArm.ToolchainRustFlags() + " " + "${config.LinuxMuslToolchainRustFlags}" | 
 | } | 
 |  | 
 | func linuxMuslArmToolchainFactory(arch android.Arch) Toolchain { | 
 | 	return toolchainLinuxMuslArmSingleton | 
 | } | 
 |  | 
 | var toolchainLinuxMuslArm64Singleton Toolchain = &toolchainLinuxMuslArm64{} | 
 | var toolchainLinuxMuslArmSingleton Toolchain = &toolchainLinuxMuslArm{} |