//=====-- LanaiSubtarget.h - Define Subtarget for the Lanai -----*- C++ -*--==//
//
// 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 declares the Lanai specific subclass of TargetSubtarget.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_LANAI_LANAISUBTARGET_H
#define LLVM_LIB_TARGET_LANAI_LANAISUBTARGET_H

#include "LanaiFrameLowering.h"
#include "LanaiISelLowering.h"
#include "LanaiInstrInfo.h"
#include "LanaiSelectionDAGInfo.h"
#include "llvm/CodeGen/TargetFrameLowering.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/Target/TargetMachine.h"

#define GET_SUBTARGETINFO_HEADER
#include "LanaiGenSubtargetInfo.inc"

namespace llvm {

class LanaiSubtarget : public LanaiGenSubtargetInfo {
public:
  // This constructor initializes the data members to match that
  // of the specified triple.
  LanaiSubtarget(const Triple &TargetTriple, StringRef Cpu,
                 StringRef FeatureString, const TargetMachine &TM,
                 const TargetOptions &Options, CodeModel::Model CodeModel,
                 CodeGenOpt::Level OptLevel);

  // ParseSubtargetFeatures - Parses features string setting specified
  // subtarget options.  Definition of function is auto generated by tblgen.
  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);

  LanaiSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS);

  void initSubtargetFeatures(StringRef CPU, StringRef FS);

  bool enableMachineScheduler() const override { return true; }

  const LanaiInstrInfo *getInstrInfo() const override { return &InstrInfo; }

  const TargetFrameLowering *getFrameLowering() const override {
    return &FrameLowering;
  }

  const LanaiRegisterInfo *getRegisterInfo() const override {
    return &InstrInfo.getRegisterInfo();
  }

  const LanaiTargetLowering *getTargetLowering() const override {
    return &TLInfo;
  }

  const LanaiSelectionDAGInfo *getSelectionDAGInfo() const override {
    return &TSInfo;
  }

private:
  LanaiFrameLowering FrameLowering;
  LanaiInstrInfo InstrInfo;
  LanaiTargetLowering TLInfo;
  LanaiSelectionDAGInfo TSInfo;
};
} // namespace llvm

#endif // LLVM_LIB_TARGET_LANAI_LANAISUBTARGET_H
