Hook up -filetype=obj through the MachO streamer. Here's a demo:
authorChris Lattner <sabre@nondot.org>
Tue, 2 Feb 2010 23:57:42 +0000 (23:57 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 2 Feb 2010 23:57:42 +0000 (23:57 +0000)
$ cat t.ll
@g = global i32 42
$ llc t.ll -o t.o -filetype=obj
$ nm t.o
00000000 D _g

There is still a ton of work left.  Instructions are not being encoded
yet apparently.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95162 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCStreamer.h
lib/CodeGen/LLVMTargetMachine.cpp
tools/llc/llc.cpp

index be10947969ab6d30f14cd7e27c18944cba116f4b..cfd457261ff8bddddb9168e6506449516c2e29d2 100644 (file)
@@ -282,7 +282,7 @@ namespace llvm {
   /// createMachOStream - Create a machine code streamer which will generative
   /// Mach-O format object files.
   MCStreamer *createMachOStreamer(MCContext &Ctx, raw_ostream &OS,
-                                  MCCodeEmitter *CE = 0);
+                                  MCCodeEmitter *CE);
 
   /// createELFStreamer - Create a machine code streamer which will generative
   /// ELF format object files.
index d255492ef8f886ec962f1bc80a98758411afab6a..af33776c3a64dda9c6ae3ca0000da628ade54e21 100644 (file)
@@ -124,23 +124,30 @@ LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
   OwningPtr<MCStreamer> AsmStreamer;
 
   switch (FileType) {
-  default:
-  case CGFT_ObjectFile:
-    return CGFT_ErrorOccurred;
-  case CGFT_AssemblyFile: {
+  default: return CGFT_ErrorOccurred;
+  case CGFT_AssemblyFile:
     AsmStreamer.reset(createAsmStreamer(*Context, Out, *getMCAsmInfo(),
                                         getTargetData()->isLittleEndian(),
                                         getVerboseAsm(), /*instprinter*/0,
                                         /*codeemitter*/0));
     break;
+  case CGFT_ObjectFile: {
+    // Create the code emitter for the target if it exists.  If not, .o file
+    // emission fails.
+    MCCodeEmitter *MCE = getTarget().createCodeEmitter(*this);
+    if (MCE == 0)
+      return CGFT_ErrorOccurred;
+    
+    AsmStreamer.reset(createMachOStreamer(*Context, Out, MCE));
+    break;
   }
   }
   
   // Create the AsmPrinter, which takes ownership of Context and AsmStreamer
   // if successful.
   FunctionPass *Printer =
-  getTarget().createAsmPrinter(Out, *this, *Context, *AsmStreamer,
-                               getMCAsmInfo());
+    getTarget().createAsmPrinter(Out, *this, *Context, *AsmStreamer,
+                                 getMCAsmInfo());
   if (Printer == 0)
     return CGFT_ErrorOccurred;
   
index eebd20846ca64422bedc0101c2b6c5c9c2f367f9..c7bd1c670675d53da0aa24185ee6d7c99319e478 100644 (file)
@@ -360,6 +360,7 @@ int main(int argc, char **argv) {
       sys::Path(OutputFilename).eraseFromDisk();
       return 1;
     case TargetMachine::CGFT_AssemblyFile:
+    case TargetMachine::CGFT_ObjectFile:
       break;
     }