xref: /aosp_15_r20/build/soong/cc/config/arm64_device.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage config
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"strings"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workervar (
25*333d2b36SAndroid Build Coastguard Worker	arm64Cflags = []string{
26*333d2b36SAndroid Build Coastguard Worker		// Help catch common 32/64-bit errors.
27*333d2b36SAndroid Build Coastguard Worker		"-Werror=implicit-function-declaration",
28*333d2b36SAndroid Build Coastguard Worker	}
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker	arm64ArchVariantCflags = map[string][]string{
31*333d2b36SAndroid Build Coastguard Worker		"armv8-a": []string{
32*333d2b36SAndroid Build Coastguard Worker			"-march=armv8-a",
33*333d2b36SAndroid Build Coastguard Worker		},
34*333d2b36SAndroid Build Coastguard Worker		"armv8-a-branchprot": []string{
35*333d2b36SAndroid Build Coastguard Worker			"-march=armv8-a",
36*333d2b36SAndroid Build Coastguard Worker			"-mbranch-protection=standard",
37*333d2b36SAndroid Build Coastguard Worker		},
38*333d2b36SAndroid Build Coastguard Worker		"armv8-2a": []string{
39*333d2b36SAndroid Build Coastguard Worker			"-march=armv8.2-a",
40*333d2b36SAndroid Build Coastguard Worker		},
41*333d2b36SAndroid Build Coastguard Worker		"armv8-2a-dotprod": []string{
42*333d2b36SAndroid Build Coastguard Worker			"-march=armv8.2-a+dotprod",
43*333d2b36SAndroid Build Coastguard Worker		},
44*333d2b36SAndroid Build Coastguard Worker		// On ARMv9 and later, Pointer Authentication Codes (PAC) are mandatory,
45*333d2b36SAndroid Build Coastguard Worker		// so -fstack-protector is unnecessary.
46*333d2b36SAndroid Build Coastguard Worker		"armv9-a": []string{
47*333d2b36SAndroid Build Coastguard Worker			"-march=armv8.2-a+dotprod",
48*333d2b36SAndroid Build Coastguard Worker			"-mbranch-protection=standard",
49*333d2b36SAndroid Build Coastguard Worker			"-fno-stack-protector",
50*333d2b36SAndroid Build Coastguard Worker		},
51*333d2b36SAndroid Build Coastguard Worker		"armv9-2a": []string{
52*333d2b36SAndroid Build Coastguard Worker			"-march=armv9.2-a",
53*333d2b36SAndroid Build Coastguard Worker			"-mbranch-protection=standard",
54*333d2b36SAndroid Build Coastguard Worker			"-fno-stack-protector",
55*333d2b36SAndroid Build Coastguard Worker		},
56*333d2b36SAndroid Build Coastguard Worker	}
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker	arm64Ldflags = []string{
59*333d2b36SAndroid Build Coastguard Worker		"-Wl,-z,separate-code",
60*333d2b36SAndroid Build Coastguard Worker		"-Wl,-z,separate-loadable-segments",
61*333d2b36SAndroid Build Coastguard Worker	}
62*333d2b36SAndroid Build Coastguard Worker
63*333d2b36SAndroid Build Coastguard Worker	arm64Lldflags = arm64Ldflags
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker	arm64Cppflags = []string{}
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Worker	arm64CpuVariantCflags = map[string][]string{
68*333d2b36SAndroid Build Coastguard Worker		"cortex-a53": []string{
69*333d2b36SAndroid Build Coastguard Worker			"-mcpu=cortex-a53",
70*333d2b36SAndroid Build Coastguard Worker		},
71*333d2b36SAndroid Build Coastguard Worker		"cortex-a55": []string{
72*333d2b36SAndroid Build Coastguard Worker			"-mcpu=cortex-a55",
73*333d2b36SAndroid Build Coastguard Worker		},
74*333d2b36SAndroid Build Coastguard Worker		"cortex-a75": []string{
75*333d2b36SAndroid Build Coastguard Worker			// Use the cortex-a55 since it is similar to the little
76*333d2b36SAndroid Build Coastguard Worker			// core (cortex-a55) and is sensitive to ordering.
77*333d2b36SAndroid Build Coastguard Worker			"-mcpu=cortex-a55",
78*333d2b36SAndroid Build Coastguard Worker		},
79*333d2b36SAndroid Build Coastguard Worker		"cortex-a76": []string{
80*333d2b36SAndroid Build Coastguard Worker			// Use the cortex-a55 since it is similar to the little
81*333d2b36SAndroid Build Coastguard Worker			// core (cortex-a55) and is sensitive to ordering.
82*333d2b36SAndroid Build Coastguard Worker			"-mcpu=cortex-a55",
83*333d2b36SAndroid Build Coastguard Worker		},
84*333d2b36SAndroid Build Coastguard Worker		"kryo": []string{
85*333d2b36SAndroid Build Coastguard Worker			"-mcpu=kryo",
86*333d2b36SAndroid Build Coastguard Worker		},
87*333d2b36SAndroid Build Coastguard Worker		"kryo385": []string{
88*333d2b36SAndroid Build Coastguard Worker			// Use cortex-a53 because kryo385 is not supported in clang.
89*333d2b36SAndroid Build Coastguard Worker			"-mcpu=cortex-a53",
90*333d2b36SAndroid Build Coastguard Worker		},
91*333d2b36SAndroid Build Coastguard Worker		"exynos-m1": []string{
92*333d2b36SAndroid Build Coastguard Worker			"-mcpu=exynos-m1",
93*333d2b36SAndroid Build Coastguard Worker		},
94*333d2b36SAndroid Build Coastguard Worker		"exynos-m2": []string{
95*333d2b36SAndroid Build Coastguard Worker			"-mcpu=exynos-m2",
96*333d2b36SAndroid Build Coastguard Worker		},
97*333d2b36SAndroid Build Coastguard Worker	}
98*333d2b36SAndroid Build Coastguard Worker)
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Workerfunc init() {
101*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("Arm64Ldflags", strings.Join(arm64Ldflags, " "))
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Worker	pctx.VariableFunc("Arm64Lldflags", func(ctx android.PackageVarContext) string {
104*333d2b36SAndroid Build Coastguard Worker		maxPageSizeFlag := "-Wl,-z,max-page-size=" + ctx.Config().MaxPageSizeSupported()
105*333d2b36SAndroid Build Coastguard Worker		flags := append(arm64Lldflags, maxPageSizeFlag)
106*333d2b36SAndroid Build Coastguard Worker		return strings.Join(flags, " ")
107*333d2b36SAndroid Build Coastguard Worker	})
108*333d2b36SAndroid Build Coastguard Worker
109*333d2b36SAndroid Build Coastguard Worker	pctx.VariableFunc("Arm64Cflags", func(ctx android.PackageVarContext) string {
110*333d2b36SAndroid Build Coastguard Worker		flags := arm64Cflags
111*333d2b36SAndroid Build Coastguard Worker		if ctx.Config().NoBionicPageSizeMacro() {
112*333d2b36SAndroid Build Coastguard Worker			flags = append(flags, "-D__BIONIC_NO_PAGE_SIZE_MACRO")
113*333d2b36SAndroid Build Coastguard Worker		} else {
114*333d2b36SAndroid Build Coastguard Worker			flags = append(flags, "-D__BIONIC_DEPRECATED_PAGE_SIZE_MACRO")
115*333d2b36SAndroid Build Coastguard Worker		}
116*333d2b36SAndroid Build Coastguard Worker		return strings.Join(flags, " ")
117*333d2b36SAndroid Build Coastguard Worker	})
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("Arm64Cppflags", strings.Join(arm64Cppflags, " "))
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Worker	for variant, cflags := range arm64ArchVariantCflags {
122*333d2b36SAndroid Build Coastguard Worker		pctx.StaticVariable("Arm64"+variant+"VariantCflags", strings.Join(cflags, " "))
123*333d2b36SAndroid Build Coastguard Worker	}
124*333d2b36SAndroid Build Coastguard Worker
125*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("Arm64CortexA53Cflags", strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
126*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("Arm64CortexA55Cflags", strings.Join(arm64CpuVariantCflags["cortex-a55"], " "))
127*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("Arm64KryoCflags", strings.Join(arm64CpuVariantCflags["kryo"], " "))
128*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("Arm64ExynosM1Cflags", strings.Join(arm64CpuVariantCflags["exynos-m1"], " "))
129*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("Arm64ExynosM2Cflags", strings.Join(arm64CpuVariantCflags["exynos-m2"], " "))
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("Arm64FixCortexA53Ldflags", "-Wl,--fix-cortex-a53-843419")
132*333d2b36SAndroid Build Coastguard Worker}
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Workervar (
135*333d2b36SAndroid Build Coastguard Worker	arm64CpuVariantCflagsVar = map[string]string{
136*333d2b36SAndroid Build Coastguard Worker		"cortex-a53": "${config.Arm64CortexA53Cflags}",
137*333d2b36SAndroid Build Coastguard Worker		"cortex-a55": "${config.Arm64CortexA55Cflags}",
138*333d2b36SAndroid Build Coastguard Worker		"cortex-a72": "${config.Arm64CortexA53Cflags}",
139*333d2b36SAndroid Build Coastguard Worker		"cortex-a73": "${config.Arm64CortexA53Cflags}",
140*333d2b36SAndroid Build Coastguard Worker		"cortex-a75": "${config.Arm64CortexA55Cflags}",
141*333d2b36SAndroid Build Coastguard Worker		"cortex-a76": "${config.Arm64CortexA55Cflags}",
142*333d2b36SAndroid Build Coastguard Worker		"kryo":       "${config.Arm64KryoCflags}",
143*333d2b36SAndroid Build Coastguard Worker		"kryo385":    "${config.Arm64CortexA53Cflags}",
144*333d2b36SAndroid Build Coastguard Worker		"exynos-m1":  "${config.Arm64ExynosM1Cflags}",
145*333d2b36SAndroid Build Coastguard Worker		"exynos-m2":  "${config.Arm64ExynosM2Cflags}",
146*333d2b36SAndroid Build Coastguard Worker	}
147*333d2b36SAndroid Build Coastguard Worker
148*333d2b36SAndroid Build Coastguard Worker	arm64CpuVariantLdflags = map[string]string{
149*333d2b36SAndroid Build Coastguard Worker		"cortex-a53": "${config.Arm64FixCortexA53Ldflags}",
150*333d2b36SAndroid Build Coastguard Worker		"cortex-a72": "${config.Arm64FixCortexA53Ldflags}",
151*333d2b36SAndroid Build Coastguard Worker		"cortex-a73": "${config.Arm64FixCortexA53Ldflags}",
152*333d2b36SAndroid Build Coastguard Worker		"kryo":       "${config.Arm64FixCortexA53Ldflags}",
153*333d2b36SAndroid Build Coastguard Worker		"exynos-m1":  "${config.Arm64FixCortexA53Ldflags}",
154*333d2b36SAndroid Build Coastguard Worker		"exynos-m2":  "${config.Arm64FixCortexA53Ldflags}",
155*333d2b36SAndroid Build Coastguard Worker	}
156*333d2b36SAndroid Build Coastguard Worker)
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Workertype toolchainArm64 struct {
159*333d2b36SAndroid Build Coastguard Worker	toolchainBionic
160*333d2b36SAndroid Build Coastguard Worker	toolchain64Bit
161*333d2b36SAndroid Build Coastguard Worker
162*333d2b36SAndroid Build Coastguard Worker	ldflags         string
163*333d2b36SAndroid Build Coastguard Worker	lldflags        string
164*333d2b36SAndroid Build Coastguard Worker	toolchainCflags string
165*333d2b36SAndroid Build Coastguard Worker}
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) Name() string {
168*333d2b36SAndroid Build Coastguard Worker	return "arm64"
169*333d2b36SAndroid Build Coastguard Worker}
170*333d2b36SAndroid Build Coastguard Worker
171*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) IncludeFlags() string {
172*333d2b36SAndroid Build Coastguard Worker	return ""
173*333d2b36SAndroid Build Coastguard Worker}
174*333d2b36SAndroid Build Coastguard Worker
175*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) ClangTriple() string {
176*333d2b36SAndroid Build Coastguard Worker	return "aarch64-linux-android"
177*333d2b36SAndroid Build Coastguard Worker}
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) Cflags() string {
180*333d2b36SAndroid Build Coastguard Worker	return "${config.Arm64Cflags}"
181*333d2b36SAndroid Build Coastguard Worker}
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) Cppflags() string {
184*333d2b36SAndroid Build Coastguard Worker	return "${config.Arm64Cppflags}"
185*333d2b36SAndroid Build Coastguard Worker}
186*333d2b36SAndroid Build Coastguard Worker
187*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) Ldflags() string {
188*333d2b36SAndroid Build Coastguard Worker	return t.ldflags
189*333d2b36SAndroid Build Coastguard Worker}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) Lldflags() string {
192*333d2b36SAndroid Build Coastguard Worker	return t.lldflags
193*333d2b36SAndroid Build Coastguard Worker}
194*333d2b36SAndroid Build Coastguard Worker
195*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainArm64) ToolchainCflags() string {
196*333d2b36SAndroid Build Coastguard Worker	return t.toolchainCflags
197*333d2b36SAndroid Build Coastguard Worker}
198*333d2b36SAndroid Build Coastguard Worker
199*333d2b36SAndroid Build Coastguard Workerfunc (toolchainArm64) LibclangRuntimeLibraryArch() string {
200*333d2b36SAndroid Build Coastguard Worker	return "aarch64"
201*333d2b36SAndroid Build Coastguard Worker}
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Workerfunc arm64ToolchainFactory(arch android.Arch) Toolchain {
204*333d2b36SAndroid Build Coastguard Worker	// Error now rather than having a confusing Ninja error
205*333d2b36SAndroid Build Coastguard Worker	if _, ok := arm64ArchVariantCflags[arch.ArchVariant]; !ok {
206*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Sprintf("Unknown ARM64 architecture version: %q", arch.ArchVariant))
207*333d2b36SAndroid Build Coastguard Worker	}
208*333d2b36SAndroid Build Coastguard Worker
209*333d2b36SAndroid Build Coastguard Worker	toolchainCflags := []string{"${config.Arm64" + arch.ArchVariant + "VariantCflags}"}
210*333d2b36SAndroid Build Coastguard Worker	toolchainCflags = append(toolchainCflags,
211*333d2b36SAndroid Build Coastguard Worker		variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant))
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Worker	extraLdflags := variantOrDefault(arm64CpuVariantLdflags, arch.CpuVariant)
214*333d2b36SAndroid Build Coastguard Worker	return &toolchainArm64{
215*333d2b36SAndroid Build Coastguard Worker		ldflags: strings.Join([]string{
216*333d2b36SAndroid Build Coastguard Worker			"${config.Arm64Ldflags}",
217*333d2b36SAndroid Build Coastguard Worker			extraLdflags,
218*333d2b36SAndroid Build Coastguard Worker		}, " "),
219*333d2b36SAndroid Build Coastguard Worker		lldflags: strings.Join([]string{
220*333d2b36SAndroid Build Coastguard Worker			"${config.Arm64Lldflags}",
221*333d2b36SAndroid Build Coastguard Worker			extraLdflags,
222*333d2b36SAndroid Build Coastguard Worker		}, " "),
223*333d2b36SAndroid Build Coastguard Worker		toolchainCflags: strings.Join(toolchainCflags, " "),
224*333d2b36SAndroid Build Coastguard Worker	}
225*333d2b36SAndroid Build Coastguard Worker}
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Workerfunc init() {
228*333d2b36SAndroid Build Coastguard Worker	registerToolchainFactory(android.Android, android.Arm64, arm64ToolchainFactory)
229*333d2b36SAndroid Build Coastguard Worker}
230