about summary refs log tree commit diff
path: root/src/comp/back
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-11-25 22:00:43 -0800
committerBrian Anderson <banderson@mozilla.com>2011-11-25 22:54:10 -0800
commit9a188b2e94007422cbc16a858cb56c96c726bf73 (patch)
tree9fdef3ab96fddeb21d42ce389c8fdb03cf7399a0 /src/comp/back
parent143f87899b0548700d5b799efd53594602114195 (diff)
downloadrust-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.rs46
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 {