mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-24 08:18:33 +00:00
Summary: This concludes the patch series to eliminate StringRef forms of GNU triples from the internals of LLVM that began in r239036. At this point, the StringRef-form of GNU Triples should only be used in the public API (including IR serialization) and a couple objects that directly interact with the API (most notably the Module class). The next step is to replace these Triple objects with the TargetTuple object that will represent our authoratative/unambiguous internal equivalent to GNU Triples. Reviewers: rengolin Subscribers: llvm-commits, jholewinski, ted, rengolin Differential Revision: http://reviews.llvm.org/D10962 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241472 91177308-0d34-0410-b5e6-96231b3b80d8
162 lines
5.4 KiB
C++
162 lines
5.4 KiB
C++
//===-- XCoreMCTargetDesc.cpp - XCore Target Descriptions -----------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file provides XCore specific target descriptions.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "XCoreMCTargetDesc.h"
|
|
#include "InstPrinter/XCoreInstPrinter.h"
|
|
#include "XCoreMCAsmInfo.h"
|
|
#include "XCoreTargetStreamer.h"
|
|
#include "llvm/MC/MCCodeGenInfo.h"
|
|
#include "llvm/MC/MCInstrInfo.h"
|
|
#include "llvm/MC/MCRegisterInfo.h"
|
|
#include "llvm/MC/MCSubtargetInfo.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 "XCoreGenInstrInfo.inc"
|
|
|
|
#define GET_SUBTARGETINFO_MC_DESC
|
|
#include "XCoreGenSubtargetInfo.inc"
|
|
|
|
#define GET_REGINFO_MC_DESC
|
|
#include "XCoreGenRegisterInfo.inc"
|
|
|
|
static MCInstrInfo *createXCoreMCInstrInfo() {
|
|
MCInstrInfo *X = new MCInstrInfo();
|
|
InitXCoreMCInstrInfo(X);
|
|
return X;
|
|
}
|
|
|
|
static MCRegisterInfo *createXCoreMCRegisterInfo(const Triple &TT) {
|
|
MCRegisterInfo *X = new MCRegisterInfo();
|
|
InitXCoreMCRegisterInfo(X, XCore::LR);
|
|
return X;
|
|
}
|
|
|
|
static MCSubtargetInfo *
|
|
createXCoreMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
|
|
MCSubtargetInfo *X = new MCSubtargetInfo();
|
|
InitXCoreMCSubtargetInfo(X, TT, CPU, FS);
|
|
return X;
|
|
}
|
|
|
|
static MCAsmInfo *createXCoreMCAsmInfo(const MCRegisterInfo &MRI,
|
|
const Triple &TT) {
|
|
MCAsmInfo *MAI = new XCoreMCAsmInfo(TT);
|
|
|
|
// Initial state of the frame pointer is SP.
|
|
MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, XCore::SP, 0);
|
|
MAI->addInitialFrameState(Inst);
|
|
|
|
return MAI;
|
|
}
|
|
|
|
static MCCodeGenInfo *createXCoreMCCodeGenInfo(const Triple &TT,
|
|
Reloc::Model RM,
|
|
CodeModel::Model CM,
|
|
CodeGenOpt::Level OL) {
|
|
MCCodeGenInfo *X = new MCCodeGenInfo();
|
|
if (RM == Reloc::Default) {
|
|
RM = Reloc::Static;
|
|
}
|
|
if (CM == CodeModel::Default) {
|
|
CM = CodeModel::Small;
|
|
}
|
|
if (CM != CodeModel::Small && CM != CodeModel::Large)
|
|
report_fatal_error("Target only supports CodeModel Small or Large");
|
|
|
|
X->initMCCodeGenInfo(RM, CM, OL);
|
|
return X;
|
|
}
|
|
|
|
static MCInstPrinter *createXCoreMCInstPrinter(const Triple &T,
|
|
unsigned SyntaxVariant,
|
|
const MCAsmInfo &MAI,
|
|
const MCInstrInfo &MII,
|
|
const MCRegisterInfo &MRI) {
|
|
return new XCoreInstPrinter(MAI, MII, MRI);
|
|
}
|
|
|
|
XCoreTargetStreamer::XCoreTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
|
|
XCoreTargetStreamer::~XCoreTargetStreamer() {}
|
|
|
|
namespace {
|
|
|
|
class XCoreTargetAsmStreamer : public XCoreTargetStreamer {
|
|
formatted_raw_ostream &OS;
|
|
public:
|
|
XCoreTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
|
|
void emitCCTopData(StringRef Name) override;
|
|
void emitCCTopFunction(StringRef Name) override;
|
|
void emitCCBottomData(StringRef Name) override;
|
|
void emitCCBottomFunction(StringRef Name) override;
|
|
};
|
|
|
|
XCoreTargetAsmStreamer::XCoreTargetAsmStreamer(MCStreamer &S,
|
|
formatted_raw_ostream &OS)
|
|
: XCoreTargetStreamer(S), OS(OS) {}
|
|
|
|
void XCoreTargetAsmStreamer::emitCCTopData(StringRef Name) {
|
|
OS << "\t.cc_top " << Name << ".data," << Name << '\n';
|
|
}
|
|
|
|
void XCoreTargetAsmStreamer::emitCCTopFunction(StringRef Name) {
|
|
OS << "\t.cc_top " << Name << ".function," << Name << '\n';
|
|
}
|
|
|
|
void XCoreTargetAsmStreamer::emitCCBottomData(StringRef Name) {
|
|
OS << "\t.cc_bottom " << Name << ".data\n";
|
|
}
|
|
|
|
void XCoreTargetAsmStreamer::emitCCBottomFunction(StringRef Name) {
|
|
OS << "\t.cc_bottom " << Name << ".function\n";
|
|
}
|
|
}
|
|
|
|
static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S,
|
|
formatted_raw_ostream &OS,
|
|
MCInstPrinter *InstPrint,
|
|
bool isVerboseAsm) {
|
|
return new XCoreTargetAsmStreamer(S, OS);
|
|
}
|
|
|
|
// Force static initialization.
|
|
extern "C" void LLVMInitializeXCoreTargetMC() {
|
|
// Register the MC asm info.
|
|
RegisterMCAsmInfoFn X(TheXCoreTarget, createXCoreMCAsmInfo);
|
|
|
|
// Register the MC codegen info.
|
|
TargetRegistry::RegisterMCCodeGenInfo(TheXCoreTarget,
|
|
createXCoreMCCodeGenInfo);
|
|
|
|
// Register the MC instruction info.
|
|
TargetRegistry::RegisterMCInstrInfo(TheXCoreTarget, createXCoreMCInstrInfo);
|
|
|
|
// Register the MC register info.
|
|
TargetRegistry::RegisterMCRegInfo(TheXCoreTarget, createXCoreMCRegisterInfo);
|
|
|
|
// Register the MC subtarget info.
|
|
TargetRegistry::RegisterMCSubtargetInfo(TheXCoreTarget,
|
|
createXCoreMCSubtargetInfo);
|
|
|
|
// Register the MCInstPrinter
|
|
TargetRegistry::RegisterMCInstPrinter(TheXCoreTarget,
|
|
createXCoreMCInstPrinter);
|
|
|
|
TargetRegistry::RegisterAsmTargetStreamer(TheXCoreTarget,
|
|
createTargetAsmStreamer);
|
|
}
|