Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===-- llc.cpp - Implement the LLVM Native Code Generator ----------------===// | 1 //===-- llc.cpp - Implement the LLVM Native Code Generator ----------------===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This is the llc code generator driver. It provides a convenient | 10 // This is the llc code generator driver. It provides a convenient |
| 11 // command-line interface for generating native assembly-language code | 11 // command-line interface for generating native assembly-language code |
| 12 // or C code, given LLVM bitcode. | 12 // or C code, given LLVM bitcode. |
| 13 // | 13 // |
| 14 //===----------------------------------------------------------------------===// | 14 //===----------------------------------------------------------------------===// |
| 15 | 15 |
| 16 #include "llvm/LLVMContext.h" | 16 #include "llvm/LLVMContext.h" |
| 17 #include "llvm/Module.h" | 17 #include "llvm/Module.h" |
| 18 #include "llvm/PassManager.h" | 18 #include "llvm/PassManager.h" |
| 19 #include "llvm/Pass.h" | 19 #include "llvm/Pass.h" |
| 20 #include "llvm/ADT/Triple.h" | 20 #include "llvm/ADT/Triple.h" |
| 21 #include "llvm/Bitcode/BitcodeStream.h" | |
| 21 #include "llvm/Support/IRReader.h" | 22 #include "llvm/Support/IRReader.h" |
| 22 #include "llvm/CodeGen/LinkAllAsmWriterComponents.h" | 23 #include "llvm/CodeGen/LinkAllAsmWriterComponents.h" |
| 23 #include "llvm/CodeGen/LinkAllCodegenComponents.h" | 24 #include "llvm/CodeGen/LinkAllCodegenComponents.h" |
| 24 #include "llvm/Config/config.h" | 25 #include "llvm/Config/config.h" |
| 25 #include "llvm/MC/SubtargetFeature.h" | 26 #include "llvm/MC/SubtargetFeature.h" |
| 26 #include "llvm/Support/CommandLine.h" | 27 #include "llvm/Support/CommandLine.h" |
| 27 #include "llvm/Support/Debug.h" | 28 #include "llvm/Support/Debug.h" |
| 28 #include "llvm/Support/FormattedStream.h" | 29 #include "llvm/Support/FormattedStream.h" |
| 29 #include "llvm/Support/ManagedStatic.h" | 30 #include "llvm/Support/ManagedStatic.h" |
| 30 #if !defined(__native_client__) | 31 #if !defined(__native_client__) |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 322 std::auto_ptr<Module> M; | 323 std::auto_ptr<Module> M; |
| 323 | 324 |
| 324 // In the NACL_SRPC case, fake a memory mapped file | 325 // In the NACL_SRPC case, fake a memory mapped file |
| 325 // TODO(jvoung): revert changes in MemoryBuffer.cpp which are no longer needed | 326 // TODO(jvoung): revert changes in MemoryBuffer.cpp which are no longer needed |
| 326 #if defined(__native_client__) && defined(NACL_SRPC) | 327 #if defined(__native_client__) && defined(NACL_SRPC) |
| 327 M.reset(ParseIR(NaClGetMemoryBufferForFile(InputFilename.c_str()), | 328 M.reset(ParseIR(NaClGetMemoryBufferForFile(InputFilename.c_str()), |
| 328 Err, | 329 Err, |
| 329 Context)); | 330 Context)); |
| 330 M->setModuleIdentifier(InputFilename); | 331 M->setModuleIdentifier(InputFilename); |
| 331 #else | 332 #else |
| 332 M.reset(ParseIRFile(InputFilename, Err, Context)); | 333 //M.reset(ParseIRFile(InputFilename, Err, Context)); |
| 334 StreamChunkCallback cb = GetBitcodeFileStream(InputFilename, Err); | |
| 335 if (cb) { | |
| 336 M.reset(getLazyIRStreamModule(InputFilename, Err, Context, cb)); | |
| 337 } | |
| 333 #endif // defined(__native_client__) && defined(NACL_SRPC) | 338 #endif // defined(__native_client__) && defined(NACL_SRPC) |
| 334 if (M.get() == 0) { | 339 if (M.get() == 0) { |
| 335 Err.print(argv[0], errs()); | 340 Err.print(argv[0], errs()); |
| 336 return 1; | 341 return 1; |
| 337 } | 342 } |
| 338 Module &mod = *M.get(); | 343 Module &mod = *M.get(); |
| 339 | 344 |
| 340 // @LOCALMOD-BEGIN | 345 // @LOCALMOD-BEGIN |
| 341 if (!DumpMetadata.empty()) { | 346 if (!DumpMetadata.empty()) { |
| 342 bool success = WriteMetadata(DumpMetadata.c_str(), mod); | 347 bool success = WriteMetadata(DumpMetadata.c_str(), mod); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 438 errs() << argv[0] << ": invalid optimization level.\n"; | 443 errs() << argv[0] << ": invalid optimization level.\n"; |
| 439 return 1; | 444 return 1; |
| 440 case ' ': break; | 445 case ' ': break; |
| 441 case '0': OLvl = CodeGenOpt::None; break; | 446 case '0': OLvl = CodeGenOpt::None; break; |
| 442 case '1': OLvl = CodeGenOpt::Less; break; | 447 case '1': OLvl = CodeGenOpt::Less; break; |
| 443 case '2': OLvl = CodeGenOpt::Default; break; | 448 case '2': OLvl = CodeGenOpt::Default; break; |
| 444 case '3': OLvl = CodeGenOpt::Aggressive; break; | 449 case '3': OLvl = CodeGenOpt::Aggressive; break; |
| 445 } | 450 } |
| 446 | 451 |
| 447 // Build up all of the passes that we want to do to the module. | 452 // Build up all of the passes that we want to do to the module. |
| 448 PassManager PM; | 453 FunctionPassManager PM(&mod); |
| 449 | 454 |
| 450 // Add the target data from the target machine, if it exists, or the module. | 455 // Add the target data from the target machine, if it exists, or the module. |
| 451 if (const TargetData *TD = Target.getTargetData()) | 456 if (const TargetData *TD = Target.getTargetData()) |
| 452 PM.add(new TargetData(*TD)); | 457 PM.add(new TargetData(*TD)); |
| 453 else | 458 else |
| 454 PM.add(new TargetData(&mod)); | 459 PM.add(new TargetData(&mod)); |
| 455 | 460 |
| 456 // Override default to generate verbose assembly. | 461 // Override default to generate verbose assembly. |
| 457 Target.setAsmVerbosityDefault(true); | 462 Target.setAsmVerbosityDefault(true); |
| 458 | 463 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 491 // Ask the target to add backend passes as necessary. | 496 // Ask the target to add backend passes as necessary. |
| 492 if (Target.addPassesToEmitFile(PM, FOS, FileType, OLvl, NoVerify)) { | 497 if (Target.addPassesToEmitFile(PM, FOS, FileType, OLvl, NoVerify)) { |
| 493 errs() << argv[0] << ": target does not support generation of this" | 498 errs() << argv[0] << ": target does not support generation of this" |
| 494 << " file type!\n"; | 499 << " file type!\n"; |
| 495 return 1; | 500 return 1; |
| 496 } | 501 } |
| 497 | 502 |
| 498 // Before executing passes, print the final values of the LLVM options. | 503 // Before executing passes, print the final values of the LLVM options. |
| 499 cl::PrintOptionValues(); | 504 cl::PrintOptionValues(); |
| 500 | 505 |
| 501 PM.run(mod); | 506 PM.doInitialization(); |
|
jasonwkim
2011/10/25 21:34:12
Why did you expand this?
(google.com) Derek Schuff
2011/10/25 22:23:22
Because the module-level pass manager caused the w
| |
| 507 for (Module::iterator I = mod.begin(), E = mod.end(); I != E; ++I) { | |
| 508 PM.run(*I); | |
| 509 } | |
| 510 PM.doFinalization(); | |
| 502 } | 511 } |
| 503 | 512 |
| 504 // Declare success. | 513 // Declare success. |
| 505 Out->keep(); | 514 Out->keep(); |
| 506 #endif | 515 #endif |
| 507 | 516 |
| 508 return 0; | 517 return 0; |
| 509 } | 518 } |
| 510 | 519 |
| 511 #if !defined(NACL_SRPC) | 520 #if !defined(NACL_SRPC) |
| 512 int | 521 int |
| 513 main (int argc, char **argv) { | 522 main (int argc, char **argv) { |
| 514 return llc_main(argc, argv); | 523 return llc_main(argc, argv); |
| 515 } | 524 } |
| 516 #else | 525 #else |
| 517 // main() is in nacl_file.cpp. | 526 // main() is in nacl_file.cpp. |
| 518 #endif | 527 #endif |
| OLD | NEW |