| //===-- RISCVSubtarget.cpp - RISCV Subtarget Information ------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements the RISCV specific subclass of TargetSubtargetInfo. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "RISCVSubtarget.h" |
| #include "RISCV.h" |
| #include "RISCVCallLowering.h" |
| #include "RISCVFrameLowering.h" |
| #include "RISCVLegalizerInfo.h" |
| #include "RISCVRegisterBankInfo.h" |
| #include "RISCVTargetMachine.h" |
| #include "llvm/Support/TargetRegistry.h" |
| |
| using namespace llvm; |
| |
| #define DEBUG_TYPE "riscv-subtarget" |
| |
| #define GET_SUBTARGETINFO_TARGET_DESC |
| #define GET_SUBTARGETINFO_CTOR |
| #include "RISCVGenSubtargetInfo.inc" |
| |
| void RISCVSubtarget::anchor() {} |
| |
| RISCVSubtarget &RISCVSubtarget::initializeSubtargetDependencies( |
| const Triple &TT, StringRef CPU, StringRef FS, StringRef ABIName) { |
| // Determine default and user-specified characteristics |
| bool Is64Bit = TT.isArch64Bit(); |
| std::string CPUName = CPU; |
| if (CPUName.empty()) |
| CPUName = Is64Bit ? "generic-rv64" : "generic-rv32"; |
| ParseSubtargetFeatures(CPUName, FS); |
| if (Is64Bit) { |
| XLenVT = MVT::i64; |
| XLen = 64; |
| } |
| |
| TargetABI = RISCVABI::computeTargetABI(TT, getFeatureBits(), ABIName); |
| RISCVFeatures::validate(TT, getFeatureBits()); |
| return *this; |
| } |
| |
| RISCVSubtarget::RISCVSubtarget(const Triple &TT, StringRef CPU, StringRef FS, |
| StringRef ABIName, const TargetMachine &TM) |
| : RISCVGenSubtargetInfo(TT, CPU, FS), |
| UserReservedRegister(RISCV::NUM_TARGET_REGS), |
| FrameLowering(initializeSubtargetDependencies(TT, CPU, FS, ABIName)), |
| InstrInfo(*this), RegInfo(getHwMode()), TLInfo(TM, *this) { |
| CallLoweringInfo.reset(new RISCVCallLowering(*getTargetLowering())); |
| Legalizer.reset(new RISCVLegalizerInfo(*this)); |
| |
| auto *RBI = new RISCVRegisterBankInfo(*getRegisterInfo()); |
| RegBankInfo.reset(RBI); |
| InstSelector.reset(createRISCVInstructionSelector( |
| *static_cast<const RISCVTargetMachine *>(&TM), *this, *RBI)); |
| } |
| |
| const CallLowering *RISCVSubtarget::getCallLowering() const { |
| return CallLoweringInfo.get(); |
| } |
| |
| InstructionSelector *RISCVSubtarget::getInstructionSelector() const { |
| return InstSelector.get(); |
| } |
| |
| const LegalizerInfo *RISCVSubtarget::getLegalizerInfo() const { |
| return Legalizer.get(); |
| } |
| |
| const RegisterBankInfo *RISCVSubtarget::getRegBankInfo() const { |
| return RegBankInfo.get(); |
| } |