mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-13 09:33:50 +00:00
Hoist some grossly duplicated code from the COFF/ELF/MachO streamers into MCObjectStreamer.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165225 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ee700cfc94
commit
e660fc15fe
@ -72,6 +72,13 @@ public:
|
|||||||
virtual void ChangeSection(const MCSection *Section);
|
virtual void ChangeSection(const MCSection *Section);
|
||||||
virtual void EmitInstruction(const MCInst &Inst);
|
virtual void EmitInstruction(const MCInst &Inst);
|
||||||
virtual void EmitInstToFragment(const MCInst &Inst);
|
virtual void EmitInstToFragment(const MCInst &Inst);
|
||||||
|
virtual void EmitBytes(StringRef Data, unsigned AddrSpace);
|
||||||
|
virtual void EmitValueToAlignment(unsigned ByteAlignment,
|
||||||
|
int64_t Value = 0,
|
||||||
|
unsigned ValueSize = 1,
|
||||||
|
unsigned MaxBytesToEmit = 0);
|
||||||
|
virtual void EmitCodeAlignment(unsigned ByteAlignment,
|
||||||
|
unsigned MaxBytesToEmit = 0);
|
||||||
virtual bool EmitValueToOffset(const MCExpr *Offset, unsigned char Value);
|
virtual bool EmitValueToOffset(const MCExpr *Offset, unsigned char Value);
|
||||||
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
|
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
|
||||||
const MCSymbol *LastLabel,
|
const MCSymbol *LastLabel,
|
||||||
|
@ -98,12 +98,6 @@ public:
|
|||||||
uint64_t Size, unsigned ByteAlignment = 0) {
|
uint64_t Size, unsigned ByteAlignment = 0) {
|
||||||
llvm_unreachable("ELF doesn't support this directive");
|
llvm_unreachable("ELF doesn't support this directive");
|
||||||
}
|
}
|
||||||
virtual void EmitBytes(StringRef Data, unsigned AddrSpace);
|
|
||||||
virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,
|
|
||||||
unsigned ValueSize = 1,
|
|
||||||
unsigned MaxBytesToEmit = 0);
|
|
||||||
virtual void EmitCodeAlignment(unsigned ByteAlignment,
|
|
||||||
unsigned MaxBytesToEmit = 0);
|
|
||||||
virtual void EmitValueImpl(const MCExpr *Value, unsigned Size,
|
virtual void EmitValueImpl(const MCExpr *Value, unsigned Size,
|
||||||
unsigned AddrSpace);
|
unsigned AddrSpace);
|
||||||
|
|
||||||
@ -355,42 +349,6 @@ void MCELFStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
|||||||
EmitCommonSymbol(Symbol, Size, ByteAlignment);
|
EmitCommonSymbol(Symbol, Size, ByteAlignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCELFStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) {
|
|
||||||
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
|
||||||
// MCObjectStreamer.
|
|
||||||
getOrCreateDataFragment()->getContents().append(Data.begin(), Data.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
void MCELFStreamer::EmitValueToAlignment(unsigned ByteAlignment,
|
|
||||||
int64_t Value, unsigned ValueSize,
|
|
||||||
unsigned MaxBytesToEmit) {
|
|
||||||
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
|
||||||
// MCObjectStreamer.
|
|
||||||
if (MaxBytesToEmit == 0)
|
|
||||||
MaxBytesToEmit = ByteAlignment;
|
|
||||||
new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit,
|
|
||||||
getCurrentSectionData());
|
|
||||||
|
|
||||||
// Update the maximum alignment on the current section if necessary.
|
|
||||||
if (ByteAlignment > getCurrentSectionData()->getAlignment())
|
|
||||||
getCurrentSectionData()->setAlignment(ByteAlignment);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MCELFStreamer::EmitCodeAlignment(unsigned ByteAlignment,
|
|
||||||
unsigned MaxBytesToEmit) {
|
|
||||||
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
|
||||||
// MCObjectStreamer.
|
|
||||||
if (MaxBytesToEmit == 0)
|
|
||||||
MaxBytesToEmit = ByteAlignment;
|
|
||||||
MCAlignFragment *F = new MCAlignFragment(ByteAlignment, 0, 1, MaxBytesToEmit,
|
|
||||||
getCurrentSectionData());
|
|
||||||
F->setEmitNops(true);
|
|
||||||
|
|
||||||
// Update the maximum alignment on the current section if necessary.
|
|
||||||
if (ByteAlignment > getCurrentSectionData()->getAlignment())
|
|
||||||
getCurrentSectionData()->setAlignment(ByteAlignment);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MCELFStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
|
void MCELFStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
|
||||||
unsigned AddrSpace) {
|
unsigned AddrSpace) {
|
||||||
fixSymbolsInTLSFixups(Value);
|
fixSymbolsInTLSFixups(Value);
|
||||||
|
@ -75,12 +75,6 @@ public:
|
|||||||
uint64_t Size = 0, unsigned ByteAlignment = 0);
|
uint64_t Size = 0, unsigned ByteAlignment = 0);
|
||||||
virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
|
virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
|
||||||
uint64_t Size, unsigned ByteAlignment = 0);
|
uint64_t Size, unsigned ByteAlignment = 0);
|
||||||
virtual void EmitBytes(StringRef Data, unsigned AddrSpace);
|
|
||||||
virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,
|
|
||||||
unsigned ValueSize = 1,
|
|
||||||
unsigned MaxBytesToEmit = 0);
|
|
||||||
virtual void EmitCodeAlignment(unsigned ByteAlignment,
|
|
||||||
unsigned MaxBytesToEmit = 0);
|
|
||||||
|
|
||||||
virtual void EmitFileDirective(StringRef Filename) {
|
virtual void EmitFileDirective(StringRef Filename) {
|
||||||
// FIXME: Just ignore the .file; it isn't important enough to fail the
|
// FIXME: Just ignore the .file; it isn't important enough to fail the
|
||||||
@ -372,42 +366,6 @@ void MCMachOStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCMachOStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) {
|
|
||||||
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
|
||||||
// MCObjectStreamer.
|
|
||||||
getOrCreateDataFragment()->getContents().append(Data.begin(), Data.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
void MCMachOStreamer::EmitValueToAlignment(unsigned ByteAlignment,
|
|
||||||
int64_t Value, unsigned ValueSize,
|
|
||||||
unsigned MaxBytesToEmit) {
|
|
||||||
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
|
||||||
// MCObjectStreamer.
|
|
||||||
if (MaxBytesToEmit == 0)
|
|
||||||
MaxBytesToEmit = ByteAlignment;
|
|
||||||
new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit,
|
|
||||||
getCurrentSectionData());
|
|
||||||
|
|
||||||
// Update the maximum alignment on the current section if necessary.
|
|
||||||
if (ByteAlignment > getCurrentSectionData()->getAlignment())
|
|
||||||
getCurrentSectionData()->setAlignment(ByteAlignment);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MCMachOStreamer::EmitCodeAlignment(unsigned ByteAlignment,
|
|
||||||
unsigned MaxBytesToEmit) {
|
|
||||||
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
|
||||||
// MCObjectStreamer.
|
|
||||||
if (MaxBytesToEmit == 0)
|
|
||||||
MaxBytesToEmit = ByteAlignment;
|
|
||||||
MCAlignFragment *F = new MCAlignFragment(ByteAlignment, 0, 1, MaxBytesToEmit,
|
|
||||||
getCurrentSectionData());
|
|
||||||
F->setEmitNops(true);
|
|
||||||
|
|
||||||
// Update the maximum alignment on the current section if necessary.
|
|
||||||
if (ByteAlignment > getCurrentSectionData()->getAlignment())
|
|
||||||
getCurrentSectionData()->setAlignment(ByteAlignment);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MCMachOStreamer::EmitInstToData(const MCInst &Inst) {
|
void MCMachOStreamer::EmitInstToData(const MCInst &Inst) {
|
||||||
MCDataFragment *DF = getOrCreateDataFragment();
|
MCDataFragment *DF = getOrCreateDataFragment();
|
||||||
|
|
||||||
|
@ -232,6 +232,31 @@ void MCObjectStreamer::EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
|
|||||||
new MCDwarfCallFrameFragment(*AddrDelta, getCurrentSectionData());
|
new MCDwarfCallFrameFragment(*AddrDelta, getCurrentSectionData());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MCObjectStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) {
|
||||||
|
assert(AddrSpace == 0 && "Address space must be 0!");
|
||||||
|
getOrCreateDataFragment()->getContents().append(Data.begin(), Data.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MCObjectStreamer::EmitValueToAlignment(unsigned ByteAlignment,
|
||||||
|
int64_t Value,
|
||||||
|
unsigned ValueSize,
|
||||||
|
unsigned MaxBytesToEmit) {
|
||||||
|
if (MaxBytesToEmit == 0)
|
||||||
|
MaxBytesToEmit = ByteAlignment;
|
||||||
|
new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit,
|
||||||
|
getCurrentSectionData());
|
||||||
|
|
||||||
|
// Update the maximum alignment on the current section if necessary.
|
||||||
|
if (ByteAlignment > getCurrentSectionData()->getAlignment())
|
||||||
|
getCurrentSectionData()->setAlignment(ByteAlignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MCObjectStreamer::EmitCodeAlignment(unsigned ByteAlignment,
|
||||||
|
unsigned MaxBytesToEmit) {
|
||||||
|
EmitValueToAlignment(ByteAlignment, 0, 1, MaxBytesToEmit);
|
||||||
|
cast<MCAlignFragment>(getCurrentFragment())->setEmitNops(true);
|
||||||
|
}
|
||||||
|
|
||||||
bool MCObjectStreamer::EmitValueToOffset(const MCExpr *Offset,
|
bool MCObjectStreamer::EmitValueToOffset(const MCExpr *Offset,
|
||||||
unsigned char Value) {
|
unsigned char Value) {
|
||||||
int64_t Res;
|
int64_t Res;
|
||||||
|
@ -70,11 +70,6 @@ public:
|
|||||||
uint64_t Size,unsigned ByteAlignment);
|
uint64_t Size,unsigned ByteAlignment);
|
||||||
virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
|
virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
|
||||||
uint64_t Size, unsigned ByteAlignment);
|
uint64_t Size, unsigned ByteAlignment);
|
||||||
virtual void EmitBytes(StringRef Data, unsigned AddrSpace);
|
|
||||||
virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value,
|
|
||||||
unsigned ValueSize, unsigned MaxBytesToEmit);
|
|
||||||
virtual void EmitCodeAlignment(unsigned ByteAlignment,
|
|
||||||
unsigned MaxBytesToEmit);
|
|
||||||
virtual void EmitFileDirective(StringRef Filename);
|
virtual void EmitFileDirective(StringRef Filename);
|
||||||
virtual void EmitInstruction(const MCInst &Instruction);
|
virtual void EmitInstruction(const MCInst &Instruction);
|
||||||
virtual void EmitWin64EHHandlerData();
|
virtual void EmitWin64EHHandlerData();
|
||||||
@ -333,43 +328,6 @@ void WinCOFFStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
|
|||||||
llvm_unreachable("not implemented");
|
llvm_unreachable("not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
void WinCOFFStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) {
|
|
||||||
// TODO: This is copied exactly from the MachOStreamer. Consider merging into
|
|
||||||
// MCObjectStreamer?
|
|
||||||
getOrCreateDataFragment()->getContents().append(Data.begin(), Data.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
void WinCOFFStreamer::EmitValueToAlignment(unsigned ByteAlignment,
|
|
||||||
int64_t Value,
|
|
||||||
unsigned ValueSize,
|
|
||||||
unsigned MaxBytesToEmit) {
|
|
||||||
// TODO: This is copied exactly from the MachOStreamer. Consider merging into
|
|
||||||
// MCObjectStreamer?
|
|
||||||
if (MaxBytesToEmit == 0)
|
|
||||||
MaxBytesToEmit = ByteAlignment;
|
|
||||||
new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit,
|
|
||||||
getCurrentSectionData());
|
|
||||||
|
|
||||||
// Update the maximum alignment on the current section if necessary.
|
|
||||||
if (ByteAlignment > getCurrentSectionData()->getAlignment())
|
|
||||||
getCurrentSectionData()->setAlignment(ByteAlignment);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WinCOFFStreamer::EmitCodeAlignment(unsigned ByteAlignment,
|
|
||||||
unsigned MaxBytesToEmit) {
|
|
||||||
// TODO: This is copied exactly from the MachOStreamer. Consider merging into
|
|
||||||
// MCObjectStreamer?
|
|
||||||
if (MaxBytesToEmit == 0)
|
|
||||||
MaxBytesToEmit = ByteAlignment;
|
|
||||||
MCAlignFragment *F = new MCAlignFragment(ByteAlignment, 0, 1, MaxBytesToEmit,
|
|
||||||
getCurrentSectionData());
|
|
||||||
F->setEmitNops(true);
|
|
||||||
|
|
||||||
// Update the maximum alignment on the current section if necessary.
|
|
||||||
if (ByteAlignment > getCurrentSectionData()->getAlignment())
|
|
||||||
getCurrentSectionData()->setAlignment(ByteAlignment);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WinCOFFStreamer::EmitFileDirective(StringRef Filename) {
|
void WinCOFFStreamer::EmitFileDirective(StringRef Filename) {
|
||||||
// Ignore for now, linkers don't care, and proper debug
|
// Ignore for now, linkers don't care, and proper debug
|
||||||
// info will be a much large effort.
|
// info will be a much large effort.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user