llvm-65816/lib/Target/WDC65816/MCTargetDesc/WDC65816TargetStreamer.cpp

111 lines
2.0 KiB
C++

//
// WDC65816TargetAsmStreamer.cpp
// llvm
//
// Created by Jeremy Rand on 2016-04-11.
// Copyright © 2016 Jeremy Rand. All rights reserved.
//
#include "WDC65816.h"
#include "WDC65816TargetStreamer.h"
#include "llvm/Support/FormattedStream.h"
using namespace llvm;
// pin vtable to this file
void WDC65816TargetStreamer::anchor() {}
WDC65816TargetAsmStreamer::~WDC65816TargetAsmStreamer()
{
}
StringRef &WDC65816TargetAsmStreamer::trimFilename(StringRef &filename)
{
size_t lastSlash = filename.find_last_of('/');
if (lastSlash != StringRef::npos) {
filename = filename.drop_front(lastSlash + 1);
}
size_t lastPeriod = filename.find_last_of('.');
if (lastPeriod != StringRef::npos) {
filename = filename.substr(0, lastPeriod);
}
return filename;
}
void WDC65816TargetAsmStreamer::EmitCaseDirective(void)
{
OS << indent;
OS << "case on";
OS << '\n';
}
void WDC65816TargetAsmStreamer::EmitKeepDirective(StringRef filename)
{
OS << indent;
OS << "keep ";
OS << trimFilename(filename);
OS << '\n';
}
void WDC65816TargetAsmStreamer::EmitSegStartDirective(StringRef filename)
{
StringRef trimmedName = trimFilename(filename);
int col = 1;
OS << "~";
col++;
OS << trimFilename(filename);
col += trimmedName.size();
while (col < indentlen) {
OS << " ";
col++;
}
OS << " start";
OS << '\n';
}
void WDC65816TargetAsmStreamer::EmitSegEndDirective(void)
{
OS << indent;
OS << "end";
OS << '\n';
}
void WDC65816TargetAsmStreamer::EmitFunctionEntryLabel(StringRef function)
{
int col = 1;
OS << function;
col += function.size();
while (col < indentlen) {
OS << " ";
col++;
}
OS << " entry";
OS << '\n';
}
void WDC65816TargetAsmStreamer::EmitInstruction(StringRef instruction)
{
instruction = instruction.ltrim();
OS << indent;
OS << instruction;
OS << '\n';
}