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/IR/LLVMContext.h" | 16 #include "llvm/IR/LLVMContext.h" |
| 17 #include "llvm/ADT/Triple.h" | 17 #include "llvm/ADT/Triple.h" |
| 18 #include "llvm/Analysis/NaCl.h" | |
| 18 #include "llvm/Assembly/PrintModulePass.h" | 19 #include "llvm/Assembly/PrintModulePass.h" |
| 19 #include "llvm/Support/DataStream.h" // @LOCALMOD | 20 #include "llvm/Support/DataStream.h" // @LOCALMOD |
| 20 #include "llvm/CodeGen/CommandFlags.h" | 21 #include "llvm/CodeGen/CommandFlags.h" |
| 21 #include "llvm/CodeGen/IntrinsicLowering.h" // @LOCALMOD | 22 #include "llvm/CodeGen/IntrinsicLowering.h" // @LOCALMOD |
| 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/IR/DataLayout.h" | 25 #include "llvm/IR/DataLayout.h" |
| 25 #include "llvm/IR/Module.h" | 26 #include "llvm/IR/Module.h" |
| 26 #include "llvm/MC/SubtargetFeature.h" | 27 #include "llvm/MC/SubtargetFeature.h" |
| 27 #include "llvm/Pass.h" | 28 #include "llvm/Pass.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 100 | 101 |
| 101 // The option below overlaps very much with bitcode streaming. | 102 // The option below overlaps very much with bitcode streaming. |
| 102 // We keep it separate because it is still experimental and we want | 103 // We keep it separate because it is still experimental and we want |
| 103 // to use it without changing the outside behavior which is especially | 104 // to use it without changing the outside behavior which is especially |
| 104 // relevant for the sandboxed case. | 105 // relevant for the sandboxed case. |
| 105 static cl::opt<bool> | 106 static cl::opt<bool> |
| 106 ReduceMemoryFootprint("reduce-memory-footprint", | 107 ReduceMemoryFootprint("reduce-memory-footprint", |
| 107 cl::desc("Aggressively reduce memory used by llc"), | 108 cl::desc("Aggressively reduce memory used by llc"), |
| 108 cl::init(false)); | 109 cl::init(false)); |
| 109 | 110 |
| 111 static cl::opt<bool> | |
| 112 ABIVerify("pnaclabi-verify", | |
|
jvoung (off chromium)
2013/03/12 22:16:21
Maybe have the PNaCl prefix in the variable name t
Derek Schuff
2013/03/13 21:51:01
Done.
| |
| 113 cl::desc("Verify PNaCl bitcode ABI before translating"), | |
| 114 cl::init(false)); | |
| 110 // @LOCALMOD-END | 115 // @LOCALMOD-END |
| 111 | 116 |
| 112 // Determine optimization level. | 117 // Determine optimization level. |
| 113 static cl::opt<char> | 118 static cl::opt<char> |
| 114 OptLevel("O", | 119 OptLevel("O", |
| 115 cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " | 120 cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " |
| 116 "(default = '-O2')"), | 121 "(default = '-O2')"), |
| 117 cl::Prefix, | 122 cl::Prefix, |
| 118 cl::ZeroOrMore, | 123 cl::ZeroOrMore, |
| 119 cl::init(' ')); | 124 cl::init(' ')); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 339 #endif | 344 #endif |
| 340 // @LOCALMOD-END | 345 // @LOCALMOD-END |
| 341 | 346 |
| 342 mod = M.get(); | 347 mod = M.get(); |
| 343 if (mod == 0) { | 348 if (mod == 0) { |
| 344 Err.print(argv[0], errs()); | 349 Err.print(argv[0], errs()); |
| 345 return 1; | 350 return 1; |
| 346 } | 351 } |
| 347 | 352 |
| 348 // @LOCALMOD-BEGIN | 353 // @LOCALMOD-BEGIN |
| 354 if (ABIVerify) { | |
| 355 // Verify the module (but not the functions yet) | |
| 356 ModulePass* VerifyPass = createPNaClABIVerifyModulePass(true); | |
|
jvoung (off chromium)
2013/03/12 22:16:21
The Function pass is only added when __native_clie
Mark Seaborn
2013/03/12 22:25:56
Spacing should be " *"
Derek Schuff
2013/03/13 21:51:01
Done.
Derek Schuff
2013/03/13 21:51:01
Done.
| |
| 357 VerifyPass->runOnModule(*mod); | |
| 358 } | |
| 349 #if defined(__native_client__) && defined(NACL_SRPC) | 359 #if defined(__native_client__) && defined(NACL_SRPC) |
| 350 RecordMetadataForSrpc(*mod); | 360 RecordMetadataForSrpc(*mod); |
| 351 | 361 |
| 352 // To determine if we should compile PIC or not, we needed to load at | 362 // To determine if we should compile PIC or not, we needed to load at |
| 353 // least the metadata. Since we've already constructed the commandline, | 363 // least the metadata. Since we've already constructed the commandline, |
| 354 // we have to hack this in after commandline processing. | 364 // we have to hack this in after commandline processing. |
| 355 if (mod->getOutputFormat() == Module::SharedOutputFormat) { | 365 if (mod->getOutputFormat() == Module::SharedOutputFormat) { |
| 356 RelocModel = Reloc::PIC_; | 366 RelocModel = Reloc::PIC_; |
| 357 } | 367 } |
| 358 // Also set PIC_ for dynamic executables: | 368 // Also set PIC_ for dynamic executables: |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 547 } | 557 } |
| 548 if (!StopAfter.empty()) { | 558 if (!StopAfter.empty()) { |
| 549 const PassInfo *PI = PR->getPassInfo(StopAfter); | 559 const PassInfo *PI = PR->getPassInfo(StopAfter); |
| 550 if (!PI) { | 560 if (!PI) { |
| 551 errs() << argv[0] << ": stop-after pass is not registered.\n"; | 561 errs() << argv[0] << ": stop-after pass is not registered.\n"; |
| 552 return 1; | 562 return 1; |
| 553 } | 563 } |
| 554 StopAfterID = PI->getTypeInfo(); | 564 StopAfterID = PI->getTypeInfo(); |
| 555 } | 565 } |
| 556 | 566 |
| 567 // Add the ABI verifier pass before the code emission passes. | |
| 568 if (ABIVerify) | |
| 569 PM->add(createPNaClABIVerifyFunctionsPass(true)); | |
| 570 | |
| 557 // Ask the target to add backend passes as necessary. | 571 // Ask the target to add backend passes as necessary. |
| 558 if (Target.addPassesToEmitFile(*PM, FOS, FileType, NoVerify, | 572 if (Target.addPassesToEmitFile(*PM, FOS, FileType, NoVerify, |
| 559 StartAfterID, StopAfterID)) { | 573 StartAfterID, StopAfterID)) { |
| 560 errs() << argv[0] << ": target does not support generation of this" | 574 errs() << argv[0] << ": target does not support generation of this" |
| 561 << " file type!\n"; | 575 << " file type!\n"; |
| 562 return 1; | 576 return 1; |
| 563 } | 577 } |
| 564 | 578 |
| 565 // Before executing passes, print the final values of the LLVM options. | 579 // Before executing passes, print the final values of the LLVM options. |
| 566 cl::PrintOptionValues(); | 580 cl::PrintOptionValues(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 605 } | 619 } |
| 606 | 620 |
| 607 #if !defined(NACL_SRPC) | 621 #if !defined(NACL_SRPC) |
| 608 int | 622 int |
| 609 main (int argc, char **argv) { | 623 main (int argc, char **argv) { |
| 610 return llc_main(argc, argv); | 624 return llc_main(argc, argv); |
| 611 } | 625 } |
| 612 #else | 626 #else |
| 613 // main() is in nacl_file.cpp. | 627 // main() is in nacl_file.cpp. |
| 614 #endif | 628 #endif |
| OLD | NEW |