106 lines · cpp
1//===- ARCMCTargetDesc.cpp - ARC Target Descriptions ------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file provides ARC specific target descriptions.10//11//===----------------------------------------------------------------------===//12 13#include "ARCMCTargetDesc.h"14#include "ARCInstPrinter.h"15#include "ARCMCAsmInfo.h"16#include "ARCTargetStreamer.h"17#include "TargetInfo/ARCTargetInfo.h"18#include "llvm/MC/MCDwarf.h"19#include "llvm/MC/MCInstrInfo.h"20#include "llvm/MC/MCRegisterInfo.h"21#include "llvm/MC/MCSubtargetInfo.h"22#include "llvm/MC/TargetRegistry.h"23#include "llvm/Support/ErrorHandling.h"24#include "llvm/Support/FormattedStream.h"25 26using namespace llvm;27 28#define GET_INSTRINFO_MC_DESC29#define ENABLE_INSTR_PREDICATE_VERIFIER30#include "ARCGenInstrInfo.inc"31 32#define GET_SUBTARGETINFO_MC_DESC33#include "ARCGenSubtargetInfo.inc"34 35#define GET_REGINFO_MC_DESC36#include "ARCGenRegisterInfo.inc"37 38static MCInstrInfo *createARCMCInstrInfo() {39 auto *X = new MCInstrInfo();40 InitARCMCInstrInfo(X);41 return X;42}43 44static MCRegisterInfo *createARCMCRegisterInfo(const Triple &TT) {45 auto *X = new MCRegisterInfo();46 InitARCMCRegisterInfo(X, ARC::BLINK);47 return X;48}49 50static MCSubtargetInfo *createARCMCSubtargetInfo(const Triple &TT,51 StringRef CPU, StringRef FS) {52 return createARCMCSubtargetInfoImpl(TT, CPU, /*TuneCPU=*/CPU, FS);53}54 55static MCAsmInfo *createARCMCAsmInfo(const MCRegisterInfo &MRI,56 const Triple &TT,57 const MCTargetOptions &Options) {58 MCAsmInfo *MAI = new ARCMCAsmInfo(TT);59 60 // Initial state of the frame pointer is SP.61 MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(nullptr, ARC::SP, 0);62 MAI->addInitialFrameState(Inst);63 64 return MAI;65}66 67static MCInstPrinter *createARCMCInstPrinter(const Triple &T,68 unsigned SyntaxVariant,69 const MCAsmInfo &MAI,70 const MCInstrInfo &MII,71 const MCRegisterInfo &MRI) {72 return new ARCInstPrinter(MAI, MII, MRI);73}74 75ARCTargetStreamer::ARCTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}76ARCTargetStreamer::~ARCTargetStreamer() = default;77 78static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S,79 formatted_raw_ostream &OS,80 MCInstPrinter *InstPrint) {81 return new ARCTargetStreamer(S);82}83 84// Force static initialization.85extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARCTargetMC() {86 // Register the MC asm info.87 Target &TheARCTarget = getTheARCTarget();88 RegisterMCAsmInfoFn X(TheARCTarget, createARCMCAsmInfo);89 90 // Register the MC instruction info.91 TargetRegistry::RegisterMCInstrInfo(TheARCTarget, createARCMCInstrInfo);92 93 // Register the MC register info.94 TargetRegistry::RegisterMCRegInfo(TheARCTarget, createARCMCRegisterInfo);95 96 // Register the MC subtarget info.97 TargetRegistry::RegisterMCSubtargetInfo(TheARCTarget,98 createARCMCSubtargetInfo);99 100 // Register the MCInstPrinter101 TargetRegistry::RegisterMCInstPrinter(TheARCTarget, createARCMCInstPrinter);102 103 TargetRegistry::RegisterAsmTargetStreamer(TheARCTarget,104 createTargetAsmStreamer);105}106