[llvm-commits] [llvm] r78640 - /llvm/trunk/tools/llvm-mc/llvm-mc.cpp

Daniel Dunbar daniel at zuster.org
Mon Aug 10 21:34:55 PDT 2009


Author: ddunbar
Date: Mon Aug 10 23:34:48 2009
New Revision: 78640

URL: http://llvm.org/viewvc/llvm-project?rev=78640&view=rev
Log:
llvm-mc: Honor -o option (and add -f).

Modified:
    llvm/trunk/tools/llvm-mc/llvm-mc.cpp

Modified: llvm/trunk/tools/llvm-mc/llvm-mc.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/llvm-mc.cpp?rev=78640&r1=78639&r2=78640&view=diff

==============================================================================
--- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original)
+++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Mon Aug 10 23:34:48 2009
@@ -36,6 +36,9 @@
 OutputFilename("o", cl::desc("Output filename"),
                cl::value_desc("filename"));
 
+static cl::opt<bool>
+Force("f", cl::desc("Overwrite output files"));
+
 static cl::list<std::string>
 IncludeDirs("I", cl::desc("Directory of include files"),
             cl::value_desc("directory"), cl::Prefix);
@@ -161,6 +164,28 @@
   return 0;
 }
 
+static raw_ostream *GetOutputStream() {
+  if (OutputFilename == "" || OutputFilename == "-")
+    return &outs();
+
+  // Make sure that the Out file gets unlinked from the disk if we get a
+  // SIGINT
+  sys::RemoveFileOnSignal(sys::Path(OutputFilename));
+
+  std::string Err;
+  raw_fd_ostream *Out = new raw_fd_ostream(OutputFilename.c_str(),
+                                           /*Binary=*/false, Force, Err);
+  if (!Err.empty()) {
+    errs() << Err << '\n';
+    if (!Force)
+      errs() << "Use -f command line argument to force output\n";
+    delete Out;
+    return 0;
+  }
+  
+  return Out;
+}
+
 static int AssembleInput(const char *ProgName) {
   std::string Error;
   MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename, &Error);
@@ -183,7 +208,10 @@
   SrcMgr.setIncludeDirs(IncludeDirs);
   
   MCContext Ctx;
-  OwningPtr<MCStreamer> Str(createAsmStreamer(Ctx, outs()));
+  raw_ostream *Out = GetOutputStream();
+  if (!Out)
+    return 1;
+  OwningPtr<MCStreamer> Str(createAsmStreamer(Ctx, *Out));
 
   // FIXME: Target hook & command line option for initial section.
   Str.get()->SwitchSection(MCSectionMachO::Create("__TEXT","__text",
@@ -196,7 +224,12 @@
   if (!TAP)
     return 1;
   Parser.setTargetParser(*TAP.get());
-  return Parser.Run();
+
+  int Res = Parser.Run();
+  if (Out != &outs())
+    delete Out;
+
+  return Res;
 }  
 
 





More information about the llvm-commits mailing list