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