diff options
Diffstat (limited to 'llvm/tools/llvm-c-test/echo.cpp')
-rw-r--r-- | llvm/tools/llvm-c-test/echo.cpp | 13 |
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); |