@@ -536,62 +536,74 @@ bool swift::performLLVM(const IRGenOptions &Opts,
536
536
537
537
performLLVMOptimizations (Opts, Module, TargetMachine);
538
538
539
+ if (Stats) {
540
+ if (DiagMutex)
541
+ DiagMutex->lock ();
542
+ countStatsPostIRGen (*Stats, *Module);
543
+ if (DiagMutex)
544
+ DiagMutex->unlock ();
545
+ }
546
+
547
+ if (!RawOS)
548
+ return false ;
549
+
550
+ return compileAndWriteLLVM (Module, TargetMachine, Opts, Stats, Diags, *RawOS,
551
+ DiagMutex);
552
+ }
553
+
554
+ bool swift::compileAndWriteLLVM (llvm::Module *module ,
555
+ llvm::TargetMachine *targetMachine,
556
+ const IRGenOptions &opts,
557
+ UnifiedStatsReporter *stats,
558
+ DiagnosticEngine &diags,
559
+ llvm::raw_pwrite_stream &out,
560
+ llvm::sys::Mutex *diagMutex) {
539
561
legacy::PassManager EmitPasses;
540
562
541
563
// Set up the final emission passes.
542
- switch (Opts .OutputKind ) {
564
+ switch (opts .OutputKind ) {
543
565
case IRGenOutputKind::Module:
544
566
break ;
545
567
case IRGenOutputKind::LLVMAssembly:
546
- EmitPasses.add (createPrintModulePass (*RawOS ));
568
+ EmitPasses.add (createPrintModulePass (out ));
547
569
break ;
548
570
case IRGenOutputKind::LLVMBitcode: {
549
- if (Opts .LLVMLTOKind == IRGenLLVMLTOKind::Thin) {
550
- EmitPasses.add (createWriteThinLTOBitcodePass (*RawOS ));
571
+ if (opts .LLVMLTOKind == IRGenLLVMLTOKind::Thin) {
572
+ EmitPasses.add (createWriteThinLTOBitcodePass (out ));
551
573
} else {
552
- EmitPasses.add (createBitcodeWriterPass (*RawOS ));
574
+ EmitPasses.add (createBitcodeWriterPass (out ));
553
575
}
554
576
break ;
555
577
}
556
578
case IRGenOutputKind::NativeAssembly:
557
579
case IRGenOutputKind::ObjectFile: {
558
580
CodeGenFileType FileType;
559
- FileType = (Opts.OutputKind == IRGenOutputKind::NativeAssembly
560
- ? CGFT_AssemblyFile
561
- : CGFT_ObjectFile);
562
-
581
+ FileType =
582
+ (opts.OutputKind == IRGenOutputKind::NativeAssembly ? CGFT_AssemblyFile
583
+ : CGFT_ObjectFile);
563
584
EmitPasses.add (createTargetTransformInfoWrapperPass (
564
- TargetMachine ->getTargetIRAnalysis ()));
585
+ targetMachine ->getTargetIRAnalysis ()));
565
586
566
- bool fail = TargetMachine ->addPassesToEmitFile (EmitPasses, *RawOS , nullptr ,
567
- FileType, !Opts .Verify );
587
+ bool fail = targetMachine ->addPassesToEmitFile (EmitPasses, out , nullptr ,
588
+ FileType, !opts .Verify );
568
589
if (fail) {
569
- diagnoseSync (Diags, DiagMutex ,
570
- SourceLoc (), diag::error_codegen_init_fail);
590
+ diagnoseSync (diags, diagMutex, SourceLoc () ,
591
+ diag::error_codegen_init_fail);
571
592
return true ;
572
593
}
573
594
break ;
574
595
}
575
596
}
576
597
577
- if (Stats) {
578
- if (DiagMutex)
579
- DiagMutex->lock ();
580
- countStatsPostIRGen (*Stats, *Module);
581
- if (DiagMutex)
582
- DiagMutex->unlock ();
583
- }
598
+ EmitPasses.run (*module );
584
599
585
- EmitPasses.run (*Module);
586
-
587
- if (Stats && RawOS.hasValue ()) {
588
- if (DiagMutex)
589
- DiagMutex->lock ();
590
- Stats->getFrontendCounters ().NumLLVMBytesOutput += RawOS->tell ();
591
- if (DiagMutex)
592
- DiagMutex->unlock ();
600
+ if (stats) {
601
+ if (diagMutex)
602
+ diagMutex->lock ();
603
+ stats->getFrontendCounters ().NumLLVMBytesOutput += out.tell ();
604
+ if (diagMutex)
605
+ diagMutex->unlock ();
593
606
}
594
-
595
607
return false ;
596
608
}
597
609
0 commit comments