about summary refs log tree commit diff
path: root/src/rustllvm/RustWrapper.cpp
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-12-09 16:11:28 -0800
committerbors <bors@rust-lang.org>2013-12-09 16:11:28 -0800
commit29ca4350c8d64facb39311660e8ee919766f481a (patch)
tree89cc0a532846f00be6159ea2eb5b3c8f3d9cf058 /src/rustllvm/RustWrapper.cpp
parentf817ed3e6f39e6e0b1a8ec968ea0ad3c1bc36ba5 (diff)
parentfce4a174b9ffff71a66feecd9f4960f17fc9c331 (diff)
downloadrust-29ca4350c8d64facb39311660e8ee919766f481a.tar.gz
rust-29ca4350c8d64facb39311660e8ee919766f481a.zip
auto merge of #10812 : alexcrichton/rust/lto, r=pcwalton
The first commit was approved from another pull request, but I wanted to rebase LTO on top of it.

LTO is not turned on by default at all, and it's hidden behind a `-Z` flag. I have added a few small tests for it, however.
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
-rw-r--r--src/rustllvm/RustWrapper.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp
index 484cded3147..fb611dd15c2 100644
--- a/src/rustllvm/RustWrapper.cpp
+++ b/src/rustllvm/RustWrapper.cpp
@@ -539,3 +539,22 @@ extern "C" char *LLVMTypeToString(LLVMTypeRef Type) {
     unwrap<llvm::Type>(Type)->print(os);
     return strdup(os.str().data());
 }
+
+extern "C" bool
+LLVMRustLinkInExternalBitcode(LLVMModuleRef dst, char *bc, size_t len) {
+    Module *Dst = unwrap(dst);
+    MemoryBuffer* buf = MemoryBuffer::getMemBufferCopy(StringRef(bc, len));
+    std::string Err;
+    Module *Src = llvm::getLazyBitcodeModule(buf, Dst->getContext(), &Err);
+    if (Src == NULL) {
+        LLVMRustError = Err.c_str();
+        delete buf;
+        return false;
+    }
+
+    if (Linker::LinkModules(Dst, Src, Linker::DestroySource, &Err)) {
+        LLVMRustError = Err.c_str();
+        return false;
+    }
+    return true;
+}