From: Jiri Slaby Date: Thu, 8 Jun 2017 13:25:56 +0200 Subject: llvm: PointerType is not SequentialType in LLVM 4 Patch-mainline: no So handle the type specially whenever needed. Signed-off-by: Jiri Slaby --- include/klee/util/GetElementPtrTypeIterator.h | 5 +++++ lib/Core/Executor.cpp | 22 +++++++++++++++++++--- lib/Core/ExecutorUtil.cpp | 17 ++++++++++++++--- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/include/klee/util/GetElementPtrTypeIterator.h b/include/klee/util/GetElementPtrTypeIterator.h index 2d145cd67f14..b551d772eaac 100644 --- a/include/klee/util/GetElementPtrTypeIterator.h +++ b/include/klee/util/GetElementPtrTypeIterator.h @@ -93,6 +93,11 @@ namespace klee { if (LLVM_TYPE_Q llvm::CompositeType *CT = dyn_cast(CurTy)) { CurTy = CT->getTypeAtIndex(getOperand()); +#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0) + } else if (LLVM_TYPE_Q llvm::PointerType *ptr = + dyn_cast(CurTy)) { + CurTy = ptr->getElementType(); +#endif } else { CurTy = 0; } diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 4a0239dace49..fd5cb5e4e751 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -2648,8 +2648,7 @@ void Executor::computeOffsets(KGEPInstruction *kgepi, TypeIt ib, TypeIt ie) { uint64_t addend = sl->getElementOffset((unsigned) ci->getZExtValue()); constantOffset = constantOffset->Add(ConstantExpr::alloc(addend, Context::get().getPointerWidth())); - } else { - const SequentialType *set = cast(*ii); + } else if (const SequentialType *set = dyn_cast(*ii)) { uint64_t elementSize = kmodule->targetData->getTypeStoreSize(set->getElementType()); Value *operand = ii.getOperand(); @@ -2663,7 +2662,24 @@ void Executor::computeOffsets(KGEPInstruction *kgepi, TypeIt ib, TypeIt ie) { } else { kgepi->indices.push_back(std::make_pair(index, elementSize)); } - } +#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0) + } else if (const PointerType *ptr = dyn_cast(*ii)) { + uint64_t elementSize = + kmodule->targetData->getTypeStoreSize(ptr->getElementType()); + Value *operand = ii.getOperand(); + if (Constant *c = dyn_cast(operand)) { + ref index = + evalConstant(c)->SExt(Context::get().getPointerWidth()); + ref addend = + index->Mul(ConstantExpr::alloc(elementSize, + Context::get().getPointerWidth())); + constantOffset = constantOffset->Add(addend); + } else { + kgepi->indices.push_back(std::make_pair(index, elementSize)); + } +#endif + } else + assert("invalid type" && 0); index++; } kgepi->offset = constantOffset->getZExtValue(); diff --git a/lib/Core/ExecutorUtil.cpp b/lib/Core/ExecutorUtil.cpp index b91b5deec173..a63b891bf925 100644 --- a/lib/Core/ExecutorUtil.cpp +++ b/lib/Core/ExecutorUtil.cpp @@ -102,8 +102,7 @@ namespace klee { addend = ConstantExpr::alloc(sl->getElementOffset((unsigned) ci->getZExtValue()), Context::get().getPointerWidth()); - } else { - const SequentialType *set = cast(*ii); + } else if (const SequentialType *set = dyn_cast(*ii)) { ref index = evalConstant(cast(ii.getOperand())); unsigned elementSize = @@ -112,7 +111,19 @@ namespace klee { index = index->ZExt(Context::get().getPointerWidth()); addend = index->Mul(ConstantExpr::alloc(elementSize, Context::get().getPointerWidth())); - } +#if LLVM_VERSION_CODE >= LLVM_VERSION(4, 0) + } else if (const PointerType *ptr = dyn_cast(*ii)) { + ref index = + evalConstant(cast(ii.getOperand())); + unsigned elementSize = + kmodule->targetData->getTypeStoreSize(ptr->getElementType()); + + index = index->ZExt(Context::get().getPointerWidth()); + addend = index->Mul(ConstantExpr::alloc(elementSize, + Context::get().getPointerWidth())); +#endif + } else + assert("invalid type" && 0); base = base->Add(addend); } -- 2.13.1