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