[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