diff options
| author | bors <bors@rust-lang.org> | 2016-12-08 11:45:26 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-12-08 11:45:26 +0000 |
| commit | 47ffafcdcd01ec3f782b89e8ea27a7f1a7183ae0 (patch) | |
| tree | 9a3d4eb149e6ff74d4aec42640c3545adff6913d /src/rustllvm/RustWrapper.cpp | |
| parent | 816a34aca23f3ebd0fddf79ebdf96c9fae976f58 (diff) | |
| parent | d5f6125fb32078d3331f4c2fddfbcfa303e82232 (diff) | |
| download | rust-47ffafcdcd01ec3f782b89e8ea27a7f1a7183ae0.tar.gz rust-47ffafcdcd01ec3f782b89e8ea27a7f1a7183ae0.zip | |
Auto merge of #38156 - shepmaster:llvm-4.0-bitcode-reader-writer, r=alexcrichton
[LLVM 4.0] New bitcode headers and API /cc @michaelwoerister @rkruppe
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 6a95b65d5e9..ae2ab932a61 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -892,19 +892,34 @@ extern "C" void LLVMRustWriteValueToString(LLVMValueRef Value, RustStringRef str extern "C" bool LLVMRustLinkInExternalBitcode(LLVMModuleRef dst, char *bc, size_t len) { Module *Dst = unwrap(dst); + std::unique_ptr<MemoryBuffer> buf = MemoryBuffer::getMemBufferCopy(StringRef(bc, len)); + +#if LLVM_VERSION_GE(4, 0) + Expected<std::unique_ptr<Module>> SrcOrError = + llvm::getLazyBitcodeModule(buf->getMemBufferRef(), Dst->getContext()); + if (!SrcOrError) { + LLVMRustSetLastError(toString(SrcOrError.takeError()).c_str()); + return false; + } + + auto Src = std::move(*SrcOrError); +#else ErrorOr<std::unique_ptr<Module>> Src = llvm::getLazyBitcodeModule(std::move(buf), Dst->getContext()); if (!Src) { LLVMRustSetLastError(Src.getError().message().c_str()); return false; } +#endif std::string Err; raw_string_ostream Stream(Err); DiagnosticPrinterRawOStream DP(Stream); -#if LLVM_VERSION_GE(3, 8) +#if LLVM_VERSION_GE(4, 0) + if (Linker::linkModules(*Dst, std::move(Src))) { +#elif LLVM_VERSION_GE(3, 8) if (Linker::linkModules(*Dst, std::move(Src.get()))) { #else if (Linker::LinkModules(Dst, Src->get(), [&](const DiagnosticInfo &DI) { DI.print(DP); })) { |
