[llvm] r277413 - [Verifier] Disallow illegal ptr<->int casts in ConstantExprs
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 1 19:55:58 PDT 2016
Author: sanjoy
Date: Mon Aug 1 21:55:57 2016
New Revision: 277413
URL: http://llvm.org/viewvc/llvm-project?rev=277413&view=rev
Log:
[Verifier] Disallow illegal ptr<->int casts in ConstantExprs
This should have been a part of rL277085, but I hadn't considered this
case.
Modified:
llvm/trunk/lib/IR/Verifier.cpp
llvm/trunk/test/Verifier/non-integral-pointers.ll
Modified: llvm/trunk/lib/IR/Verifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=277413&r1=277412&r2=277413&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Verifier.cpp (original)
+++ llvm/trunk/lib/IR/Verifier.cpp Mon Aug 1 21:55:57 2016
@@ -1641,12 +1641,23 @@ void Verifier::visitConstantExprsRecursi
}
void Verifier::visitConstantExpr(const ConstantExpr *CE) {
- if (CE->getOpcode() != Instruction::BitCast)
- return;
-
- Assert(CastInst::castIsValid(Instruction::BitCast, CE->getOperand(0),
- CE->getType()),
- "Invalid bitcast", CE);
+ if (CE->getOpcode() == Instruction::BitCast)
+ Assert(CastInst::castIsValid(Instruction::BitCast, CE->getOperand(0),
+ CE->getType()),
+ "Invalid bitcast", CE);
+
+ if (CE->getOpcode() == Instruction::IntToPtr ||
+ CE->getOpcode() == Instruction::PtrToInt) {
+ auto *PtrTy = CE->getOpcode() == Instruction::IntToPtr
+ ? CE->getType()
+ : CE->getOperand(0)->getType();
+ StringRef Msg = CE->getOpcode() == Instruction::IntToPtr
+ ? "inttoptr not supported for non-integral pointers"
+ : "ptrtoint not supported for non-integral pointers";
+ Assert(
+ !DL.isNonIntegralPointerType(cast<PointerType>(PtrTy->getScalarType())),
+ Msg);
+ }
}
bool Verifier::verifyAttributeCount(AttributeSet Attrs, unsigned Params) {
@@ -3694,9 +3705,12 @@ void Verifier::visitInstruction(Instruct
(i + 3 == e && isa<InvokeInst>(I)),
"Cannot take the address of an inline asm!", &I);
} else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I.getOperand(i))) {
- if (CE->getType()->isPtrOrPtrVectorTy()) {
+ if (CE->getType()->isPtrOrPtrVectorTy() ||
+ !DL.getNonIntegralAddressSpaces().empty()) {
// If we have a ConstantExpr pointer, we need to see if it came from an
- // illegal bitcast (inttoptr <constant int> )
+ // illegal bitcast. If the datalayout string specifies non-integral
+ // address spaces then we also need to check for illegal ptrtoint and
+ // inttoptr expressions.
visitConstantExprsRecursively(CE);
}
}
Modified: llvm/trunk/test/Verifier/non-integral-pointers.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/non-integral-pointers.ll?rev=277413&r1=277412&r2=277413&view=diff
==============================================================================
--- llvm/trunk/test/Verifier/non-integral-pointers.ll (original)
+++ llvm/trunk/test/Verifier/non-integral-pointers.ll Mon Aug 1 21:55:57 2016
@@ -43,3 +43,15 @@ define i64 @f_6(i8 addrspace(6)* %ptr) {
%val = ptrtoint i8 addrspace(6)* %ptr to i64
ret i64 %val
}
+
+define i8 addrspace(4)* @f_7() {
+; CHECK: inttoptr not supported for non-integral pointers
+ ret i8 addrspace(4)* inttoptr (i64 50 to i8 addrspace(4)*)
+}
+
+ at global0 = addrspace(4) constant i8 42
+
+define i64 @f_8() {
+; CHECK: ptrtoint not supported for non-integral pointers
+ ret i64 ptrtoint (i8 addrspace(4)* @global0 to i64)
+}
More information about the llvm-commits
mailing list