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:
Roman Divacky
2010-09-09 17:57:50 +00:00
parent 9ae4ca611b
commit 5baf79edc0
3 changed files with 28 additions and 15 deletions

View File

@ -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();

View File

@ -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() {

View File

@ -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());
} }
} }