Lanai.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. //===--- Lanai.cpp - Implement Lanai target feature support ---------------===//
  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 Lanai TargetInfo objects.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "Lanai.h"
  13. #include "clang/Basic/MacroBuilder.h"
  14. #include "llvm/ADT/StringSwitch.h"
  15. using namespace clang;
  16. using namespace clang::targets;
  17. const char *const LanaiTargetInfo::GCCRegNames[] = {
  18. "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
  19. "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
  20. "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
  21. };
  22. ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
  23. return llvm::ArrayRef(GCCRegNames);
  24. }
  25. const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
  26. {{"pc"}, "r2"}, {{"sp"}, "r4"}, {{"fp"}, "r5"}, {{"rv"}, "r8"},
  27. {{"rr1"}, "r10"}, {{"rr2"}, "r11"}, {{"rca"}, "r15"},
  28. };
  29. ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
  30. return llvm::ArrayRef(GCCRegAliases);
  31. }
  32. bool LanaiTargetInfo::isValidCPUName(StringRef Name) const {
  33. return llvm::StringSwitch<bool>(Name).Case("v11", true).Default(false);
  34. }
  35. void LanaiTargetInfo::fillValidCPUList(
  36. SmallVectorImpl<StringRef> &Values) const {
  37. Values.emplace_back("v11");
  38. }
  39. bool LanaiTargetInfo::setCPU(const std::string &Name) {
  40. CPU = llvm::StringSwitch<CPUKind>(Name).Case("v11", CK_V11).Default(CK_NONE);
  41. return CPU != CK_NONE;
  42. }
  43. bool LanaiTargetInfo::hasFeature(StringRef Feature) const {
  44. return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
  45. }
  46. void LanaiTargetInfo::getTargetDefines(const LangOptions &Opts,
  47. MacroBuilder &Builder) const {
  48. // Define __lanai__ when building for target lanai.
  49. Builder.defineMacro("__lanai__");
  50. // Set define for the CPU specified.
  51. switch (CPU) {
  52. case CK_V11:
  53. Builder.defineMacro("__LANAI_V11__");
  54. break;
  55. case CK_NONE:
  56. llvm_unreachable("Unhandled target CPU");
  57. }
  58. }