aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-c-test/echo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-c-test/echo.cpp')
-rw-r--r--llvm/tools/llvm-c-test/echo.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp
index 61b7158..4a9b915 100644
--- a/llvm/tools/llvm-c-test/echo.cpp
+++ b/llvm/tools/llvm-c-test/echo.cpp
@@ -402,6 +402,19 @@ static LLVMValueRef clone_constant_impl(LLVMValueRef Cst, LLVMModuleRef M) {
case LLVMBitCast:
return LLVMConstBitCast(clone_constant(LLVMGetOperand(Cst, 0), M),
TypeCloner(M).Clone(Cst));
+ case LLVMGetElementPtr: {
+ LLVMTypeRef ElemTy =
+ TypeCloner(M).Clone(LLVMGetGEPSourceElementType(Cst));
+ LLVMValueRef Ptr = clone_constant(LLVMGetOperand(Cst, 0), M);
+ int NumIdx = LLVMGetNumIndices(Cst);
+ SmallVector<LLVMValueRef, 8> Idx;
+ for (int i = 1; i <= NumIdx; i++)
+ Idx.push_back(clone_constant(LLVMGetOperand(Cst, i), M));
+ if (LLVMIsInBounds(Cst))
+ return LLVMConstInBoundsGEP2(ElemTy, Ptr, Idx.data(), NumIdx);
+ else
+ return LLVMConstGEP2(ElemTy, Ptr, Idx.data(), NumIdx);
+ }
default:
fprintf(stderr, "%d is not a supported opcode for constant expressions\n",
Op);