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 "fmt" 19 "strings" 20 21 "android/soong/android" 22) 23 24var ( 25 riscv64Cflags = []string{ 26 // Help catch common 32/64-bit errors. 27 "-Werror=implicit-function-declaration", 28 "-fno-emulated-tls", 29 // A temporary fix for SExtWRemoval miscompilation bug. 30 "-mllvm", 31 "-riscv-disable-sextw-removal=true", 32 } 33 34 riscv64ArchVariantCflags = map[string][]string{} 35 36 riscv64Ldflags = []string{ 37 "-Wl,--hash-style=gnu", 38 } 39 40 riscv64Lldflags = append(riscv64Ldflags, 41 "-Wl,-z,max-page-size=4096", 42 "-Wl,-plugin-opt,-emulated-tls=0", 43 ) 44 45 riscv64Cppflags = []string{} 46 47 riscv64CpuVariantCflags = map[string][]string{} 48) 49 50const () 51 52func init() { 53 54 exportedVars.ExportStringListStaticVariable("Riscv64Ldflags", riscv64Ldflags) 55 exportedVars.ExportStringListStaticVariable("Riscv64Lldflags", riscv64Lldflags) 56 57 exportedVars.ExportStringListStaticVariable("Riscv64Cflags", riscv64Cflags) 58 exportedVars.ExportStringListStaticVariable("Riscv64Cppflags", riscv64Cppflags) 59 60 exportedVars.ExportVariableReferenceDict("Riscv64ArchVariantCflags", riscv64ArchVariantCflagsVar) 61 exportedVars.ExportVariableReferenceDict("Riscv64CpuVariantCflags", riscv64CpuVariantCflagsVar) 62 exportedVars.ExportVariableReferenceDict("Riscv64CpuVariantLdflags", riscv64CpuVariantLdflags) 63} 64 65var ( 66 riscv64ArchVariantCflagsVar = map[string]string{} 67 68 riscv64CpuVariantCflagsVar = map[string]string{} 69 70 riscv64CpuVariantLdflags = map[string]string{} 71) 72 73type toolchainRiscv64 struct { 74 toolchainBionic 75 toolchain64Bit 76 77 ldflags string 78 lldflags string 79 toolchainCflags string 80} 81 82func (t *toolchainRiscv64) Name() string { 83 return "riscv64" 84} 85 86func (t *toolchainRiscv64) IncludeFlags() string { 87 return "" 88} 89 90func (t *toolchainRiscv64) ClangTriple() string { 91 return "riscv64-linux-android" 92} 93 94func (t *toolchainRiscv64) Cflags() string { 95 return "${config.Riscv64Cflags}" 96} 97 98func (t *toolchainRiscv64) Cppflags() string { 99 return "${config.Riscv64Cppflags}" 100} 101 102func (t *toolchainRiscv64) Ldflags() string { 103 return t.ldflags 104} 105 106func (t *toolchainRiscv64) Lldflags() string { 107 return t.lldflags 108} 109 110func (t *toolchainRiscv64) ToolchainCflags() string { 111 return t.toolchainCflags 112} 113 114func (toolchainRiscv64) LibclangRuntimeLibraryArch() string { 115 return "riscv64" 116} 117 118func riscv64ToolchainFactory(arch android.Arch) Toolchain { 119 switch arch.ArchVariant { 120 case "": 121 default: 122 panic(fmt.Sprintf("Unknown Riscv64 architecture version: %q", arch.ArchVariant)) 123 } 124 125 toolchainCflags := []string{riscv64ArchVariantCflagsVar[arch.ArchVariant]} 126 toolchainCflags = append(toolchainCflags, 127 variantOrDefault(riscv64CpuVariantCflagsVar, arch.CpuVariant)) 128 129 extraLdflags := variantOrDefault(riscv64CpuVariantLdflags, arch.CpuVariant) 130 return &toolchainRiscv64{ 131 ldflags: strings.Join([]string{ 132 "${config.Riscv64Ldflags}", 133 extraLdflags, 134 }, " "), 135 lldflags: strings.Join([]string{ 136 "${config.Riscv64Lldflags}", 137 extraLdflags, 138 }, " "), 139 toolchainCflags: strings.Join(toolchainCflags, " "), 140 } 141} 142 143func init() { 144 registerToolchainFactory(android.Android, android.Riscv64, riscv64ToolchainFactory) 145} 146