Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Side by Side Diff: tools/opt/opt.cpp

Issue 939073008: Rebased PNaCl localmods in LLVM to 223109 (Closed)
Patch Set: undo localmod Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/opt/Makefile ('k') | tools/pnacl-abicheck/CMakeLists.txt » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- opt.cpp - The LLVM Modular Optimizer -------------------------------===// 1 //===- opt.cpp - The LLVM Modular Optimizer -------------------------------===//
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 // Optimizations may be specified an arbitrary number of times on the command 10 // Optimizations may be specified an arbitrary number of times on the command
11 // line, They are run in the order specified. 11 // line, They are run in the order specified.
12 // 12 //
13 //===----------------------------------------------------------------------===// 13 //===----------------------------------------------------------------------===//
14 14
15 #include "BreakpointPrinter.h" 15 #include "BreakpointPrinter.h"
16 #include "NewPMDriver.h" 16 #include "NewPMDriver.h"
17 #include "PassPrinters.h" 17 #include "PassPrinters.h"
18 #include "llvm/ADT/Triple.h" 18 #include "llvm/ADT/Triple.h"
19 #include "llvm/Analysis/CallGraph.h" 19 #include "llvm/Analysis/CallGraph.h"
20 #include "llvm/Analysis/CallGraphSCCPass.h" 20 #include "llvm/Analysis/CallGraphSCCPass.h"
21 #include "llvm/Analysis/LoopPass.h" 21 #include "llvm/Analysis/LoopPass.h"
22 #include "llvm/Analysis/RegionPass.h" 22 #include "llvm/Analysis/RegionPass.h"
23 #include "llvm/Bitcode/BitcodeWriterPass.h" 23 #include "llvm/Bitcode/BitcodeWriterPass.h"
24 #include "llvm/Bitcode/NaCl/NaClBitcodeWriterPass.h" // @LOCALMOD
24 #include "llvm/CodeGen/CommandFlags.h" 25 #include "llvm/CodeGen/CommandFlags.h"
25 #include "llvm/IR/DataLayout.h" 26 #include "llvm/IR/DataLayout.h"
26 #include "llvm/IR/IRPrintingPasses.h" 27 #include "llvm/IR/IRPrintingPasses.h"
27 #include "llvm/IR/LLVMContext.h" 28 #include "llvm/IR/LLVMContext.h"
28 #include "llvm/IR/LegacyPassNameParser.h" 29 #include "llvm/IR/LegacyPassNameParser.h"
29 #include "llvm/IR/Module.h" 30 #include "llvm/IR/Module.h"
30 #include "llvm/IR/Verifier.h" 31 #include "llvm/IR/Verifier.h"
31 #include "llvm/IRReader/IRReader.h" 32 #include "llvm/IRReader/IRReader.h"
32 #include "llvm/InitializePasses.h" 33 #include "llvm/InitializePasses.h"
33 #include "llvm/LinkAllIR.h" 34 #include "llvm/LinkAllIR.h"
34 #include "llvm/LinkAllPasses.h" 35 #include "llvm/LinkAllPasses.h"
35 #include "llvm/MC/SubtargetFeature.h" 36 #include "llvm/MC/SubtargetFeature.h"
36 #include "llvm/PassManager.h" 37 #include "llvm/PassManager.h"
37 #include "llvm/Support/Debug.h" 38 #include "llvm/Support/Debug.h"
38 #include "llvm/Support/FileSystem.h" 39 #include "llvm/Support/FileSystem.h"
39 #include "llvm/Support/ManagedStatic.h" 40 #include "llvm/Support/ManagedStatic.h"
40 #include "llvm/Support/PluginLoader.h" 41 #include "llvm/Support/PluginLoader.h"
41 #include "llvm/Support/PrettyStackTrace.h" 42 #include "llvm/Support/PrettyStackTrace.h"
42 #include "llvm/Support/Signals.h" 43 #include "llvm/Support/Signals.h"
43 #include "llvm/Support/SourceMgr.h" 44 #include "llvm/Support/SourceMgr.h"
44 #include "llvm/Support/SystemUtils.h" 45 #include "llvm/Support/SystemUtils.h"
45 #include "llvm/Support/TargetRegistry.h" 46 #include "llvm/Support/TargetRegistry.h"
46 #include "llvm/Support/TargetSelect.h" 47 #include "llvm/Support/TargetSelect.h"
47 #include "llvm/Support/ToolOutputFile.h" 48 #include "llvm/Support/ToolOutputFile.h"
48 #include "llvm/Target/TargetLibraryInfo.h" 49 #include "llvm/Target/TargetLibraryInfo.h"
49 #include "llvm/Target/TargetMachine.h" 50 #include "llvm/Target/TargetMachine.h"
50 #include "llvm/Transforms/IPO/PassManagerBuilder.h" 51 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
52 #include "llvm/Transforms/MinSFI.h" // @LOCALMOD
53 #include "llvm/Transforms/NaCl.h" // @LOCALMOD
51 #include <algorithm> 54 #include <algorithm>
52 #include <memory> 55 #include <memory>
53 using namespace llvm; 56 using namespace llvm;
54 using namespace opt_tool; 57 using namespace opt_tool;
55 58
56 // The OptimizationList is automatically populated with registered Passes by the 59 // The OptimizationList is automatically populated with registered Passes by the
57 // PassNameParser. 60 // PassNameParser.
58 // 61 //
59 static cl::list<const PassInfo*, bool, PassNameParser> 62 static cl::list<const PassInfo*, bool, PassNameParser>
60 PassList(cl::desc("Optimizations available:")); 63 PassList(cl::desc("Optimizations available:"));
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 cl::desc("Like -O2 with extra optimizations for size. Similar to clan g -Os")); 128 cl::desc("Like -O2 with extra optimizations for size. Similar to clan g -Os"));
126 129
127 static cl::opt<bool> 130 static cl::opt<bool>
128 OptLevelOz("Oz", 131 OptLevelOz("Oz",
129 cl::desc("Like -Os but reduces code size further. Similar to clang -O z")); 132 cl::desc("Like -Os but reduces code size further. Similar to clang -O z"));
130 133
131 static cl::opt<bool> 134 static cl::opt<bool>
132 OptLevelO3("O3", 135 OptLevelO3("O3",
133 cl::desc("Optimization level 3. Similar to clang -O3")); 136 cl::desc("Optimization level 3. Similar to clang -O3"));
134 137
138 // @LOCALMOD-BEGIN
139 static cl::opt<bool>
140 PNaClABISimplifyPreOpt(
141 "pnacl-abi-simplify-preopt",
142 cl::desc("PNaCl ABI simplifications for before optimizations"));
143
144 static cl::opt<bool>
145 PNaClABISimplifyPostOpt(
146 "pnacl-abi-simplify-postopt",
147 cl::desc("PNaCl ABI simplifications for after optimizations"));
148
149 static cl::opt<bool>
150 MinSFI("minsfi",
151 cl::desc("MinSFI sandboxing"));
152 // @LOCALMOD-END
153
135 static cl::opt<std::string> 154 static cl::opt<std::string>
136 TargetTriple("mtriple", cl::desc("Override target triple for module")); 155 TargetTriple("mtriple", cl::desc("Override target triple for module"));
137 156
138 static cl::opt<bool> 157 static cl::opt<bool>
139 UnitAtATime("funit-at-a-time", 158 UnitAtATime("funit-at-a-time",
140 cl::desc("Enable IPO. This corresponds to gcc's -funit-at-a-time"), 159 cl::desc("Enable IPO. This corresponds to gcc's -funit-at-a-time"),
141 cl::init(true)); 160 cl::init(true));
142 161
143 static cl::opt<bool> 162 static cl::opt<bool>
144 DisableLoopUnrolling("disable-loop-unrolling", 163 DisableLoopUnrolling("disable-loop-unrolling",
(...skipping 25 matching lines...) Expand all
170 189
171 static cl::opt<bool> 190 static cl::opt<bool>
172 PrintBreakpoints("print-breakpoints-for-testing", 191 PrintBreakpoints("print-breakpoints-for-testing",
173 cl::desc("Print select breakpoints location for testing")); 192 cl::desc("Print select breakpoints location for testing"));
174 193
175 static cl::opt<std::string> 194 static cl::opt<std::string>
176 DefaultDataLayout("default-data-layout", 195 DefaultDataLayout("default-data-layout",
177 cl::desc("data layout string to use if not specified by module"), 196 cl::desc("data layout string to use if not specified by module"),
178 cl::value_desc("layout-string"), cl::init("")); 197 cl::value_desc("layout-string"), cl::init(""));
179 198
199 // @LOCALMOD-BEGIN
200 static cl::opt<NaClFileFormat>
201 OutputFileFormat(
202 "bitcode-format",
203 cl::desc("Define format of generated bitcode file:"),
204 cl::values(
205 clEnumValN(LLVMFormat, "llvm", "LLVM bitcode file (default)"),
206 clEnumValN(PNaClFormat, "pnacl", "PNaCl bitcode file"),
207 clEnumValEnd),
208 cl::init(LLVMFormat));
209 extern bool OutputFileFormatIsPNaCl;
210 // @LOCALMOD-END
180 211
181 212
182 static inline void addPass(PassManagerBase &PM, Pass *P) { 213 static inline void addPass(PassManagerBase &PM, Pass *P) {
183 // Add the pass to the pass manager... 214 // Add the pass to the pass manager...
184 PM.add(P); 215 PM.add(P);
185 216
186 // If we are verifying all of the intermediate steps, add the verifier... 217 // If we are verifying all of the intermediate steps, add the verifier...
187 if (VerifyEach) { 218 if (VerifyEach) {
188 PM.add(createVerifierPass()); 219 PM.add(createVerifierPass());
189 PM.add(createDebugInfoVerifierPass()); 220 PM.add(createDebugInfoVerifierPass());
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 if (OptLevelO2) 282 if (OptLevelO2)
252 return CodeGenOpt::Default; 283 return CodeGenOpt::Default;
253 if (OptLevelO3) 284 if (OptLevelO3)
254 return CodeGenOpt::Aggressive; 285 return CodeGenOpt::Aggressive;
255 return CodeGenOpt::None; 286 return CodeGenOpt::None;
256 } 287 }
257 288
258 // Returns the TargetMachine instance or zero if no triple is provided. 289 // Returns the TargetMachine instance or zero if no triple is provided.
259 static TargetMachine* GetTargetMachine(Triple TheTriple) { 290 static TargetMachine* GetTargetMachine(Triple TheTriple) {
260 std::string Error; 291 std::string Error;
292 // @LOCALMOD-BEGIN: Some optimization passes like SimplifyCFG do nice
293 // things for code size, but only do it if the TTI says it is okay.
294 // For now, use the ARM TTI for LE32 until we have an LE32 TTI.
295 // https://code.google.com/p/nativeclient/issues/detail?id=2554
296 if (TheTriple.getArch() == Triple::le32) {
297 TheTriple.setArchName("armv7a");
298 }
299 // @LOCALMOD-END
261 const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple, 300 const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple,
262 Error); 301 Error);
263 // Some modules don't specify a triple, and this is okay. 302 // Some modules don't specify a triple, and this is okay.
264 if (!TheTarget) { 303 if (!TheTarget) {
265 return nullptr; 304 return nullptr;
266 } 305 }
267 306
268 // Package up features to be passed to target/subtarget 307 // Package up features to be passed to target/subtarget
269 std::string FeaturesStr; 308 std::string FeaturesStr;
270 if (MAttrs.size()) { 309 if (MAttrs.size()) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 // For codegen passes, only passes that do IR to IR transformation are 359 // For codegen passes, only passes that do IR to IR transformation are
321 // supported. 360 // supported.
322 initializeCodeGenPreparePass(Registry); 361 initializeCodeGenPreparePass(Registry);
323 initializeAtomicExpandPass(Registry); 362 initializeAtomicExpandPass(Registry);
324 initializeRewriteSymbolsPass(Registry); 363 initializeRewriteSymbolsPass(Registry);
325 364
326 #ifdef LINK_POLLY_INTO_TOOLS 365 #ifdef LINK_POLLY_INTO_TOOLS
327 polly::initializePollyPasses(Registry); 366 polly::initializePollyPasses(Registry);
328 #endif 367 #endif
329 368
369 // @LOCALMOD-BEGIN
370 initializeAddPNaClExternalDeclsPass(Registry);
371 initializeAllocateDataSegmentPass(Registry);
372 initializeBackendCanonicalizePass(Registry);
373 initializeCanonicalizeMemIntrinsicsPass(Registry);
374 initializeConstantInsertExtractElementIndexPass(Registry);
375 initializeExpandAllocasPass(Registry);
376 initializeExpandArithWithOverflowPass(Registry);
377 initializeExpandByValPass(Registry);
378 initializeExpandConstantExprPass(Registry);
379 initializeExpandCtorsPass(Registry);
380 initializeExpandGetElementPtrPass(Registry);
381 initializeExpandIndirectBrPass(Registry);
382 initializeExpandLargeIntegersPass(Registry);
383 initializeExpandShuffleVectorPass(Registry);
384 initializeExpandSmallArgumentsPass(Registry);
385 initializeExpandStructRegsPass(Registry);
386 initializeExpandTlsConstantExprPass(Registry);
387 initializeExpandTlsPass(Registry);
388 initializeExpandVarArgsPass(Registry);
389 initializeFixVectorLoadStoreAlignmentPass(Registry);
390 initializeFlattenGlobalsPass(Registry);
391 initializeGlobalCleanupPass(Registry);
392 initializeGlobalizeConstantVectorsPass(Registry);
393 initializeInsertDivideCheckPass(Registry);
394 initializePNaClABIVerifyFunctionsPass(Registry);
395 initializePNaClABIVerifyModulePass(Registry);
396 initializePNaClSjLjEHPass(Registry);
397 initializePromoteI1OpsPass(Registry);
398 initializePromoteIntegersPass(Registry);
399 initializeRemoveAsmMemoryPass(Registry);
400 initializeRenameEntryPointPass(Registry);
401 initializeReplacePtrsWithIntsPass(Registry);
402 initializeResolveAliasesPass(Registry);
403 initializeResolvePNaClIntrinsicsPass(Registry);
404 initializeRewriteAtomicsPass(Registry);
405 initializeRewriteLLVMIntrinsicsPass(Registry);
406 initializeRewritePNaClLibraryCallsPass(Registry);
407 initializeSandboxIndirectCallsPass(Registry);
408 initializeSandboxMemoryAccessesPass(Registry);
409 initializeSimplifyAllocasPass(Registry);
410 initializeStripAttributesPass(Registry);
411 initializeStripMetadataPass(Registry);
412 initializeStripModuleFlagsPass(Registry);
413 initializeStripTlsPass(Registry);
414 initializeSubstituteUndefsPass(Registry);
415 // @LOCALMOD-END
416
330 cl::ParseCommandLineOptions(argc, argv, 417 cl::ParseCommandLineOptions(argc, argv,
331 "llvm .bc -> .bc modular optimizer and analysis printer\n"); 418 "llvm .bc -> .bc modular optimizer and analysis printer\n");
332 419
333 if (AnalyzeOnly && NoOutput) { 420 if (AnalyzeOnly && NoOutput) {
334 errs() << argv[0] << ": analyze mode conflicts with no-output mode.\n"; 421 errs() << argv[0] << ": analyze mode conflicts with no-output mode.\n";
335 return 1; 422 return 1;
336 } 423 }
337 424
338 SMDiagnostic Err; 425 SMDiagnostic Err;
339 426
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 Passes.add(createBreakpointPrinter(Out->os())); 541 Passes.add(createBreakpointPrinter(Out->os()));
455 NoOutput = true; 542 NoOutput = true;
456 } 543 }
457 544
458 // If the -strip-debug command line option was specified, add it. 545 // If the -strip-debug command line option was specified, add it.
459 if (StripDebug) 546 if (StripDebug)
460 addPass(Passes, createStripSymbolsPass(true)); 547 addPass(Passes, createStripSymbolsPass(true));
461 548
462 // Create a new optimization pass for each one specified on the command line 549 // Create a new optimization pass for each one specified on the command line
463 for (unsigned i = 0; i < PassList.size(); ++i) { 550 for (unsigned i = 0; i < PassList.size(); ++i) {
551 // @LOCALMOD-BEGIN
552 if (PNaClABISimplifyPreOpt &&
553 PNaClABISimplifyPreOpt.getPosition() < PassList.getPosition(i)) {
554 PNaClABISimplifyAddPreOptPasses(Passes);
555 PNaClABISimplifyPreOpt = false;
556 }
557 // @LOCALMOD-END
558
464 if (StandardLinkOpts && 559 if (StandardLinkOpts &&
465 StandardLinkOpts.getPosition() < PassList.getPosition(i)) { 560 StandardLinkOpts.getPosition() < PassList.getPosition(i)) {
466 AddStandardLinkPasses(Passes); 561 AddStandardLinkPasses(Passes);
467 StandardLinkOpts = false; 562 StandardLinkOpts = false;
468 } 563 }
469 564
470 if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) { 565 if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) {
471 AddOptimizationPasses(Passes, *FPasses, 1, 0); 566 AddOptimizationPasses(Passes, *FPasses, 1, 0);
472 OptLevelO1 = false; 567 OptLevelO1 = false;
473 } 568 }
(...skipping 11 matching lines...) Expand all
485 if (OptLevelOz && OptLevelOz.getPosition() < PassList.getPosition(i)) { 580 if (OptLevelOz && OptLevelOz.getPosition() < PassList.getPosition(i)) {
486 AddOptimizationPasses(Passes, *FPasses, 2, 2); 581 AddOptimizationPasses(Passes, *FPasses, 2, 2);
487 OptLevelOz = false; 582 OptLevelOz = false;
488 } 583 }
489 584
490 if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) { 585 if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) {
491 AddOptimizationPasses(Passes, *FPasses, 3, 0); 586 AddOptimizationPasses(Passes, *FPasses, 3, 0);
492 OptLevelO3 = false; 587 OptLevelO3 = false;
493 } 588 }
494 589
590 // @LOCALMOD-BEGIN
591 if (PNaClABISimplifyPostOpt &&
592 PNaClABISimplifyPostOpt.getPosition() < PassList.getPosition(i)) {
593 PNaClABISimplifyAddPostOptPasses(Passes);
594 PNaClABISimplifyPostOpt = false;
595 }
596
597 if (MinSFI && MinSFI.getPosition() < PassList.getPosition(i)) {
598 MinSFIPasses(Passes);
599 MinSFI = false;
600 }
601 // @LOCALMOD-END
602
495 const PassInfo *PassInf = PassList[i]; 603 const PassInfo *PassInf = PassList[i];
496 Pass *P = nullptr; 604 Pass *P = nullptr;
497 if (PassInf->getTargetMachineCtor()) 605 if (PassInf->getTargetMachineCtor())
498 P = PassInf->getTargetMachineCtor()(TM.get()); 606 P = PassInf->getTargetMachineCtor()(TM.get());
499 else if (PassInf->getNormalCtor()) 607 else if (PassInf->getNormalCtor())
500 P = PassInf->getNormalCtor()(); 608 P = PassInf->getNormalCtor()();
501 else 609 else
502 errs() << argv[0] << ": cannot create pass: " 610 errs() << argv[0] << ": cannot create pass: "
503 << PassInf->getPassName() << "\n"; 611 << PassInf->getPassName() << "\n";
504 if (P) { 612 if (P) {
(...skipping 21 matching lines...) Expand all
526 Passes.add(createModulePassPrinter(PassInf, Out->os(), Quiet)); 634 Passes.add(createModulePassPrinter(PassInf, Out->os(), Quiet));
527 break; 635 break;
528 } 636 }
529 } 637 }
530 } 638 }
531 639
532 if (PrintEachXForm) 640 if (PrintEachXForm)
533 Passes.add(createPrintModulePass(errs())); 641 Passes.add(createPrintModulePass(errs()));
534 } 642 }
535 643
644 // @LOCALMOD-BEGIN
645 if (PNaClABISimplifyPreOpt)
646 PNaClABISimplifyAddPreOptPasses(Passes);
647 // @LOCALMOD-END
648
536 if (StandardLinkOpts) { 649 if (StandardLinkOpts) {
537 AddStandardLinkPasses(Passes); 650 AddStandardLinkPasses(Passes);
538 StandardLinkOpts = false; 651 StandardLinkOpts = false;
539 } 652 }
540 653
541 if (OptLevelO1) 654 if (OptLevelO1)
542 AddOptimizationPasses(Passes, *FPasses, 1, 0); 655 AddOptimizationPasses(Passes, *FPasses, 1, 0);
543 656
544 if (OptLevelO2) 657 if (OptLevelO2)
545 AddOptimizationPasses(Passes, *FPasses, 2, 0); 658 AddOptimizationPasses(Passes, *FPasses, 2, 0);
546 659
547 if (OptLevelOs) 660 if (OptLevelOs)
548 AddOptimizationPasses(Passes, *FPasses, 2, 1); 661 AddOptimizationPasses(Passes, *FPasses, 2, 1);
549 662
550 if (OptLevelOz) 663 if (OptLevelOz)
551 AddOptimizationPasses(Passes, *FPasses, 2, 2); 664 AddOptimizationPasses(Passes, *FPasses, 2, 2);
552 665
553 if (OptLevelO3) 666 if (OptLevelO3)
554 AddOptimizationPasses(Passes, *FPasses, 3, 0); 667 AddOptimizationPasses(Passes, *FPasses, 3, 0);
555 668
556 if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) { 669 if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) {
557 FPasses->doInitialization(); 670 FPasses->doInitialization();
558 for (Module::iterator F = M->begin(), E = M->end(); F != E; ++F) 671 for (Module::iterator F = M->begin(), E = M->end(); F != E; ++F)
559 FPasses->run(*F); 672 FPasses->run(*F);
560 FPasses->doFinalization(); 673 FPasses->doFinalization();
561 } 674 }
562 675
676 // @LOCALMOD-BEGIN
677 if (PNaClABISimplifyPostOpt)
678 PNaClABISimplifyAddPostOptPasses(Passes);
679
680 if (MinSFI)
681 MinSFIPasses(Passes);
682 // @LOCALMOD-END
683
563 // Check that the module is well formed on completion of optimization 684 // Check that the module is well formed on completion of optimization
564 if (!NoVerify && !VerifyEach) { 685 if (!NoVerify && !VerifyEach) {
565 Passes.add(createVerifierPass()); 686 Passes.add(createVerifierPass());
566 Passes.add(createDebugInfoVerifierPass()); 687 Passes.add(createDebugInfoVerifierPass());
567 } 688 }
568 689
569 // Write bitcode or assembly to the output as the last step... 690 // Write bitcode or assembly to the output as the last step...
570 if (!NoOutput && !AnalyzeOnly) { 691 if (!NoOutput && !AnalyzeOnly) {
571 if (OutputAssembly) 692 if (OutputAssembly)
572 Passes.add(createPrintModulePass(Out->os())); 693 Passes.add(createPrintModulePass(Out->os()));
573 else 694 else
574 Passes.add(createBitcodeWriterPass(Out->os())); 695 // @LOCALMOD-START
696 switch (OutputFileFormat) {
697 case LLVMFormat:
698 Passes.add(createBitcodeWriterPass(Out->os()));
699 break;
700 case PNaClFormat:
701 Passes.add(createNaClBitcodeWriterPass(Out->os()));
702 break;
703 case AutodetectFileFormat:
704 report_fatal_error("Command can't autodetect file format!");
705 break;
706 }
707 // @LOCALMOD-END
575 } 708 }
576 709
577 // Before executing passes, print the final values of the LLVM options. 710 // Before executing passes, print the final values of the LLVM options.
578 cl::PrintOptionValues(); 711 cl::PrintOptionValues();
579 712
580 // Now that we have all of the passes ready, run them. 713 // Now that we have all of the passes ready, run them.
581 Passes.run(*M.get()); 714 Passes.run(*M.get());
582 715
583 // Declare success. 716 // Declare success.
584 if (!NoOutput || PrintBreakpoints) 717 if (!NoOutput || PrintBreakpoints)
585 Out->keep(); 718 Out->keep();
586 719
587 return 0; 720 return 0;
588 } 721 }
OLDNEW
« no previous file with comments | « tools/opt/Makefile ('k') | tools/pnacl-abicheck/CMakeLists.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698