Path: blob/main/contrib/llvm-project/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCTargetDesc.cpp
35294 views
//===-- CSKYMCTargetDesc.cpp - CSKY Target Descriptions -------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7///8/// This file provides CSKY specific target descriptions.9///10//===----------------------------------------------------------------------===//1112#include "CSKYMCTargetDesc.h"13#include "CSKYAsmBackend.h"14#include "CSKYELFStreamer.h"15#include "CSKYInstPrinter.h"16#include "CSKYMCAsmInfo.h"17#include "CSKYMCCodeEmitter.h"18#include "CSKYTargetStreamer.h"19#include "TargetInfo/CSKYTargetInfo.h"20#include "llvm/MC/MCAssembler.h"21#include "llvm/MC/MCInstrAnalysis.h"22#include "llvm/MC/MCInstrInfo.h"23#include "llvm/MC/MCRegisterInfo.h"24#include "llvm/MC/MCSubtargetInfo.h"25#include "llvm/MC/TargetRegistry.h"2627#define GET_INSTRINFO_MC_DESC28#define ENABLE_INSTR_PREDICATE_VERIFIER29#include "CSKYGenInstrInfo.inc"3031#define GET_REGINFO_MC_DESC32#include "CSKYGenRegisterInfo.inc"3334#define GET_SUBTARGETINFO_MC_DESC35#include "CSKYGenSubtargetInfo.inc"3637using namespace llvm;3839static MCAsmInfo *createCSKYMCAsmInfo(const MCRegisterInfo &MRI,40const Triple &TT,41const MCTargetOptions &Options) {42MCAsmInfo *MAI = new CSKYMCAsmInfo(TT);4344// Initial state of the frame pointer is SP.45unsigned Reg = MRI.getDwarfRegNum(CSKY::R14, true);46MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(nullptr, Reg, 0);47MAI->addInitialFrameState(Inst);48return MAI;49}5051static MCInstrInfo *createCSKYMCInstrInfo() {52MCInstrInfo *Info = new MCInstrInfo();53InitCSKYMCInstrInfo(Info);54return Info;55}5657static MCInstPrinter *createCSKYMCInstPrinter(const Triple &T,58unsigned SyntaxVariant,59const MCAsmInfo &MAI,60const MCInstrInfo &MII,61const MCRegisterInfo &MRI) {62return new CSKYInstPrinter(MAI, MII, MRI);63}6465static MCRegisterInfo *createCSKYMCRegisterInfo(const Triple &TT) {66MCRegisterInfo *Info = new MCRegisterInfo();67InitCSKYMCRegisterInfo(Info, CSKY::R15);68return Info;69}7071static MCSubtargetInfo *createCSKYMCSubtargetInfo(const Triple &TT,72StringRef CPU, StringRef FS) {73std::string CPUName = std::string(CPU);74if (CPUName.empty())75CPUName = "generic";76return createCSKYMCSubtargetInfoImpl(TT, CPUName, /*TuneCPU=*/CPUName, FS);77}7879static MCTargetStreamer *80createCSKYObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {81const Triple &TT = STI.getTargetTriple();82if (TT.isOSBinFormatELF())83return new CSKYTargetELFStreamer(S, STI);84return nullptr;85}8687static MCStreamer *createELFStreamer(const Triple &T, MCContext &Ctx,88std::unique_ptr<MCAsmBackend> &&MAB,89std::unique_ptr<MCObjectWriter> &&OW,90std::unique_ptr<MCCodeEmitter> &&Emitter) {91CSKYELFStreamer *S = new CSKYELFStreamer(Ctx, std::move(MAB), std::move(OW),92std::move(Emitter));9394return S;95}9697static MCTargetStreamer *98createCSKYAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS,99MCInstPrinter *InstPrinter) {100return new CSKYTargetAsmStreamer(S, OS);101}102103static MCTargetStreamer *createCSKYNullTargetStreamer(MCStreamer &S) {104return new CSKYTargetStreamer(S);105}106107namespace {108109class CSKYMCInstrAnalysis : public MCInstrAnalysis {110public:111explicit CSKYMCInstrAnalysis(const MCInstrInfo *Info)112: MCInstrAnalysis(Info) {}113114bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,115uint64_t &Target) const override {116if (isConditionalBranch(Inst) || isUnconditionalBranch(Inst)) {117int64_t Imm;118Imm = Inst.getOperand(Inst.getNumOperands() - 1).getImm();119Target = Addr + Imm;120return true;121}122123if (Inst.getOpcode() == CSKY::BSR32) {124Target = Addr + Inst.getOperand(0).getImm();125return true;126}127128switch (Inst.getOpcode()) {129default:130return false;131case CSKY::LRW16:132case CSKY::LRW32:133case CSKY::JSRI32:134case CSKY::JMPI32:135int64_t Imm = Inst.getOperand(Inst.getNumOperands() - 1).getImm();136Target = ((Addr + Imm) & 0xFFFFFFFC);137return true;138}139140return false;141}142};143144} // end anonymous namespace145146static MCInstrAnalysis *createCSKYInstrAnalysis(const MCInstrInfo *Info) {147return new CSKYMCInstrAnalysis(Info);148}149150extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeCSKYTargetMC() {151auto &CSKYTarget = getTheCSKYTarget();152TargetRegistry::RegisterMCAsmBackend(CSKYTarget, createCSKYAsmBackend);153TargetRegistry::RegisterMCAsmInfo(CSKYTarget, createCSKYMCAsmInfo);154TargetRegistry::RegisterMCInstrInfo(CSKYTarget, createCSKYMCInstrInfo);155TargetRegistry::RegisterMCRegInfo(CSKYTarget, createCSKYMCRegisterInfo);156TargetRegistry::RegisterMCCodeEmitter(CSKYTarget, createCSKYMCCodeEmitter);157TargetRegistry::RegisterMCInstPrinter(CSKYTarget, createCSKYMCInstPrinter);158TargetRegistry::RegisterMCSubtargetInfo(CSKYTarget,159createCSKYMCSubtargetInfo);160TargetRegistry::RegisterELFStreamer(CSKYTarget, createELFStreamer);161TargetRegistry::RegisterObjectTargetStreamer(CSKYTarget,162createCSKYObjectTargetStreamer);163TargetRegistry::RegisterAsmTargetStreamer(CSKYTarget,164createCSKYAsmTargetStreamer);165// Register the null target streamer.166TargetRegistry::RegisterNullTargetStreamer(CSKYTarget,167createCSKYNullTargetStreamer);168TargetRegistry::RegisterMCInstrAnalysis(CSKYTarget, createCSKYInstrAnalysis);169}170171172