mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-05 14:34:55 +00:00
Add a XCoreTargetStreamer and port over the simple uses of EmitRawText.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200167 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
283b40e4d4
commit
7a04f6302e
@ -14,11 +14,13 @@
|
||||
#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"
|
||||
|
||||
#define GET_INSTRINFO_MC_DESC
|
||||
@ -88,6 +90,54 @@ static MCInstPrinter *createXCoreMCInstPrinter(const Target &T,
|
||||
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);
|
||||
virtual void emitCCTopData(StringRef Name);
|
||||
virtual void emitCCTopFunction(StringRef Name);
|
||||
virtual void emitCCBottonData(StringRef Name);
|
||||
virtual void emitCCBottonFunction(StringRef Name);
|
||||
};
|
||||
|
||||
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::emitCCBottonData(StringRef Name) {
|
||||
OS << "\t.cc_bottom " << Name << ".data\n";
|
||||
}
|
||||
|
||||
void XCoreTargetAsmStreamer::emitCCBottonFunction(StringRef Name) {
|
||||
OS << "\t.cc_bottom " << Name << ".function\n";
|
||||
}
|
||||
}
|
||||
|
||||
static MCStreamer *
|
||||
createXCoreMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
|
||||
bool isVerboseAsm, bool useLoc, bool useCFI,
|
||||
bool useDwarfDirectory, MCInstPrinter *InstPrint,
|
||||
MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) {
|
||||
MCStreamer *S =
|
||||
llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useLoc, useCFI,
|
||||
useDwarfDirectory, InstPrint, CE, TAB, ShowInst);
|
||||
new XCoreTargetAsmStreamer(*S, OS);
|
||||
return S;
|
||||
}
|
||||
|
||||
// Force static initialization.
|
||||
extern "C" void LLVMInitializeXCoreTargetMC() {
|
||||
// Register the MC asm info.
|
||||
@ -110,4 +160,6 @@ extern "C" void LLVMInitializeXCoreTargetMC() {
|
||||
// Register the MCInstPrinter
|
||||
TargetRegistry::RegisterMCInstPrinter(TheXCoreTarget,
|
||||
createXCoreMCInstPrinter);
|
||||
|
||||
TargetRegistry::RegisterAsmStreamer(TheXCoreTarget, createXCoreMCAsmStreamer);
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
#define DEBUG_TYPE "asm-printer"
|
||||
#include "XCore.h"
|
||||
#include "XCoreTargetStreamer.h"
|
||||
#include "InstPrinter/XCoreInstPrinter.h"
|
||||
#include "XCoreInstrInfo.h"
|
||||
#include "XCoreMCInstLower.h"
|
||||
@ -50,6 +51,8 @@ namespace {
|
||||
class XCoreAsmPrinter : public AsmPrinter {
|
||||
const XCoreSubtarget &Subtarget;
|
||||
XCoreMCInstLower MCInstLowering;
|
||||
XCoreTargetStreamer &getTargetStreamer();
|
||||
|
||||
public:
|
||||
explicit XCoreAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
|
||||
: AsmPrinter(TM, Streamer), Subtarget(TM.getSubtarget<XCoreSubtarget>()),
|
||||
@ -79,6 +82,10 @@ namespace {
|
||||
};
|
||||
} // end of anonymous namespace
|
||||
|
||||
XCoreTargetStreamer &XCoreAsmPrinter::getTargetStreamer() {
|
||||
return static_cast<XCoreTargetStreamer&>(*OutStreamer.getTargetStreamer());
|
||||
}
|
||||
|
||||
void XCoreAsmPrinter::emitArrayBound(MCSymbol *Sym, const GlobalVariable *GV) {
|
||||
assert(((GV->hasExternalLinkage() ||
|
||||
GV->hasWeakLinkage()) ||
|
||||
@ -114,8 +121,7 @@ void XCoreAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
unsigned Align = (unsigned)TD->getPreferredTypeAlignmentShift(C->getType());
|
||||
|
||||
// Mark the start of the global
|
||||
OutStreamer.EmitRawText("\t.cc_top " + Twine(GVSym->getName()) + ".data," +
|
||||
GVSym->getName());
|
||||
getTargetStreamer().emitCCTopData(GVSym->getName());
|
||||
|
||||
switch (GV->getLinkage()) {
|
||||
case GlobalValue::AppendingLinkage:
|
||||
@ -147,8 +153,7 @@ void XCoreAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
unsigned Size = TD->getTypeAllocSize(C->getType());
|
||||
if (MAI->hasDotTypeDotSizeDirective()) {
|
||||
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_ELF_TypeObject);
|
||||
OutStreamer.EmitRawText("\t.size " + Twine(GVSym->getName()) + "," +
|
||||
Twine(Size));
|
||||
OutStreamer.EmitELFSize(GVSym, MCConstantExpr::Create(Size, OutContext));
|
||||
}
|
||||
OutStreamer.EmitLabel(GVSym);
|
||||
|
||||
@ -159,7 +164,7 @@ void XCoreAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
OutStreamer.EmitZeros(4 - Size);
|
||||
|
||||
// Mark the end of the global
|
||||
OutStreamer.EmitRawText("\t.cc_bottom " + Twine(GVSym->getName()) + ".data");
|
||||
getTargetStreamer().emitCCBottonData(GVSym->getName());
|
||||
}
|
||||
|
||||
void XCoreAsmPrinter::EmitFunctionBodyStart() {
|
||||
@ -170,14 +175,12 @@ void XCoreAsmPrinter::EmitFunctionBodyStart() {
|
||||
/// the last basic block in the function.
|
||||
void XCoreAsmPrinter::EmitFunctionBodyEnd() {
|
||||
// Emit function end directives
|
||||
OutStreamer.EmitRawText("\t.cc_bottom " + Twine(CurrentFnSym->getName()) +
|
||||
".function");
|
||||
getTargetStreamer().emitCCBottonFunction(CurrentFnSym->getName());
|
||||
}
|
||||
|
||||
void XCoreAsmPrinter::EmitFunctionEntryLabel() {
|
||||
// Mark the start of the function
|
||||
OutStreamer.EmitRawText("\t.cc_top " + Twine(CurrentFnSym->getName()) +
|
||||
".function," + CurrentFnSym->getName());
|
||||
getTargetStreamer().emitCCTopFunction(CurrentFnSym->getName());
|
||||
OutStreamer.EmitLabel(CurrentFnSym);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user