1 //===- opt.cpp - The LLVM Modular Optimizer -------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Optimizations may be specified an arbitrary number of times on the command 11 // line, They are run in the order specified. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm/LLVMContext.h" 16 #include "llvm/Module.h" 17 #include "llvm/ModuleProvider.h" 18 #include "llvm/PassManager.h" 19 #include "llvm/CallGraphSCCPass.h" 20 #include "llvm/Bitcode/ReaderWriter.h" 21 #include "llvm/Assembly/PrintModulePass.h" 22 #include "llvm/Analysis/Verifier.h" 23 #include "llvm/Analysis/LoopPass.h" 24 #include "llvm/Analysis/CallGraph.h" 25 #include "llvm/Target/TargetData.h" 26 #include "llvm/Target/TargetMachine.h" 27 #include "llvm/Support/PassNameParser.h" 28 #include "llvm/System/Signals.h" 29 #include "llvm/Support/ManagedStatic.h" 30 #include "llvm/Support/MemoryBuffer.h" 31 #include "llvm/Support/PluginLoader.h" 32 #include "llvm/Support/StandardPasses.h" 33 #include "llvm/Support/SystemUtils.h" 34 #include "llvm/Support/raw_ostream.h" 35 #include "llvm/LinkAllPasses.h" 36 #include "llvm/LinkAllVMCore.h" 37 #include <memory> 38 #include <algorithm> 39 using namespace llvm; 40 41 // The OptimizationList is automatically populated with registered Passes by the 42 // PassNameParser. 43 // 44 static cl::list<const PassInfo*, bool, PassNameParser> 45 PassList(cl::desc("Optimizations available:")); 46 47 // Other command line options... 48 // 49 static cl::opt<std::string> 50 InputFilename(cl::Positional, cl::desc("<input bitcode file>"), 51 cl::init("-"), cl::value_desc("filename")); 52 53 static cl::opt<std::string> 54 OutputFilename("o", cl::desc("Override output filename"), 55 cl::value_desc("filename"), cl::init("-")); 56 57 static cl::opt<bool> 58 Force("f", cl::desc("Overwrite output files")); 59 60 static cl::opt<bool> 61 PrintEachXForm("p", cl::desc("Print module after each transformation")); 62 63 static cl::opt<bool> 64 NoOutput("disable-output", 65 cl::desc("Do not write result bitcode file"), cl::Hidden); 66 67 static cl::opt<bool> 68 NoVerify("disable-verify", cl::desc("Do not verify result module"), cl::Hidden); 69 70 static cl::opt<bool> 71 VerifyEach("verify-each", cl::desc("Verify after each transform")); 72 73 static cl::opt<bool> 74 StripDebug("strip-debug", 75 cl::desc("Strip debugger symbol info from translation unit")); 76 77 static cl::opt<bool> 78 DisableInline("disable-inlining", cl::desc("Do not run the inliner pass")); 79 80 static cl::opt<bool> 81 DisableOptimizations("disable-opt", 82 cl::desc("Do not run any optimization passes")); 83 84 static cl::opt<bool> 85 DisableInternalize("disable-internalize", 86 cl::desc("Do not mark all symbols as internal")); 87 88 static cl::opt<bool> 89 StandardCompileOpts("std-compile-opts", 90 cl::desc("Include the standard compile time optimizations")); 91 92 static cl::opt<bool> 93 StandardLinkOpts("std-link-opts", 94 cl::desc("Include the standard link time optimizations")); 95 96 static cl::opt<bool> 97 OptLevelO1("O1", 98 cl::desc("Optimization level 1. Similar to llvm-gcc -O1")); 99 100 static cl::opt<bool> 101 OptLevelO2("O2", 102 cl::desc("Optimization level 2. Similar to llvm-gcc -O2")); 103 104 static cl::opt<bool> 105 OptLevelO3("O3", 106 cl::desc("Optimization level 3. Similar to llvm-gcc -O3")); 107 108 static cl::opt<bool> 109 UnitAtATime("funit-at-a-time", 110 cl::desc("Enable IPO. This is same as llvm-gcc's -funit-at-a-time")); 111 112 static cl::opt<bool> 113 DisableSimplifyLibCalls("disable-simplify-libcalls", 114 cl::desc("Disable simplify-libcalls")); 115 116 static cl::opt<bool> 117 Quiet("q", cl::desc("Obsolete option"), cl::Hidden); 118 119 static cl::alias 120 QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet)); 121 122 static cl::opt<bool> 123 AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization")); 124 125 // ---------- Define Printers for module and function passes ------------ 126 namespace { 127 128 struct CallGraphSCCPassPrinter : public CallGraphSCCPass { 129 static char ID; 130 const PassInfo *PassToPrint; 131 CallGraphSCCPassPrinter(const PassInfo *PI) : 132 CallGraphSCCPass(&ID), PassToPrint(PI) {} 133 134 virtual bool runOnSCC(const std::vector<CallGraphNode *>&SCC) { 135 if (!Quiet) { 136 outs() << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; 137 138 for (unsigned i = 0, e = SCC.size(); i != e; ++i) { 139 Function *F = SCC[i]->getFunction(); 140 if (F) { 141 outs().flush(); 142 getAnalysisID<Pass>(PassToPrint).print(cout, F->getParent()); 143 cout << std::flush; 144 } 145 } 146 } 147 // Get and print pass... 148 return false; 149 } 150 151 virtual const char *getPassName() const { return "'Pass' Printer"; } 152 153 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 154 AU.addRequiredID(PassToPrint); 155 AU.setPreservesAll(); 156 } 157 }; 158 159 char CallGraphSCCPassPrinter::ID = 0; 160 161 struct ModulePassPrinter : public ModulePass { 162 static char ID; 163 const PassInfo *PassToPrint; 164 ModulePassPrinter(const PassInfo *PI) : ModulePass(&ID), 165 PassToPrint(PI) {} 166 167 virtual bool runOnModule(Module &M) { 168 if (!Quiet) { 169 outs() << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; 170 outs().flush(); 171 getAnalysisID<Pass>(PassToPrint).print(cout, &M); 172 cout << std::flush; 173 } 174 175 // Get and print pass... 176 return false; 177 } 178 179 virtual const char *getPassName() const { return "'Pass' Printer"; } 180 181 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 182 AU.addRequiredID(PassToPrint); 183 AU.setPreservesAll(); 184 } 185 }; 186 187 char ModulePassPrinter::ID = 0; 188 struct FunctionPassPrinter : public FunctionPass { 189 const PassInfo *PassToPrint; 190 static char ID; 191 FunctionPassPrinter(const PassInfo *PI) : FunctionPass(&ID), 192 PassToPrint(PI) {} 193 194 virtual bool runOnFunction(Function &F) { 195 if (!Quiet) { 196 outs() << "Printing analysis '" << PassToPrint->getPassName() 197 << "' for function '" << F.getName() << "':\n"; 198 } 199 // Get and print pass... 200 outs().flush(); 201 getAnalysisID<Pass>(PassToPrint).print(cout, F.getParent()); 202 cout << std::flush; 203 return false; 204 } 205 206 virtual const char *getPassName() const { return "FunctionPass Printer"; } 207 208 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 209 AU.addRequiredID(PassToPrint); 210 AU.setPreservesAll(); 211 } 212 }; 213 214 char FunctionPassPrinter::ID = 0; 215 216 struct LoopPassPrinter : public LoopPass { 217 static char ID; 218 const PassInfo *PassToPrint; 219 LoopPassPrinter(const PassInfo *PI) : 220 LoopPass(&ID), PassToPrint(PI) {} 221 222 virtual bool runOnLoop(Loop *L, LPPassManager &LPM) { 223 if (!Quiet) { 224 outs() << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; 225 outs().flush(); 226 getAnalysisID<Pass>(PassToPrint).print(cout, 227 L->getHeader()->getParent()->getParent()); 228 cout << std::flush; 229 } 230 // Get and print pass... 231 return false; 232 } 233 234 virtual const char *getPassName() const { return "'Pass' Printer"; } 235 236 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 237 AU.addRequiredID(PassToPrint); 238 AU.setPreservesAll(); 239 } 240 }; 241 242 char LoopPassPrinter::ID = 0; 243 244 struct BasicBlockPassPrinter : public BasicBlockPass { 245 const PassInfo *PassToPrint; 246 static char ID; 247 BasicBlockPassPrinter(const PassInfo *PI) 248 : BasicBlockPass(&ID), PassToPrint(PI) {} 249 250 virtual bool runOnBasicBlock(BasicBlock &BB) { 251 if (!Quiet) { 252 outs() << "Printing Analysis info for BasicBlock '" << BB.getName() 253 << "': Pass " << PassToPrint->getPassName() << ":\n"; 254 } 255 256 // Get and print pass... 257 outs().flush(); 258 getAnalysisID<Pass>(PassToPrint).print(cout, BB.getParent()->getParent()); 259 cout << std::flush; 260 return false; 261 } 262 263 virtual const char *getPassName() const { return "BasicBlockPass Printer"; } 264 265 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 266 AU.addRequiredID(PassToPrint); 267 AU.setPreservesAll(); 268 } 269 }; 270 271 char BasicBlockPassPrinter::ID = 0; 272 inline void addPass(PassManager &PM, Pass *P) { 273 // Add the pass to the pass manager... 274 PM.add(P); 275 276 // If we are verifying all of the intermediate steps, add the verifier... 277 if (VerifyEach) PM.add(createVerifierPass()); 278 } 279 280 /// AddOptimizationPasses - This routine adds optimization passes 281 /// based on selected optimization level, OptLevel. This routine 282 /// duplicates llvm-gcc behaviour. 283 /// 284 /// OptLevel - Optimization Level 285 void AddOptimizationPasses(PassManager &MPM, FunctionPassManager &FPM, 286 unsigned OptLevel) { 287 createStandardFunctionPasses(&FPM, OptLevel); 288 289 llvm::Pass *InliningPass = OptLevel > 1 ? createFunctionInliningPass() : 0; 290 createStandardModulePasses(&MPM, OptLevel, 291 /*OptimizeSize=*/ false, 292 UnitAtATime, 293 /*UnrollLoops=*/ OptLevel > 1, 294 !DisableSimplifyLibCalls, 295 /*HaveExceptions=*/ true, 296 InliningPass); 297 } 298 299 void AddStandardCompilePasses(PassManager &PM) { 300 PM.add(createVerifierPass()); // Verify that input is correct 301 302 addPass(PM, createLowerSetJmpPass()); // Lower llvm.setjmp/.longjmp 303 304 // If the -strip-debug command line option was specified, do it. 305 if (StripDebug) 306 addPass(PM, createStripSymbolsPass(true)); 307 308 if (DisableOptimizations) return; 309 310 llvm::Pass *InliningPass = !DisableInline ? createFunctionInliningPass() : 0; 311 312 // -std-compile-opts adds the same module passes as -O3. 313 createStandardModulePasses(&PM, 3, 314 /*OptimizeSize=*/ false, 315 /*UnitAtATime=*/ true, 316 /*UnrollLoops=*/ true, 317 /*SimplifyLibCalls=*/ true, 318 /*HaveExceptions=*/ true, 319 InliningPass); 320 } 321 322 void AddStandardLinkPasses(PassManager &PM) { 323 PM.add(createVerifierPass()); // Verify that input is correct 324 325 // If the -strip-debug command line option was specified, do it. 326 if (StripDebug) 327 addPass(PM, createStripSymbolsPass(true)); 328 329 if (DisableOptimizations) return; 330 331 createStandardLTOPasses(&PM, /*Internalize=*/ !DisableInternalize, 332 /*RunInliner=*/ !DisableInline, 333 /*VerifyEach=*/ VerifyEach); 334 } 335 336 } // anonymous namespace 337 338 339 //===----------------------------------------------------------------------===// 340 // main for opt 341 // 342 int main(int argc, char **argv) { 343 llvm_shutdown_obj X; // Call llvm_shutdown() on exit. 344 LLVMContext &Context = getGlobalContext(); 345 try { 346 cl::ParseCommandLineOptions(argc, argv, 347 "llvm .bc -> .bc modular optimizer and analysis printer\n"); 348 sys::PrintStackTraceOnErrorSignal(); 349 350 // Allocate a full target machine description only if necessary. 351 // FIXME: The choice of target should be controllable on the command line. 352 std::auto_ptr<TargetMachine> target; 353 354 std::string ErrorMessage; 355 356 // Load the input module... 357 std::auto_ptr<Module> M; 358 if (MemoryBuffer *Buffer 359 = MemoryBuffer::getFileOrSTDIN(InputFilename, &ErrorMessage)) { 360 M.reset(ParseBitcodeFile(Buffer, Context, &ErrorMessage)); 361 delete Buffer; 362 } 363 364 if (M.get() == 0) { 365 errs() << argv[0] << ": "; 366 if (ErrorMessage.size()) 367 errs() << ErrorMessage << "\n"; 368 else 369 errs() << "bitcode didn't read correctly.\n"; 370 return 1; 371 } 372 373 // Figure out what stream we are supposed to write to... 374 // FIXME: outs() is not binary! 375 raw_ostream *Out = &outs(); // Default to printing to stdout... 376 if (OutputFilename != "-") { 377 std::string ErrorInfo; 378 Out = new raw_fd_ostream(OutputFilename.c_str(), /*Binary=*/true, 379 Force, ErrorInfo); 380 if (!ErrorInfo.empty()) { 381 errs() << ErrorInfo << '\n'; 382 if (!Force) 383 errs() << "Use -f command line argument to force output\n"; 384 delete Out; 385 return 1; 386 } 387 388 // Make sure that the Output file gets unlinked from the disk if we get a 389 // SIGINT 390 sys::RemoveFileOnSignal(sys::Path(OutputFilename)); 391 } 392 393 // If the output is set to be emitted to standard out, and standard out is a 394 // console, print out a warning message and refuse to do it. We don't 395 // impress anyone by spewing tons of binary goo to a terminal. 396 if (!Force && !NoOutput && CheckBitcodeOutputToConsole(Out,!Quiet)) { 397 NoOutput = true; 398 } 399 400 // Create a PassManager to hold and optimize the collection of passes we are 401 // about to build... 402 // 403 PassManager Passes; 404 405 // Add an appropriate TargetData instance for this module... 406 Passes.add(new TargetData(M.get())); 407 408 FunctionPassManager *FPasses = NULL; 409 if (OptLevelO1 || OptLevelO2 || OptLevelO3) { 410 FPasses = new FunctionPassManager(new ExistingModuleProvider(M.get())); 411 FPasses->add(new TargetData(M.get())); 412 } 413 414 // If the -strip-debug command line option was specified, add it. If 415 // -std-compile-opts was also specified, it will handle StripDebug. 416 if (StripDebug && !StandardCompileOpts) 417 addPass(Passes, createStripSymbolsPass(true)); 418 419 // Create a new optimization pass for each one specified on the command line 420 for (unsigned i = 0; i < PassList.size(); ++i) { 421 // Check to see if -std-compile-opts was specified before this option. If 422 // so, handle it. 423 if (StandardCompileOpts && 424 StandardCompileOpts.getPosition() < PassList.getPosition(i)) { 425 AddStandardCompilePasses(Passes); 426 StandardCompileOpts = false; 427 } 428 429 if (StandardLinkOpts && 430 StandardLinkOpts.getPosition() < PassList.getPosition(i)) { 431 AddStandardLinkPasses(Passes); 432 StandardLinkOpts = false; 433 } 434 435 if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) { 436 AddOptimizationPasses(Passes, *FPasses, 1); 437 OptLevelO1 = false; 438 } 439 440 if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) { 441 AddOptimizationPasses(Passes, *FPasses, 2); 442 OptLevelO2 = false; 443 } 444 445 if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) { 446 AddOptimizationPasses(Passes, *FPasses, 3); 447 OptLevelO3 = false; 448 } 449 450 const PassInfo *PassInf = PassList[i]; 451 Pass *P = 0; 452 if (PassInf->getNormalCtor()) 453 P = PassInf->getNormalCtor()(); 454 else 455 errs() << argv[0] << ": cannot create pass: " 456 << PassInf->getPassName() << "\n"; 457 if (P) { 458 bool isBBPass = dynamic_cast<BasicBlockPass*>(P) != 0; 459 bool isLPass = !isBBPass && dynamic_cast<LoopPass*>(P) != 0; 460 bool isFPass = !isLPass && dynamic_cast<FunctionPass*>(P) != 0; 461 bool isCGSCCPass = !isFPass && dynamic_cast<CallGraphSCCPass*>(P) != 0; 462 463 addPass(Passes, P); 464 465 if (AnalyzeOnly) { 466 if (isBBPass) 467 Passes.add(new BasicBlockPassPrinter(PassInf)); 468 else if (isLPass) 469 Passes.add(new LoopPassPrinter(PassInf)); 470 else if (isFPass) 471 Passes.add(new FunctionPassPrinter(PassInf)); 472 else if (isCGSCCPass) 473 Passes.add(new CallGraphSCCPassPrinter(PassInf)); 474 else 475 Passes.add(new ModulePassPrinter(PassInf)); 476 } 477 } 478 479 if (PrintEachXForm) 480 Passes.add(createPrintModulePass(&errs())); 481 } 482 483 // If -std-compile-opts was specified at the end of the pass list, add them. 484 if (StandardCompileOpts) { 485 AddStandardCompilePasses(Passes); 486 StandardCompileOpts = false; 487 } 488 489 if (StandardLinkOpts) { 490 AddStandardLinkPasses(Passes); 491 StandardLinkOpts = false; 492 } 493 494 if (OptLevelO1) { 495 AddOptimizationPasses(Passes, *FPasses, 1); 496 } 497 498 if (OptLevelO2) { 499 AddOptimizationPasses(Passes, *FPasses, 2); 500 } 501 502 if (OptLevelO3) { 503 AddOptimizationPasses(Passes, *FPasses, 3); 504 } 505 506 if (OptLevelO1 || OptLevelO2 || OptLevelO3) { 507 FPasses->doInitialization(); 508 for (Module::iterator I = M.get()->begin(), E = M.get()->end(); 509 I != E; ++I) 510 FPasses->run(*I); 511 } 512 513 // Check that the module is well formed on completion of optimization 514 if (!NoVerify && !VerifyEach) 515 Passes.add(createVerifierPass()); 516 517 // Write bitcode out to disk or outs() as the last step... 518 if (!NoOutput && !AnalyzeOnly) 519 Passes.add(createBitcodeWriterPass(*Out)); 520 521 // Now that we have all of the passes ready, run them. 522 Passes.run(*M.get()); 523 524 // Delete the raw_fd_ostream. 525 if (Out != &outs()) 526 delete Out; 527 return 0; 528 529 } catch (const std::string& msg) { 530 errs() << argv[0] << ": " << msg << "\n"; 531 } catch (...) { 532 errs() << argv[0] << ": Unexpected unknown exception occurred.\n"; 533 } 534 llvm_shutdown(); 535 return 1; 536 } 537