diff options
Diffstat (limited to 'src/rustllvm')
| -rw-r--r-- | src/rustllvm/PassWrapper.cpp | 8 | ||||
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 19 | ||||
| -rw-r--r-- | src/rustllvm/rustllvm.def.in | 3 | ||||
| -rw-r--r-- | src/rustllvm/rustllvm.h | 2 |
4 files changed, 32 insertions, 0 deletions
diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 0ae8991b2e7..76e24faebd9 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -211,3 +211,11 @@ extern "C" void LLVMRustAddAlwaysInlinePass(LLVMPassManagerBuilderRef PMB, bool AddLifetimes) { unwrap(PMB)->Inliner = createAlwaysInlinerPass(AddLifetimes); } + +extern "C" void +LLVMRustRunRestrictionPass(LLVMModuleRef M, char **symbols, size_t len) { + PassManager passes; + ArrayRef<const char*> ref(symbols, len); + passes.add(llvm::createInternalizePass(ref)); + passes.run(*unwrap(M)); +} 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; +} diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in index d8ec1c86840..ee82fa80f87 100644 --- a/src/rustllvm/rustllvm.def.in +++ b/src/rustllvm/rustllvm.def.in @@ -629,3 +629,6 @@ LLVMTypeToString LLVMAddColdAttribute LLVMCreateMemoryBufferWithMemoryRange LLVMCreateMemoryBufferWithMemoryRangeCopy +LLVMPassManagerBuilderPopulateLTOPassManager +LLVMRustLinkInExternalBitcode +LLVMRustRunRestrictionPass diff --git a/src/rustllvm/rustllvm.h b/src/rustllvm/rustllvm.h index 94bb00aab77..ef7199a6ca8 100644 --- a/src/rustllvm/rustllvm.h +++ b/src/rustllvm/rustllvm.h @@ -19,6 +19,7 @@ #include "llvm/Analysis/Verifier.h" #include "llvm/Analysis/Passes.h" #include "llvm/Analysis/Lint.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/Triple.h" #include "llvm/ADT/DenseSet.h" #include "llvm/Assembly/Parser.h" @@ -47,6 +48,7 @@ #include "llvm/Transforms/Vectorize.h" #include "llvm/DebugInfo.h" #include "llvm/DIBuilder.h" +#include "llvm/Bitcode/ReaderWriter.h" #include "llvm-c/Core.h" #include "llvm-c/BitReader.h" #include "llvm-c/ExecutionEngine.h" |
