diff options
-rw-r--r-- | llvm/lib/Transforms/Utils/CloneModule.cpp | 2 | ||||
-rw-r--r-- | llvm/test/tools/llvm-split/personality.ll | 18 | ||||
-rw-r--r-- | llvm/tools/llvm-split/llvm-split.cpp | 2 |
3 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/CloneModule.cpp b/llvm/lib/Transforms/Utils/CloneModule.cpp index b16a02adbd6..494e275991a 100644 --- a/llvm/lib/Transforms/Utils/CloneModule.cpp +++ b/llvm/lib/Transforms/Utils/CloneModule.cpp @@ -126,6 +126,8 @@ std::unique_ptr<Module> llvm::CloneModule( if (!ShouldCloneDefinition(&*I)) { // Skip after setting the correct linkage for an external reference. F->setLinkage(GlobalValue::ExternalLinkage); + // Personality function is not valid on a declaration. + F->setPersonalityFn(nullptr); continue; } if (!I->isDeclaration()) { diff --git a/llvm/test/tools/llvm-split/personality.ll b/llvm/test/tools/llvm-split/personality.ll new file mode 100644 index 00000000000..50a4fb235b9 --- /dev/null +++ b/llvm/test/tools/llvm-split/personality.ll @@ -0,0 +1,18 @@ +; Test that "personality" attributes are correctly updated when cloning modules. +; RUN: llvm-split -o %t %s +; RUN: llvm-dis -o - %t0 | FileCheck --check-prefix=CHECK0 %s +; RUN: llvm-dis -o - %t1 | FileCheck --check-prefix=CHECK1 %s + +; CHECK0: define void @foo() +; CHECK1: declare void @foo() +define void @foo() { + ret void +} + +; CHECK0: declare void @bar() +; CHECK0-NOT: personality +; CHECK1: define void @bar() personality i8* bitcast (void ()* @foo to i8*) +define void @bar() personality i8* bitcast (void ()* @foo to i8*) +{ + ret void +} diff --git a/llvm/tools/llvm-split/llvm-split.cpp b/llvm/tools/llvm-split/llvm-split.cpp index 04ca1936ed8..010b1eb7320 100644 --- a/llvm/tools/llvm-split/llvm-split.cpp +++ b/llvm/tools/llvm-split/llvm-split.cpp @@ -14,6 +14,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Verifier.h" #include "llvm/IRReader/IRReader.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" @@ -61,6 +62,7 @@ int main(int argc, char **argv) { exit(1); } + verifyModule(*MPart); WriteBitcodeToFile(MPart.get(), Out->os()); // Declare success. |