Skip to content

Commit 408b6fc

Browse files
committed
[IRGen] Factor out compileAndWriteLLVM
Factor out the logic that deals with the LLVM passes for compiling and emitting the module.
1 parent 53ef0a2 commit 408b6fc

File tree

2 files changed

+51
-30
lines changed

2 files changed

+51
-30
lines changed

include/swift/Subsystems.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,15 @@ namespace swift {
232232
void performLLVMOptimizations(const IRGenOptions &Opts, llvm::Module *Module,
233233
llvm::TargetMachine *TargetMachine);
234234

235+
/// Compiles and writes the given LLVM module into an output stream in the
236+
/// format specified in the \c IRGenOptions.
237+
bool compileAndWriteLLVM(llvm::Module *module,
238+
llvm::TargetMachine *targetMachine,
239+
const IRGenOptions &opts,
240+
UnifiedStatsReporter *stats, DiagnosticEngine &diags,
241+
llvm::raw_pwrite_stream &out,
242+
llvm::sys::Mutex *diagMutex = nullptr);
243+
235244
/// Wrap a serialized module inside a swift AST section in an object file.
236245
void createSwiftModuleObjectFile(SILModule &SILMod, StringRef Buffer,
237246
StringRef OutputPath);

lib/IRGen/IRGen.cpp

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -536,62 +536,74 @@ bool swift::performLLVM(const IRGenOptions &Opts,
536536

537537
performLLVMOptimizations(Opts, Module, TargetMachine);
538538

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) {
539561
legacy::PassManager EmitPasses;
540562

541563
// Set up the final emission passes.
542-
switch (Opts.OutputKind) {
564+
switch (opts.OutputKind) {
543565
case IRGenOutputKind::Module:
544566
break;
545567
case IRGenOutputKind::LLVMAssembly:
546-
EmitPasses.add(createPrintModulePass(*RawOS));
568+
EmitPasses.add(createPrintModulePass(out));
547569
break;
548570
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));
551573
} else {
552-
EmitPasses.add(createBitcodeWriterPass(*RawOS));
574+
EmitPasses.add(createBitcodeWriterPass(out));
553575
}
554576
break;
555577
}
556578
case IRGenOutputKind::NativeAssembly:
557579
case IRGenOutputKind::ObjectFile: {
558580
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);
563584
EmitPasses.add(createTargetTransformInfoWrapperPass(
564-
TargetMachine->getTargetIRAnalysis()));
585+
targetMachine->getTargetIRAnalysis()));
565586

566-
bool fail = TargetMachine->addPassesToEmitFile(EmitPasses, *RawOS, nullptr,
567-
FileType, !Opts.Verify);
587+
bool fail = targetMachine->addPassesToEmitFile(EmitPasses, out, nullptr,
588+
FileType, !opts.Verify);
568589
if (fail) {
569-
diagnoseSync(Diags, DiagMutex,
570-
SourceLoc(), diag::error_codegen_init_fail);
590+
diagnoseSync(diags, diagMutex, SourceLoc(),
591+
diag::error_codegen_init_fail);
571592
return true;
572593
}
573594
break;
574595
}
575596
}
576597

577-
if (Stats) {
578-
if (DiagMutex)
579-
DiagMutex->lock();
580-
countStatsPostIRGen(*Stats, *Module);
581-
if (DiagMutex)
582-
DiagMutex->unlock();
583-
}
598+
EmitPasses.run(*module);
584599

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();
593606
}
594-
595607
return false;
596608
}
597609

0 commit comments

Comments
 (0)