MC: Provide MCAssembler with a TargetAsmBackend.
authorDaniel Dunbar <daniel@zuster.org>
Thu, 11 Mar 2010 01:34:27 +0000 (01:34 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 11 Mar 2010 01:34:27 +0000 (01:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98222 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCAssembler.h
include/llvm/MC/MCStreamer.h
include/llvm/Target/TargetMachine.h
lib/CodeGen/LLVMTargetMachine.cpp
lib/MC/MCAssembler.cpp
lib/MC/MCMachOStreamer.cpp
tools/llvm-mc/llvm-mc.cpp

index 0a296cd297407863f186289b855f52d30d84857d..ffd77c51eb4298d5f0b8a458760d794fa391c98a 100644 (file)
@@ -28,6 +28,7 @@ class MCFragment;
 class MCSection;
 class MCSectionData;
 class MCSymbol;
+class TargetAsmBackend;
 
 /// MCAsmFixup - Represent a fixed size region of bytes inside some fragment
 /// which needs to be rewritten. This region will either be rewritten by the
@@ -582,6 +583,8 @@ private:
 
   MCContext &Context;
 
+  TargetAsmBackend &Backend;
+
   raw_ostream &OS;
 
   iplist<MCSectionData> Sections;
@@ -617,7 +620,7 @@ public:
   // concrete and require clients to pass in a target like object. The other
   // option is to make this abstract, and have targets provide concrete
   // implementations as we do with AsmParser.
-  MCAssembler(MCContext &_Context, raw_ostream &OS);
+  MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend, raw_ostream &OS);
   ~MCAssembler();
 
   MCContext &getContext() const { return Context; }
index 6359ccefe63a394e09ed88cc0178c3d302ff0483..2f5f8285326093f2603be7f786bec4676e00b35d 100644 (file)
@@ -27,6 +27,7 @@ namespace llvm {
   class MCSection;
   class MCSymbol;
   class StringRef;
+class TargetAsmBackend;
   class Twine;
   class raw_ostream;
   class formatted_raw_ostream;
@@ -304,18 +305,10 @@ namespace llvm {
                                 MCCodeEmitter *CE = 0,
                                 bool ShowInst = false);
 
-  // FIXME: These two may end up getting rolled into a single
-  // createObjectStreamer interface, which implements the assembler backend, and
-  // is parameterized on an output object file writer.
-
   /// createMachOStream - Create a machine code streamer which will generative
   /// Mach-O format object files.
-  MCStreamer *createMachOStreamer(MCContext &Ctx, raw_ostream &OS,
-                                  MCCodeEmitter *CE);
-
-  /// createELFStreamer - Create a machine code streamer which will generative
-  /// ELF format object files.
-  MCStreamer *createELFStreamer(MCContext &Ctx, raw_ostream &OS);
+  MCStreamer *createMachOStreamer(MCContext &Ctx, TargetAsmBackend &TAB,
+                                  raw_ostream &OS, MCCodeEmitter *CE);
 
 } // end namespace llvm
 
index a7062ac94f35d9e8a54a1dff2de32be86c5cfbfe..4ab2e5cf3d232d9f83fa33f85c4d632f2bc3a146 100644 (file)
@@ -224,6 +224,8 @@ public:
 /// implemented with the LLVM target-independent code generator.
 ///
 class LLVMTargetMachine : public TargetMachine {
+  std::string TargetTriple;
+
 protected: // Can only create subclasses.
   LLVMTargetMachine(const Target &T, const std::string &TargetTriple);
   
index 9bc0b7121d72b52cebad28f02c5e082ed4cc0784..23ef8ba7ce44fc3a71073192470dddfe6b27de48 100644 (file)
@@ -94,8 +94,8 @@ static cl::opt<bool> EnableSplitGEPGVN("split-gep-gvn", cl::Hidden,
     cl::desc("Split GEPs and run no-load GVN"));
 
 LLVMTargetMachine::LLVMTargetMachine(const Target &T,
-                                     const std::string &TargetTriple)
-  : TargetMachine(T) {
+                                     const std::string &Triple)
+  : TargetMachine(T), TargetTriple(Triple) {
   AsmInfo = T.createAsmInfo(TargetTriple);
 }
 
@@ -143,10 +143,11 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
     // Create the code emitter for the target if it exists.  If not, .o file
     // emission fails.
     MCCodeEmitter *MCE = getTarget().createCodeEmitter(*this, *Context);
-    if (MCE == 0)
+    TargetAsmBackend *TAB = getTarget().createAsmBackend(TargetTriple);
+    if (MCE == 0 || TAB == 0)
       return true;
     
-    AsmStreamer.reset(createMachOStreamer(*Context, Out, MCE));
+    AsmStreamer.reset(createMachOStreamer(*Context, *TAB, Out, MCE));
     
     // Any output to the asmprinter's "O" stream is bad and needs to be fixed,
     // force it to come out stderr.
index f51be42cc9d41bb30a5a114158dddc900a92e1a7..277cf921254a6e893c0cc4d7a085357e86f20651 100644 (file)
@@ -991,8 +991,9 @@ MCSymbolData::MCSymbolData(const MCSymbol &_Symbol, MCFragment *_Fragment,
 
 /* *** */
 
-MCAssembler::MCAssembler(MCContext &_Context, raw_ostream &_OS)
-  : Context(_Context), OS(_OS), SubsectionsViaSymbols(false)
+MCAssembler::MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend,
+                         raw_ostream &_OS)
+  : Context(_Context), Backend(_Backend), OS(_OS), SubsectionsViaSymbols(false)
 {
 }
 
index a35aae29a8ce3685a98699f0f3b423c6cd4698a8..1a6fa41169217b3c7d93a82dca36d3d3425ab34f 100644 (file)
@@ -59,8 +59,9 @@ private:
   }
 
 public:
-  MCMachOStreamer(MCContext &Context, raw_ostream &_OS, MCCodeEmitter *_Emitter)
-    : MCStreamer(Context), Assembler(Context, _OS), Emitter(_Emitter),
+  MCMachOStreamer(MCContext &Context, TargetAsmBackend &TAB,
+                  raw_ostream &_OS, MCCodeEmitter *_Emitter)
+    : MCStreamer(Context), Assembler(Context, TAB, _OS), Emitter(_Emitter),
       CurSectionData(0) {}
   ~MCMachOStreamer() {}
 
@@ -398,7 +399,7 @@ void MCMachOStreamer::Finish() {
   Assembler.Finish();
 }
 
-MCStreamer *llvm::createMachOStreamer(MCContext &Context, raw_ostream &OS,
-                                      MCCodeEmitter *CE) {
-  return new MCMachOStreamer(Context, OS, CE);
+MCStreamer *llvm::createMachOStreamer(MCContext &Context, TargetAsmBackend &TAB,
+                                      raw_ostream &OS, MCCodeEmitter *CE) {
+  return new MCMachOStreamer(Context, TAB, OS, CE);
 }
index 76ce080caea53657452092748fa50b7963f7bddc..fa87238a029e35a2c54e6e9b2ad4d903ba948b17 100644 (file)
@@ -27,6 +27,7 @@
 #include "llvm/Support/SourceMgr.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/System/Signals.h"
+#include "llvm/Target/TargetAsmBackend.h"
 #include "llvm/Target/TargetAsmParser.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetRegistry.h"
@@ -259,6 +260,7 @@ static int AssembleInput(const char *ProgName) {
   OwningPtr<MCInstPrinter> IP;
   OwningPtr<MCCodeEmitter> CE;
   OwningPtr<MCStreamer> Str;
+  OwningPtr<TargetAsmBackend> TAB;
 
   const MCAsmInfo *MAI = TheTarget->createAsmInfo(TripleName);
   assert(MAI && "Unable to create target asm info!");
@@ -274,7 +276,8 @@ static int AssembleInput(const char *ProgName) {
   } else {
     assert(FileType == OFT_ObjectFile && "Invalid file type!");
     CE.reset(TheTarget->createCodeEmitter(*TM, Ctx));
-    Str.reset(createMachOStreamer(Ctx, *Out, CE.get()));
+    TAB.reset(TheTarget->createAsmBackend(TripleName));
+    Str.reset(createMachOStreamer(Ctx, *TAB, *Out, CE.get()));
   }
 
   AsmParser Parser(SrcMgr, Ctx, *Str.get(), *MAI);