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