mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 05:24:01 +00:00
Make ELF OS ABI dependent on the OS from target triple.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113508 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -10,6 +10,7 @@
|
|||||||
#ifndef LLVM_MC_ELFOBJECTWRITER_H
|
#ifndef LLVM_MC_ELFOBJECTWRITER_H
|
||||||
#define LLVM_MC_ELFOBJECTWRITER_H
|
#define LLVM_MC_ELFOBJECTWRITER_H
|
||||||
|
|
||||||
|
#include "llvm/ADT/Triple.h"
|
||||||
#include "llvm/MC/MCObjectWriter.h"
|
#include "llvm/MC/MCObjectWriter.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
@ -25,8 +26,8 @@ class ELFObjectWriter : public MCObjectWriter {
|
|||||||
void *Impl;
|
void *Impl;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ELFObjectWriter(raw_ostream &OS, bool Is64Bit, bool IsLittleEndian = true,
|
ELFObjectWriter(raw_ostream &OS, bool Is64Bit, Triple::OSType OSType,
|
||||||
bool HasRelocationAddend = true);
|
bool IsLittleEndian = true, bool HasRelocationAddend = true);
|
||||||
|
|
||||||
virtual ~ELFObjectWriter();
|
virtual ~ELFObjectWriter();
|
||||||
|
|
||||||
|
@ -107,6 +107,8 @@ namespace {
|
|||||||
|
|
||||||
bool HasRelocationAddend;
|
bool HasRelocationAddend;
|
||||||
|
|
||||||
|
Triple::OSType OSType;
|
||||||
|
|
||||||
// This holds the symbol table index of the last local symbol.
|
// This holds the symbol table index of the last local symbol.
|
||||||
unsigned LastLocalSymbolIndex;
|
unsigned LastLocalSymbolIndex;
|
||||||
// This holds the .strtab section index.
|
// This holds the .strtab section index.
|
||||||
@ -116,9 +118,10 @@ namespace {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
ELFObjectWriterImpl(ELFObjectWriter *_Writer, bool _Is64Bit,
|
ELFObjectWriterImpl(ELFObjectWriter *_Writer, bool _Is64Bit,
|
||||||
bool _HasRelAddend)
|
bool _HasRelAddend, Triple::OSType _OSType)
|
||||||
: Writer(_Writer), OS(Writer->getStream()),
|
: Writer(_Writer), OS(Writer->getStream()),
|
||||||
Is64Bit(_Is64Bit), HasRelocationAddend(_HasRelAddend) {
|
Is64Bit(_Is64Bit), HasRelocationAddend(_HasRelAddend),
|
||||||
|
OSType(_OSType) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Write8(uint8_t Value) { Writer->Write8(Value); }
|
void Write8(uint8_t Value) { Writer->Write8(Value); }
|
||||||
@ -270,7 +273,12 @@ void ELFObjectWriterImpl::WriteHeader(uint64_t SectionDataSize,
|
|||||||
Write8(Writer->isLittleEndian() ? ELF::ELFDATA2LSB : ELF::ELFDATA2MSB);
|
Write8(Writer->isLittleEndian() ? ELF::ELFDATA2LSB : ELF::ELFDATA2MSB);
|
||||||
|
|
||||||
Write8(ELF::EV_CURRENT); // e_ident[EI_VERSION]
|
Write8(ELF::EV_CURRENT); // e_ident[EI_VERSION]
|
||||||
Write8(ELF::ELFOSABI_LINUX); // e_ident[EI_OSABI]
|
// e_ident[EI_OSABI]
|
||||||
|
switch (OSType) {
|
||||||
|
case Triple::FreeBSD: Write8(ELF::ELFOSABI_FREEBSD); break;
|
||||||
|
case Triple::Linux: Write8(ELF::ELFOSABI_LINUX); break;
|
||||||
|
default: Write8(ELF::ELFOSABI_NONE); break;
|
||||||
|
}
|
||||||
Write8(0); // e_ident[EI_ABIVERSION]
|
Write8(0); // e_ident[EI_ABIVERSION]
|
||||||
|
|
||||||
WriteZeros(ELF::EI_NIDENT - ELF::EI_PAD);
|
WriteZeros(ELF::EI_NIDENT - ELF::EI_PAD);
|
||||||
@ -955,11 +963,12 @@ void ELFObjectWriterImpl::WriteObject(const MCAssembler &Asm,
|
|||||||
|
|
||||||
ELFObjectWriter::ELFObjectWriter(raw_ostream &OS,
|
ELFObjectWriter::ELFObjectWriter(raw_ostream &OS,
|
||||||
bool Is64Bit,
|
bool Is64Bit,
|
||||||
|
Triple::OSType OSType,
|
||||||
bool IsLittleEndian,
|
bool IsLittleEndian,
|
||||||
bool HasRelocationAddend)
|
bool HasRelocationAddend)
|
||||||
: MCObjectWriter(OS, IsLittleEndian)
|
: MCObjectWriter(OS, IsLittleEndian)
|
||||||
{
|
{
|
||||||
Impl = new ELFObjectWriterImpl(this, Is64Bit, HasRelocationAddend);
|
Impl = new ELFObjectWriterImpl(this, Is64Bit, HasRelocationAddend, OSType);
|
||||||
}
|
}
|
||||||
|
|
||||||
ELFObjectWriter::~ELFObjectWriter() {
|
ELFObjectWriter::~ELFObjectWriter() {
|
||||||
|
@ -186,25 +186,27 @@ bool X86AsmBackend::WriteNopData(uint64_t Count, MCObjectWriter *OW) const {
|
|||||||
namespace {
|
namespace {
|
||||||
class ELFX86AsmBackend : public X86AsmBackend {
|
class ELFX86AsmBackend : public X86AsmBackend {
|
||||||
public:
|
public:
|
||||||
ELFX86AsmBackend(const Target &T)
|
Triple::OSType OSType;
|
||||||
: X86AsmBackend(T) {
|
ELFX86AsmBackend(const Target &T, Triple::OSType _OSType)
|
||||||
|
: X86AsmBackend(T), OSType(_OSType) {
|
||||||
HasAbsolutizedSet = true;
|
HasAbsolutizedSet = true;
|
||||||
HasScatteredSymbols = true;
|
HasScatteredSymbols = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isVirtualSection(const MCSection &Section) const {
|
bool isVirtualSection(const MCSection &Section) const {
|
||||||
const MCSectionELF &SE = static_cast<const MCSectionELF&>(Section);
|
const MCSectionELF &SE = static_cast<const MCSectionELF&>(Section);
|
||||||
return SE.getType() == MCSectionELF::SHT_NOBITS;;
|
return SE.getType() == MCSectionELF::SHT_NOBITS;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ELFX86_32AsmBackend : public ELFX86AsmBackend {
|
class ELFX86_32AsmBackend : public ELFX86AsmBackend {
|
||||||
public:
|
public:
|
||||||
ELFX86_32AsmBackend(const Target &T)
|
ELFX86_32AsmBackend(const Target &T, Triple::OSType OSType)
|
||||||
: ELFX86AsmBackend(T) {}
|
: ELFX86AsmBackend(T, OSType) {}
|
||||||
|
|
||||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||||
return new ELFObjectWriter(OS, /*Is64Bit=*/false,
|
return new ELFObjectWriter(OS, /*Is64Bit=*/false,
|
||||||
|
OSType,
|
||||||
/*IsLittleEndian=*/true,
|
/*IsLittleEndian=*/true,
|
||||||
/*HasRelocationAddend=*/false);
|
/*HasRelocationAddend=*/false);
|
||||||
}
|
}
|
||||||
@ -212,11 +214,12 @@ public:
|
|||||||
|
|
||||||
class ELFX86_64AsmBackend : public ELFX86AsmBackend {
|
class ELFX86_64AsmBackend : public ELFX86AsmBackend {
|
||||||
public:
|
public:
|
||||||
ELFX86_64AsmBackend(const Target &T)
|
ELFX86_64AsmBackend(const Target &T, Triple::OSType OSType)
|
||||||
: ELFX86AsmBackend(T) {}
|
: ELFX86AsmBackend(T, OSType) {}
|
||||||
|
|
||||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||||
return new ELFObjectWriter(OS, /*Is64Bit=*/true,
|
return new ELFObjectWriter(OS, /*Is64Bit=*/true,
|
||||||
|
OSType,
|
||||||
/*IsLittleEndian=*/true,
|
/*IsLittleEndian=*/true,
|
||||||
/*HasRelocationAddend=*/true);
|
/*HasRelocationAddend=*/true);
|
||||||
}
|
}
|
||||||
@ -324,7 +327,7 @@ TargetAsmBackend *llvm::createX86_32AsmBackend(const Target &T,
|
|||||||
case Triple::Win32:
|
case Triple::Win32:
|
||||||
return new WindowsX86AsmBackend(T, false);
|
return new WindowsX86AsmBackend(T, false);
|
||||||
default:
|
default:
|
||||||
return new ELFX86_32AsmBackend(T);
|
return new ELFX86_32AsmBackend(T, Triple(TT).getOS());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,6 +341,6 @@ TargetAsmBackend *llvm::createX86_64AsmBackend(const Target &T,
|
|||||||
case Triple::Win32:
|
case Triple::Win32:
|
||||||
return new WindowsX86AsmBackend(T, true);
|
return new WindowsX86AsmBackend(T, true);
|
||||||
default:
|
default:
|
||||||
return new ELFX86_64AsmBackend(T);
|
return new ELFX86_64AsmBackend(T, Triple(TT).getOS());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user