about summary refs log tree commit diff
path: root/src/rustllvm/PassWrapper.cpp
diff options
context:
space:
mode:
authorJan-Erik Rediger <janerik@fnordig.de>2016-07-13 00:42:44 +0200
committerJan-Erik Rediger <janerik@fnordig.de>2016-07-29 10:29:44 +0200
commit5b44e10fb7e9d1226af11df26ee5fa78b8d54cc3 (patch)
treebf10e8d4f50a9278d6e6b84a8e52575f02d4f02e /src/rustllvm/PassWrapper.cpp
parent6ed5db8d351038622b180be917ef2e2e3f0727b2 (diff)
downloadrust-5b44e10fb7e9d1226af11df26ee5fa78b8d54cc3.tar.gz
rust-5b44e10fb7e9d1226af11df26ee5fa78b8d54cc3.zip
[LLVM-3.9] Preserve certain functions when internalizing
This makes sure to still use the old way for older LLVM versions.
Diffstat (limited to 'src/rustllvm/PassWrapper.cpp')
-rw-r--r--src/rustllvm/PassWrapper.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp
index 95ad686161f..64edc79a86a 100644
--- a/src/rustllvm/PassWrapper.cpp
+++ b/src/rustllvm/PassWrapper.cpp
@@ -358,9 +358,24 @@ LLVMRustAddAlwaysInlinePass(LLVMPassManagerBuilderRef PMB, bool AddLifetimes) {
 
 extern "C" void
 LLVMRustRunRestrictionPass(LLVMModuleRef M, char **symbols, size_t len) {
-    PassManager passes;
+    llvm::legacy::PassManager passes;
+
+#if LLVM_VERSION_MINOR <= 8
     ArrayRef<const char*> ref(symbols, len);
     passes.add(llvm::createInternalizePass(ref));
+#else
+    auto PreserveFunctions = [=](const GlobalValue &GV) {
+        for (size_t i=0; i<len; i++) {
+            if (GV.getName() == symbols[i]) {
+                return true;
+            }
+        }
+        return false;
+    };
+
+    passes.add(llvm::createInternalizePass(PreserveFunctions));
+#endif
+
     passes.run(*unwrap(M));
 }