opt.cpp revision d0fde30ce850b78371fd1386338350591f9ff494
10eafc31684d6c512c6a56868031b8c1cc4ab4ed6Chris Lattner//===----------------------------------------------------------------------===//
27c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//                     The LLVM Compiler Infrastructure
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
57c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// This file was developed by the LLVM research group and is distributed under
67c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
77c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===//
9d4c7f2766bcf2cf87e562ea4e71cb4b54d81b74eChris Lattner// LLVM Modular Optimizer Utility: opt
10009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//
11009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// Optimizations may be specified an arbitrary number of times on the command
12009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// line, they are run in the order specified.
13009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//
140eafc31684d6c512c6a56868031b8c1cc4ab4ed6Chris Lattner//===----------------------------------------------------------------------===//
15009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
16009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/Module.h"
17fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner#include "llvm/PassManager.h"
18009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/Bytecode/Reader.h"
19fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner#include "llvm/Bytecode/WriteBytecodePass.h"
20ffa6f9ca062d410ff25c8d11907f182d022f274dChris Lattner#include "llvm/Assembly/PrintModulePass.h"
2122d26d7c7d7c9666d0da0e51250586da5a0744daChris Lattner#include "llvm/Analysis/Verifier.h"
2218fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve#include "llvm/Target/TargetMachine.h"
236560b6b101635203068b0b32f544c2b3b577b59bChris Lattner#include "llvm/Target/TargetMachineImpls.h"
242053a2a2720ea93550b230da6ceac371014c20c2Chris Lattner#include "llvm/Support/PassNameParser.h"
2576d12299b5333d71bfc079614031f97c97aa5148Chris Lattner#include "Support/Signals.h"
2673e11d77aaa09d5b126aef0b600c31ebd1206c3dChris Lattner#include <fstream>
2763202328d3dac33322f564889cd44126912102e6Chris Lattner#include <memory>
28c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner#include <algorithm>
2963aaa11506f1edcd6e6073b1dbdbe02d678c8cfaAnand Shukla
30d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm;
3130af36808263fc256ead4fc50b639420b016a58dChris Lattner
32c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// The OptimizationList is automatically populated with registered Passes by the
33c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// PassNameParser.
34fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner//
352053a2a2720ea93550b230da6ceac371014c20c2Chris Lattnerstatic cl::list<const PassInfo*, bool,
362053a2a2720ea93550b230da6ceac371014c20c2Chris Lattner                FilteredPassNameParser<PassInfo::Optimization> >
37c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris LattnerOptimizationList(cl::desc("Optimizations available:"));
38009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
399d6e7eb74fce8dccaeb3f42c6392de727baff310Chris Lattner
40c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// Other command line options...
41fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner//
426c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattnerstatic cl::opt<std::string>
435ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerInputFilename(cl::Positional, cl::desc("<input bytecode>"), cl::init("-"));
445ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
456c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattnerstatic cl::opt<std::string>
465ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Override output filename"),
475ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner               cl::value_desc("filename"));
485ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
495ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
505ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerForce("f", cl::desc("Overwrite output files"));
515ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
525ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
535ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerPrintEachXForm("p", cl::desc("Print module after each transformation"));
545ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
555ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
56ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris LattnerNoOutput("disable-output",
57ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris Lattner         cl::desc("Do not write result bytecode file"), cl::Hidden);
58d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattner
59d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattnerstatic cl::opt<bool>
60ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris LattnerNoVerify("disable-verify", cl::desc("Do not verify result module"), cl::Hidden);
61f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattner
62f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattnerstatic cl::opt<bool>
63f9e173e85ab1e4062cc723cab6db0b86ed2578b8Chris LattnerQuiet("q", cl::desc("Don't print 'program modified' message"));
645ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
655ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::alias
665ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerQuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
675ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
68009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
69c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner//===----------------------------------------------------------------------===//
70c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// main for opt
71c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner//
728f367bd3c0f56b7b318c46cee04f77735f617777Chris Lattnerint main(int argc, char **argv) {
738f367bd3c0f56b7b318c46cee04f77735f617777Chris Lattner  cl::ParseCommandLineOptions(argc, argv,
748f367bd3c0f56b7b318c46cee04f77735f617777Chris Lattner			      " llvm .bc -> .bc modular optimizer\n");
75fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner
7618fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve  // Allocate a full target machine description only if necessary...
7718fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve  // FIXME: The choice of target should be controllable on the command line.
7818fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve  std::auto_ptr<TargetMachine> target;
7918fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve
8018fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve  TargetMachine* TM = NULL;
8156620da5b486225dfbb0db02d5cbc5c976d0dc02Chris Lattner  std::string ErrorMessage;
8218fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve
83fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  // Load the input module...
8456620da5b486225dfbb0db02d5cbc5c976d0dc02Chris Lattner  std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename, &ErrorMessage));
8563202328d3dac33322f564889cd44126912102e6Chris Lattner  if (M.get() == 0) {
866c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner    std::cerr << argv[0] << ": ";
8756620da5b486225dfbb0db02d5cbc5c976d0dc02Chris Lattner    if (ErrorMessage.size())
886c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner      std::cerr << ErrorMessage << "\n";
8956620da5b486225dfbb0db02d5cbc5c976d0dc02Chris Lattner    else
906c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner      std::cerr << "bytecode didn't read correctly.\n";
91009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner    return 1;
92009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner  }
93009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
94fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  // Figure out what stream we are supposed to write to...
95697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  std::ostream *Out = &std::cout;  // Default to printing to stdout...
961e78f36127fb0e405d2cf893e2ce3381300a667bChris Lattner  if (OutputFilename != "") {
97888912dbe01c715aa5a0ddec19da6ef12f382ebfChris Lattner    if (!Force && std::ifstream(OutputFilename.c_str())) {
98697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner      // If force is not specified, make sure not to overwrite a file!
996c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner      std::cerr << argv[0] << ": error opening '" << OutputFilename
1006c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner                << "': file exists!\n"
1016c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner                << "Use -f command line argument to force output\n";
102697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner      return 1;
103697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner    }
104697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner    Out = new std::ofstream(OutputFilename.c_str());
105697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner
106009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner    if (!Out->good()) {
1076c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner      std::cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
108009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner      return 1;
109009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner    }
11076d12299b5333d71bfc079614031f97c97aa5148Chris Lattner
111452fea997232437902385e88366482b01957eeefMisha Brukman    // Make sure that the Output file gets unlinked from the disk if we get a
11276d12299b5333d71bfc079614031f97c97aa5148Chris Lattner    // SIGINT
11376d12299b5333d71bfc079614031f97c97aa5148Chris Lattner    RemoveFileOnSignal(OutputFilename);
114009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner  }
115009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
116fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  // Create a PassManager to hold and optimize the collection of passes we are
117fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  // about to build...
118fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  //
119fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  PassManager Passes;
120fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner
1219c3b55ea9f5fe17c5713757e97aa62e0fb356dcfChris Lattner  // Add an appropriate TargetData instance for this module...
1229c3b55ea9f5fe17c5713757e97aa62e0fb356dcfChris Lattner  Passes.add(new TargetData("opt", M.get()));
1239c3b55ea9f5fe17c5713757e97aa62e0fb356dcfChris Lattner
124fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  // Create a new optimization pass for each one specified on the command line
125fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  for (unsigned i = 0; i < OptimizationList.size(); ++i) {
126c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner    const PassInfo *Opt = OptimizationList[i];
127c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner
128c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner    if (Opt->getNormalCtor())
129c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner      Passes.add(Opt->getNormalCtor()());
13018fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve    else if (Opt->getTargetCtor()) {
1310af1e8e3a41285772d2a8d0f26c139cf5332dde3Chris Lattner#if 0
13218fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve      if (target.get() == NULL)
13318fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve        target.reset(allocateSparcTargetMachine()); // FIXME: target option
1340af1e8e3a41285772d2a8d0f26c139cf5332dde3Chris Lattner#endif
13518fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve      assert(target.get() && "Could not allocate target machine!");
13618fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve      Passes.add(Opt->getTargetCtor()(*target.get()));
13718fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve    } else
1386c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner      std::cerr << argv[0] << ": cannot create pass: " << Opt->getPassName()
1396c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner                << "\n";
140fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner
141fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner    if (PrintEachXForm)
1426c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner      Passes.add(new PrintModulePass(&std::cerr));
143fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  }
144fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner
14522d26d7c7d7c9666d0da0e51250586da5a0744daChris Lattner  // Check that the module is well formed on completion of optimization
146f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattner  if (!NoVerify)
147f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattner    Passes.add(createVerifierPass());
14822d26d7c7d7c9666d0da0e51250586da5a0744daChris Lattner
149fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  // Write bytecode out to disk or cout as the last step...
150d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattner  if (!NoOutput)
151d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattner    Passes.add(new WriteBytecodePass(Out, Out != &std::cout));
152fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner
153fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner  // Now that we have all of the passes ready, run them.
1547e70829632f82de15db187845666aaca6e04b792Chris Lattner  if (Passes.run(*M.get()) && !Quiet)
1556c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner    std::cerr << "Program modified.\n";
156009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
157009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner  return 0;
158009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner}
159