xref: /openbsd-src/gnu/llvm/clang/lib/Basic/Targets/Lanai.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
1e5dd7070Spatrick //===--- Lanai.cpp - Implement Lanai target feature support ---------------===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick //
9e5dd7070Spatrick // This file implements Lanai TargetInfo objects.
10e5dd7070Spatrick //
11e5dd7070Spatrick //===----------------------------------------------------------------------===//
12e5dd7070Spatrick 
13e5dd7070Spatrick #include "Lanai.h"
14e5dd7070Spatrick #include "clang/Basic/MacroBuilder.h"
15e5dd7070Spatrick #include "llvm/ADT/StringSwitch.h"
16e5dd7070Spatrick 
17e5dd7070Spatrick using namespace clang;
18e5dd7070Spatrick using namespace clang::targets;
19e5dd7070Spatrick 
20e5dd7070Spatrick const char *const LanaiTargetInfo::GCCRegNames[] = {
21e5dd7070Spatrick     "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",  "r8",  "r9",  "r10",
22e5dd7070Spatrick     "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
23e5dd7070Spatrick     "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
24e5dd7070Spatrick };
25e5dd7070Spatrick 
getGCCRegNames() const26e5dd7070Spatrick ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
27*12c85518Srobert   return llvm::ArrayRef(GCCRegNames);
28e5dd7070Spatrick }
29e5dd7070Spatrick 
30e5dd7070Spatrick const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
31e5dd7070Spatrick     {{"pc"}, "r2"},   {{"sp"}, "r4"},   {{"fp"}, "r5"},   {{"rv"}, "r8"},
32e5dd7070Spatrick     {{"rr1"}, "r10"}, {{"rr2"}, "r11"}, {{"rca"}, "r15"},
33e5dd7070Spatrick };
34e5dd7070Spatrick 
getGCCRegAliases() const35e5dd7070Spatrick ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
36*12c85518Srobert   return llvm::ArrayRef(GCCRegAliases);
37e5dd7070Spatrick }
38e5dd7070Spatrick 
isValidCPUName(StringRef Name) const39e5dd7070Spatrick bool LanaiTargetInfo::isValidCPUName(StringRef Name) const {
40e5dd7070Spatrick   return llvm::StringSwitch<bool>(Name).Case("v11", true).Default(false);
41e5dd7070Spatrick }
fillValidCPUList(SmallVectorImpl<StringRef> & Values) const42e5dd7070Spatrick void LanaiTargetInfo::fillValidCPUList(
43e5dd7070Spatrick     SmallVectorImpl<StringRef> &Values) const {
44e5dd7070Spatrick   Values.emplace_back("v11");
45e5dd7070Spatrick }
46e5dd7070Spatrick 
setCPU(const std::string & Name)47e5dd7070Spatrick bool LanaiTargetInfo::setCPU(const std::string &Name) {
48e5dd7070Spatrick   CPU = llvm::StringSwitch<CPUKind>(Name).Case("v11", CK_V11).Default(CK_NONE);
49e5dd7070Spatrick 
50e5dd7070Spatrick   return CPU != CK_NONE;
51e5dd7070Spatrick }
52e5dd7070Spatrick 
hasFeature(StringRef Feature) const53e5dd7070Spatrick bool LanaiTargetInfo::hasFeature(StringRef Feature) const {
54e5dd7070Spatrick   return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
55e5dd7070Spatrick }
56e5dd7070Spatrick 
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const57e5dd7070Spatrick void LanaiTargetInfo::getTargetDefines(const LangOptions &Opts,
58e5dd7070Spatrick                                        MacroBuilder &Builder) const {
59e5dd7070Spatrick   // Define __lanai__ when building for target lanai.
60e5dd7070Spatrick   Builder.defineMacro("__lanai__");
61e5dd7070Spatrick 
62e5dd7070Spatrick   // Set define for the CPU specified.
63e5dd7070Spatrick   switch (CPU) {
64e5dd7070Spatrick   case CK_V11:
65e5dd7070Spatrick     Builder.defineMacro("__LANAI_V11__");
66e5dd7070Spatrick     break;
67e5dd7070Spatrick   case CK_NONE:
68e5dd7070Spatrick     llvm_unreachable("Unhandled target CPU");
69e5dd7070Spatrick   }
70e5dd7070Spatrick }
71