1// Copyright 2022 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 "android/soong/android" 18 19var ( 20 linuxArmCflags = []string{ 21 "-march=armv7a", 22 } 23 24 linuxArm64Cflags = []string{} 25 26 linuxArmLdflags = []string{ 27 "-march=armv7a", 28 } 29 30 linuxArm64Ldflags = []string{} 31) 32 33func init() { 34 exportedVars.ExportStringListStaticVariable("LinuxArmCflags", linuxArmCflags) 35 exportedVars.ExportStringListStaticVariable("LinuxArm64Cflags", linuxArm64Cflags) 36 exportedVars.ExportStringListStaticVariable("LinuxArmLdflags", linuxArmLdflags) 37 exportedVars.ExportStringListStaticVariable("LinuxArmLldflags", linuxArmLdflags) 38 exportedVars.ExportStringListStaticVariable("LinuxArm64Ldflags", linuxArm64Ldflags) 39 exportedVars.ExportStringListStaticVariable("LinuxArm64Lldflags", linuxArm64Ldflags) 40 41 exportedVars.ExportStringListStaticVariable("LinuxArmYasmFlags", []string{"-f elf32 -m arm"}) 42 exportedVars.ExportStringListStaticVariable("LinuxArm64YasmFlags", []string{"-f elf64 -m aarch64"}) 43 44} 45 46// Musl arm+arm64 47type toolchainLinuxArm struct { 48 toolchain32Bit 49 toolchainLinux 50} 51 52type toolchainLinuxArm64 struct { 53 toolchain64Bit 54 toolchainLinux 55} 56 57func (t *toolchainLinuxArm) Name() string { 58 return "arm" 59} 60 61func (t *toolchainLinuxArm64) Name() string { 62 return "arm64" 63} 64 65func (t *toolchainLinuxArm) Cflags() string { 66 return "${config.LinuxCflags} ${config.LinuxArmCflags}" 67} 68 69func (t *toolchainLinuxArm) Cppflags() string { 70 return "" 71} 72 73func (t *toolchainLinuxArm64) Cflags() string { 74 return "${config.LinuxCflags} ${config.LinuxArm64Cflags}" 75} 76 77func (t *toolchainLinuxArm64) Cppflags() string { 78 return "" 79} 80 81func (t *toolchainLinuxArm) Ldflags() string { 82 return "${config.LinuxLdflags} ${config.LinuxArmLdflags}" 83} 84 85func (t *toolchainLinuxArm) Lldflags() string { 86 return "${config.LinuxLldflags} ${config.LinuxArmLldflags}" 87} 88 89func (t *toolchainLinuxArm64) Ldflags() string { 90 return "${config.LinuxLdflags} ${config.LinuxArm64Ldflags}" 91} 92 93func (t *toolchainLinuxArm64) Lldflags() string { 94 return "${config.LinuxLldflags} ${config.LinuxArm64Lldflags}" 95} 96 97func (t *toolchainLinuxArm) YasmFlags() string { 98 return "${config.LinuxArmYasmFlags}" 99} 100 101func (t *toolchainLinuxArm64) YasmFlags() string { 102 return "${config.LinuxArm64YasmFlags}" 103} 104 105func (toolchainLinuxArm) LibclangRuntimeLibraryArch() string { 106 return "arm" 107} 108 109func (toolchainLinuxArm64) LibclangRuntimeLibraryArch() string { 110 return "arm64" 111} 112 113func (t *toolchainLinuxArm) InstructionSetFlags(isa string) (string, error) { 114 // TODO: Is no thumb OK? 115 return t.toolchainBase.InstructionSetFlags("") 116} 117 118type toolchainLinuxMuslArm struct { 119 toolchainLinuxArm 120 toolchainMusl 121} 122 123type toolchainLinuxMuslArm64 struct { 124 toolchainLinuxArm64 125 toolchainMusl 126} 127 128func (t *toolchainLinuxMuslArm) ClangTriple() string { 129 return "arm-linux-musleabihf" 130} 131 132func (t *toolchainLinuxMuslArm) Cflags() string { 133 return t.toolchainLinuxArm.Cflags() + " " + t.toolchainMusl.Cflags() 134} 135 136func (t *toolchainLinuxMuslArm) Ldflags() string { 137 return t.toolchainLinuxArm.Ldflags() + " " + t.toolchainMusl.Ldflags() 138} 139 140func (t *toolchainLinuxMuslArm) Lldflags() string { 141 return t.toolchainLinuxArm.Lldflags() + " " + t.toolchainMusl.Lldflags() 142} 143 144func (t *toolchainLinuxMuslArm64) ClangTriple() string { 145 return "aarch64-linux-musl" 146} 147 148func (t *toolchainLinuxMuslArm64) Cflags() string { 149 return t.toolchainLinuxArm64.Cflags() + " " + t.toolchainMusl.Cflags() 150} 151 152func (t *toolchainLinuxMuslArm64) Ldflags() string { 153 return t.toolchainLinuxArm64.Ldflags() + " " + t.toolchainMusl.Ldflags() 154} 155 156func (t *toolchainLinuxMuslArm64) Lldflags() string { 157 return t.toolchainLinuxArm64.Lldflags() + " " + t.toolchainMusl.Lldflags() 158} 159 160var toolchainLinuxMuslArmSingleton Toolchain = &toolchainLinuxMuslArm{} 161var toolchainLinuxMuslArm64Singleton Toolchain = &toolchainLinuxMuslArm64{} 162 163func linuxMuslArmToolchainFactory(arch android.Arch) Toolchain { 164 return toolchainLinuxMuslArmSingleton 165} 166 167func linuxMuslArm64ToolchainFactory(arch android.Arch) Toolchain { 168 return toolchainLinuxMuslArm64Singleton 169} 170 171func init() { 172 registerToolchainFactory(android.LinuxMusl, android.Arm, linuxMuslArmToolchainFactory) 173 registerToolchainFactory(android.LinuxMusl, android.Arm64, linuxMuslArm64ToolchainFactory) 174} 175