diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-12-27 22:52:22 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-12-27 23:39:33 -0800 |
| commit | b6a746352646965f71fa6c4fd9b37fd94918db8a (patch) | |
| tree | dc6e2552eac8e85cb9165477c8f82a7fb4209169 /src | |
| parent | 1a9c8cc1283675dfc1b85dbf80a9ea07a2b8b335 (diff) | |
| download | rust-b6a746352646965f71fa6c4fd9b37fd94918db8a.tar.gz rust-b6a746352646965f71fa6c4fd9b37fd94918db8a.zip | |
Initialize LLVM only once
This also appears to fix a race in LLVM that was causing a deadlock on the bots during the doc-test tests (where we use rustc in parallel).
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/back/link.rs | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index a85d5f35b5a..e761a14a3ac 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -111,29 +111,7 @@ pub mod write { let llmod = trans.module; let llcx = trans.context; unsafe { - llvm::LLVMInitializePasses(); - - // Only initialize the platforms supported by Rust here, because - // using --llvm-root will have multiple platforms that rustllvm - // doesn't actually link to and it's pointless to put target info - // into the registry that Rust can not generate machine code for. - llvm::LLVMInitializeX86TargetInfo(); - llvm::LLVMInitializeX86Target(); - llvm::LLVMInitializeX86TargetMC(); - llvm::LLVMInitializeX86AsmPrinter(); - llvm::LLVMInitializeX86AsmParser(); - - llvm::LLVMInitializeARMTargetInfo(); - llvm::LLVMInitializeARMTarget(); - llvm::LLVMInitializeARMTargetMC(); - llvm::LLVMInitializeARMAsmPrinter(); - llvm::LLVMInitializeARMAsmParser(); - - llvm::LLVMInitializeMipsTargetInfo(); - llvm::LLVMInitializeMipsTarget(); - llvm::LLVMInitializeMipsTargetMC(); - llvm::LLVMInitializeMipsAsmPrinter(); - llvm::LLVMInitializeMipsAsmParser(); + configure_llvm(sess); if sess.opts.save_temps { output.with_extension("no-opt.bc").with_c_str(|buf| { @@ -141,8 +119,6 @@ pub mod write { }) } - configure_llvm(sess); - let OptLevel = match sess.opts.optimize { session::No => lib::llvm::CodeGenLevelNone, session::Less => lib::llvm::CodeGenLevelLess, @@ -367,6 +343,30 @@ pub mod write { LOCK.lock(); if !CONFIGURED { + llvm::LLVMInitializePasses(); + + // Only initialize the platforms supported by Rust here, because + // using --llvm-root will have multiple platforms that rustllvm + // doesn't actually link to and it's pointless to put target info + // into the registry that Rust can not generate machine code for. + llvm::LLVMInitializeX86TargetInfo(); + llvm::LLVMInitializeX86Target(); + llvm::LLVMInitializeX86TargetMC(); + llvm::LLVMInitializeX86AsmPrinter(); + llvm::LLVMInitializeX86AsmParser(); + + llvm::LLVMInitializeARMTargetInfo(); + llvm::LLVMInitializeARMTarget(); + llvm::LLVMInitializeARMTargetMC(); + llvm::LLVMInitializeARMAsmPrinter(); + llvm::LLVMInitializeARMAsmParser(); + + llvm::LLVMInitializeMipsTargetInfo(); + llvm::LLVMInitializeMipsTarget(); + llvm::LLVMInitializeMipsTargetMC(); + llvm::LLVMInitializeMipsAsmPrinter(); + llvm::LLVMInitializeMipsAsmParser(); + llvm::LLVMRustSetLLVMOptions(llvm_args.len() as c_int, llvm_args.as_ptr()); CONFIGURED = true; |
