mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Enable ELF machine type to be specified explicitly in X86 backend
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167027 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9a419f656e
commit
678c35c386
@ -354,7 +354,7 @@ public:
|
||||
: ELFX86AsmBackend(T, OSABI, CPU) {}
|
||||
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
return createX86ELFObjectWriter(OS, /*Is64Bit*/ false, OSABI);
|
||||
return createX86ELFObjectWriter(OS, /*IsELF64*/ false, OSABI, ELF::EM_386);
|
||||
}
|
||||
};
|
||||
|
||||
@ -364,7 +364,7 @@ public:
|
||||
: ELFX86AsmBackend(T, OSABI, CPU) {}
|
||||
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
return createX86ELFObjectWriter(OS, /*Is64Bit*/ true, OSABI);
|
||||
return createX86ELFObjectWriter(OS, /*IsELF64*/ true, OSABI, ELF::EM_X86_64);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -20,7 +20,7 @@ using namespace llvm;
|
||||
namespace {
|
||||
class X86ELFObjectWriter : public MCELFObjectTargetWriter {
|
||||
public:
|
||||
X86ELFObjectWriter(bool is64Bit, uint8_t OSABI);
|
||||
X86ELFObjectWriter(bool IsELF64, uint8_t OSABI, uint16_t EMachine);
|
||||
|
||||
virtual ~X86ELFObjectWriter();
|
||||
protected:
|
||||
@ -30,10 +30,11 @@ namespace {
|
||||
};
|
||||
}
|
||||
|
||||
X86ELFObjectWriter::X86ELFObjectWriter(bool Is64Bit, uint8_t OSABI)
|
||||
: MCELFObjectTargetWriter(Is64Bit, OSABI,
|
||||
Is64Bit ? ELF::EM_X86_64 : ELF::EM_386,
|
||||
/*HasRelocationAddend*/ Is64Bit) {}
|
||||
X86ELFObjectWriter::X86ELFObjectWriter(bool IsELF64, uint8_t OSABI,
|
||||
uint16_t EMachine)
|
||||
: MCELFObjectTargetWriter(IsELF64, OSABI, EMachine,
|
||||
// Only i386 uses Rel instead of RelA.
|
||||
/*HasRelocationAddend*/ EMachine != ELF::EM_386) {}
|
||||
|
||||
X86ELFObjectWriter::~X86ELFObjectWriter()
|
||||
{}
|
||||
@ -48,7 +49,7 @@ unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target,
|
||||
MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ?
|
||||
MCSymbolRefExpr::VK_None : Target.getSymA()->getKind();
|
||||
unsigned Type;
|
||||
if (is64Bit()) {
|
||||
if (getEMachine() == ELF::EM_X86_64) {
|
||||
if (IsPCRel) {
|
||||
switch ((unsigned)Fixup.getKind()) {
|
||||
default: llvm_unreachable("invalid fixup kind!");
|
||||
@ -130,7 +131,7 @@ unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target,
|
||||
case FK_Data_1: Type = ELF::R_X86_64_8; break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
} else if (getEMachine() == ELF::EM_386) {
|
||||
if (IsPCRel) {
|
||||
switch ((unsigned)Fixup.getKind()) {
|
||||
default: llvm_unreachable("invalid fixup kind!");
|
||||
@ -210,15 +211,17 @@ unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target,
|
||||
case FK_Data_1: Type = ELF::R_386_8; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else
|
||||
llvm_unreachable("Unsupported ELF machine type.");
|
||||
|
||||
return Type;
|
||||
}
|
||||
|
||||
MCObjectWriter *llvm::createX86ELFObjectWriter(raw_ostream &OS,
|
||||
bool Is64Bit,
|
||||
uint8_t OSABI) {
|
||||
bool IsELF64,
|
||||
uint8_t OSABI,
|
||||
uint16_t EMachine) {
|
||||
MCELFObjectTargetWriter *MOTW =
|
||||
new X86ELFObjectWriter(Is64Bit, OSABI);
|
||||
new X86ELFObjectWriter(IsELF64, OSABI, EMachine);
|
||||
return createELFObjectWriter(MOTW, OS, /*IsLittleEndian=*/true);
|
||||
}
|
||||
|
@ -89,8 +89,9 @@ MCObjectWriter *createX86MachObjectWriter(raw_ostream &OS,
|
||||
|
||||
/// createX86ELFObjectWriter - Construct an X86 ELF object writer.
|
||||
MCObjectWriter *createX86ELFObjectWriter(raw_ostream &OS,
|
||||
bool Is64Bit,
|
||||
uint8_t OSABI);
|
||||
bool IsELF64,
|
||||
uint8_t OSABI,
|
||||
uint16_t EMachine);
|
||||
/// createX86WinCOFFObjectWriter - Construct an X86 Win COFF object writer.
|
||||
MCObjectWriter *createX86WinCOFFObjectWriter(raw_ostream &OS, bool Is64Bit);
|
||||
} // End llvm namespace
|
||||
|
Loading…
Reference in New Issue
Block a user