mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Initial support for the cfi directives. This is just enough to get
f: .cfi_startproc nop .cfi_endproc assembled (on ELF). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121434 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
#include "llvm/Support/Format.h"
|
||||
#include "llvm/Support/FormattedStream.h"
|
||||
#include "llvm/Target/TargetLoweringObjectFile.h"
|
||||
#include "llvm/Target/TargetAsmInfo.h"
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
@@ -37,32 +38,26 @@ class MCAsmStreamer : public MCStreamer {
|
||||
SmallString<128> CommentToEmit;
|
||||
raw_svector_ostream CommentStream;
|
||||
|
||||
const TargetLoweringObjectFile *TLOF;
|
||||
int PointerSize;
|
||||
|
||||
unsigned IsLittleEndian : 1;
|
||||
unsigned IsVerboseAsm : 1;
|
||||
unsigned ShowInst : 1;
|
||||
unsigned UseLoc : 1;
|
||||
|
||||
bool needsSet(const MCExpr *Value);
|
||||
|
||||
public:
|
||||
MCAsmStreamer(MCContext &Context, formatted_raw_ostream &os,
|
||||
bool isLittleEndian, bool isVerboseAsm,
|
||||
const TargetLoweringObjectFile *tlof, int pointerSize,
|
||||
bool isVerboseAsm,
|
||||
bool useLoc,
|
||||
MCInstPrinter *printer, MCCodeEmitter *emitter, bool showInst)
|
||||
: MCStreamer(Context), OS(os), MAI(Context.getAsmInfo()),
|
||||
InstPrinter(printer), Emitter(emitter), CommentStream(CommentToEmit),
|
||||
TLOF(tlof), PointerSize(pointerSize),
|
||||
IsLittleEndian(isLittleEndian), IsVerboseAsm(isVerboseAsm),
|
||||
ShowInst(showInst) {
|
||||
IsVerboseAsm(isVerboseAsm),
|
||||
ShowInst(showInst), UseLoc(useLoc) {
|
||||
if (InstPrinter && IsVerboseAsm)
|
||||
InstPrinter->setCommentStream(CommentStream);
|
||||
}
|
||||
~MCAsmStreamer() {}
|
||||
|
||||
bool isLittleEndian() const { return IsLittleEndian; }
|
||||
|
||||
inline void EmitEOL() {
|
||||
// If we don't have any comments, just emit a \n.
|
||||
if (!IsVerboseAsm) {
|
||||
@@ -152,7 +147,8 @@ public:
|
||||
|
||||
virtual void EmitBytes(StringRef Data, unsigned AddrSpace);
|
||||
|
||||
virtual void EmitValue(const MCExpr *Value, unsigned Size,unsigned AddrSpace);
|
||||
virtual void EmitValueImpl(const MCExpr *Value, unsigned Size,
|
||||
bool isPCRel, unsigned AddrSpace);
|
||||
virtual void EmitIntValue(uint64_t Value, unsigned Size,
|
||||
unsigned AddrSpace = 0);
|
||||
|
||||
@@ -307,7 +303,8 @@ void MCAsmStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {
|
||||
void MCAsmStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
|
||||
const MCSymbol *LastLabel,
|
||||
const MCSymbol *Label) {
|
||||
EmitDwarfSetLineAddr(LineDelta, Label, PointerSize);
|
||||
EmitDwarfSetLineAddr(LineDelta, Label,
|
||||
getContext().getTargetAsmInfo().getPointerSize());
|
||||
}
|
||||
|
||||
void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
@@ -512,9 +509,10 @@ void MCAsmStreamer::EmitIntValue(uint64_t Value, unsigned Size,
|
||||
EmitValue(MCConstantExpr::Create(Value, getContext()), Size, AddrSpace);
|
||||
}
|
||||
|
||||
void MCAsmStreamer::EmitValue(const MCExpr *Value, unsigned Size,
|
||||
unsigned AddrSpace) {
|
||||
void MCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
|
||||
bool isPCRel, unsigned AddrSpace) {
|
||||
assert(CurSection && "Cannot emit contents before setting section!");
|
||||
assert(!isPCRel && "Cannot emit pc relative relocations!");
|
||||
const char *Directive = 0;
|
||||
switch (Size) {
|
||||
default: break;
|
||||
@@ -528,7 +526,7 @@ void MCAsmStreamer::EmitValue(const MCExpr *Value, unsigned Size,
|
||||
int64_t IntValue;
|
||||
if (!Value->EvaluateAsAbsolute(IntValue))
|
||||
report_fatal_error("Don't know how to emit this value.");
|
||||
if (isLittleEndian()) {
|
||||
if (getContext().getTargetAsmInfo().isLittleEndian()) {
|
||||
EmitIntValue((uint32_t)(IntValue >> 0 ), 4, AddrSpace);
|
||||
EmitIntValue((uint32_t)(IntValue >> 32), 4, AddrSpace);
|
||||
} else {
|
||||
@@ -662,7 +660,7 @@ void MCAsmStreamer::EmitFileDirective(StringRef Filename) {
|
||||
}
|
||||
|
||||
bool MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Filename){
|
||||
if (!TLOF) {
|
||||
if (UseLoc) {
|
||||
OS << "\t.file\t" << FileNo << ' ';
|
||||
PrintQuotedString(Filename, OS);
|
||||
EmitEOL();
|
||||
@@ -676,7 +674,7 @@ void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
|
||||
unsigned Discriminator) {
|
||||
this->MCStreamer::EmitDwarfLocDirective(FileNo, Line, Column, Flags,
|
||||
Isa, Discriminator);
|
||||
if (TLOF)
|
||||
if (!UseLoc)
|
||||
return;
|
||||
|
||||
OS << "\t.loc\t" << FileNo << " " << Line << " " << Column;
|
||||
@@ -829,7 +827,7 @@ void MCAsmStreamer::AddEncodingComment(const MCInst &Inst) {
|
||||
unsigned Bit = (Code[i] >> j) & 1;
|
||||
|
||||
unsigned FixupBit;
|
||||
if (IsLittleEndian)
|
||||
if (getContext().getTargetAsmInfo().isLittleEndian())
|
||||
FixupBit = i * 8 + j;
|
||||
else
|
||||
FixupBit = i * 8 + (7-j);
|
||||
@@ -855,7 +853,7 @@ void MCAsmStreamer::AddEncodingComment(const MCInst &Inst) {
|
||||
void MCAsmStreamer::EmitInstruction(const MCInst &Inst) {
|
||||
assert(CurSection && "Cannot emit contents before setting section!");
|
||||
|
||||
if (TLOF)
|
||||
if (!UseLoc)
|
||||
MCLineEntry::Make(this, getCurrentSection());
|
||||
|
||||
// Show the encoding in a comment if we have a code emitter.
|
||||
@@ -888,28 +886,15 @@ void MCAsmStreamer::EmitRawText(StringRef String) {
|
||||
|
||||
void MCAsmStreamer::Finish() {
|
||||
// Dump out the dwarf file & directory tables and line tables.
|
||||
if (getContext().hasDwarfFiles() && TLOF)
|
||||
MCDwarfFileTable::Emit(this, TLOF->getDwarfLineSection());
|
||||
if (getContext().hasDwarfFiles() && !UseLoc)
|
||||
MCDwarfFileTable::Emit(this);
|
||||
}
|
||||
|
||||
MCStreamer *llvm::createAsmStreamer(MCContext &Context,
|
||||
formatted_raw_ostream &OS,
|
||||
bool isLittleEndian,
|
||||
bool isVerboseAsm, MCInstPrinter *IP,
|
||||
bool isVerboseAsm, bool useLoc,
|
||||
MCInstPrinter *IP,
|
||||
MCCodeEmitter *CE, bool ShowInst) {
|
||||
return new MCAsmStreamer(Context, OS, isLittleEndian, isVerboseAsm,
|
||||
NULL, 0, IP, CE, ShowInst);
|
||||
}
|
||||
|
||||
|
||||
MCStreamer *llvm::createAsmStreamerNoLoc(MCContext &Context,
|
||||
formatted_raw_ostream &OS,
|
||||
bool isLittleEndian,
|
||||
bool isVerboseAsm,
|
||||
const TargetLoweringObjectFile *TLOF,
|
||||
int PointerSize,
|
||||
MCInstPrinter *IP,
|
||||
MCCodeEmitter *CE, bool ShowInst) {
|
||||
return new MCAsmStreamer(Context, OS, isLittleEndian, isVerboseAsm,
|
||||
TLOF, PointerSize, IP, CE, ShowInst);
|
||||
return new MCAsmStreamer(Context, OS, isVerboseAsm, useLoc,
|
||||
IP, CE, ShowInst);
|
||||
}
|
||||
|
Reference in New Issue
Block a user