From: Daniel Dunbar Date: Fri, 19 Mar 2010 10:43:26 +0000 (+0000) Subject: MC: Add TargetAsmBackend::createObjectWriter. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1a9158c301b58d8119664f416461d5a5549170c4;p=oota-llvm.git MC: Add TargetAsmBackend::createObjectWriter. - MCAssembler is now object-file independent, although we will surely need more work to fully support ELF/COFF. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98955 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Target/TargetAsmBackend.h b/include/llvm/Target/TargetAsmBackend.h index 97b1d6024e1..bb501cc5226 100644 --- a/include/llvm/Target/TargetAsmBackend.h +++ b/include/llvm/Target/TargetAsmBackend.h @@ -15,8 +15,10 @@ namespace llvm { class MCAsmFixup; class MCDataFragment; +class MCObjectWriter; class MCSection; class Target; +class raw_ostream; /// TargetAsmBackend - Generic interface to target specific assembler backends. class TargetAsmBackend { @@ -37,6 +39,10 @@ public: const Target &getTarget() const { return TheTarget; } + /// createObjectWriter - Create a new MCObjectWriter instance for use by the + /// assembler backend to emit the final object file. + virtual MCObjectWriter *createObjectWriter(raw_ostream &OS) const = 0; + /// hasAbsolutizedSet - Check whether this target "absolutizes" /// assignments. That is, given code like: /// a: diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 74876a501dc..beecf7e6b85 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -15,7 +15,7 @@ #include "llvm/MC/MCObjectWriter.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCValue.h" -#include "llvm/MC/MachObjectWriter.h" +#include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/Twine.h" @@ -541,12 +541,13 @@ void MCAssembler::Finish() { dump(); }); // FIXME: Factor out MCObjectWriter. - bool Is64Bit = StringRef(getBackend().getTarget().getName()) == "x86-64"; - MachObjectWriter MOW(OS, Is64Bit); + llvm::OwningPtr Writer(getBackend().createObjectWriter(OS)); + if (!Writer) + llvm_report_error("unable to create object writer!"); // Allow the object writer a chance to perform post-layout binding (for // example, to set the index fields in the symbol data). - MOW.ExecutePostLayoutBinding(*this); + Writer->ExecutePostLayoutBinding(*this); // Evaluate and apply the fixups, generating relocation entries as necessary. // @@ -570,7 +571,7 @@ void MCAssembler::Finish() { // The fixup was unresolved, we need a relocation. Inform the object // writer of the relocation, and give it an opportunity to adjust the // fixup value if need be. - MOW.RecordRelocation(*this, *DF, Fixup, Target, FixedValue); + Writer->RecordRelocation(*this, *DF, Fixup, Target, FixedValue); } getBackend().ApplyFixup(Fixup, *DF, FixedValue); @@ -579,8 +580,7 @@ void MCAssembler::Finish() { } // Write the object file. - MOW.WriteObject(*this); - + Writer->WriteObject(*this); OS.flush(); } diff --git a/lib/Target/X86/X86AsmBackend.cpp b/lib/Target/X86/X86AsmBackend.cpp index 1d66b841523..754a2009790 100644 --- a/lib/Target/X86/X86AsmBackend.cpp +++ b/lib/Target/X86/X86AsmBackend.cpp @@ -13,6 +13,7 @@ #include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCSectionMachO.h" +#include "llvm/MC/MachObjectWriter.h" #include "llvm/Target/TargetRegistry.h" #include "llvm/Target/TargetAsmBackend.h" using namespace llvm; @@ -57,6 +58,10 @@ public: HasScatteredSymbols = true; } + MCObjectWriter *createObjectWriter(raw_ostream &OS) const { + return 0; + } + bool isVirtualSection(const MCSection &Section) const { const MCSectionELF &SE = static_cast(Section); return SE.getType() == MCSectionELF::SHT_NOBITS;; @@ -82,6 +87,10 @@ class DarwinX86_32AsmBackend : public DarwinX86AsmBackend { public: DarwinX86_32AsmBackend(const Target &T) : DarwinX86AsmBackend(T) {} + + MCObjectWriter *createObjectWriter(raw_ostream &OS) const { + return new MachObjectWriter(OS, /*Is64Bit=*/false); + } }; class DarwinX86_64AsmBackend : public DarwinX86AsmBackend { @@ -91,6 +100,10 @@ public: HasReliableSymbolDifference = true; } + MCObjectWriter *createObjectWriter(raw_ostream &OS) const { + return new MachObjectWriter(OS, /*Is64Bit=*/true); + } + virtual bool doesSectionRequireSymbols(const MCSection &Section) const { // Temporary labels in the string literals sections require symbols. The // issue is that the x86_64 relocation format does not allow symbol +