1326941Sdim//===--- Lanai.cpp - Implement Lanai target feature support ---------------===// 2326941Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6326941Sdim// 7326941Sdim//===----------------------------------------------------------------------===// 8326941Sdim// 9326941Sdim// This file implements Lanai TargetInfo objects. 10326941Sdim// 11326941Sdim//===----------------------------------------------------------------------===// 12326941Sdim 13326941Sdim#include "Lanai.h" 14326941Sdim#include "clang/Basic/MacroBuilder.h" 15326941Sdim#include "llvm/ADT/StringSwitch.h" 16326941Sdim 17326941Sdimusing namespace clang; 18326941Sdimusing namespace clang::targets; 19326941Sdim 20326941Sdimconst char *const LanaiTargetInfo::GCCRegNames[] = { 21326941Sdim "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", 22326941Sdim "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", 23326941Sdim "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31" 24326941Sdim}; 25326941Sdim 26326941SdimArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const { 27326941Sdim return llvm::makeArrayRef(GCCRegNames); 28326941Sdim} 29326941Sdim 30326941Sdimconst TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = { 31326941Sdim {{"pc"}, "r2"}, {{"sp"}, "r4"}, {{"fp"}, "r5"}, {{"rv"}, "r8"}, 32326941Sdim {{"rr1"}, "r10"}, {{"rr2"}, "r11"}, {{"rca"}, "r15"}, 33326941Sdim}; 34326941Sdim 35326941SdimArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const { 36326941Sdim return llvm::makeArrayRef(GCCRegAliases); 37326941Sdim} 38326941Sdim 39326941Sdimbool LanaiTargetInfo::isValidCPUName(StringRef Name) const { 40326941Sdim return llvm::StringSwitch<bool>(Name).Case("v11", true).Default(false); 41326941Sdim} 42341825Sdimvoid LanaiTargetInfo::fillValidCPUList( 43341825Sdim SmallVectorImpl<StringRef> &Values) const { 44341825Sdim Values.emplace_back("v11"); 45341825Sdim} 46326941Sdim 47326941Sdimbool LanaiTargetInfo::setCPU(const std::string &Name) { 48326941Sdim CPU = llvm::StringSwitch<CPUKind>(Name).Case("v11", CK_V11).Default(CK_NONE); 49326941Sdim 50326941Sdim return CPU != CK_NONE; 51326941Sdim} 52326941Sdim 53326941Sdimbool LanaiTargetInfo::hasFeature(StringRef Feature) const { 54326941Sdim return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false); 55326941Sdim} 56326941Sdim 57326941Sdimvoid LanaiTargetInfo::getTargetDefines(const LangOptions &Opts, 58326941Sdim MacroBuilder &Builder) const { 59326941Sdim // Define __lanai__ when building for target lanai. 60326941Sdim Builder.defineMacro("__lanai__"); 61326941Sdim 62326941Sdim // Set define for the CPU specified. 63326941Sdim switch (CPU) { 64326941Sdim case CK_V11: 65326941Sdim Builder.defineMacro("__LANAI_V11__"); 66326941Sdim break; 67326941Sdim case CK_NONE: 68326941Sdim llvm_unreachable("Unhandled target CPU"); 69326941Sdim } 70326941Sdim} 71