diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-03-28 21:37:02 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-03-28 21:37:02 +0000 |
commit | f575b2687cdd1ad8d83c5dbf88dbca347e152648 (patch) | |
tree | ef4da1ea79a8bba847dd1b4d24bf4953c04fabb8 | |
parent | d3df400fa9d20ea11c1c0b1296ce4299d5b82b86 (diff) | |
download | bcm5719-llvm-f575b2687cdd1ad8d83c5dbf88dbca347e152648.tar.gz bcm5719-llvm-f575b2687cdd1ad8d83c5dbf88dbca347e152648.zip |
Remove personality for declarations in CloneModule.
Personality is copied as part of copyFunctionAttributes, but it is
invalid on a declaration. Remove the personality attribute it the
function body is not cloned.
Also add a verifier run over output modules in the llvm-split tool.
llvm-svn: 264667
-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. |