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