diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
commit | 344a3780b2e33f6ca763666c380202b18aab72a3 (patch) | |
tree | f0b203ee6eb71d7fdd792373e3c81eb18d6934dd /llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp | |
parent | b60736ec1405bb0a8dd40989f67ef4c93da068ab (diff) | |
download | src-344a3780b2e33f6ca763666c380202b18aab72a3.tar.gz src-344a3780b2e33f6ca763666c380202b18aab72a3.zip |
Vendor import of llvm-project main 88e66fa60ae5, the last commit beforevendor/llvm-project/llvmorg-13-init-16847-g88e66fa60ae5vendor/llvm-project/llvmorg-12.0.1-rc2-0-ge7dac564cd0evendor/llvm-project/llvmorg-12.0.1-0-gfed41342a82f
the upstream release/13.x branch was created.
Diffstat (limited to 'llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp')
-rw-r--r-- | llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp new file mode 100644 index 000000000000..0a438ea042be --- /dev/null +++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp @@ -0,0 +1,135 @@ +//===-- M68kMCTargetDesc.cpp - M68k Target Descriptions -----*- 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 +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file provides M68k target specific descriptions. +/// +//===----------------------------------------------------------------------===// + +#include "M68kMCTargetDesc.h" +#include "M68kInstPrinter.h" +#include "M68kMCAsmInfo.h" +#include "TargetInfo/M68kTargetInfo.h" + +#include "llvm/MC/MCELFStreamer.h" +#include "llvm/MC/MCInstPrinter.h" +#include "llvm/MC/MCInstrInfo.h" +#include "llvm/MC/MCRegisterInfo.h" +#include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/MC/MCSymbol.h" +#include "llvm/MC/MachineLocation.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/FormattedStream.h" +#include "llvm/Support/TargetRegistry.h" + +using namespace llvm; + +#define GET_INSTRINFO_MC_DESC +#include "M68kGenInstrInfo.inc" + +#define GET_SUBTARGETINFO_MC_DESC +#include "M68kGenSubtargetInfo.inc" + +#define GET_REGINFO_MC_DESC +#include "M68kGenRegisterInfo.inc" + +// TODO Implement feature set parsing logics +static std::string ParseM68kTriple(const Triple &TT, StringRef CPU) { + return ""; +} + +static MCInstrInfo *createM68kMCInstrInfo() { + MCInstrInfo *X = new MCInstrInfo(); + InitM68kMCInstrInfo(X); // defined in M68kGenInstrInfo.inc + return X; +} + +static MCRegisterInfo *createM68kMCRegisterInfo(const Triple &TT) { + MCRegisterInfo *X = new MCRegisterInfo(); + InitM68kMCRegisterInfo(X, llvm::M68k::A0, 0, 0, llvm::M68k::PC); + return X; +} + +static MCSubtargetInfo *createM68kMCSubtargetInfo(const Triple &TT, + StringRef CPU, StringRef FS) { + std::string ArchFS = ParseM68kTriple(TT, CPU); + if (!FS.empty()) { + if (!ArchFS.empty()) { + ArchFS = (ArchFS + "," + FS).str(); + } else { + ArchFS = FS.str(); + } + } + return createM68kMCSubtargetInfoImpl(TT, CPU, /*TuneCPU=*/CPU, ArchFS); +} + +static MCAsmInfo *createM68kMCAsmInfo(const MCRegisterInfo &MRI, + const Triple &TT, + const MCTargetOptions &TO) { + MCAsmInfo *MAI = new M68kELFMCAsmInfo(TT); + + // Initialize initial frame state. + // Calculate amount of bytes used for return address storing + int StackGrowth = -4; + + // Initial state of the frame pointer is SP+StackGrowth. + // TODO: Add tests for `cfi_*` directives + MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa( + nullptr, MRI.getDwarfRegNum(llvm::M68k::SP, true), -StackGrowth); + MAI->addInitialFrameState(Inst); + + // Add return address to move list + Inst = MCCFIInstruction::createOffset( + nullptr, MRI.getDwarfRegNum(M68k::PC, true), StackGrowth); + MAI->addInitialFrameState(Inst); + + return MAI; +} + +static MCRelocationInfo *createM68kMCRelocationInfo(const Triple &TheTriple, + MCContext &Ctx) { + // Default to the stock relocation info. + return llvm::createMCRelocationInfo(TheTriple, Ctx); +} + +static MCInstPrinter *createM68kMCInstPrinter(const Triple &T, + unsigned SyntaxVariant, + const MCAsmInfo &MAI, + const MCInstrInfo &MII, + const MCRegisterInfo &MRI) { + return new M68kInstPrinter(MAI, MII, MRI); +} + +extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeM68kTargetMC() { + Target &T = getTheM68kTarget(); + + // Register the MC asm info. + RegisterMCAsmInfoFn X(T, createM68kMCAsmInfo); + + // Register the MC instruction info. + TargetRegistry::RegisterMCInstrInfo(T, createM68kMCInstrInfo); + + // Register the MC register info. + TargetRegistry::RegisterMCRegInfo(T, createM68kMCRegisterInfo); + + // Register the MC subtarget info. + TargetRegistry::RegisterMCSubtargetInfo(T, createM68kMCSubtargetInfo); + + // Register the code emitter. + TargetRegistry::RegisterMCCodeEmitter(T, createM68kMCCodeEmitter); + + // Register the MCInstPrinter. + TargetRegistry::RegisterMCInstPrinter(T, createM68kMCInstPrinter); + + // Register the MC relocation info. + TargetRegistry::RegisterMCRelocationInfo(T, createM68kMCRelocationInfo); + + // Register the asm backend. + TargetRegistry::RegisterMCAsmBackend(T, createM68kAsmBackend); +} |