Index: llvm/include/llvm-c/Core.h =================================================================== --- llvm/include/llvm-c/Core.h +++ llvm/include/llvm-c/Core.h @@ -15,6 +15,7 @@ #ifndef LLVM_C_CORE_H #define LLVM_C_CORE_H +#include "llvm-c/Deprecated.h" #include "llvm-c/ErrorHandling.h" #include "llvm-c/ExternC.h" #include "llvm-c/Types.h" @@ -2378,9 +2379,10 @@ * @{ */ -/** Deprecated: Use LLVMAddAlias2 instead. */ -LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee, - const char *Name); +LLVM_ATTRIBUTE_C_DEPRECATED( + LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, + LLVMValueRef Aliasee, const char *Name), + "Use LLVMAddAlias2 instead"); /** * Add a GlobalAlias with the given value type, address space and aliasee. @@ -3506,6 +3508,11 @@ */ void LLVMSetIsInBounds(LLVMValueRef GEP, LLVMBool InBounds); +/** + * Get the source element type of the given GEP instruction. + */ +LLVMTypeRef LLVMGetGEPSourceElementType(LLVMValueRef GEP); + /** * @} */ @@ -3678,10 +3685,12 @@ unsigned NumDests); // LLVMBuildInvoke is deprecated in favor of LLVMBuildInvoke2, in preparation // for opaque pointer types. -LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn, - LLVMValueRef *Args, unsigned NumArgs, - LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, - const char *Name); +LLVM_ATTRIBUTE_C_DEPRECATED( + LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn, + LLVMValueRef *Args, unsigned NumArgs, + LLVMBasicBlockRef Then, + LLVMBasicBlockRef Catch, const char *Name), + "Use LLVMBuildInvoke2 instead"); LLVMValueRef LLVMBuildInvoke2(LLVMBuilderRef, LLVMTypeRef Ty, LLVMValueRef Fn, LLVMValueRef *Args, unsigned NumArgs, LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, @@ -3877,21 +3886,29 @@ LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal); // LLVMBuildLoad is deprecated in favor of LLVMBuildLoad2, in preparation for // opaque pointer types. -LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal, - const char *Name); +LLVM_ATTRIBUTE_C_DEPRECATED( + LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal, + const char *Name), + "Use LLVMBuildLoad2 instead"); LLVMValueRef LLVMBuildLoad2(LLVMBuilderRef, LLVMTypeRef Ty, LLVMValueRef PointerVal, const char *Name); LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr); // LLVMBuildGEP, LLVMBuildInBoundsGEP, and LLVMBuildStructGEP are deprecated in // favor of LLVMBuild*GEP2, in preparation for opaque pointer types. -LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer, - LLVMValueRef *Indices, unsigned NumIndices, - const char *Name); -LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer, - LLVMValueRef *Indices, unsigned NumIndices, - const char *Name); -LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer, - unsigned Idx, const char *Name); +LLVM_ATTRIBUTE_C_DEPRECATED( + LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer, + LLVMValueRef *Indices, unsigned NumIndices, + const char *Name), + "Use LLVMBuildGEP2 instead"); +LLVM_ATTRIBUTE_C_DEPRECATED( + LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer, + LLVMValueRef *Indices, + unsigned NumIndices, const char *Name), + "Use LLVMBuildInBoundsGEP2 instead"); +LLVM_ATTRIBUTE_C_DEPRECATED( + LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer, + unsigned Idx, const char *Name), + "Use LLVMBuildStructGEP2 instead"); LLVMValueRef LLVMBuildGEP2(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Pointer, LLVMValueRef *Indices, unsigned NumIndices, const char *Name); @@ -3973,9 +3990,11 @@ LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name); // LLVMBuildCall is deprecated in favor of LLVMBuildCall2, in preparation for // opaque pointer types. -LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn, - LLVMValueRef *Args, unsigned NumArgs, - const char *Name); +LLVM_ATTRIBUTE_C_DEPRECATED( + LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn, + LLVMValueRef *Args, unsigned NumArgs, + const char *Name), + "Use LLVMBuildCall2 instead"); LLVMValueRef LLVMBuildCall2(LLVMBuilderRef, LLVMTypeRef, LLVMValueRef Fn, LLVMValueRef *Args, unsigned NumArgs, const char *Name); Index: llvm/include/llvm-c/Deprecated.h =================================================================== --- /dev/null +++ llvm/include/llvm-c/Deprecated.h @@ -0,0 +1,38 @@ +/*===-- llvm-c/Deprecated.h - Deprecation macro -------------------*- C -*-===*\ +|* *| +|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| +|* Exceptions. *| +|* See https://llvm.org/LICENSE.txt for license information. *| +|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| +|* *| +|*===----------------------------------------------------------------------===*| +|* *| +|* This header declares LLVM_ATTRIBUTE_C_DEPRECATED() macro, which can be *| +|* used to deprecate functions in the C interface. *| +|* *| +\*===----------------------------------------------------------------------===*/ + +#ifndef LLVM_C_DEPRECATED_H +#define LLVM_C_DEPRECATED_H + +#ifndef __has_feature +# define __has_feature(x) 0 +#endif + +// This is a variant of LLVM_ATTRIBUTE_DEPRECATED() that is compatible with +// C compilers. +#if __has_feature(attribute_deprecated_with_message) +# define LLVM_ATTRIBUTE_C_DEPRECATED(decl, message) \ + decl __attribute__((deprecated(message))) +#elif defined(__GNUC__) +# define LLVM_ATTRIBUTE_C_DEPRECATED(decl, message) \ + decl __attribute__((deprecated)) +#elif defined(_MSC_VER) +# define LLVM_ATTRIBUTE_C_DEPRECATED(decl, message) \ + __declspec(deprecated(message)) decl +#else +# define LLVM_ATTRIBUTE_C_DEPRECATED(decl, message) \ + decl +#endif + +#endif /* LLVM_C_DEPRECATED_H */ Index: llvm/lib/IR/Core.cpp =================================================================== --- llvm/lib/IR/Core.cpp +++ llvm/lib/IR/Core.cpp @@ -3014,6 +3014,10 @@ return unwrap(GEP)->setIsInBounds(InBounds); } +LLVMTypeRef LLVMGetGEPSourceElementType(LLVMValueRef GEP) { + return wrap(unwrap(GEP)->getSourceElementType()); +} + /*--.. Operations on phi nodes .............................................--*/ void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues, Index: llvm/tools/llvm-c-test/calc.c =================================================================== --- llvm/tools/llvm-c-test/calc.c +++ llvm/tools/llvm-c-test/calc.c @@ -74,8 +74,9 @@ return NULL; } - off = LLVMBuildGEP(builder, param, &stack[depth - 1], 1, ""); - stack[depth - 1] = LLVMBuildLoad(builder, off, ""); + LLVMTypeRef ty = LLVMInt64Type(); + off = LLVMBuildGEP2(builder, ty, param, &stack[depth - 1], 1, ""); + stack[depth - 1] = LLVMBuildLoad2(builder, ty, off, ""); break; } Index: llvm/tools/llvm-c-test/echo.cpp =================================================================== --- llvm/tools/llvm-c-test/echo.cpp +++ llvm/tools/llvm-c-test/echo.cpp @@ -524,11 +524,12 @@ int ArgCount = LLVMGetNumArgOperands(Src); for (int i = 0; i < ArgCount; i++) Args.push_back(CloneValue(LLVMGetOperand(Src, i))); + LLVMTypeRef FnTy = CloneType(LLVMGetCalledFunctionType(Src)); LLVMValueRef Fn = CloneValue(LLVMGetCalledValue(Src)); LLVMBasicBlockRef Then = DeclareBB(LLVMGetNormalDest(Src)); LLVMBasicBlockRef Unwind = DeclareBB(LLVMGetUnwindDest(Src)); - Dst = LLVMBuildInvoke(Builder, Fn, Args.data(), ArgCount, - Then, Unwind, Name); + Dst = LLVMBuildInvoke2(Builder, FnTy, Fn, Args.data(), ArgCount, + Then, Unwind, Name); CloneAttrs(Src, Dst); break; } @@ -621,7 +622,7 @@ } case LLVMLoad: { LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0)); - Dst = LLVMBuildLoad(Builder, Ptr, Name); + Dst = LLVMBuildLoad2(Builder, CloneType(Src), Ptr, Name); LLVMSetAlignment(Dst, LLVMGetAlignment(Src)); LLVMSetOrdering(Dst, LLVMGetOrdering(Src)); LLVMSetVolatile(Dst, LLVMGetVolatile(Src)); @@ -637,15 +638,17 @@ break; } case LLVMGetElementPtr: { + LLVMTypeRef ElemTy = CloneType(LLVMGetGEPSourceElementType(Src)); LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0)); SmallVector Idx; int NumIdx = LLVMGetNumIndices(Src); for (int i = 1; i <= NumIdx; i++) Idx.push_back(CloneValue(LLVMGetOperand(Src, i))); if (LLVMIsInBounds(Src)) - Dst = LLVMBuildInBoundsGEP(Builder, Ptr, Idx.data(), NumIdx, Name); + Dst = LLVMBuildInBoundsGEP2(Builder, ElemTy, Ptr, Idx.data(), NumIdx, + Name); else - Dst = LLVMBuildGEP(Builder, Ptr, Idx.data(), NumIdx, Name); + Dst = LLVMBuildGEP2(Builder, ElemTy, Ptr, Idx.data(), NumIdx, Name); break; } case LLVMAtomicRMW: { @@ -709,8 +712,9 @@ int ArgCount = LLVMGetNumArgOperands(Src); for (int i = 0; i < ArgCount; i++) Args.push_back(CloneValue(LLVMGetOperand(Src, i))); + LLVMTypeRef FnTy = CloneType(LLVMGetCalledFunctionType(Src)); LLVMValueRef Fn = CloneValue(LLVMGetCalledValue(Src)); - Dst = LLVMBuildCall(Builder, Fn, Args.data(), ArgCount, Name); + Dst = LLVMBuildCall2(Builder, FnTy, Fn, Args.data(), ArgCount, Name); LLVMSetTailCall(Dst, LLVMIsTailCall(Src)); CloneAttrs(Src, Dst); break;