1// Copyright 2022 The Android Open Source Project 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 "strings" 19 20 "android/soong/android" 21) 22 23var ( 24 Riscv64RustFlags = []string{ 25 "-C force-frame-pointers=y", 26 } 27 Riscv64ArchFeatureRustFlags = map[string][]string{ 28 "riscv64": { 29 "-C target-feature=+V,+Zba,+Zbb,+Zbs", 30 }, 31 } 32 Riscv64LinkFlags = []string{} 33 34 Riscv64ArchVariantRustFlags = map[string][]string{"": {}} 35) 36 37func init() { 38 registerToolchainFactory(android.Android, android.Riscv64, Riscv64ToolchainFactory) 39 40 pctx.StaticVariable("Riscv64ToolchainRustFlags", strings.Join(Riscv64RustFlags, " ")) 41 pctx.StaticVariable("Riscv64ToolchainLinkFlags", strings.Join(Riscv64LinkFlags, " ")) 42 43 for variant, rustFlags := range Riscv64ArchVariantRustFlags { 44 pctx.StaticVariable("Riscv64"+variant+"VariantRustFlags", 45 strings.Join(rustFlags, " ")) 46 } 47 48} 49 50type toolchainRiscv64 struct { 51 toolchain64Bit 52 toolchainRustFlags string 53} 54 55func (t *toolchainRiscv64) RustTriple() string { 56 return "riscv64-linux-android" 57} 58 59func (t *toolchainRiscv64) ToolchainLinkFlags() string { 60 // Prepend the lld flags from cc_config so we stay in sync with cc 61 return "${config.DeviceGlobalLinkFlags} ${cc_config.Riscv64Lldflags} ${config.Riscv64ToolchainLinkFlags}" 62} 63 64func (t *toolchainRiscv64) ToolchainRustFlags() string { 65 return t.toolchainRustFlags 66} 67 68func (t *toolchainRiscv64) RustFlags() string { 69 return "${config.Riscv64ToolchainRustFlags}" 70} 71 72func (t *toolchainRiscv64) Supported() bool { 73 return true 74} 75 76func (toolchainRiscv64) LibclangRuntimeLibraryArch() string { 77 return "riscv64" 78} 79 80func Riscv64ToolchainFactory(arch android.Arch) Toolchain { 81 archVariant := arch.ArchVariant 82 83 toolchainRustFlags := []string{ 84 "${config.Riscv64ToolchainRustFlags}", 85 "${config.Riscv64" + archVariant + "VariantRustFlags}", 86 } 87 88 toolchainRustFlags = append(toolchainRustFlags, deviceGlobalRustFlags...) 89 90 for _, feature := range arch.ArchFeatures { 91 toolchainRustFlags = append(toolchainRustFlags, Riscv64ArchFeatureRustFlags[feature]...) 92 } 93 94 return &toolchainRiscv64{ 95 toolchainRustFlags: strings.Join(toolchainRustFlags, " "), 96 } 97} 98