mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +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 EmitInstruction(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 void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
|
||||
const MCSymbol *LastLabel,
|
||||
|
@ -98,12 +98,6 @@ public:
|
||||
uint64_t Size, unsigned ByteAlignment = 0) {
|
||||
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,
|
||||
unsigned AddrSpace);
|
||||
|
||||
@ -355,42 +349,6 @@ void MCELFStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
||||
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,
|
||||
unsigned AddrSpace) {
|
||||
fixSymbolsInTLSFixups(Value);
|
||||
|
@ -75,12 +75,6 @@ public:
|
||||
uint64_t Size = 0, unsigned ByteAlignment = 0);
|
||||
virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
|
||||
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) {
|
||||
// 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;
|
||||
}
|
||||
|
||||
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) {
|
||||
MCDataFragment *DF = getOrCreateDataFragment();
|
||||
|
||||
|
@ -232,6 +232,31 @@ void MCObjectStreamer::EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
|
||||
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,
|
||||
unsigned char Value) {
|
||||
int64_t Res;
|
||||
|
@ -70,11 +70,6 @@ public:
|
||||
uint64_t Size,unsigned ByteAlignment);
|
||||
virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
|
||||
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 EmitInstruction(const MCInst &Instruction);
|
||||
virtual void EmitWin64EHHandlerData();
|
||||
@ -333,43 +328,6 @@ void WinCOFFStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
|
||||
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) {
|
||||
// Ignore for now, linkers don't care, and proper debug
|
||||
// info will be a much large effort.
|
||||
|
Loading…
x
Reference in New Issue
Block a user