Right, globals aren't values yet..
[oota-llvm.git] / tools / opt / opt.cpp
index bc0a5fcb6fb5a765c0742470d8fca616bc406893..43e807472557a109ced39dd7e647f70d602d0b37 100644 (file)
@@ -1,4 +1,4 @@
-//===----------------------------------------------------------------------===//
+//===- opt.cpp - The LLVM Modular Optimizer -------------------------------===//
 // 
 //                     The LLVM Compiler Infrastructure
 //
@@ -6,7 +6,6 @@
 // the University of Illinois Open Source License. See LICENSE.TXT for details.
 // 
 //===----------------------------------------------------------------------===//
-// LLVM Modular Optimizer Utility: opt
 //
 // Optimizations may be specified an arbitrary number of times on the command
 // line, they are run in the order specified.
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetMachineImpls.h"
 #include "llvm/Support/PassNameParser.h"
-#include "Support/Signals.h"
+#include "llvm/System/Signals.h"
+#include "Support/SystemUtils.h"
 #include <fstream>
 #include <memory>
 #include <algorithm>
 
+using namespace llvm;
 
 // The OptimizationList is automatically populated with registered Passes by the
 // PassNameParser.
@@ -43,7 +44,7 @@ InputFilename(cl::Positional, cl::desc("<input bytecode>"), cl::init("-"));
 
 static cl::opt<std::string>
 OutputFilename("o", cl::desc("Override output filename"),
-               cl::value_desc("filename"));
+               cl::value_desc("filename"), cl::init("-"));
 
 static cl::opt<bool>
 Force("f", cl::desc("Overwrite output files"));
@@ -71,6 +72,7 @@ QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
 int main(int argc, char **argv) {
   cl::ParseCommandLineOptions(argc, argv,
                              " llvm .bc -> .bc modular optimizer\n");
+  PrintStackTraceOnErrorSignal();
 
   // Allocate a full target machine description only if necessary...
   // FIXME: The choice of target should be controllable on the command line.
@@ -92,7 +94,7 @@ int main(int argc, char **argv) {
 
   // Figure out what stream we are supposed to write to...
   std::ostream *Out = &std::cout;  // Default to printing to stdout...
-  if (OutputFilename != "") {
+  if (OutputFilename != "-") {
     if (!Force && std::ifstream(OutputFilename.c_str())) {
       // If force is not specified, make sure not to overwrite a file!
       std::cerr << argv[0] << ": error opening '" << OutputFilename
@@ -112,6 +114,18 @@ int main(int argc, char **argv) {
     RemoveFileOnSignal(OutputFilename);
   }
 
+  // If the output is set to be emitted to standard out, and standard out is a
+  // console, print out a warning message and refuse to do it.  We don't impress
+  // anyone by spewing tons of binary goo to a terminal.
+  if (Out == &std::cout && isStandardOutAConsole() && !Force && !NoOutput) {
+    std::cerr << "WARNING: It looks like you're attempting to print out a "
+              << "bytecode file.  I'm\ngoing to pretend you didn't ask me to do"
+              << " this (for your own good).  If you\nREALLY want to taste LLVM"
+              << " bytecode first hand, you can force output with the\n'-f'"
+              << " option.\n\n";
+    NoOutput = true;
+  }
+
   // Create a PassManager to hold and optimize the collection of passes we are
   // about to build...
   //