-//===----------------------------------------------------------------------===//
+//===- opt.cpp - The LLVM Modular Optimizer -------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// 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.
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"));
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.
// 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
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...
//