111 lines
2.0 KiB
C++
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';
|
|
}
|