RISCVTargetParser.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. //===-- RISCVTargetParser.cpp - Parser for target features ------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file implements a target parser to recognise hardware features
  10. // FOR RISC-V CPUS.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "llvm/TargetParser/RISCVTargetParser.h"
  14. #include "llvm/ADT/SmallVector.h"
  15. #include "llvm/ADT/StringSwitch.h"
  16. #include "llvm/TargetParser/Triple.h"
  17. namespace llvm {
  18. namespace RISCV {
  19. struct CPUInfo {
  20. StringLiteral Name;
  21. CPUKind Kind;
  22. StringLiteral DefaultMarch;
  23. bool isInvalid() const { return DefaultMarch.empty(); }
  24. bool is64Bit() const { return DefaultMarch.starts_with("rv64"); }
  25. };
  26. constexpr CPUInfo RISCVCPUInfo[] = {
  27. #define PROC(ENUM, NAME, DEFAULT_MARCH) \
  28. {NAME, CK_##ENUM, DEFAULT_MARCH},
  29. #include "llvm/TargetParser/RISCVTargetParserDef.inc"
  30. };
  31. bool checkCPUKind(CPUKind Kind, bool IsRV64) {
  32. if (Kind == CK_INVALID)
  33. return false;
  34. return RISCVCPUInfo[static_cast<unsigned>(Kind)].is64Bit() == IsRV64;
  35. }
  36. bool checkTuneCPUKind(CPUKind Kind, bool IsRV64) {
  37. if (Kind == CK_INVALID)
  38. return false;
  39. #define TUNE_PROC(ENUM, NAME) \
  40. if (Kind == CK_##ENUM) \
  41. return true;
  42. #include "llvm/TargetParser/RISCVTargetParserDef.inc"
  43. return RISCVCPUInfo[static_cast<unsigned>(Kind)].is64Bit() == IsRV64;
  44. }
  45. CPUKind parseCPUKind(StringRef CPU) {
  46. return llvm::StringSwitch<CPUKind>(CPU)
  47. #define PROC(ENUM, NAME, DEFAULT_MARCH) .Case(NAME, CK_##ENUM)
  48. #include "llvm/TargetParser/RISCVTargetParserDef.inc"
  49. .Default(CK_INVALID);
  50. }
  51. CPUKind parseTuneCPUKind(StringRef TuneCPU, bool IsRV64) {
  52. return llvm::StringSwitch<CPUKind>(TuneCPU)
  53. #define PROC(ENUM, NAME, DEFAULT_MARCH) .Case(NAME, CK_##ENUM)
  54. #define TUNE_PROC(ENUM, NAME) .Case(NAME, CK_##ENUM)
  55. #include "llvm/TargetParser/RISCVTargetParserDef.inc"
  56. .Default(CK_INVALID);
  57. }
  58. StringRef getMArchFromMcpu(StringRef CPU) {
  59. CPUKind Kind = parseCPUKind(CPU);
  60. return RISCVCPUInfo[static_cast<unsigned>(Kind)].DefaultMarch;
  61. }
  62. void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64) {
  63. for (const auto &C : RISCVCPUInfo) {
  64. if (C.Kind != CK_INVALID && IsRV64 == C.is64Bit())
  65. Values.emplace_back(C.Name);
  66. }
  67. }
  68. void fillValidTuneCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64) {
  69. for (const auto &C : RISCVCPUInfo) {
  70. if (C.Kind != CK_INVALID && IsRV64 == C.is64Bit())
  71. Values.emplace_back(C.Name);
  72. }
  73. #define TUNE_PROC(ENUM, NAME) Values.emplace_back(StringRef(NAME));
  74. #include "llvm/TargetParser/RISCVTargetParserDef.inc"
  75. }
  76. // Get all features except standard extension feature
  77. bool getCPUFeaturesExceptStdExt(CPUKind Kind,
  78. std::vector<StringRef> &Features) {
  79. const CPUInfo &Info = RISCVCPUInfo[static_cast<unsigned>(Kind)];
  80. if (Info.isInvalid())
  81. return false;
  82. if (Info.is64Bit())
  83. Features.push_back("+64bit");
  84. else
  85. Features.push_back("-64bit");
  86. return true;
  87. }
  88. bool isX18ReservedByDefault(const Triple &TT) {
  89. // X18 is reserved for the ShadowCallStack ABI (even when not enabled).
  90. return TT.isOSFuchsia();
  91. }
  92. } // namespace RISCV
  93. } // namespace llvm