summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2015-12-21 22:14:04 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2015-12-21 22:14:04 +0000
commitfda72c52a23d8f6379adee5bc11bf39933f470ae (patch)
tree0fed92419e7c1f13e4b1156e08e467b6dd08ac9f
parent2b9349db3888ee3df30382d2e647ead34adb5666 (diff)
downloadbcm5719-llvm-fda72c52a23d8f6379adee5bc11bf39933f470ae.tar.gz
bcm5719-llvm-fda72c52a23d8f6379adee5bc11bf39933f470ae.zip
[cfi] Fix LowerBitSets on 32-bit targets.
This code attempts to truncate IntPtrTy to i32, which may be the same type. llvm-svn: 256205
-rw-r--r--llvm/lib/Transforms/IPO/LowerBitSets.cpp2
-rw-r--r--llvm/test/Transforms/LowerBitSets/pr25902.ll21
2 files changed, 22 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/IPO/LowerBitSets.cpp b/llvm/lib/Transforms/IPO/LowerBitSets.cpp
index 65d082b27a8..7b515745c31 100644
--- a/llvm/lib/Transforms/IPO/LowerBitSets.cpp
+++ b/llvm/lib/Transforms/IPO/LowerBitSets.cpp
@@ -683,7 +683,7 @@ Constant *LowerBitSets::createJumpTableEntry(GlobalObject *Src, Function *Dest,
ConstantInt *DispOffset =
ConstantInt::get(IntPtrTy, Distance * kX86JumpTableEntrySize + 5);
Constant *OffsetedDisp = ConstantExpr::getSub(Disp, DispOffset);
- OffsetedDisp = ConstantExpr::getTrunc(OffsetedDisp, Int32Ty);
+ OffsetedDisp = ConstantExpr::getTruncOrBitCast(OffsetedDisp, Int32Ty);
ConstantInt *Int3 = ConstantInt::get(Int8Ty, kInt3Code);
diff --git a/llvm/test/Transforms/LowerBitSets/pr25902.ll b/llvm/test/Transforms/LowerBitSets/pr25902.ll
new file mode 100644
index 00000000000..b9a1203ec0e
--- /dev/null
+++ b/llvm/test/Transforms/LowerBitSets/pr25902.ll
@@ -0,0 +1,21 @@
+; PR25902: gold plugin crash.
+; RUN: opt -mtriple=i686-pc -S -lowerbitsets < %s
+
+define void @f(void ()* %p) {
+entry:
+ %a = bitcast void ()* %p to i8*, !nosanitize !1
+ %b = call i1 @llvm.bitset.test(i8* %a, metadata !"_ZTSFvvE"), !nosanitize !1
+ ret void
+}
+
+define void @g() {
+entry:
+ ret void
+}
+
+declare i1 @llvm.bitset.test(i8*, metadata)
+
+!llvm.bitsets = !{!0}
+
+!0 = !{!"_ZTSFvvE", void ()* @g, i64 0}
+!1 = !{}
OpenPOWER on IntegriCloud