about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-05-05 11:34:15 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-05-05 11:34:45 -0700
commit5fb6e6364b6b10e98430140554e644697f29eb06 (patch)
tree3332fcffda123b9c9d02f94d337597cef2b3a610 /src
parent6b742aec91f1c2615ab8e01ba027dfff3008a7f7 (diff)
downloadrust-5fb6e6364b6b10e98430140554e644697f29eb06.tar.gz
rust-5fb6e6364b6b10e98430140554e644697f29eb06.zip
rustc: Add a binding to LLVM's bitcode parser
Diffstat (limited to 'src')
-rw-r--r--src/comp/back/Link.rs6
-rw-r--r--src/comp/lib/llvm.rs3
-rw-r--r--src/rustllvm/RustWrapper.cpp8
-rw-r--r--src/rustllvm/rustllvm.def.in1
4 files changed, 18 insertions, 0 deletions
diff --git a/src/comp/back/Link.rs b/src/comp/back/Link.rs
index 5d9eb9d6e3c..da165787477 100644
--- a/src/comp/back/Link.rs
+++ b/src/comp/back/Link.rs
@@ -16,6 +16,10 @@ tag output_type {
     output_type_object;
 }
 
+fn link_intrinsics(session.session sess, ModuleRef llmod) {
+    // TODO
+}
+
 mod Write {
     fn is_object_or_assembly(output_type ot) -> bool {
         if (ot == output_type_assembly) {
@@ -41,6 +45,8 @@ mod Write {
     }
 
     fn run_passes(session.session sess, ModuleRef llmod, str output) {
+        link_intrinsics(sess, llmod);
+
         auto pm = mk_pass_manager();
         auto opts = sess.get_opts();
 
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs
index 5e758bc6676..cfa82b0346d 100644
--- a/src/comp/lib/llvm.rs
+++ b/src/comp/lib/llvm.rs
@@ -848,6 +848,9 @@ native mod llvm = llvm_lib {
         call. */
     fn LLVMRustGetLastError() -> sbuf;
 
+    /** Parses the bitcode in the given memory buffer. */
+    fn LLVMRustParseBitcode(MemoryBufferRef MemBuf) -> ModuleRef;
+
     /** Links LLVM modules together. `Src` is destroyed by this call and
         must never be referenced again. */
     fn LLVMLinkModules(ModuleRef Dest, ModuleRef Src) -> Bool;
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp
index 01ea6677be1..3c9588305f1 100644
--- a/src/rustllvm/RustWrapper.cpp
+++ b/src/rustllvm/RustWrapper.cpp
@@ -21,6 +21,7 @@
 #include "llvm/Target/TargetRegistry.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm-c/Core.h"
+#include "llvm-c/BitReader.h"
 #include "llvm-c/Object.h"
 #include <cstdlib>
 
@@ -98,3 +99,10 @@ extern "C" void LLVMRustWriteOutputFile(LLVMPassManagerRef PMR,
   (void)foo;
   PM->run(*unwrap(M));
 }
+
+extern "C" LLVMModuleRef LLVMRustParseBitcode(LLVMMemoryBufferRef MemBuf) {
+  LLVMModuleRef M;
+  return LLVMParseBitcode(MemBuf, &M, const_cast<char **>(&LLVMRustError))
+         ? NULL : M;
+}
+
diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in
index 74acb28bb9c..a5ffa04ebcc 100644
--- a/src/rustllvm/rustllvm.def.in
+++ b/src/rustllvm/rustllvm.def.in
@@ -1,6 +1,7 @@
 LLVMRustCreateMemoryBufferWithContentsOfFile
 LLVMRustWriteOutputFile
 LLVMRustGetLastError
+LLVMRustParseBitcode
 LLVMLinkModules
 LLVMCreateObjectFile
 LLVMDisposeObjectFile