riscv64_device.go 3.6 KB

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