MC: Add TargetAsmBackend::createObjectWriter.
authorDaniel Dunbar <daniel@zuster.org>
Fri, 19 Mar 2010 10:43:26 +0000 (10:43 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 19 Mar 2010 10:43:26 +0000 (10:43 +0000)
 - 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

include/llvm/Target/TargetAsmBackend.h
lib/MC/MCAssembler.cpp
lib/Target/X86/X86AsmBackend.cpp

index 97b1d6024e1b669eba2b195b73d18d2eee61fee7..bb501cc5226b64cf3a5e46e85c41eaa87c9e9e42 100644 (file)
 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:
index 74876a501dc39e3a8d508b72c8e5a41a12bdeddc..beecf7e6b85813168d13909380bf628c164292ef 100644 (file)
@@ -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<MCObjectWriter> 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();
 }
 
index 1d66b841523207d96997de124175bdae0eda8217..754a200979084ceac3b053c8b0dd4695f04f51e6 100644 (file)
@@ -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<const MCSectionELF&>(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 +