diff options
| author | bors <bors@rust-lang.org> | 2020-09-10 04:03:28 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-09-10 04:03:28 +0000 |
| commit | a1894e4afe1a39f718cc27232a5a2f0d02b501f6 (patch) | |
| tree | 0d698d42b60ac432aed6ce83a2e9a66e176060be /compiler/rustc_llvm/llvm-wrapper/Linker.cpp | |
| parent | 97eb606e4b2becd17d46a67d87169f52b210e67c (diff) | |
| parent | 193503eb62aba269b505b99dc1c143645a115e31 (diff) | |
| download | rust-a1894e4afe1a39f718cc27232a5a2f0d02b501f6.tar.gz rust-a1894e4afe1a39f718cc27232a5a2f0d02b501f6.zip | |
Auto merge of #76558 - tmandry:rollup-bskim2r, r=tmandry
Rollup of 7 pull requests Successful merges: - #74787 (Move `rustllvm` into `compiler/rustc_llvm`) - #76458 (Add drain_filter method to HashMap and HashSet) - #76472 (rustbuild: don't set PYTHON_EXECUTABLE and WITH_POLLY cmake vars since they are no longer supported by llvm) - #76497 (Use intra-doc links in `core::ptr`) - #76500 (Add -Zgraphviz_dark_mode and monospace font fix) - #76543 (Document btree's unwrap_unchecked) - #76556 (Revert #76285) Failed merges: r? `@ghost`
Diffstat (limited to 'compiler/rustc_llvm/llvm-wrapper/Linker.cpp')
| -rw-r--r-- | compiler/rustc_llvm/llvm-wrapper/Linker.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/compiler/rustc_llvm/llvm-wrapper/Linker.cpp b/compiler/rustc_llvm/llvm-wrapper/Linker.cpp new file mode 100644 index 00000000000..8766e96f086 --- /dev/null +++ b/compiler/rustc_llvm/llvm-wrapper/Linker.cpp @@ -0,0 +1,48 @@ +#include "llvm/Linker/Linker.h" + +#include "LLVMWrapper.h" + +using namespace llvm; + +struct RustLinker { + Linker L; + LLVMContext &Ctx; + + RustLinker(Module &M) : + L(M), + Ctx(M.getContext()) + {} +}; + +extern "C" RustLinker* +LLVMRustLinkerNew(LLVMModuleRef DstRef) { + Module *Dst = unwrap(DstRef); + + return new RustLinker(*Dst); +} + +extern "C" void +LLVMRustLinkerFree(RustLinker *L) { + delete L; +} + +extern "C" bool +LLVMRustLinkerAdd(RustLinker *L, char *BC, size_t Len) { + std::unique_ptr<MemoryBuffer> Buf = + MemoryBuffer::getMemBufferCopy(StringRef(BC, Len)); + + Expected<std::unique_ptr<Module>> SrcOrError = + llvm::getLazyBitcodeModule(Buf->getMemBufferRef(), L->Ctx); + if (!SrcOrError) { + LLVMRustSetLastError(toString(SrcOrError.takeError()).c_str()); + return false; + } + + auto Src = std::move(*SrcOrError); + + if (L->L.linkInModule(std::move(Src))) { + LLVMRustSetLastError(""); + return false; + } + return true; +} |
