From: Daniel Dunbar Date: Thu, 16 Dec 2010 16:09:19 +0000 (+0000) Subject: MC/Mach-O: Stub out explicit MCMachObjectTargetWriter interface. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=ae5abd595f5442767313a4c8a24008ad19323ceb;p=oota-llvm.git MC/Mach-O: Stub out explicit MCMachObjectTargetWriter interface. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121973 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCMachObjectWriter.h b/include/llvm/MC/MCMachObjectWriter.h index 8dc4558916c..3c2eb2f4786 100644 --- a/include/llvm/MC/MCMachObjectWriter.h +++ b/include/llvm/MC/MCMachObjectWriter.h @@ -14,7 +14,23 @@ namespace llvm { -MCObjectWriter *createMachObjectWriter(raw_ostream &OS, bool is64Bit, +class MCMachObjectTargetWriter { +protected: + MCMachObjectTargetWriter(); + +public: + virtual ~MCMachObjectTargetWriter(); +}; + +/// \brief Construct a new Mach-O writer instance. +/// +/// This routine takes ownership of the target writer subclass. +/// +/// \param MOTW - The target specific Mach-O writer subclass. +/// \param OS - The stream to write to. +/// \returns The constructed object writer. +MCObjectWriter *createMachObjectWriter(MCMachObjectTargetWriter *MOTW, + raw_ostream &OS, bool is64Bit, uint32_t CPUType, uint32_t CPUSubtype, bool IsLittleEndian); diff --git a/lib/MC/CMakeLists.txt b/lib/MC/CMakeLists.txt index e6991d3f4b7..6f73df88300 100644 --- a/lib/MC/CMakeLists.txt +++ b/lib/MC/CMakeLists.txt @@ -16,6 +16,7 @@ add_llvm_library(LLVMMC MCDwarf.cpp MCLoggingStreamer.cpp MCMachOStreamer.cpp + MCMachObjectTargetWriter.cpp MCNullStreamer.cpp MCObjectStreamer.cpp MCObjectFormat.cpp diff --git a/lib/MC/MCMachObjectTargetWriter.cpp b/lib/MC/MCMachObjectTargetWriter.cpp new file mode 100644 index 00000000000..9c96f26e7c6 --- /dev/null +++ b/lib/MC/MCMachObjectTargetWriter.cpp @@ -0,0 +1,18 @@ +//===-- MCMachObjectTargetWriter.cpp - Mach-O Target Writer Subclass ------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/MC/MCMachObjectWriter.h" + +using namespace llvm; + +MCMachObjectTargetWriter::MCMachObjectTargetWriter() { +} + +MCMachObjectTargetWriter::~MCMachObjectTargetWriter() { +} diff --git a/lib/MC/MachObjectWriter.cpp b/lib/MC/MachObjectWriter.cpp index 7c6e59175f9..fa132d8aebb 100644 --- a/lib/MC/MachObjectWriter.cpp +++ b/lib/MC/MachObjectWriter.cpp @@ -7,12 +7,13 @@ // //===----------------------------------------------------------------------===// +#include "llvm/MC/MCMachObjectWriter.h" +#include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/Twine.h" #include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCAsmLayout.h" #include "llvm/MC/MCExpr.h" -#include "llvm/MC/MCMachObjectWriter.h" #include "llvm/MC/MCObjectWriter.h" #include "llvm/MC/MCSectionMachO.h" #include "llvm/MC/MCSymbol.h" @@ -162,17 +163,8 @@ class MachObjectWriter : public MCObjectWriter { } }; - /// @name Utility Methods - /// @{ - - bool isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind) { - const MCFixupKindInfo &FKI = Asm.getBackend().getFixupKindInfo( - (MCFixupKind) Kind); - - return FKI.Flags & MCFixupKindInfo::FKF_IsPCRel; - } - - /// @} + /// The target specific Mach-O writer instance. + llvm::OwningPtr TargetObjectWriter; /// @name Relocation Data /// @{ @@ -192,6 +184,19 @@ class MachObjectWriter : public MCObjectWriter { /// @} +private: + /// @name Utility Methods + /// @{ + + bool isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind) { + const MCFixupKindInfo &FKI = Asm.getBackend().getFixupKindInfo( + (MCFixupKind) Kind); + + return FKI.Flags & MCFixupKindInfo::FKF_IsPCRel; + } + + /// @} + SectionAddrMap SectionAddress; uint64_t getSectionAddress(const MCSectionData* SD) const { return SectionAddress.lookup(SD); @@ -226,10 +231,10 @@ class MachObjectWriter : public MCObjectWriter { uint32_t CPUSubtype; public: - MachObjectWriter(raw_ostream &_OS, + MachObjectWriter(MCMachObjectTargetWriter *MOTW, raw_ostream &_OS, bool _Is64Bit, uint32_t _CPUType, uint32_t _CPUSubtype, bool _IsLittleEndian) - : MCObjectWriter(_OS, _IsLittleEndian), + : MCObjectWriter(_OS, _IsLittleEndian), TargetObjectWriter(MOTW), Is64Bit(_Is64Bit), CPUType(_CPUType), CPUSubtype(_CPUSubtype) { } @@ -1321,9 +1326,11 @@ public: } -MCObjectWriter *llvm::createMachObjectWriter(raw_ostream &OS, bool is64Bit, +MCObjectWriter *llvm::createMachObjectWriter(MCMachObjectTargetWriter *MOTW, + raw_ostream &OS, bool is64Bit, uint32_t CPUType, uint32_t CPUSubtype, bool IsLittleEndian) { - return new MachObjectWriter(OS, is64Bit, CPUType, CPUSubtype, IsLittleEndian); + return new MachObjectWriter(MOTW, OS, is64Bit, CPUType, CPUSubtype, + IsLittleEndian); } diff --git a/lib/Target/ARM/ARMAsmBackend.cpp b/lib/Target/ARM/ARMAsmBackend.cpp index bd871c0fad3..9556a7d9e32 100644 --- a/lib/Target/ARM/ARMAsmBackend.cpp +++ b/lib/Target/ARM/ARMAsmBackend.cpp @@ -28,6 +28,9 @@ using namespace llvm; namespace { +class ARMMachObjectWriter : public MCMachObjectTargetWriter { +}; + class ARMAsmBackend : public TargetAsmBackend { bool isThumbMode; // Currently emitting Thumb code. public: @@ -382,7 +385,8 @@ public: MCObjectWriter *createObjectWriter(raw_ostream &OS) const { // FIXME: Subtarget info should be derived. Force v7 for now. - return createMachObjectWriter(OS, /*Is64Bit=*/false, + return createMachObjectWriter(new ARMMachObjectWriter, + OS, /*Is64Bit=*/false, object::mach::CTM_ARM, object::mach::CSARM_V7, /*IsLittleEndian=*/true); diff --git a/lib/Target/PowerPC/PPCAsmBackend.cpp b/lib/Target/PowerPC/PPCAsmBackend.cpp index 165433549a3..d8ab689bfa7 100644 --- a/lib/Target/PowerPC/PPCAsmBackend.cpp +++ b/lib/Target/PowerPC/PPCAsmBackend.cpp @@ -19,6 +19,9 @@ using namespace llvm; namespace { +class PPCMachObjectWriter : public MCMachObjectTargetWriter { +}; + class PPCAsmBackend : public TargetAsmBackend { const Target &TheTarget; public: @@ -92,7 +95,8 @@ namespace { MCObjectWriter *createObjectWriter(raw_ostream &OS) const { bool is64 = getPointerSize() == 8; - return createMachObjectWriter(OS, /*Is64Bit=*/is64, + return createMachObjectWriter(new PPCMachObjectWriter, + OS, /*Is64Bit=*/is64, (is64 ? object::mach::CTM_PowerPC64 : object::mach::CTM_PowerPC), object::mach::CSPPC_ALL, diff --git a/lib/Target/X86/X86AsmBackend.cpp b/lib/Target/X86/X86AsmBackend.cpp index e1c8cb71c97..3c1c4592dcb 100644 --- a/lib/Target/X86/X86AsmBackend.cpp +++ b/lib/Target/X86/X86AsmBackend.cpp @@ -46,6 +46,9 @@ static unsigned getFixupKindLog2Size(unsigned Kind) { } namespace { +class X86MachObjectWriter : public MCMachObjectTargetWriter { +}; + class X86AsmBackend : public TargetAsmBackend { public: X86AsmBackend(const Target &T) @@ -362,7 +365,8 @@ public: : DarwinX86AsmBackend(T) {} MCObjectWriter *createObjectWriter(raw_ostream &OS) const { - return createMachObjectWriter(OS, /*Is64Bit=*/false, + return createMachObjectWriter(new X86MachObjectWriter, + OS, /*Is64Bit=*/false, object::mach::CTM_i386, object::mach::CSX86_ALL, /*IsLittleEndian=*/true); @@ -377,7 +381,8 @@ public: } MCObjectWriter *createObjectWriter(raw_ostream &OS) const { - return createMachObjectWriter(OS, /*Is64Bit=*/true, + return createMachObjectWriter(new X86MachObjectWriter, + OS, /*Is64Bit=*/true, object::mach::CTM_x86_64, object::mach::CSX86_ALL, /*IsLittleEndian=*/true);