diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-11-25 22:00:43 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-11-25 22:54:10 -0800 |
| commit | 9a188b2e94007422cbc16a858cb56c96c726bf73 (patch) | |
| tree | 9fdef3ab96fddeb21d42ce389c8fdb03cf7399a0 /src/comp/back | |
| parent | 143f87899b0548700d5b799efd53594602114195 (diff) | |
| download | rust-9a188b2e94007422cbc16a858cb56c96c726bf73.tar.gz rust-9a188b2e94007422cbc16a858cb56c96c726bf73.zip | |
rustc: Fall back to intrinsics.ll if we can't parse the bc
This will allow us to transition to the new bitcode format.
Diffstat (limited to 'src/comp/back')
| -rw-r--r-- | src/comp/back/link.rs | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/src/comp/back/link.rs b/src/comp/back/link.rs index 9bfa52f0c33..c941869556a 100644 --- a/src/comp/back/link.rs +++ b/src/comp/back/link.rs @@ -37,16 +37,19 @@ fn llvm_err(sess: session::session, msg: str) unsafe { } else { sess.fatal(msg + ": " + str::str_from_cstr(buf)); } } -fn link_intrinsics(sess: session::session, llmod: ModuleRef) { +fn load_intrinsics_bc(sess: session::session) -> option::t<ModuleRef> { let path = alt filesearch::search( sess.filesearch(), bind filesearch::pick_file("intrinsics.bc", _)) { option::some(path) { path } - option::none. { sess.fatal("couldn't find intrinsics.bc") } + option::none. { + sess.warn("couldn't find intrinsics.bc"); + ret option::none; + } }; let membuf = str::as_buf(path, {|buf| llvm::LLVMRustCreateMemoryBufferWithContentsOfFile(buf) - }); + }); if membuf as uint == 0u { llvm_err(sess, "installation problem: couldn't open " + path); fail; @@ -54,9 +57,44 @@ fn link_intrinsics(sess: session::session, llmod: ModuleRef) { let llintrinsicsmod = llvm::LLVMRustParseBitcode(membuf); llvm::LLVMDisposeMemoryBuffer(membuf); if llintrinsicsmod as uint == 0u { - llvm_err(sess, "installation problem: couldn't parse intrinsics.bc"); + sess.warn("couldn't parse intrinsics.bc"); + ret option::none; + } + + ret option::some(llintrinsicsmod); +} + +fn load_intrinsics_ll(sess: session::session) -> ModuleRef { + let path = alt filesearch::search( + sess.filesearch(), + bind filesearch::pick_file("intrinsics.ll", _)) { + option::some(path) { path } + option::none. { sess.fatal("couldn't find intrinsics.ll") } + }; + let llintrinsicsmod = str::as_buf(path, { |buf| + llvm::LLVMRustParseAssemblyFile(buf) + }); + if llintrinsicsmod as uint == 0u { + llvm_err(sess, "couldn't parse intrinsics.ll"); fail; } + ret llintrinsicsmod; +} + +fn link_intrinsics(sess: session::session, llmod: ModuleRef) { + let llintrinsicsmod = { + alt load_intrinsics_bc(sess) { + option::some(m) { m } + option::none. { + // When the bitcode format changes we can't parse a .bc + // file produced with a newer LLVM (as happens when stage0 + // is trying to build against a new LLVM revision), in + // that case we'll try to parse the assembly. + sess.warn("couldn't parse intrinsics.bc, trying intrinsics.ll"); + load_intrinsics_ll(sess) + } + } + }; let linkres = llvm::LLVMLinkModules(llmod, llintrinsicsmod); llvm::LLVMDisposeModule(llintrinsicsmod); if linkres == False { |
