• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===-- Core.cpp ----------------------------------------------------------===//
2  //
3  //                     The LLVM Compiler Infrastructure
4  //
5  // This file is distributed under the University of Illinois Open Source
6  // License. See LICENSE.TXT for details.
7  //
8  //===----------------------------------------------------------------------===//
9  //
10  // This file implements the common infrastructure (including the C bindings)
11  // for libLLVMCore.a, which implements the LLVM intermediate representation.
12  //
13  //===----------------------------------------------------------------------===//
14  
15  #include "llvm-c/Core.h"
16  #include "llvm/Bitcode/ReaderWriter.h"
17  #include "llvm/Constants.h"
18  #include "llvm/DerivedTypes.h"
19  #include "llvm/GlobalVariable.h"
20  #include "llvm/GlobalAlias.h"
21  #include "llvm/LLVMContext.h"
22  #include "llvm/InlineAsm.h"
23  #include "llvm/IntrinsicInst.h"
24  #include "llvm/PassManager.h"
25  #include "llvm/Support/CallSite.h"
26  #include "llvm/Support/Debug.h"
27  #include "llvm/Support/ErrorHandling.h"
28  #include "llvm/Support/MemoryBuffer.h"
29  #include "llvm/Support/raw_ostream.h"
30  #include "llvm/Support/system_error.h"
31  #include <cassert>
32  #include <cstdlib>
33  #include <cstring>
34  
35  using namespace llvm;
36  
initializeCore(PassRegistry & Registry)37  void llvm::initializeCore(PassRegistry &Registry) {
38    initializeDominatorTreePass(Registry);
39    initializePrintModulePassPass(Registry);
40    initializePrintFunctionPassPass(Registry);
41    initializeVerifierPass(Registry);
42    initializePreVerifierPass(Registry);
43  }
44  
LLVMInitializeCore(LLVMPassRegistryRef R)45  void LLVMInitializeCore(LLVMPassRegistryRef R) {
46    initializeCore(*unwrap(R));
47  }
48  
49  /*===-- Error handling ----------------------------------------------------===*/
50  
LLVMDisposeMessage(char * Message)51  void LLVMDisposeMessage(char *Message) {
52    free(Message);
53  }
54  
55  
56  /*===-- Operations on contexts --------------------------------------------===*/
57  
LLVMContextCreate()58  LLVMContextRef LLVMContextCreate() {
59    return wrap(new LLVMContext());
60  }
61  
LLVMGetGlobalContext()62  LLVMContextRef LLVMGetGlobalContext() {
63    return wrap(&getGlobalContext());
64  }
65  
LLVMContextDispose(LLVMContextRef C)66  void LLVMContextDispose(LLVMContextRef C) {
67    delete unwrap(C);
68  }
69  
LLVMGetMDKindIDInContext(LLVMContextRef C,const char * Name,unsigned SLen)70  unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char* Name,
71                                    unsigned SLen) {
72    return unwrap(C)->getMDKindID(StringRef(Name, SLen));
73  }
74  
LLVMGetMDKindID(const char * Name,unsigned SLen)75  unsigned LLVMGetMDKindID(const char* Name, unsigned SLen) {
76    return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name, SLen);
77  }
78  
79  
80  /*===-- Operations on modules ---------------------------------------------===*/
81  
LLVMModuleCreateWithName(const char * ModuleID)82  LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) {
83    return wrap(new Module(ModuleID, getGlobalContext()));
84  }
85  
LLVMModuleCreateWithNameInContext(const char * ModuleID,LLVMContextRef C)86  LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
87                                                  LLVMContextRef C) {
88    return wrap(new Module(ModuleID, *unwrap(C)));
89  }
90  
LLVMDisposeModule(LLVMModuleRef M)91  void LLVMDisposeModule(LLVMModuleRef M) {
92    delete unwrap(M);
93  }
94  
95  /*--.. Data layout .........................................................--*/
LLVMGetDataLayout(LLVMModuleRef M)96  const char * LLVMGetDataLayout(LLVMModuleRef M) {
97    return unwrap(M)->getDataLayout().c_str();
98  }
99  
LLVMSetDataLayout(LLVMModuleRef M,const char * Triple)100  void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple) {
101    unwrap(M)->setDataLayout(Triple);
102  }
103  
104  /*--.. Target triple .......................................................--*/
LLVMGetTarget(LLVMModuleRef M)105  const char * LLVMGetTarget(LLVMModuleRef M) {
106    return unwrap(M)->getTargetTriple().c_str();
107  }
108  
LLVMSetTarget(LLVMModuleRef M,const char * Triple)109  void LLVMSetTarget(LLVMModuleRef M, const char *Triple) {
110    unwrap(M)->setTargetTriple(Triple);
111  }
112  
LLVMDumpModule(LLVMModuleRef M)113  void LLVMDumpModule(LLVMModuleRef M) {
114    unwrap(M)->dump();
115  }
116  
117  /*--.. Operations on inline assembler ......................................--*/
LLVMSetModuleInlineAsm(LLVMModuleRef M,const char * Asm)118  void LLVMSetModuleInlineAsm(LLVMModuleRef M, const char *Asm) {
119    unwrap(M)->setModuleInlineAsm(StringRef(Asm));
120  }
121  
122  
123  /*--.. Operations on module contexts ......................................--*/
LLVMGetModuleContext(LLVMModuleRef M)124  LLVMContextRef LLVMGetModuleContext(LLVMModuleRef M) {
125    return wrap(&unwrap(M)->getContext());
126  }
127  
128  
129  /*===-- Operations on types -----------------------------------------------===*/
130  
131  /*--.. Operations on all types (mostly) ....................................--*/
132  
LLVMGetTypeKind(LLVMTypeRef Ty)133  LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty) {
134    switch (unwrap(Ty)->getTypeID()) {
135    default:
136      assert(false && "Unhandled TypeID.");
137    case Type::VoidTyID:
138      return LLVMVoidTypeKind;
139    case Type::FloatTyID:
140      return LLVMFloatTypeKind;
141    case Type::DoubleTyID:
142      return LLVMDoubleTypeKind;
143    case Type::X86_FP80TyID:
144      return LLVMX86_FP80TypeKind;
145    case Type::FP128TyID:
146      return LLVMFP128TypeKind;
147    case Type::PPC_FP128TyID:
148      return LLVMPPC_FP128TypeKind;
149    case Type::LabelTyID:
150      return LLVMLabelTypeKind;
151    case Type::MetadataTyID:
152      return LLVMMetadataTypeKind;
153    case Type::IntegerTyID:
154      return LLVMIntegerTypeKind;
155    case Type::FunctionTyID:
156      return LLVMFunctionTypeKind;
157    case Type::StructTyID:
158      return LLVMStructTypeKind;
159    case Type::ArrayTyID:
160      return LLVMArrayTypeKind;
161    case Type::PointerTyID:
162      return LLVMPointerTypeKind;
163    case Type::VectorTyID:
164      return LLVMVectorTypeKind;
165    case Type::X86_MMXTyID:
166      return LLVMX86_MMXTypeKind;
167    }
168  }
169  
LLVMGetTypeContext(LLVMTypeRef Ty)170  LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty) {
171    return wrap(&unwrap(Ty)->getContext());
172  }
173  
174  /*--.. Operations on integer types .........................................--*/
175  
LLVMInt1TypeInContext(LLVMContextRef C)176  LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C)  {
177    return (LLVMTypeRef) Type::getInt1Ty(*unwrap(C));
178  }
LLVMInt8TypeInContext(LLVMContextRef C)179  LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C)  {
180    return (LLVMTypeRef) Type::getInt8Ty(*unwrap(C));
181  }
LLVMInt16TypeInContext(LLVMContextRef C)182  LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C) {
183    return (LLVMTypeRef) Type::getInt16Ty(*unwrap(C));
184  }
LLVMInt32TypeInContext(LLVMContextRef C)185  LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C) {
186    return (LLVMTypeRef) Type::getInt32Ty(*unwrap(C));
187  }
LLVMInt64TypeInContext(LLVMContextRef C)188  LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C) {
189    return (LLVMTypeRef) Type::getInt64Ty(*unwrap(C));
190  }
LLVMIntTypeInContext(LLVMContextRef C,unsigned NumBits)191  LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits) {
192    return wrap(IntegerType::get(*unwrap(C), NumBits));
193  }
194  
LLVMInt1Type(void)195  LLVMTypeRef LLVMInt1Type(void)  {
196    return LLVMInt1TypeInContext(LLVMGetGlobalContext());
197  }
LLVMInt8Type(void)198  LLVMTypeRef LLVMInt8Type(void)  {
199    return LLVMInt8TypeInContext(LLVMGetGlobalContext());
200  }
LLVMInt16Type(void)201  LLVMTypeRef LLVMInt16Type(void) {
202    return LLVMInt16TypeInContext(LLVMGetGlobalContext());
203  }
LLVMInt32Type(void)204  LLVMTypeRef LLVMInt32Type(void) {
205    return LLVMInt32TypeInContext(LLVMGetGlobalContext());
206  }
LLVMInt64Type(void)207  LLVMTypeRef LLVMInt64Type(void) {
208    return LLVMInt64TypeInContext(LLVMGetGlobalContext());
209  }
LLVMIntType(unsigned NumBits)210  LLVMTypeRef LLVMIntType(unsigned NumBits) {
211    return LLVMIntTypeInContext(LLVMGetGlobalContext(), NumBits);
212  }
213  
LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy)214  unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy) {
215    return unwrap<IntegerType>(IntegerTy)->getBitWidth();
216  }
217  
218  /*--.. Operations on real types ............................................--*/
219  
LLVMFloatTypeInContext(LLVMContextRef C)220  LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C) {
221    return (LLVMTypeRef) Type::getFloatTy(*unwrap(C));
222  }
LLVMDoubleTypeInContext(LLVMContextRef C)223  LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C) {
224    return (LLVMTypeRef) Type::getDoubleTy(*unwrap(C));
225  }
LLVMX86FP80TypeInContext(LLVMContextRef C)226  LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C) {
227    return (LLVMTypeRef) Type::getX86_FP80Ty(*unwrap(C));
228  }
LLVMFP128TypeInContext(LLVMContextRef C)229  LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C) {
230    return (LLVMTypeRef) Type::getFP128Ty(*unwrap(C));
231  }
LLVMPPCFP128TypeInContext(LLVMContextRef C)232  LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C) {
233    return (LLVMTypeRef) Type::getPPC_FP128Ty(*unwrap(C));
234  }
LLVMX86MMXTypeInContext(LLVMContextRef C)235  LLVMTypeRef LLVMX86MMXTypeInContext(LLVMContextRef C) {
236    return (LLVMTypeRef) Type::getX86_MMXTy(*unwrap(C));
237  }
238  
LLVMFloatType(void)239  LLVMTypeRef LLVMFloatType(void) {
240    return LLVMFloatTypeInContext(LLVMGetGlobalContext());
241  }
LLVMDoubleType(void)242  LLVMTypeRef LLVMDoubleType(void) {
243    return LLVMDoubleTypeInContext(LLVMGetGlobalContext());
244  }
LLVMX86FP80Type(void)245  LLVMTypeRef LLVMX86FP80Type(void) {
246    return LLVMX86FP80TypeInContext(LLVMGetGlobalContext());
247  }
LLVMFP128Type(void)248  LLVMTypeRef LLVMFP128Type(void) {
249    return LLVMFP128TypeInContext(LLVMGetGlobalContext());
250  }
LLVMPPCFP128Type(void)251  LLVMTypeRef LLVMPPCFP128Type(void) {
252    return LLVMPPCFP128TypeInContext(LLVMGetGlobalContext());
253  }
LLVMX86MMXType(void)254  LLVMTypeRef LLVMX86MMXType(void) {
255    return LLVMX86MMXTypeInContext(LLVMGetGlobalContext());
256  }
257  
258  /*--.. Operations on function types ........................................--*/
259  
LLVMFunctionType(LLVMTypeRef ReturnType,LLVMTypeRef * ParamTypes,unsigned ParamCount,LLVMBool IsVarArg)260  LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
261                               LLVMTypeRef *ParamTypes, unsigned ParamCount,
262                               LLVMBool IsVarArg) {
263    ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount);
264    return wrap(FunctionType::get(unwrap(ReturnType), Tys, IsVarArg != 0));
265  }
266  
LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy)267  LLVMBool LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy) {
268    return unwrap<FunctionType>(FunctionTy)->isVarArg();
269  }
270  
LLVMGetReturnType(LLVMTypeRef FunctionTy)271  LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy) {
272    return wrap(unwrap<FunctionType>(FunctionTy)->getReturnType());
273  }
274  
LLVMCountParamTypes(LLVMTypeRef FunctionTy)275  unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy) {
276    return unwrap<FunctionType>(FunctionTy)->getNumParams();
277  }
278  
LLVMGetParamTypes(LLVMTypeRef FunctionTy,LLVMTypeRef * Dest)279  void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest) {
280    FunctionType *Ty = unwrap<FunctionType>(FunctionTy);
281    for (FunctionType::param_iterator I = Ty->param_begin(),
282                                      E = Ty->param_end(); I != E; ++I)
283      *Dest++ = wrap(*I);
284  }
285  
286  /*--.. Operations on struct types ..........................................--*/
287  
LLVMStructTypeInContext(LLVMContextRef C,LLVMTypeRef * ElementTypes,unsigned ElementCount,LLVMBool Packed)288  LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
289                             unsigned ElementCount, LLVMBool Packed) {
290    ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
291    return wrap(StructType::get(*unwrap(C), Tys, Packed != 0));
292  }
293  
LLVMStructType(LLVMTypeRef * ElementTypes,unsigned ElementCount,LLVMBool Packed)294  LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes,
295                             unsigned ElementCount, LLVMBool Packed) {
296    return LLVMStructTypeInContext(LLVMGetGlobalContext(), ElementTypes,
297                                   ElementCount, Packed);
298  }
299  
LLVMStructCreateNamed(LLVMContextRef C,const char * Name)300  LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name)
301  {
302    return wrap(StructType::createNamed(*unwrap(C), Name));
303  }
304  
LLVMStructSetBody(LLVMTypeRef StructTy,LLVMTypeRef * ElementTypes,unsigned ElementCount,LLVMBool Packed)305  void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes,
306                         unsigned ElementCount, LLVMBool Packed) {
307    ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
308    unwrap<StructType>(StructTy)->setBody(Tys, Packed != 0);
309  }
310  
LLVMCountStructElementTypes(LLVMTypeRef StructTy)311  unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy) {
312    return unwrap<StructType>(StructTy)->getNumElements();
313  }
314  
LLVMGetStructElementTypes(LLVMTypeRef StructTy,LLVMTypeRef * Dest)315  void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest) {
316    StructType *Ty = unwrap<StructType>(StructTy);
317    for (StructType::element_iterator I = Ty->element_begin(),
318                                      E = Ty->element_end(); I != E; ++I)
319      *Dest++ = wrap(*I);
320  }
321  
LLVMIsPackedStruct(LLVMTypeRef StructTy)322  LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy) {
323    return unwrap<StructType>(StructTy)->isPacked();
324  }
325  
LLVMIsOpaqueStruct(LLVMTypeRef StructTy)326  LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy) {
327    return unwrap<StructType>(StructTy)->isOpaque();
328  }
329  
LLVMGetTypeByName(LLVMModuleRef M,const char * Name)330  LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) {
331    return wrap(unwrap(M)->getTypeByName(Name));
332  }
333  
334  /*--.. Operations on array, pointer, and vector types (sequence types) .....--*/
335  
LLVMArrayType(LLVMTypeRef ElementType,unsigned ElementCount)336  LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) {
337    return wrap(ArrayType::get(unwrap(ElementType), ElementCount));
338  }
339  
LLVMPointerType(LLVMTypeRef ElementType,unsigned AddressSpace)340  LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace) {
341    return wrap(PointerType::get(unwrap(ElementType), AddressSpace));
342  }
343  
LLVMVectorType(LLVMTypeRef ElementType,unsigned ElementCount)344  LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) {
345    return wrap(VectorType::get(unwrap(ElementType), ElementCount));
346  }
347  
LLVMGetElementType(LLVMTypeRef Ty)348  LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty) {
349    return wrap(unwrap<SequentialType>(Ty)->getElementType());
350  }
351  
LLVMGetArrayLength(LLVMTypeRef ArrayTy)352  unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) {
353    return unwrap<ArrayType>(ArrayTy)->getNumElements();
354  }
355  
LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy)356  unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy) {
357    return unwrap<PointerType>(PointerTy)->getAddressSpace();
358  }
359  
LLVMGetVectorSize(LLVMTypeRef VectorTy)360  unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy) {
361    return unwrap<VectorType>(VectorTy)->getNumElements();
362  }
363  
364  /*--.. Operations on other types ...........................................--*/
365  
LLVMVoidTypeInContext(LLVMContextRef C)366  LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C)  {
367    return wrap(Type::getVoidTy(*unwrap(C)));
368  }
LLVMLabelTypeInContext(LLVMContextRef C)369  LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C) {
370    return wrap(Type::getLabelTy(*unwrap(C)));
371  }
372  
LLVMVoidType(void)373  LLVMTypeRef LLVMVoidType(void)  {
374    return LLVMVoidTypeInContext(LLVMGetGlobalContext());
375  }
LLVMLabelType(void)376  LLVMTypeRef LLVMLabelType(void) {
377    return LLVMLabelTypeInContext(LLVMGetGlobalContext());
378  }
379  
380  /*===-- Operations on values ----------------------------------------------===*/
381  
382  /*--.. Operations on all values ............................................--*/
383  
LLVMTypeOf(LLVMValueRef Val)384  LLVMTypeRef LLVMTypeOf(LLVMValueRef Val) {
385    return wrap(unwrap(Val)->getType());
386  }
387  
LLVMGetValueName(LLVMValueRef Val)388  const char *LLVMGetValueName(LLVMValueRef Val) {
389    return unwrap(Val)->getName().data();
390  }
391  
LLVMSetValueName(LLVMValueRef Val,const char * Name)392  void LLVMSetValueName(LLVMValueRef Val, const char *Name) {
393    unwrap(Val)->setName(Name);
394  }
395  
LLVMDumpValue(LLVMValueRef Val)396  void LLVMDumpValue(LLVMValueRef Val) {
397    unwrap(Val)->dump();
398  }
399  
LLVMReplaceAllUsesWith(LLVMValueRef OldVal,LLVMValueRef NewVal)400  void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal) {
401    unwrap(OldVal)->replaceAllUsesWith(unwrap(NewVal));
402  }
403  
LLVMHasMetadata(LLVMValueRef Inst)404  int LLVMHasMetadata(LLVMValueRef Inst) {
405    return unwrap<Instruction>(Inst)->hasMetadata();
406  }
407  
LLVMGetMetadata(LLVMValueRef Inst,unsigned KindID)408  LLVMValueRef LLVMGetMetadata(LLVMValueRef Inst, unsigned KindID) {
409    return wrap(unwrap<Instruction>(Inst)->getMetadata(KindID));
410  }
411  
LLVMSetMetadata(LLVMValueRef Inst,unsigned KindID,LLVMValueRef MD)412  void LLVMSetMetadata(LLVMValueRef Inst, unsigned KindID, LLVMValueRef MD) {
413    unwrap<Instruction>(Inst)->setMetadata(KindID, MD? unwrap<MDNode>(MD) : NULL);
414  }
415  
416  /*--.. Conversion functions ................................................--*/
417  
418  #define LLVM_DEFINE_VALUE_CAST(name)                                       \
419    LLVMValueRef LLVMIsA##name(LLVMValueRef Val) {                           \
420      return wrap(static_cast<Value*>(dyn_cast_or_null<name>(unwrap(Val)))); \
421    }
422  
LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST)423  LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST)
424  
425  /*--.. Operations on Uses ..................................................--*/
426  LLVMUseRef LLVMGetFirstUse(LLVMValueRef Val) {
427    Value *V = unwrap(Val);
428    Value::use_iterator I = V->use_begin();
429    if (I == V->use_end())
430      return 0;
431    return wrap(&(I.getUse()));
432  }
433  
LLVMGetNextUse(LLVMUseRef U)434  LLVMUseRef LLVMGetNextUse(LLVMUseRef U) {
435    Use *Next = unwrap(U)->getNext();
436    if (Next)
437      return wrap(Next);
438    return 0;
439  }
440  
LLVMGetUser(LLVMUseRef U)441  LLVMValueRef LLVMGetUser(LLVMUseRef U) {
442    return wrap(unwrap(U)->getUser());
443  }
444  
LLVMGetUsedValue(LLVMUseRef U)445  LLVMValueRef LLVMGetUsedValue(LLVMUseRef U) {
446    return wrap(unwrap(U)->get());
447  }
448  
449  /*--.. Operations on Users .................................................--*/
LLVMGetOperand(LLVMValueRef Val,unsigned Index)450  LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index) {
451    return wrap(unwrap<User>(Val)->getOperand(Index));
452  }
453  
LLVMSetOperand(LLVMValueRef Val,unsigned Index,LLVMValueRef Op)454  void LLVMSetOperand(LLVMValueRef Val, unsigned Index, LLVMValueRef Op) {
455    unwrap<User>(Val)->setOperand(Index, unwrap(Op));
456  }
457  
LLVMGetNumOperands(LLVMValueRef Val)458  int LLVMGetNumOperands(LLVMValueRef Val) {
459    return unwrap<User>(Val)->getNumOperands();
460  }
461  
462  /*--.. Operations on constants of any type .................................--*/
463  
LLVMConstNull(LLVMTypeRef Ty)464  LLVMValueRef LLVMConstNull(LLVMTypeRef Ty) {
465    return wrap(Constant::getNullValue(unwrap(Ty)));
466  }
467  
LLVMConstAllOnes(LLVMTypeRef Ty)468  LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty) {
469    return wrap(Constant::getAllOnesValue(unwrap(Ty)));
470  }
471  
LLVMGetUndef(LLVMTypeRef Ty)472  LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty) {
473    return wrap(UndefValue::get(unwrap(Ty)));
474  }
475  
LLVMIsConstant(LLVMValueRef Ty)476  LLVMBool LLVMIsConstant(LLVMValueRef Ty) {
477    return isa<Constant>(unwrap(Ty));
478  }
479  
LLVMIsNull(LLVMValueRef Val)480  LLVMBool LLVMIsNull(LLVMValueRef Val) {
481    if (Constant *C = dyn_cast<Constant>(unwrap(Val)))
482      return C->isNullValue();
483    return false;
484  }
485  
LLVMIsUndef(LLVMValueRef Val)486  LLVMBool LLVMIsUndef(LLVMValueRef Val) {
487    return isa<UndefValue>(unwrap(Val));
488  }
489  
LLVMConstPointerNull(LLVMTypeRef Ty)490  LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty) {
491    return
492        wrap(ConstantPointerNull::get(unwrap<PointerType>(Ty)));
493  }
494  
495  /*--.. Operations on metadata nodes ........................................--*/
496  
LLVMMDStringInContext(LLVMContextRef C,const char * Str,unsigned SLen)497  LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str,
498                                     unsigned SLen) {
499    return wrap(MDString::get(*unwrap(C), StringRef(Str, SLen)));
500  }
501  
LLVMMDString(const char * Str,unsigned SLen)502  LLVMValueRef LLVMMDString(const char *Str, unsigned SLen) {
503    return LLVMMDStringInContext(LLVMGetGlobalContext(), Str, SLen);
504  }
505  
LLVMMDNodeInContext(LLVMContextRef C,LLVMValueRef * Vals,unsigned Count)506  LLVMValueRef LLVMMDNodeInContext(LLVMContextRef C, LLVMValueRef *Vals,
507                                   unsigned Count) {
508    return wrap(MDNode::get(*unwrap(C),
509                            makeArrayRef(unwrap<Value>(Vals, Count), Count)));
510  }
511  
LLVMMDNode(LLVMValueRef * Vals,unsigned Count)512  LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count) {
513    return LLVMMDNodeInContext(LLVMGetGlobalContext(), Vals, Count);
514  }
515  
516  /*--.. Operations on scalar constants ......................................--*/
517  
LLVMConstInt(LLVMTypeRef IntTy,unsigned long long N,LLVMBool SignExtend)518  LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
519                            LLVMBool SignExtend) {
520    return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), N, SignExtend != 0));
521  }
522  
LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy,unsigned NumWords,const uint64_t Words[])523  LLVMValueRef LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy,
524                                                unsigned NumWords,
525                                                const uint64_t Words[]) {
526      IntegerType *Ty = unwrap<IntegerType>(IntTy);
527      return wrap(ConstantInt::get(Ty->getContext(),
528                                   APInt(Ty->getBitWidth(),
529                                         makeArrayRef(Words, NumWords))));
530  }
531  
LLVMConstIntOfString(LLVMTypeRef IntTy,const char Str[],uint8_t Radix)532  LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char Str[],
533                                    uint8_t Radix) {
534    return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str),
535                                 Radix));
536  }
537  
LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy,const char Str[],unsigned SLen,uint8_t Radix)538  LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char Str[],
539                                           unsigned SLen, uint8_t Radix) {
540    return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str, SLen),
541                                 Radix));
542  }
543  
LLVMConstReal(LLVMTypeRef RealTy,double N)544  LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) {
545    return wrap(ConstantFP::get(unwrap(RealTy), N));
546  }
547  
LLVMConstRealOfString(LLVMTypeRef RealTy,const char * Text)548  LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) {
549    return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Text)));
550  }
551  
LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy,const char Str[],unsigned SLen)552  LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char Str[],
553                                            unsigned SLen) {
554    return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Str, SLen)));
555  }
556  
LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal)557  unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal) {
558    return unwrap<ConstantInt>(ConstantVal)->getZExtValue();
559  }
560  
LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal)561  long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal) {
562    return unwrap<ConstantInt>(ConstantVal)->getSExtValue();
563  }
564  
565  /*--.. Operations on composite constants ...................................--*/
566  
LLVMConstStringInContext(LLVMContextRef C,const char * Str,unsigned Length,LLVMBool DontNullTerminate)567  LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
568                                        unsigned Length,
569                                        LLVMBool DontNullTerminate) {
570    /* Inverted the sense of AddNull because ', 0)' is a
571       better mnemonic for null termination than ', 1)'. */
572    return wrap(ConstantArray::get(*unwrap(C), StringRef(Str, Length),
573                                   DontNullTerminate == 0));
574  }
LLVMConstStructInContext(LLVMContextRef C,LLVMValueRef * ConstantVals,unsigned Count,LLVMBool Packed)575  LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
576                                        LLVMValueRef *ConstantVals,
577                                        unsigned Count, LLVMBool Packed) {
578    Constant **Elements = unwrap<Constant>(ConstantVals, Count);
579    return wrap(ConstantStruct::getAnon(*unwrap(C), makeArrayRef(Elements, Count),
580                                        Packed != 0));
581  }
582  
LLVMConstString(const char * Str,unsigned Length,LLVMBool DontNullTerminate)583  LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
584                               LLVMBool DontNullTerminate) {
585    return LLVMConstStringInContext(LLVMGetGlobalContext(), Str, Length,
586                                    DontNullTerminate);
587  }
LLVMConstArray(LLVMTypeRef ElementTy,LLVMValueRef * ConstantVals,unsigned Length)588  LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
589                              LLVMValueRef *ConstantVals, unsigned Length) {
590    ArrayRef<Constant*> V(unwrap<Constant>(ConstantVals, Length), Length);
591    return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length), V));
592  }
LLVMConstStruct(LLVMValueRef * ConstantVals,unsigned Count,LLVMBool Packed)593  LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
594                               LLVMBool Packed) {
595    return LLVMConstStructInContext(LLVMGetGlobalContext(), ConstantVals, Count,
596                                    Packed);
597  }
598  
LLVMConstNamedStruct(LLVMTypeRef StructTy,LLVMValueRef * ConstantVals,unsigned Count)599  LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy,
600                                    LLVMValueRef *ConstantVals,
601                                    unsigned Count) {
602    Constant **Elements = unwrap<Constant>(ConstantVals, Count);
603    StructType *Ty = cast<StructType>(unwrap(StructTy));
604  
605    return wrap(ConstantStruct::get(Ty, makeArrayRef(Elements, Count)));
606  }
607  
LLVMConstVector(LLVMValueRef * ScalarConstantVals,unsigned Size)608  LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) {
609    return wrap(ConstantVector::get(makeArrayRef(
610                              unwrap<Constant>(ScalarConstantVals, Size), Size)));
611  }
612  /*--.. Constant expressions ................................................--*/
613  
LLVMGetConstOpcode(LLVMValueRef ConstantVal)614  LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal) {
615    return (LLVMOpcode)unwrap<ConstantExpr>(ConstantVal)->getOpcode();
616  }
617  
LLVMAlignOf(LLVMTypeRef Ty)618  LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty) {
619    return wrap(ConstantExpr::getAlignOf(unwrap(Ty)));
620  }
621  
LLVMSizeOf(LLVMTypeRef Ty)622  LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty) {
623    return wrap(ConstantExpr::getSizeOf(unwrap(Ty)));
624  }
625  
LLVMConstNeg(LLVMValueRef ConstantVal)626  LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal) {
627    return wrap(ConstantExpr::getNeg(unwrap<Constant>(ConstantVal)));
628  }
629  
LLVMConstNSWNeg(LLVMValueRef ConstantVal)630  LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal) {
631    return wrap(ConstantExpr::getNSWNeg(unwrap<Constant>(ConstantVal)));
632  }
633  
LLVMConstNUWNeg(LLVMValueRef ConstantVal)634  LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal) {
635    return wrap(ConstantExpr::getNUWNeg(unwrap<Constant>(ConstantVal)));
636  }
637  
638  
LLVMConstFNeg(LLVMValueRef ConstantVal)639  LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal) {
640    return wrap(ConstantExpr::getFNeg(unwrap<Constant>(ConstantVal)));
641  }
642  
LLVMConstNot(LLVMValueRef ConstantVal)643  LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal) {
644    return wrap(ConstantExpr::getNot(unwrap<Constant>(ConstantVal)));
645  }
646  
LLVMConstAdd(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)647  LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
648    return wrap(ConstantExpr::getAdd(unwrap<Constant>(LHSConstant),
649                                     unwrap<Constant>(RHSConstant)));
650  }
651  
LLVMConstNSWAdd(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)652  LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant,
653                               LLVMValueRef RHSConstant) {
654    return wrap(ConstantExpr::getNSWAdd(unwrap<Constant>(LHSConstant),
655                                        unwrap<Constant>(RHSConstant)));
656  }
657  
LLVMConstNUWAdd(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)658  LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant,
659                               LLVMValueRef RHSConstant) {
660    return wrap(ConstantExpr::getNUWAdd(unwrap<Constant>(LHSConstant),
661                                        unwrap<Constant>(RHSConstant)));
662  }
663  
LLVMConstFAdd(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)664  LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
665    return wrap(ConstantExpr::getFAdd(unwrap<Constant>(LHSConstant),
666                                      unwrap<Constant>(RHSConstant)));
667  }
668  
LLVMConstSub(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)669  LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
670    return wrap(ConstantExpr::getSub(unwrap<Constant>(LHSConstant),
671                                     unwrap<Constant>(RHSConstant)));
672  }
673  
LLVMConstNSWSub(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)674  LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant,
675                               LLVMValueRef RHSConstant) {
676    return wrap(ConstantExpr::getNSWSub(unwrap<Constant>(LHSConstant),
677                                        unwrap<Constant>(RHSConstant)));
678  }
679  
LLVMConstNUWSub(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)680  LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant,
681                               LLVMValueRef RHSConstant) {
682    return wrap(ConstantExpr::getNUWSub(unwrap<Constant>(LHSConstant),
683                                        unwrap<Constant>(RHSConstant)));
684  }
685  
LLVMConstFSub(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)686  LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
687    return wrap(ConstantExpr::getFSub(unwrap<Constant>(LHSConstant),
688                                      unwrap<Constant>(RHSConstant)));
689  }
690  
LLVMConstMul(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)691  LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
692    return wrap(ConstantExpr::getMul(unwrap<Constant>(LHSConstant),
693                                     unwrap<Constant>(RHSConstant)));
694  }
695  
LLVMConstNSWMul(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)696  LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant,
697                               LLVMValueRef RHSConstant) {
698    return wrap(ConstantExpr::getNSWMul(unwrap<Constant>(LHSConstant),
699                                        unwrap<Constant>(RHSConstant)));
700  }
701  
LLVMConstNUWMul(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)702  LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant,
703                               LLVMValueRef RHSConstant) {
704    return wrap(ConstantExpr::getNUWMul(unwrap<Constant>(LHSConstant),
705                                        unwrap<Constant>(RHSConstant)));
706  }
707  
LLVMConstFMul(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)708  LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
709    return wrap(ConstantExpr::getFMul(unwrap<Constant>(LHSConstant),
710                                      unwrap<Constant>(RHSConstant)));
711  }
712  
LLVMConstUDiv(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)713  LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
714    return wrap(ConstantExpr::getUDiv(unwrap<Constant>(LHSConstant),
715                                      unwrap<Constant>(RHSConstant)));
716  }
717  
LLVMConstSDiv(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)718  LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
719    return wrap(ConstantExpr::getSDiv(unwrap<Constant>(LHSConstant),
720                                      unwrap<Constant>(RHSConstant)));
721  }
722  
LLVMConstExactSDiv(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)723  LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant,
724                                  LLVMValueRef RHSConstant) {
725    return wrap(ConstantExpr::getExactSDiv(unwrap<Constant>(LHSConstant),
726                                           unwrap<Constant>(RHSConstant)));
727  }
728  
LLVMConstFDiv(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)729  LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
730    return wrap(ConstantExpr::getFDiv(unwrap<Constant>(LHSConstant),
731                                      unwrap<Constant>(RHSConstant)));
732  }
733  
LLVMConstURem(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)734  LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
735    return wrap(ConstantExpr::getURem(unwrap<Constant>(LHSConstant),
736                                      unwrap<Constant>(RHSConstant)));
737  }
738  
LLVMConstSRem(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)739  LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
740    return wrap(ConstantExpr::getSRem(unwrap<Constant>(LHSConstant),
741                                      unwrap<Constant>(RHSConstant)));
742  }
743  
LLVMConstFRem(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)744  LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
745    return wrap(ConstantExpr::getFRem(unwrap<Constant>(LHSConstant),
746                                      unwrap<Constant>(RHSConstant)));
747  }
748  
LLVMConstAnd(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)749  LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
750    return wrap(ConstantExpr::getAnd(unwrap<Constant>(LHSConstant),
751                                     unwrap<Constant>(RHSConstant)));
752  }
753  
LLVMConstOr(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)754  LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
755    return wrap(ConstantExpr::getOr(unwrap<Constant>(LHSConstant),
756                                    unwrap<Constant>(RHSConstant)));
757  }
758  
LLVMConstXor(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)759  LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
760    return wrap(ConstantExpr::getXor(unwrap<Constant>(LHSConstant),
761                                     unwrap<Constant>(RHSConstant)));
762  }
763  
LLVMConstICmp(LLVMIntPredicate Predicate,LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)764  LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
765                             LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
766    return wrap(ConstantExpr::getICmp(Predicate,
767                                      unwrap<Constant>(LHSConstant),
768                                      unwrap<Constant>(RHSConstant)));
769  }
770  
LLVMConstFCmp(LLVMRealPredicate Predicate,LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)771  LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
772                             LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
773    return wrap(ConstantExpr::getFCmp(Predicate,
774                                      unwrap<Constant>(LHSConstant),
775                                      unwrap<Constant>(RHSConstant)));
776  }
777  
LLVMConstShl(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)778  LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
779    return wrap(ConstantExpr::getShl(unwrap<Constant>(LHSConstant),
780                                     unwrap<Constant>(RHSConstant)));
781  }
782  
LLVMConstLShr(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)783  LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
784    return wrap(ConstantExpr::getLShr(unwrap<Constant>(LHSConstant),
785                                      unwrap<Constant>(RHSConstant)));
786  }
787  
LLVMConstAShr(LLVMValueRef LHSConstant,LLVMValueRef RHSConstant)788  LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
789    return wrap(ConstantExpr::getAShr(unwrap<Constant>(LHSConstant),
790                                      unwrap<Constant>(RHSConstant)));
791  }
792  
LLVMConstGEP(LLVMValueRef ConstantVal,LLVMValueRef * ConstantIndices,unsigned NumIndices)793  LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
794                            LLVMValueRef *ConstantIndices, unsigned NumIndices) {
795    return wrap(ConstantExpr::getGetElementPtr(unwrap<Constant>(ConstantVal),
796                                               unwrap<Constant>(ConstantIndices,
797                                                                NumIndices),
798                                               NumIndices));
799  }
800  
LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,LLVMValueRef * ConstantIndices,unsigned NumIndices)801  LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
802                                    LLVMValueRef *ConstantIndices,
803                                    unsigned NumIndices) {
804    Constant* Val = unwrap<Constant>(ConstantVal);
805    Constant** Idxs = unwrap<Constant>(ConstantIndices, NumIndices);
806    return wrap(ConstantExpr::getInBoundsGetElementPtr(Val, Idxs, NumIndices));
807  }
808  
LLVMConstTrunc(LLVMValueRef ConstantVal,LLVMTypeRef ToType)809  LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
810    return wrap(ConstantExpr::getTrunc(unwrap<Constant>(ConstantVal),
811                                       unwrap(ToType)));
812  }
813  
LLVMConstSExt(LLVMValueRef ConstantVal,LLVMTypeRef ToType)814  LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
815    return wrap(ConstantExpr::getSExt(unwrap<Constant>(ConstantVal),
816                                      unwrap(ToType)));
817  }
818  
LLVMConstZExt(LLVMValueRef ConstantVal,LLVMTypeRef ToType)819  LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
820    return wrap(ConstantExpr::getZExt(unwrap<Constant>(ConstantVal),
821                                      unwrap(ToType)));
822  }
823  
LLVMConstFPTrunc(LLVMValueRef ConstantVal,LLVMTypeRef ToType)824  LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
825    return wrap(ConstantExpr::getFPTrunc(unwrap<Constant>(ConstantVal),
826                                         unwrap(ToType)));
827  }
828  
LLVMConstFPExt(LLVMValueRef ConstantVal,LLVMTypeRef ToType)829  LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
830    return wrap(ConstantExpr::getFPExtend(unwrap<Constant>(ConstantVal),
831                                          unwrap(ToType)));
832  }
833  
LLVMConstUIToFP(LLVMValueRef ConstantVal,LLVMTypeRef ToType)834  LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
835    return wrap(ConstantExpr::getUIToFP(unwrap<Constant>(ConstantVal),
836                                        unwrap(ToType)));
837  }
838  
LLVMConstSIToFP(LLVMValueRef ConstantVal,LLVMTypeRef ToType)839  LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
840    return wrap(ConstantExpr::getSIToFP(unwrap<Constant>(ConstantVal),
841                                        unwrap(ToType)));
842  }
843  
LLVMConstFPToUI(LLVMValueRef ConstantVal,LLVMTypeRef ToType)844  LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
845    return wrap(ConstantExpr::getFPToUI(unwrap<Constant>(ConstantVal),
846                                        unwrap(ToType)));
847  }
848  
LLVMConstFPToSI(LLVMValueRef ConstantVal,LLVMTypeRef ToType)849  LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
850    return wrap(ConstantExpr::getFPToSI(unwrap<Constant>(ConstantVal),
851                                        unwrap(ToType)));
852  }
853  
LLVMConstPtrToInt(LLVMValueRef ConstantVal,LLVMTypeRef ToType)854  LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
855    return wrap(ConstantExpr::getPtrToInt(unwrap<Constant>(ConstantVal),
856                                          unwrap(ToType)));
857  }
858  
LLVMConstIntToPtr(LLVMValueRef ConstantVal,LLVMTypeRef ToType)859  LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
860    return wrap(ConstantExpr::getIntToPtr(unwrap<Constant>(ConstantVal),
861                                          unwrap(ToType)));
862  }
863  
LLVMConstBitCast(LLVMValueRef ConstantVal,LLVMTypeRef ToType)864  LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
865    return wrap(ConstantExpr::getBitCast(unwrap<Constant>(ConstantVal),
866                                         unwrap(ToType)));
867  }
868  
LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,LLVMTypeRef ToType)869  LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
870                                      LLVMTypeRef ToType) {
871    return wrap(ConstantExpr::getZExtOrBitCast(unwrap<Constant>(ConstantVal),
872                                               unwrap(ToType)));
873  }
874  
LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,LLVMTypeRef ToType)875  LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
876                                      LLVMTypeRef ToType) {
877    return wrap(ConstantExpr::getSExtOrBitCast(unwrap<Constant>(ConstantVal),
878                                               unwrap(ToType)));
879  }
880  
LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,LLVMTypeRef ToType)881  LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
882                                       LLVMTypeRef ToType) {
883    return wrap(ConstantExpr::getTruncOrBitCast(unwrap<Constant>(ConstantVal),
884                                                unwrap(ToType)));
885  }
886  
LLVMConstPointerCast(LLVMValueRef ConstantVal,LLVMTypeRef ToType)887  LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
888                                    LLVMTypeRef ToType) {
889    return wrap(ConstantExpr::getPointerCast(unwrap<Constant>(ConstantVal),
890                                             unwrap(ToType)));
891  }
892  
LLVMConstIntCast(LLVMValueRef ConstantVal,LLVMTypeRef ToType,LLVMBool isSigned)893  LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
894                                LLVMBool isSigned) {
895    return wrap(ConstantExpr::getIntegerCast(unwrap<Constant>(ConstantVal),
896                                             unwrap(ToType), isSigned));
897  }
898  
LLVMConstFPCast(LLVMValueRef ConstantVal,LLVMTypeRef ToType)899  LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
900    return wrap(ConstantExpr::getFPCast(unwrap<Constant>(ConstantVal),
901                                        unwrap(ToType)));
902  }
903  
LLVMConstSelect(LLVMValueRef ConstantCondition,LLVMValueRef ConstantIfTrue,LLVMValueRef ConstantIfFalse)904  LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
905                               LLVMValueRef ConstantIfTrue,
906                               LLVMValueRef ConstantIfFalse) {
907    return wrap(ConstantExpr::getSelect(unwrap<Constant>(ConstantCondition),
908                                        unwrap<Constant>(ConstantIfTrue),
909                                        unwrap<Constant>(ConstantIfFalse)));
910  }
911  
LLVMConstExtractElement(LLVMValueRef VectorConstant,LLVMValueRef IndexConstant)912  LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
913                                       LLVMValueRef IndexConstant) {
914    return wrap(ConstantExpr::getExtractElement(unwrap<Constant>(VectorConstant),
915                                                unwrap<Constant>(IndexConstant)));
916  }
917  
LLVMConstInsertElement(LLVMValueRef VectorConstant,LLVMValueRef ElementValueConstant,LLVMValueRef IndexConstant)918  LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
919                                      LLVMValueRef ElementValueConstant,
920                                      LLVMValueRef IndexConstant) {
921    return wrap(ConstantExpr::getInsertElement(unwrap<Constant>(VectorConstant),
922                                           unwrap<Constant>(ElementValueConstant),
923                                               unwrap<Constant>(IndexConstant)));
924  }
925  
LLVMConstShuffleVector(LLVMValueRef VectorAConstant,LLVMValueRef VectorBConstant,LLVMValueRef MaskConstant)926  LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
927                                      LLVMValueRef VectorBConstant,
928                                      LLVMValueRef MaskConstant) {
929    return wrap(ConstantExpr::getShuffleVector(unwrap<Constant>(VectorAConstant),
930                                               unwrap<Constant>(VectorBConstant),
931                                               unwrap<Constant>(MaskConstant)));
932  }
933  
LLVMConstExtractValue(LLVMValueRef AggConstant,unsigned * IdxList,unsigned NumIdx)934  LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
935                                     unsigned NumIdx) {
936    return wrap(ConstantExpr::getExtractValue(unwrap<Constant>(AggConstant),
937                                              makeArrayRef(IdxList, NumIdx)));
938  }
939  
LLVMConstInsertValue(LLVMValueRef AggConstant,LLVMValueRef ElementValueConstant,unsigned * IdxList,unsigned NumIdx)940  LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
941                                    LLVMValueRef ElementValueConstant,
942                                    unsigned *IdxList, unsigned NumIdx) {
943    return wrap(ConstantExpr::getInsertValue(unwrap<Constant>(AggConstant),
944                                           unwrap<Constant>(ElementValueConstant),
945                                             makeArrayRef(IdxList, NumIdx)));
946  }
947  
LLVMConstInlineAsm(LLVMTypeRef Ty,const char * AsmString,const char * Constraints,LLVMBool HasSideEffects,LLVMBool IsAlignStack)948  LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
949                                  const char *Constraints,
950                                  LLVMBool HasSideEffects,
951                                  LLVMBool IsAlignStack) {
952    return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString,
953                               Constraints, HasSideEffects, IsAlignStack));
954  }
955  
LLVMBlockAddress(LLVMValueRef F,LLVMBasicBlockRef BB)956  LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB) {
957    return wrap(BlockAddress::get(unwrap<Function>(F), unwrap(BB)));
958  }
959  
960  /*--.. Operations on global variables, functions, and aliases (globals) ....--*/
961  
LLVMGetGlobalParent(LLVMValueRef Global)962  LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) {
963    return wrap(unwrap<GlobalValue>(Global)->getParent());
964  }
965  
LLVMIsDeclaration(LLVMValueRef Global)966  LLVMBool LLVMIsDeclaration(LLVMValueRef Global) {
967    return unwrap<GlobalValue>(Global)->isDeclaration();
968  }
969  
LLVMGetLinkage(LLVMValueRef Global)970  LLVMLinkage LLVMGetLinkage(LLVMValueRef Global) {
971    switch (unwrap<GlobalValue>(Global)->getLinkage()) {
972    default:
973      assert(false && "Unhandled Linkage Type.");
974    case GlobalValue::ExternalLinkage:
975      return LLVMExternalLinkage;
976    case GlobalValue::AvailableExternallyLinkage:
977      return LLVMAvailableExternallyLinkage;
978    case GlobalValue::LinkOnceAnyLinkage:
979      return LLVMLinkOnceAnyLinkage;
980    case GlobalValue::LinkOnceODRLinkage:
981      return LLVMLinkOnceODRLinkage;
982    case GlobalValue::WeakAnyLinkage:
983      return LLVMWeakAnyLinkage;
984    case GlobalValue::WeakODRLinkage:
985      return LLVMWeakODRLinkage;
986    case GlobalValue::AppendingLinkage:
987      return LLVMAppendingLinkage;
988    case GlobalValue::InternalLinkage:
989      return LLVMInternalLinkage;
990    case GlobalValue::PrivateLinkage:
991      return LLVMPrivateLinkage;
992    case GlobalValue::LinkerPrivateLinkage:
993      return LLVMLinkerPrivateLinkage;
994    case GlobalValue::LinkerPrivateWeakLinkage:
995      return LLVMLinkerPrivateWeakLinkage;
996    case GlobalValue::LinkerPrivateWeakDefAutoLinkage:
997      return LLVMLinkerPrivateWeakDefAutoLinkage;
998    case GlobalValue::DLLImportLinkage:
999      return LLVMDLLImportLinkage;
1000    case GlobalValue::DLLExportLinkage:
1001      return LLVMDLLExportLinkage;
1002    case GlobalValue::ExternalWeakLinkage:
1003      return LLVMExternalWeakLinkage;
1004    case GlobalValue::CommonLinkage:
1005      return LLVMCommonLinkage;
1006    }
1007  
1008    // Should never get here.
1009    return static_cast<LLVMLinkage>(0);
1010  }
1011  
LLVMSetLinkage(LLVMValueRef Global,LLVMLinkage Linkage)1012  void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage) {
1013    GlobalValue *GV = unwrap<GlobalValue>(Global);
1014  
1015    switch (Linkage) {
1016    default:
1017      assert(false && "Unhandled Linkage Type.");
1018    case LLVMExternalLinkage:
1019      GV->setLinkage(GlobalValue::ExternalLinkage);
1020      break;
1021    case LLVMAvailableExternallyLinkage:
1022      GV->setLinkage(GlobalValue::AvailableExternallyLinkage);
1023      break;
1024    case LLVMLinkOnceAnyLinkage:
1025      GV->setLinkage(GlobalValue::LinkOnceAnyLinkage);
1026      break;
1027    case LLVMLinkOnceODRLinkage:
1028      GV->setLinkage(GlobalValue::LinkOnceODRLinkage);
1029      break;
1030    case LLVMWeakAnyLinkage:
1031      GV->setLinkage(GlobalValue::WeakAnyLinkage);
1032      break;
1033    case LLVMWeakODRLinkage:
1034      GV->setLinkage(GlobalValue::WeakODRLinkage);
1035      break;
1036    case LLVMAppendingLinkage:
1037      GV->setLinkage(GlobalValue::AppendingLinkage);
1038      break;
1039    case LLVMInternalLinkage:
1040      GV->setLinkage(GlobalValue::InternalLinkage);
1041      break;
1042    case LLVMPrivateLinkage:
1043      GV->setLinkage(GlobalValue::PrivateLinkage);
1044      break;
1045    case LLVMLinkerPrivateLinkage:
1046      GV->setLinkage(GlobalValue::LinkerPrivateLinkage);
1047      break;
1048    case LLVMLinkerPrivateWeakLinkage:
1049      GV->setLinkage(GlobalValue::LinkerPrivateWeakLinkage);
1050      break;
1051    case LLVMLinkerPrivateWeakDefAutoLinkage:
1052      GV->setLinkage(GlobalValue::LinkerPrivateWeakDefAutoLinkage);
1053      break;
1054    case LLVMDLLImportLinkage:
1055      GV->setLinkage(GlobalValue::DLLImportLinkage);
1056      break;
1057    case LLVMDLLExportLinkage:
1058      GV->setLinkage(GlobalValue::DLLExportLinkage);
1059      break;
1060    case LLVMExternalWeakLinkage:
1061      GV->setLinkage(GlobalValue::ExternalWeakLinkage);
1062      break;
1063    case LLVMGhostLinkage:
1064      DEBUG(errs()
1065            << "LLVMSetLinkage(): LLVMGhostLinkage is no longer supported.");
1066      break;
1067    case LLVMCommonLinkage:
1068      GV->setLinkage(GlobalValue::CommonLinkage);
1069      break;
1070    }
1071  }
1072  
LLVMGetSection(LLVMValueRef Global)1073  const char *LLVMGetSection(LLVMValueRef Global) {
1074    return unwrap<GlobalValue>(Global)->getSection().c_str();
1075  }
1076  
LLVMSetSection(LLVMValueRef Global,const char * Section)1077  void LLVMSetSection(LLVMValueRef Global, const char *Section) {
1078    unwrap<GlobalValue>(Global)->setSection(Section);
1079  }
1080  
LLVMGetVisibility(LLVMValueRef Global)1081  LLVMVisibility LLVMGetVisibility(LLVMValueRef Global) {
1082    return static_cast<LLVMVisibility>(
1083      unwrap<GlobalValue>(Global)->getVisibility());
1084  }
1085  
LLVMSetVisibility(LLVMValueRef Global,LLVMVisibility Viz)1086  void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz) {
1087    unwrap<GlobalValue>(Global)
1088      ->setVisibility(static_cast<GlobalValue::VisibilityTypes>(Viz));
1089  }
1090  
LLVMGetAlignment(LLVMValueRef Global)1091  unsigned LLVMGetAlignment(LLVMValueRef Global) {
1092    return unwrap<GlobalValue>(Global)->getAlignment();
1093  }
1094  
LLVMSetAlignment(LLVMValueRef Global,unsigned Bytes)1095  void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes) {
1096    unwrap<GlobalValue>(Global)->setAlignment(Bytes);
1097  }
1098  
1099  /*--.. Operations on global variables ......................................--*/
1100  
LLVMAddGlobal(LLVMModuleRef M,LLVMTypeRef Ty,const char * Name)1101  LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) {
1102    return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
1103                                   GlobalValue::ExternalLinkage, 0, Name));
1104  }
1105  
LLVMAddGlobalInAddressSpace(LLVMModuleRef M,LLVMTypeRef Ty,const char * Name,unsigned AddressSpace)1106  LLVMValueRef LLVMAddGlobalInAddressSpace(LLVMModuleRef M, LLVMTypeRef Ty,
1107                                           const char *Name,
1108                                           unsigned AddressSpace) {
1109    return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
1110                                   GlobalValue::ExternalLinkage, 0, Name, 0,
1111                                   false, AddressSpace));
1112  }
1113  
LLVMGetNamedGlobal(LLVMModuleRef M,const char * Name)1114  LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name) {
1115    return wrap(unwrap(M)->getNamedGlobal(Name));
1116  }
1117  
LLVMGetFirstGlobal(LLVMModuleRef M)1118  LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M) {
1119    Module *Mod = unwrap(M);
1120    Module::global_iterator I = Mod->global_begin();
1121    if (I == Mod->global_end())
1122      return 0;
1123    return wrap(I);
1124  }
1125  
LLVMGetLastGlobal(LLVMModuleRef M)1126  LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M) {
1127    Module *Mod = unwrap(M);
1128    Module::global_iterator I = Mod->global_end();
1129    if (I == Mod->global_begin())
1130      return 0;
1131    return wrap(--I);
1132  }
1133  
LLVMGetNextGlobal(LLVMValueRef GlobalVar)1134  LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar) {
1135    GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1136    Module::global_iterator I = GV;
1137    if (++I == GV->getParent()->global_end())
1138      return 0;
1139    return wrap(I);
1140  }
1141  
LLVMGetPreviousGlobal(LLVMValueRef GlobalVar)1142  LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar) {
1143    GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1144    Module::global_iterator I = GV;
1145    if (I == GV->getParent()->global_begin())
1146      return 0;
1147    return wrap(--I);
1148  }
1149  
LLVMDeleteGlobal(LLVMValueRef GlobalVar)1150  void LLVMDeleteGlobal(LLVMValueRef GlobalVar) {
1151    unwrap<GlobalVariable>(GlobalVar)->eraseFromParent();
1152  }
1153  
LLVMGetInitializer(LLVMValueRef GlobalVar)1154  LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar) {
1155    GlobalVariable* GV = unwrap<GlobalVariable>(GlobalVar);
1156    if ( !GV->hasInitializer() )
1157      return 0;
1158    return wrap(GV->getInitializer());
1159  }
1160  
LLVMSetInitializer(LLVMValueRef GlobalVar,LLVMValueRef ConstantVal)1161  void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) {
1162    unwrap<GlobalVariable>(GlobalVar)
1163      ->setInitializer(unwrap<Constant>(ConstantVal));
1164  }
1165  
LLVMIsThreadLocal(LLVMValueRef GlobalVar)1166  LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar) {
1167    return unwrap<GlobalVariable>(GlobalVar)->isThreadLocal();
1168  }
1169  
LLVMSetThreadLocal(LLVMValueRef GlobalVar,LLVMBool IsThreadLocal)1170  void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal) {
1171    unwrap<GlobalVariable>(GlobalVar)->setThreadLocal(IsThreadLocal != 0);
1172  }
1173  
LLVMIsGlobalConstant(LLVMValueRef GlobalVar)1174  LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar) {
1175    return unwrap<GlobalVariable>(GlobalVar)->isConstant();
1176  }
1177  
LLVMSetGlobalConstant(LLVMValueRef GlobalVar,LLVMBool IsConstant)1178  void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant) {
1179    unwrap<GlobalVariable>(GlobalVar)->setConstant(IsConstant != 0);
1180  }
1181  
1182  /*--.. Operations on aliases ......................................--*/
1183  
LLVMAddAlias(LLVMModuleRef M,LLVMTypeRef Ty,LLVMValueRef Aliasee,const char * Name)1184  LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
1185                            const char *Name) {
1186    return wrap(new GlobalAlias(unwrap(Ty), GlobalValue::ExternalLinkage, Name,
1187                                unwrap<Constant>(Aliasee), unwrap (M)));
1188  }
1189  
1190  /*--.. Operations on functions .............................................--*/
1191  
LLVMAddFunction(LLVMModuleRef M,const char * Name,LLVMTypeRef FunctionTy)1192  LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
1193                               LLVMTypeRef FunctionTy) {
1194    return wrap(Function::Create(unwrap<FunctionType>(FunctionTy),
1195                                 GlobalValue::ExternalLinkage, Name, unwrap(M)));
1196  }
1197  
LLVMGetNamedFunction(LLVMModuleRef M,const char * Name)1198  LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name) {
1199    return wrap(unwrap(M)->getFunction(Name));
1200  }
1201  
LLVMGetFirstFunction(LLVMModuleRef M)1202  LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M) {
1203    Module *Mod = unwrap(M);
1204    Module::iterator I = Mod->begin();
1205    if (I == Mod->end())
1206      return 0;
1207    return wrap(I);
1208  }
1209  
LLVMGetLastFunction(LLVMModuleRef M)1210  LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) {
1211    Module *Mod = unwrap(M);
1212    Module::iterator I = Mod->end();
1213    if (I == Mod->begin())
1214      return 0;
1215    return wrap(--I);
1216  }
1217  
LLVMGetNextFunction(LLVMValueRef Fn)1218  LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) {
1219    Function *Func = unwrap<Function>(Fn);
1220    Module::iterator I = Func;
1221    if (++I == Func->getParent()->end())
1222      return 0;
1223    return wrap(I);
1224  }
1225  
LLVMGetPreviousFunction(LLVMValueRef Fn)1226  LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn) {
1227    Function *Func = unwrap<Function>(Fn);
1228    Module::iterator I = Func;
1229    if (I == Func->getParent()->begin())
1230      return 0;
1231    return wrap(--I);
1232  }
1233  
LLVMDeleteFunction(LLVMValueRef Fn)1234  void LLVMDeleteFunction(LLVMValueRef Fn) {
1235    unwrap<Function>(Fn)->eraseFromParent();
1236  }
1237  
LLVMGetIntrinsicID(LLVMValueRef Fn)1238  unsigned LLVMGetIntrinsicID(LLVMValueRef Fn) {
1239    if (Function *F = dyn_cast<Function>(unwrap(Fn)))
1240      return F->getIntrinsicID();
1241    return 0;
1242  }
1243  
LLVMGetFunctionCallConv(LLVMValueRef Fn)1244  unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn) {
1245    return unwrap<Function>(Fn)->getCallingConv();
1246  }
1247  
LLVMSetFunctionCallConv(LLVMValueRef Fn,unsigned CC)1248  void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) {
1249    return unwrap<Function>(Fn)->setCallingConv(
1250      static_cast<CallingConv::ID>(CC));
1251  }
1252  
LLVMGetGC(LLVMValueRef Fn)1253  const char *LLVMGetGC(LLVMValueRef Fn) {
1254    Function *F = unwrap<Function>(Fn);
1255    return F->hasGC()? F->getGC() : 0;
1256  }
1257  
LLVMSetGC(LLVMValueRef Fn,const char * GC)1258  void LLVMSetGC(LLVMValueRef Fn, const char *GC) {
1259    Function *F = unwrap<Function>(Fn);
1260    if (GC)
1261      F->setGC(GC);
1262    else
1263      F->clearGC();
1264  }
1265  
LLVMAddFunctionAttr(LLVMValueRef Fn,LLVMAttribute PA)1266  void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
1267    Function *Func = unwrap<Function>(Fn);
1268    const AttrListPtr PAL = Func->getAttributes();
1269    const AttrListPtr PALnew = PAL.addAttr(~0U, PA);
1270    Func->setAttributes(PALnew);
1271  }
1272  
LLVMRemoveFunctionAttr(LLVMValueRef Fn,LLVMAttribute PA)1273  void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
1274    Function *Func = unwrap<Function>(Fn);
1275    const AttrListPtr PAL = Func->getAttributes();
1276    const AttrListPtr PALnew = PAL.removeAttr(~0U, PA);
1277    Func->setAttributes(PALnew);
1278  }
1279  
LLVMGetFunctionAttr(LLVMValueRef Fn)1280  LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn) {
1281    Function *Func = unwrap<Function>(Fn);
1282    const AttrListPtr PAL = Func->getAttributes();
1283    Attributes attr = PAL.getFnAttributes();
1284    return (LLVMAttribute)attr;
1285  }
1286  
1287  /*--.. Operations on parameters ............................................--*/
1288  
LLVMCountParams(LLVMValueRef FnRef)1289  unsigned LLVMCountParams(LLVMValueRef FnRef) {
1290    // This function is strictly redundant to
1291    //   LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef)))
1292    return unwrap<Function>(FnRef)->arg_size();
1293  }
1294  
LLVMGetParams(LLVMValueRef FnRef,LLVMValueRef * ParamRefs)1295  void LLVMGetParams(LLVMValueRef FnRef, LLVMValueRef *ParamRefs) {
1296    Function *Fn = unwrap<Function>(FnRef);
1297    for (Function::arg_iterator I = Fn->arg_begin(),
1298                                E = Fn->arg_end(); I != E; I++)
1299      *ParamRefs++ = wrap(I);
1300  }
1301  
LLVMGetParam(LLVMValueRef FnRef,unsigned index)1302  LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) {
1303    Function::arg_iterator AI = unwrap<Function>(FnRef)->arg_begin();
1304    while (index --> 0)
1305      AI++;
1306    return wrap(AI);
1307  }
1308  
LLVMGetParamParent(LLVMValueRef V)1309  LLVMValueRef LLVMGetParamParent(LLVMValueRef V) {
1310    return wrap(unwrap<Argument>(V)->getParent());
1311  }
1312  
LLVMGetFirstParam(LLVMValueRef Fn)1313  LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn) {
1314    Function *Func = unwrap<Function>(Fn);
1315    Function::arg_iterator I = Func->arg_begin();
1316    if (I == Func->arg_end())
1317      return 0;
1318    return wrap(I);
1319  }
1320  
LLVMGetLastParam(LLVMValueRef Fn)1321  LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn) {
1322    Function *Func = unwrap<Function>(Fn);
1323    Function::arg_iterator I = Func->arg_end();
1324    if (I == Func->arg_begin())
1325      return 0;
1326    return wrap(--I);
1327  }
1328  
LLVMGetNextParam(LLVMValueRef Arg)1329  LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg) {
1330    Argument *A = unwrap<Argument>(Arg);
1331    Function::arg_iterator I = A;
1332    if (++I == A->getParent()->arg_end())
1333      return 0;
1334    return wrap(I);
1335  }
1336  
LLVMGetPreviousParam(LLVMValueRef Arg)1337  LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg) {
1338    Argument *A = unwrap<Argument>(Arg);
1339    Function::arg_iterator I = A;
1340    if (I == A->getParent()->arg_begin())
1341      return 0;
1342    return wrap(--I);
1343  }
1344  
LLVMAddAttribute(LLVMValueRef Arg,LLVMAttribute PA)1345  void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
1346    unwrap<Argument>(Arg)->addAttr(PA);
1347  }
1348  
LLVMRemoveAttribute(LLVMValueRef Arg,LLVMAttribute PA)1349  void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
1350    unwrap<Argument>(Arg)->removeAttr(PA);
1351  }
1352  
LLVMGetAttribute(LLVMValueRef Arg)1353  LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg) {
1354    Argument *A = unwrap<Argument>(Arg);
1355    Attributes attr = A->getParent()->getAttributes().getParamAttributes(
1356      A->getArgNo()+1);
1357    return (LLVMAttribute)attr;
1358  }
1359  
1360  
LLVMSetParamAlignment(LLVMValueRef Arg,unsigned align)1361  void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) {
1362    unwrap<Argument>(Arg)->addAttr(
1363            Attribute::constructAlignmentFromInt(align));
1364  }
1365  
1366  /*--.. Operations on basic blocks ..........................................--*/
1367  
LLVMBasicBlockAsValue(LLVMBasicBlockRef BB)1368  LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB) {
1369    return wrap(static_cast<Value*>(unwrap(BB)));
1370  }
1371  
LLVMValueIsBasicBlock(LLVMValueRef Val)1372  LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val) {
1373    return isa<BasicBlock>(unwrap(Val));
1374  }
1375  
LLVMValueAsBasicBlock(LLVMValueRef Val)1376  LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val) {
1377    return wrap(unwrap<BasicBlock>(Val));
1378  }
1379  
LLVMGetBasicBlockParent(LLVMBasicBlockRef BB)1380  LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB) {
1381    return wrap(unwrap(BB)->getParent());
1382  }
1383  
LLVMCountBasicBlocks(LLVMValueRef FnRef)1384  unsigned LLVMCountBasicBlocks(LLVMValueRef FnRef) {
1385    return unwrap<Function>(FnRef)->size();
1386  }
1387  
LLVMGetBasicBlocks(LLVMValueRef FnRef,LLVMBasicBlockRef * BasicBlocksRefs)1388  void LLVMGetBasicBlocks(LLVMValueRef FnRef, LLVMBasicBlockRef *BasicBlocksRefs){
1389    Function *Fn = unwrap<Function>(FnRef);
1390    for (Function::iterator I = Fn->begin(), E = Fn->end(); I != E; I++)
1391      *BasicBlocksRefs++ = wrap(I);
1392  }
1393  
LLVMGetEntryBasicBlock(LLVMValueRef Fn)1394  LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn) {
1395    return wrap(&unwrap<Function>(Fn)->getEntryBlock());
1396  }
1397  
LLVMGetFirstBasicBlock(LLVMValueRef Fn)1398  LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn) {
1399    Function *Func = unwrap<Function>(Fn);
1400    Function::iterator I = Func->begin();
1401    if (I == Func->end())
1402      return 0;
1403    return wrap(I);
1404  }
1405  
LLVMGetLastBasicBlock(LLVMValueRef Fn)1406  LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn) {
1407    Function *Func = unwrap<Function>(Fn);
1408    Function::iterator I = Func->end();
1409    if (I == Func->begin())
1410      return 0;
1411    return wrap(--I);
1412  }
1413  
LLVMGetNextBasicBlock(LLVMBasicBlockRef BB)1414  LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB) {
1415    BasicBlock *Block = unwrap(BB);
1416    Function::iterator I = Block;
1417    if (++I == Block->getParent()->end())
1418      return 0;
1419    return wrap(I);
1420  }
1421  
LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB)1422  LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB) {
1423    BasicBlock *Block = unwrap(BB);
1424    Function::iterator I = Block;
1425    if (I == Block->getParent()->begin())
1426      return 0;
1427    return wrap(--I);
1428  }
1429  
LLVMAppendBasicBlockInContext(LLVMContextRef C,LLVMValueRef FnRef,const char * Name)1430  LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
1431                                                  LLVMValueRef FnRef,
1432                                                  const char *Name) {
1433    return wrap(BasicBlock::Create(*unwrap(C), Name, unwrap<Function>(FnRef)));
1434  }
1435  
LLVMAppendBasicBlock(LLVMValueRef FnRef,const char * Name)1436  LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef FnRef, const char *Name) {
1437    return LLVMAppendBasicBlockInContext(LLVMGetGlobalContext(), FnRef, Name);
1438  }
1439  
LLVMInsertBasicBlockInContext(LLVMContextRef C,LLVMBasicBlockRef BBRef,const char * Name)1440  LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
1441                                                  LLVMBasicBlockRef BBRef,
1442                                                  const char *Name) {
1443    BasicBlock *BB = unwrap(BBRef);
1444    return wrap(BasicBlock::Create(*unwrap(C), Name, BB->getParent(), BB));
1445  }
1446  
LLVMInsertBasicBlock(LLVMBasicBlockRef BBRef,const char * Name)1447  LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef BBRef,
1448                                         const char *Name) {
1449    return LLVMInsertBasicBlockInContext(LLVMGetGlobalContext(), BBRef, Name);
1450  }
1451  
LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef)1452  void LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef) {
1453    unwrap(BBRef)->eraseFromParent();
1454  }
1455  
LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB,LLVMBasicBlockRef MovePos)1456  void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) {
1457    unwrap(BB)->moveBefore(unwrap(MovePos));
1458  }
1459  
LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB,LLVMBasicBlockRef MovePos)1460  void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) {
1461    unwrap(BB)->moveAfter(unwrap(MovePos));
1462  }
1463  
1464  /*--.. Operations on instructions ..........................................--*/
1465  
LLVMGetInstructionParent(LLVMValueRef Inst)1466  LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst) {
1467    return wrap(unwrap<Instruction>(Inst)->getParent());
1468  }
1469  
LLVMGetFirstInstruction(LLVMBasicBlockRef BB)1470  LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB) {
1471    BasicBlock *Block = unwrap(BB);
1472    BasicBlock::iterator I = Block->begin();
1473    if (I == Block->end())
1474      return 0;
1475    return wrap(I);
1476  }
1477  
LLVMGetLastInstruction(LLVMBasicBlockRef BB)1478  LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB) {
1479    BasicBlock *Block = unwrap(BB);
1480    BasicBlock::iterator I = Block->end();
1481    if (I == Block->begin())
1482      return 0;
1483    return wrap(--I);
1484  }
1485  
LLVMGetNextInstruction(LLVMValueRef Inst)1486  LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst) {
1487    Instruction *Instr = unwrap<Instruction>(Inst);
1488    BasicBlock::iterator I = Instr;
1489    if (++I == Instr->getParent()->end())
1490      return 0;
1491    return wrap(I);
1492  }
1493  
LLVMGetPreviousInstruction(LLVMValueRef Inst)1494  LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst) {
1495    Instruction *Instr = unwrap<Instruction>(Inst);
1496    BasicBlock::iterator I = Instr;
1497    if (I == Instr->getParent()->begin())
1498      return 0;
1499    return wrap(--I);
1500  }
1501  
1502  /*--.. Call and invoke instructions ........................................--*/
1503  
LLVMGetInstructionCallConv(LLVMValueRef Instr)1504  unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) {
1505    Value *V = unwrap(Instr);
1506    if (CallInst *CI = dyn_cast<CallInst>(V))
1507      return CI->getCallingConv();
1508    else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
1509      return II->getCallingConv();
1510    llvm_unreachable("LLVMGetInstructionCallConv applies only to call and invoke!");
1511    return 0;
1512  }
1513  
LLVMSetInstructionCallConv(LLVMValueRef Instr,unsigned CC)1514  void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC) {
1515    Value *V = unwrap(Instr);
1516    if (CallInst *CI = dyn_cast<CallInst>(V))
1517      return CI->setCallingConv(static_cast<CallingConv::ID>(CC));
1518    else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
1519      return II->setCallingConv(static_cast<CallingConv::ID>(CC));
1520    llvm_unreachable("LLVMSetInstructionCallConv applies only to call and invoke!");
1521  }
1522  
LLVMAddInstrAttribute(LLVMValueRef Instr,unsigned index,LLVMAttribute PA)1523  void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index,
1524                             LLVMAttribute PA) {
1525    CallSite Call = CallSite(unwrap<Instruction>(Instr));
1526    Call.setAttributes(
1527      Call.getAttributes().addAttr(index, PA));
1528  }
1529  
LLVMRemoveInstrAttribute(LLVMValueRef Instr,unsigned index,LLVMAttribute PA)1530  void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
1531                                LLVMAttribute PA) {
1532    CallSite Call = CallSite(unwrap<Instruction>(Instr));
1533    Call.setAttributes(
1534      Call.getAttributes().removeAttr(index, PA));
1535  }
1536  
LLVMSetInstrParamAlignment(LLVMValueRef Instr,unsigned index,unsigned align)1537  void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
1538                                  unsigned align) {
1539    CallSite Call = CallSite(unwrap<Instruction>(Instr));
1540    Call.setAttributes(
1541      Call.getAttributes().addAttr(index,
1542          Attribute::constructAlignmentFromInt(align)));
1543  }
1544  
1545  /*--.. Operations on call instructions (only) ..............................--*/
1546  
LLVMIsTailCall(LLVMValueRef Call)1547  LLVMBool LLVMIsTailCall(LLVMValueRef Call) {
1548    return unwrap<CallInst>(Call)->isTailCall();
1549  }
1550  
LLVMSetTailCall(LLVMValueRef Call,LLVMBool isTailCall)1551  void LLVMSetTailCall(LLVMValueRef Call, LLVMBool isTailCall) {
1552    unwrap<CallInst>(Call)->setTailCall(isTailCall);
1553  }
1554  
1555  /*--.. Operations on phi nodes .............................................--*/
1556  
LLVMAddIncoming(LLVMValueRef PhiNode,LLVMValueRef * IncomingValues,LLVMBasicBlockRef * IncomingBlocks,unsigned Count)1557  void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
1558                       LLVMBasicBlockRef *IncomingBlocks, unsigned Count) {
1559    PHINode *PhiVal = unwrap<PHINode>(PhiNode);
1560    for (unsigned I = 0; I != Count; ++I)
1561      PhiVal->addIncoming(unwrap(IncomingValues[I]), unwrap(IncomingBlocks[I]));
1562  }
1563  
LLVMCountIncoming(LLVMValueRef PhiNode)1564  unsigned LLVMCountIncoming(LLVMValueRef PhiNode) {
1565    return unwrap<PHINode>(PhiNode)->getNumIncomingValues();
1566  }
1567  
LLVMGetIncomingValue(LLVMValueRef PhiNode,unsigned Index)1568  LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index) {
1569    return wrap(unwrap<PHINode>(PhiNode)->getIncomingValue(Index));
1570  }
1571  
LLVMGetIncomingBlock(LLVMValueRef PhiNode,unsigned Index)1572  LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index) {
1573    return wrap(unwrap<PHINode>(PhiNode)->getIncomingBlock(Index));
1574  }
1575  
1576  
1577  /*===-- Instruction builders ----------------------------------------------===*/
1578  
LLVMCreateBuilderInContext(LLVMContextRef C)1579  LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C) {
1580    return wrap(new IRBuilder<>(*unwrap(C)));
1581  }
1582  
LLVMCreateBuilder(void)1583  LLVMBuilderRef LLVMCreateBuilder(void) {
1584    return LLVMCreateBuilderInContext(LLVMGetGlobalContext());
1585  }
1586  
LLVMPositionBuilder(LLVMBuilderRef Builder,LLVMBasicBlockRef Block,LLVMValueRef Instr)1587  void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
1588                           LLVMValueRef Instr) {
1589    BasicBlock *BB = unwrap(Block);
1590    Instruction *I = Instr? unwrap<Instruction>(Instr) : (Instruction*) BB->end();
1591    unwrap(Builder)->SetInsertPoint(BB, I);
1592  }
1593  
LLVMPositionBuilderBefore(LLVMBuilderRef Builder,LLVMValueRef Instr)1594  void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1595    Instruction *I = unwrap<Instruction>(Instr);
1596    unwrap(Builder)->SetInsertPoint(I->getParent(), I);
1597  }
1598  
LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder,LLVMBasicBlockRef Block)1599  void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block) {
1600    BasicBlock *BB = unwrap(Block);
1601    unwrap(Builder)->SetInsertPoint(BB);
1602  }
1603  
LLVMGetInsertBlock(LLVMBuilderRef Builder)1604  LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder) {
1605     return wrap(unwrap(Builder)->GetInsertBlock());
1606  }
1607  
LLVMClearInsertionPosition(LLVMBuilderRef Builder)1608  void LLVMClearInsertionPosition(LLVMBuilderRef Builder) {
1609    unwrap(Builder)->ClearInsertionPoint();
1610  }
1611  
LLVMInsertIntoBuilder(LLVMBuilderRef Builder,LLVMValueRef Instr)1612  void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1613    unwrap(Builder)->Insert(unwrap<Instruction>(Instr));
1614  }
1615  
LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder,LLVMValueRef Instr,const char * Name)1616  void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
1617                                     const char *Name) {
1618    unwrap(Builder)->Insert(unwrap<Instruction>(Instr), Name);
1619  }
1620  
LLVMDisposeBuilder(LLVMBuilderRef Builder)1621  void LLVMDisposeBuilder(LLVMBuilderRef Builder) {
1622    delete unwrap(Builder);
1623  }
1624  
1625  /*--.. Metadata builders ...................................................--*/
1626  
LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder,LLVMValueRef L)1627  void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L) {
1628    MDNode *Loc = L ? unwrap<MDNode>(L) : NULL;
1629    unwrap(Builder)->SetCurrentDebugLocation(DebugLoc::getFromDILocation(Loc));
1630  }
1631  
LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder)1632  LLVMValueRef LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder) {
1633    return wrap(unwrap(Builder)->getCurrentDebugLocation()
1634                .getAsMDNode(unwrap(Builder)->getContext()));
1635  }
1636  
LLVMSetInstDebugLocation(LLVMBuilderRef Builder,LLVMValueRef Inst)1637  void LLVMSetInstDebugLocation(LLVMBuilderRef Builder, LLVMValueRef Inst) {
1638    unwrap(Builder)->SetInstDebugLocation(unwrap<Instruction>(Inst));
1639  }
1640  
1641  
1642  /*--.. Instruction builders ................................................--*/
1643  
LLVMBuildRetVoid(LLVMBuilderRef B)1644  LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef B) {
1645    return wrap(unwrap(B)->CreateRetVoid());
1646  }
1647  
LLVMBuildRet(LLVMBuilderRef B,LLVMValueRef V)1648  LLVMValueRef LLVMBuildRet(LLVMBuilderRef B, LLVMValueRef V) {
1649    return wrap(unwrap(B)->CreateRet(unwrap(V)));
1650  }
1651  
LLVMBuildAggregateRet(LLVMBuilderRef B,LLVMValueRef * RetVals,unsigned N)1652  LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef B, LLVMValueRef *RetVals,
1653                                     unsigned N) {
1654    return wrap(unwrap(B)->CreateAggregateRet(unwrap(RetVals), N));
1655  }
1656  
LLVMBuildBr(LLVMBuilderRef B,LLVMBasicBlockRef Dest)1657  LLVMValueRef LLVMBuildBr(LLVMBuilderRef B, LLVMBasicBlockRef Dest) {
1658    return wrap(unwrap(B)->CreateBr(unwrap(Dest)));
1659  }
1660  
LLVMBuildCondBr(LLVMBuilderRef B,LLVMValueRef If,LLVMBasicBlockRef Then,LLVMBasicBlockRef Else)1661  LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef B, LLVMValueRef If,
1662                               LLVMBasicBlockRef Then, LLVMBasicBlockRef Else) {
1663    return wrap(unwrap(B)->CreateCondBr(unwrap(If), unwrap(Then), unwrap(Else)));
1664  }
1665  
LLVMBuildSwitch(LLVMBuilderRef B,LLVMValueRef V,LLVMBasicBlockRef Else,unsigned NumCases)1666  LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef B, LLVMValueRef V,
1667                               LLVMBasicBlockRef Else, unsigned NumCases) {
1668    return wrap(unwrap(B)->CreateSwitch(unwrap(V), unwrap(Else), NumCases));
1669  }
1670  
LLVMBuildIndirectBr(LLVMBuilderRef B,LLVMValueRef Addr,unsigned NumDests)1671  LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
1672                                   unsigned NumDests) {
1673    return wrap(unwrap(B)->CreateIndirectBr(unwrap(Addr), NumDests));
1674  }
1675  
LLVMBuildInvoke(LLVMBuilderRef B,LLVMValueRef Fn,LLVMValueRef * Args,unsigned NumArgs,LLVMBasicBlockRef Then,LLVMBasicBlockRef Catch,const char * Name)1676  LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
1677                               LLVMValueRef *Args, unsigned NumArgs,
1678                               LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
1679                               const char *Name) {
1680    return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch),
1681                                        makeArrayRef(unwrap(Args), NumArgs),
1682                                        Name));
1683  }
1684  
LLVMBuildUnwind(LLVMBuilderRef B)1685  LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef B) {
1686    return wrap(unwrap(B)->CreateUnwind());
1687  }
1688  
LLVMBuildUnreachable(LLVMBuilderRef B)1689  LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) {
1690    return wrap(unwrap(B)->CreateUnreachable());
1691  }
1692  
LLVMAddCase(LLVMValueRef Switch,LLVMValueRef OnVal,LLVMBasicBlockRef Dest)1693  void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
1694                   LLVMBasicBlockRef Dest) {
1695    unwrap<SwitchInst>(Switch)->addCase(unwrap<ConstantInt>(OnVal), unwrap(Dest));
1696  }
1697  
LLVMAddDestination(LLVMValueRef IndirectBr,LLVMBasicBlockRef Dest)1698  void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest) {
1699    unwrap<IndirectBrInst>(IndirectBr)->addDestination(unwrap(Dest));
1700  }
1701  
1702  /*--.. Arithmetic ..........................................................--*/
1703  
LLVMBuildAdd(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1704  LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1705                            const char *Name) {
1706    return wrap(unwrap(B)->CreateAdd(unwrap(LHS), unwrap(RHS), Name));
1707  }
1708  
LLVMBuildNSWAdd(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1709  LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1710                            const char *Name) {
1711    return wrap(unwrap(B)->CreateNSWAdd(unwrap(LHS), unwrap(RHS), Name));
1712  }
1713  
LLVMBuildNUWAdd(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1714  LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1715                            const char *Name) {
1716    return wrap(unwrap(B)->CreateNUWAdd(unwrap(LHS), unwrap(RHS), Name));
1717  }
1718  
LLVMBuildFAdd(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1719  LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1720                            const char *Name) {
1721    return wrap(unwrap(B)->CreateFAdd(unwrap(LHS), unwrap(RHS), Name));
1722  }
1723  
LLVMBuildSub(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1724  LLVMValueRef LLVMBuildSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1725                            const char *Name) {
1726    return wrap(unwrap(B)->CreateSub(unwrap(LHS), unwrap(RHS), Name));
1727  }
1728  
LLVMBuildNSWSub(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1729  LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1730                            const char *Name) {
1731    return wrap(unwrap(B)->CreateNSWSub(unwrap(LHS), unwrap(RHS), Name));
1732  }
1733  
LLVMBuildNUWSub(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1734  LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1735                            const char *Name) {
1736    return wrap(unwrap(B)->CreateNUWSub(unwrap(LHS), unwrap(RHS), Name));
1737  }
1738  
LLVMBuildFSub(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1739  LLVMValueRef LLVMBuildFSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1740                            const char *Name) {
1741    return wrap(unwrap(B)->CreateFSub(unwrap(LHS), unwrap(RHS), Name));
1742  }
1743  
LLVMBuildMul(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1744  LLVMValueRef LLVMBuildMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1745                            const char *Name) {
1746    return wrap(unwrap(B)->CreateMul(unwrap(LHS), unwrap(RHS), Name));
1747  }
1748  
LLVMBuildNSWMul(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1749  LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1750                            const char *Name) {
1751    return wrap(unwrap(B)->CreateNSWMul(unwrap(LHS), unwrap(RHS), Name));
1752  }
1753  
LLVMBuildNUWMul(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1754  LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1755                            const char *Name) {
1756    return wrap(unwrap(B)->CreateNUWMul(unwrap(LHS), unwrap(RHS), Name));
1757  }
1758  
LLVMBuildFMul(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1759  LLVMValueRef LLVMBuildFMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1760                            const char *Name) {
1761    return wrap(unwrap(B)->CreateFMul(unwrap(LHS), unwrap(RHS), Name));
1762  }
1763  
LLVMBuildUDiv(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1764  LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1765                             const char *Name) {
1766    return wrap(unwrap(B)->CreateUDiv(unwrap(LHS), unwrap(RHS), Name));
1767  }
1768  
LLVMBuildSDiv(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1769  LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1770                             const char *Name) {
1771    return wrap(unwrap(B)->CreateSDiv(unwrap(LHS), unwrap(RHS), Name));
1772  }
1773  
LLVMBuildExactSDiv(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1774  LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef B, LLVMValueRef LHS,
1775                                  LLVMValueRef RHS, const char *Name) {
1776    return wrap(unwrap(B)->CreateExactSDiv(unwrap(LHS), unwrap(RHS), Name));
1777  }
1778  
LLVMBuildFDiv(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1779  LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1780                             const char *Name) {
1781    return wrap(unwrap(B)->CreateFDiv(unwrap(LHS), unwrap(RHS), Name));
1782  }
1783  
LLVMBuildURem(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1784  LLVMValueRef LLVMBuildURem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1785                             const char *Name) {
1786    return wrap(unwrap(B)->CreateURem(unwrap(LHS), unwrap(RHS), Name));
1787  }
1788  
LLVMBuildSRem(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1789  LLVMValueRef LLVMBuildSRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1790                             const char *Name) {
1791    return wrap(unwrap(B)->CreateSRem(unwrap(LHS), unwrap(RHS), Name));
1792  }
1793  
LLVMBuildFRem(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1794  LLVMValueRef LLVMBuildFRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1795                             const char *Name) {
1796    return wrap(unwrap(B)->CreateFRem(unwrap(LHS), unwrap(RHS), Name));
1797  }
1798  
LLVMBuildShl(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1799  LLVMValueRef LLVMBuildShl(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1800                            const char *Name) {
1801    return wrap(unwrap(B)->CreateShl(unwrap(LHS), unwrap(RHS), Name));
1802  }
1803  
LLVMBuildLShr(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1804  LLVMValueRef LLVMBuildLShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1805                             const char *Name) {
1806    return wrap(unwrap(B)->CreateLShr(unwrap(LHS), unwrap(RHS), Name));
1807  }
1808  
LLVMBuildAShr(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1809  LLVMValueRef LLVMBuildAShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1810                             const char *Name) {
1811    return wrap(unwrap(B)->CreateAShr(unwrap(LHS), unwrap(RHS), Name));
1812  }
1813  
LLVMBuildAnd(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1814  LLVMValueRef LLVMBuildAnd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1815                            const char *Name) {
1816    return wrap(unwrap(B)->CreateAnd(unwrap(LHS), unwrap(RHS), Name));
1817  }
1818  
LLVMBuildOr(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1819  LLVMValueRef LLVMBuildOr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1820                           const char *Name) {
1821    return wrap(unwrap(B)->CreateOr(unwrap(LHS), unwrap(RHS), Name));
1822  }
1823  
LLVMBuildXor(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1824  LLVMValueRef LLVMBuildXor(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1825                            const char *Name) {
1826    return wrap(unwrap(B)->CreateXor(unwrap(LHS), unwrap(RHS), Name));
1827  }
1828  
LLVMBuildBinOp(LLVMBuilderRef B,LLVMOpcode Op,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)1829  LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op,
1830                              LLVMValueRef LHS, LLVMValueRef RHS,
1831                              const char *Name) {
1832    return wrap(unwrap(B)->CreateBinOp(Instruction::BinaryOps(Op), unwrap(LHS),
1833                                       unwrap(RHS), Name));
1834  }
1835  
LLVMBuildNeg(LLVMBuilderRef B,LLVMValueRef V,const char * Name)1836  LLVMValueRef LLVMBuildNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1837    return wrap(unwrap(B)->CreateNeg(unwrap(V), Name));
1838  }
1839  
LLVMBuildNSWNeg(LLVMBuilderRef B,LLVMValueRef V,const char * Name)1840  LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
1841                               const char *Name) {
1842    return wrap(unwrap(B)->CreateNSWNeg(unwrap(V), Name));
1843  }
1844  
LLVMBuildNUWNeg(LLVMBuilderRef B,LLVMValueRef V,const char * Name)1845  LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V,
1846                               const char *Name) {
1847    return wrap(unwrap(B)->CreateNUWNeg(unwrap(V), Name));
1848  }
1849  
LLVMBuildFNeg(LLVMBuilderRef B,LLVMValueRef V,const char * Name)1850  LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1851    return wrap(unwrap(B)->CreateFNeg(unwrap(V), Name));
1852  }
1853  
LLVMBuildNot(LLVMBuilderRef B,LLVMValueRef V,const char * Name)1854  LLVMValueRef LLVMBuildNot(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1855    return wrap(unwrap(B)->CreateNot(unwrap(V), Name));
1856  }
1857  
1858  /*--.. Memory ..............................................................--*/
1859  
LLVMBuildMalloc(LLVMBuilderRef B,LLVMTypeRef Ty,const char * Name)1860  LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
1861                               const char *Name) {
1862    Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext());
1863    Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty));
1864    AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy);
1865    Instruction* Malloc = CallInst::CreateMalloc(unwrap(B)->GetInsertBlock(),
1866                                                 ITy, unwrap(Ty), AllocSize,
1867                                                 0, 0, "");
1868    return wrap(unwrap(B)->Insert(Malloc, Twine(Name)));
1869  }
1870  
LLVMBuildArrayMalloc(LLVMBuilderRef B,LLVMTypeRef Ty,LLVMValueRef Val,const char * Name)1871  LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
1872                                    LLVMValueRef Val, const char *Name) {
1873    Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext());
1874    Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty));
1875    AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy);
1876    Instruction* Malloc = CallInst::CreateMalloc(unwrap(B)->GetInsertBlock(),
1877                                                 ITy, unwrap(Ty), AllocSize,
1878                                                 unwrap(Val), 0, "");
1879    return wrap(unwrap(B)->Insert(Malloc, Twine(Name)));
1880  }
1881  
LLVMBuildAlloca(LLVMBuilderRef B,LLVMTypeRef Ty,const char * Name)1882  LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
1883                               const char *Name) {
1884    return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), 0, Name));
1885  }
1886  
LLVMBuildArrayAlloca(LLVMBuilderRef B,LLVMTypeRef Ty,LLVMValueRef Val,const char * Name)1887  LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
1888                                    LLVMValueRef Val, const char *Name) {
1889    return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), unwrap(Val), Name));
1890  }
1891  
LLVMBuildFree(LLVMBuilderRef B,LLVMValueRef PointerVal)1892  LLVMValueRef LLVMBuildFree(LLVMBuilderRef B, LLVMValueRef PointerVal) {
1893    return wrap(unwrap(B)->Insert(
1894       CallInst::CreateFree(unwrap(PointerVal), unwrap(B)->GetInsertBlock())));
1895  }
1896  
1897  
LLVMBuildLoad(LLVMBuilderRef B,LLVMValueRef PointerVal,const char * Name)1898  LLVMValueRef LLVMBuildLoad(LLVMBuilderRef B, LLVMValueRef PointerVal,
1899                             const char *Name) {
1900    return wrap(unwrap(B)->CreateLoad(unwrap(PointerVal), Name));
1901  }
1902  
LLVMBuildStore(LLVMBuilderRef B,LLVMValueRef Val,LLVMValueRef PointerVal)1903  LLVMValueRef LLVMBuildStore(LLVMBuilderRef B, LLVMValueRef Val,
1904                              LLVMValueRef PointerVal) {
1905    return wrap(unwrap(B)->CreateStore(unwrap(Val), unwrap(PointerVal)));
1906  }
1907  
LLVMBuildGEP(LLVMBuilderRef B,LLVMValueRef Pointer,LLVMValueRef * Indices,unsigned NumIndices,const char * Name)1908  LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1909                            LLVMValueRef *Indices, unsigned NumIndices,
1910                            const char *Name) {
1911    return wrap(unwrap(B)->CreateGEP(unwrap(Pointer), unwrap(Indices),
1912                                     unwrap(Indices) + NumIndices, Name));
1913  }
1914  
LLVMBuildInBoundsGEP(LLVMBuilderRef B,LLVMValueRef Pointer,LLVMValueRef * Indices,unsigned NumIndices,const char * Name)1915  LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1916                                    LLVMValueRef *Indices, unsigned NumIndices,
1917                                    const char *Name) {
1918    return wrap(unwrap(B)->CreateInBoundsGEP(unwrap(Pointer), unwrap(Indices),
1919                                             unwrap(Indices) + NumIndices, Name));
1920  }
1921  
LLVMBuildStructGEP(LLVMBuilderRef B,LLVMValueRef Pointer,unsigned Idx,const char * Name)1922  LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1923                                  unsigned Idx, const char *Name) {
1924    return wrap(unwrap(B)->CreateStructGEP(unwrap(Pointer), Idx, Name));
1925  }
1926  
LLVMBuildGlobalString(LLVMBuilderRef B,const char * Str,const char * Name)1927  LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
1928                                     const char *Name) {
1929    return wrap(unwrap(B)->CreateGlobalString(Str, Name));
1930  }
1931  
LLVMBuildGlobalStringPtr(LLVMBuilderRef B,const char * Str,const char * Name)1932  LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
1933                                        const char *Name) {
1934    return wrap(unwrap(B)->CreateGlobalStringPtr(Str, Name));
1935  }
1936  
1937  /*--.. Casts ...............................................................--*/
1938  
LLVMBuildTrunc(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1939  LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef B, LLVMValueRef Val,
1940                              LLVMTypeRef DestTy, const char *Name) {
1941    return wrap(unwrap(B)->CreateTrunc(unwrap(Val), unwrap(DestTy), Name));
1942  }
1943  
LLVMBuildZExt(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1944  LLVMValueRef LLVMBuildZExt(LLVMBuilderRef B, LLVMValueRef Val,
1945                             LLVMTypeRef DestTy, const char *Name) {
1946    return wrap(unwrap(B)->CreateZExt(unwrap(Val), unwrap(DestTy), Name));
1947  }
1948  
LLVMBuildSExt(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1949  LLVMValueRef LLVMBuildSExt(LLVMBuilderRef B, LLVMValueRef Val,
1950                             LLVMTypeRef DestTy, const char *Name) {
1951    return wrap(unwrap(B)->CreateSExt(unwrap(Val), unwrap(DestTy), Name));
1952  }
1953  
LLVMBuildFPToUI(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1954  LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef B, LLVMValueRef Val,
1955                               LLVMTypeRef DestTy, const char *Name) {
1956    return wrap(unwrap(B)->CreateFPToUI(unwrap(Val), unwrap(DestTy), Name));
1957  }
1958  
LLVMBuildFPToSI(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1959  LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef B, LLVMValueRef Val,
1960                               LLVMTypeRef DestTy, const char *Name) {
1961    return wrap(unwrap(B)->CreateFPToSI(unwrap(Val), unwrap(DestTy), Name));
1962  }
1963  
LLVMBuildUIToFP(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1964  LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef B, LLVMValueRef Val,
1965                               LLVMTypeRef DestTy, const char *Name) {
1966    return wrap(unwrap(B)->CreateUIToFP(unwrap(Val), unwrap(DestTy), Name));
1967  }
1968  
LLVMBuildSIToFP(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1969  LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef B, LLVMValueRef Val,
1970                               LLVMTypeRef DestTy, const char *Name) {
1971    return wrap(unwrap(B)->CreateSIToFP(unwrap(Val), unwrap(DestTy), Name));
1972  }
1973  
LLVMBuildFPTrunc(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1974  LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef B, LLVMValueRef Val,
1975                                LLVMTypeRef DestTy, const char *Name) {
1976    return wrap(unwrap(B)->CreateFPTrunc(unwrap(Val), unwrap(DestTy), Name));
1977  }
1978  
LLVMBuildFPExt(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1979  LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef B, LLVMValueRef Val,
1980                              LLVMTypeRef DestTy, const char *Name) {
1981    return wrap(unwrap(B)->CreateFPExt(unwrap(Val), unwrap(DestTy), Name));
1982  }
1983  
LLVMBuildPtrToInt(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1984  LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef B, LLVMValueRef Val,
1985                                 LLVMTypeRef DestTy, const char *Name) {
1986    return wrap(unwrap(B)->CreatePtrToInt(unwrap(Val), unwrap(DestTy), Name));
1987  }
1988  
LLVMBuildIntToPtr(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1989  LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef B, LLVMValueRef Val,
1990                                 LLVMTypeRef DestTy, const char *Name) {
1991    return wrap(unwrap(B)->CreateIntToPtr(unwrap(Val), unwrap(DestTy), Name));
1992  }
1993  
LLVMBuildBitCast(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1994  LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef B, LLVMValueRef Val,
1995                                LLVMTypeRef DestTy, const char *Name) {
1996    return wrap(unwrap(B)->CreateBitCast(unwrap(Val), unwrap(DestTy), Name));
1997  }
1998  
LLVMBuildZExtOrBitCast(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)1999  LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2000                                      LLVMTypeRef DestTy, const char *Name) {
2001    return wrap(unwrap(B)->CreateZExtOrBitCast(unwrap(Val), unwrap(DestTy),
2002                                               Name));
2003  }
2004  
LLVMBuildSExtOrBitCast(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)2005  LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2006                                      LLVMTypeRef DestTy, const char *Name) {
2007    return wrap(unwrap(B)->CreateSExtOrBitCast(unwrap(Val), unwrap(DestTy),
2008                                               Name));
2009  }
2010  
LLVMBuildTruncOrBitCast(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)2011  LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2012                                       LLVMTypeRef DestTy, const char *Name) {
2013    return wrap(unwrap(B)->CreateTruncOrBitCast(unwrap(Val), unwrap(DestTy),
2014                                                Name));
2015  }
2016  
LLVMBuildCast(LLVMBuilderRef B,LLVMOpcode Op,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)2017  LLVMValueRef LLVMBuildCast(LLVMBuilderRef B, LLVMOpcode Op, LLVMValueRef Val,
2018                             LLVMTypeRef DestTy, const char *Name) {
2019    return wrap(unwrap(B)->CreateCast(Instruction::CastOps(Op), unwrap(Val),
2020                                      unwrap(DestTy), Name));
2021  }
2022  
LLVMBuildPointerCast(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)2023  LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef B, LLVMValueRef Val,
2024                                    LLVMTypeRef DestTy, const char *Name) {
2025    return wrap(unwrap(B)->CreatePointerCast(unwrap(Val), unwrap(DestTy), Name));
2026  }
2027  
LLVMBuildIntCast(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)2028  LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef B, LLVMValueRef Val,
2029                                LLVMTypeRef DestTy, const char *Name) {
2030    return wrap(unwrap(B)->CreateIntCast(unwrap(Val), unwrap(DestTy),
2031                                         /*isSigned*/true, Name));
2032  }
2033  
LLVMBuildFPCast(LLVMBuilderRef B,LLVMValueRef Val,LLVMTypeRef DestTy,const char * Name)2034  LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef B, LLVMValueRef Val,
2035                               LLVMTypeRef DestTy, const char *Name) {
2036    return wrap(unwrap(B)->CreateFPCast(unwrap(Val), unwrap(DestTy), Name));
2037  }
2038  
2039  /*--.. Comparisons .........................................................--*/
2040  
LLVMBuildICmp(LLVMBuilderRef B,LLVMIntPredicate Op,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)2041  LLVMValueRef LLVMBuildICmp(LLVMBuilderRef B, LLVMIntPredicate Op,
2042                             LLVMValueRef LHS, LLVMValueRef RHS,
2043                             const char *Name) {
2044    return wrap(unwrap(B)->CreateICmp(static_cast<ICmpInst::Predicate>(Op),
2045                                      unwrap(LHS), unwrap(RHS), Name));
2046  }
2047  
LLVMBuildFCmp(LLVMBuilderRef B,LLVMRealPredicate Op,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)2048  LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef B, LLVMRealPredicate Op,
2049                             LLVMValueRef LHS, LLVMValueRef RHS,
2050                             const char *Name) {
2051    return wrap(unwrap(B)->CreateFCmp(static_cast<FCmpInst::Predicate>(Op),
2052                                      unwrap(LHS), unwrap(RHS), Name));
2053  }
2054  
2055  /*--.. Miscellaneous instructions ..........................................--*/
2056  
LLVMBuildPhi(LLVMBuilderRef B,LLVMTypeRef Ty,const char * Name)2057  LLVMValueRef LLVMBuildPhi(LLVMBuilderRef B, LLVMTypeRef Ty, const char *Name) {
2058    return wrap(unwrap(B)->CreatePHI(unwrap(Ty), 0, Name));
2059  }
2060  
LLVMBuildCall(LLVMBuilderRef B,LLVMValueRef Fn,LLVMValueRef * Args,unsigned NumArgs,const char * Name)2061  LLVMValueRef LLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn,
2062                             LLVMValueRef *Args, unsigned NumArgs,
2063                             const char *Name) {
2064    return wrap(unwrap(B)->CreateCall(unwrap(Fn),
2065                                      makeArrayRef(unwrap(Args), NumArgs),
2066                                      Name));
2067  }
2068  
LLVMBuildSelect(LLVMBuilderRef B,LLVMValueRef If,LLVMValueRef Then,LLVMValueRef Else,const char * Name)2069  LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If,
2070                               LLVMValueRef Then, LLVMValueRef Else,
2071                               const char *Name) {
2072    return wrap(unwrap(B)->CreateSelect(unwrap(If), unwrap(Then), unwrap(Else),
2073                                        Name));
2074  }
2075  
LLVMBuildVAArg(LLVMBuilderRef B,LLVMValueRef List,LLVMTypeRef Ty,const char * Name)2076  LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef B, LLVMValueRef List,
2077                              LLVMTypeRef Ty, const char *Name) {
2078    return wrap(unwrap(B)->CreateVAArg(unwrap(List), unwrap(Ty), Name));
2079  }
2080  
LLVMBuildExtractElement(LLVMBuilderRef B,LLVMValueRef VecVal,LLVMValueRef Index,const char * Name)2081  LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef B, LLVMValueRef VecVal,
2082                                        LLVMValueRef Index, const char *Name) {
2083    return wrap(unwrap(B)->CreateExtractElement(unwrap(VecVal), unwrap(Index),
2084                                                Name));
2085  }
2086  
LLVMBuildInsertElement(LLVMBuilderRef B,LLVMValueRef VecVal,LLVMValueRef EltVal,LLVMValueRef Index,const char * Name)2087  LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef B, LLVMValueRef VecVal,
2088                                      LLVMValueRef EltVal, LLVMValueRef Index,
2089                                      const char *Name) {
2090    return wrap(unwrap(B)->CreateInsertElement(unwrap(VecVal), unwrap(EltVal),
2091                                               unwrap(Index), Name));
2092  }
2093  
LLVMBuildShuffleVector(LLVMBuilderRef B,LLVMValueRef V1,LLVMValueRef V2,LLVMValueRef Mask,const char * Name)2094  LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1,
2095                                      LLVMValueRef V2, LLVMValueRef Mask,
2096                                      const char *Name) {
2097    return wrap(unwrap(B)->CreateShuffleVector(unwrap(V1), unwrap(V2),
2098                                               unwrap(Mask), Name));
2099  }
2100  
LLVMBuildExtractValue(LLVMBuilderRef B,LLVMValueRef AggVal,unsigned Index,const char * Name)2101  LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef B, LLVMValueRef AggVal,
2102                                     unsigned Index, const char *Name) {
2103    return wrap(unwrap(B)->CreateExtractValue(unwrap(AggVal), Index, Name));
2104  }
2105  
LLVMBuildInsertValue(LLVMBuilderRef B,LLVMValueRef AggVal,LLVMValueRef EltVal,unsigned Index,const char * Name)2106  LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef B, LLVMValueRef AggVal,
2107                                    LLVMValueRef EltVal, unsigned Index,
2108                                    const char *Name) {
2109    return wrap(unwrap(B)->CreateInsertValue(unwrap(AggVal), unwrap(EltVal),
2110                                             Index, Name));
2111  }
2112  
LLVMBuildIsNull(LLVMBuilderRef B,LLVMValueRef Val,const char * Name)2113  LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef B, LLVMValueRef Val,
2114                               const char *Name) {
2115    return wrap(unwrap(B)->CreateIsNull(unwrap(Val), Name));
2116  }
2117  
LLVMBuildIsNotNull(LLVMBuilderRef B,LLVMValueRef Val,const char * Name)2118  LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef B, LLVMValueRef Val,
2119                                  const char *Name) {
2120    return wrap(unwrap(B)->CreateIsNotNull(unwrap(Val), Name));
2121  }
2122  
LLVMBuildPtrDiff(LLVMBuilderRef B,LLVMValueRef LHS,LLVMValueRef RHS,const char * Name)2123  LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef B, LLVMValueRef LHS,
2124                                LLVMValueRef RHS, const char *Name) {
2125    return wrap(unwrap(B)->CreatePtrDiff(unwrap(LHS), unwrap(RHS), Name));
2126  }
2127  
2128  
2129  /*===-- Module providers --------------------------------------------------===*/
2130  
2131  LLVMModuleProviderRef
LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M)2132  LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M) {
2133    return reinterpret_cast<LLVMModuleProviderRef>(M);
2134  }
2135  
LLVMDisposeModuleProvider(LLVMModuleProviderRef MP)2136  void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP) {
2137    delete unwrap(MP);
2138  }
2139  
2140  
2141  /*===-- Memory buffers ----------------------------------------------------===*/
2142  
LLVMCreateMemoryBufferWithContentsOfFile(const char * Path,LLVMMemoryBufferRef * OutMemBuf,char ** OutMessage)2143  LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(
2144      const char *Path,
2145      LLVMMemoryBufferRef *OutMemBuf,
2146      char **OutMessage) {
2147  
2148    OwningPtr<MemoryBuffer> MB;
2149    error_code ec;
2150    if (!(ec = MemoryBuffer::getFile(Path, MB))) {
2151      *OutMemBuf = wrap(MB.take());
2152      return 0;
2153    }
2154  
2155    *OutMessage = strdup(ec.message().c_str());
2156    return 1;
2157  }
2158  
LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef * OutMemBuf,char ** OutMessage)2159  LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
2160                                           char **OutMessage) {
2161    OwningPtr<MemoryBuffer> MB;
2162    error_code ec;
2163    if (!(ec = MemoryBuffer::getSTDIN(MB))) {
2164      *OutMemBuf = wrap(MB.take());
2165      return 0;
2166    }
2167  
2168    *OutMessage = strdup(ec.message().c_str());
2169    return 1;
2170  }
2171  
LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf)2172  void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
2173    delete unwrap(MemBuf);
2174  }
2175  
2176  /*===-- Pass Registry -----------------------------------------------------===*/
2177  
LLVMGetGlobalPassRegistry(void)2178  LLVMPassRegistryRef LLVMGetGlobalPassRegistry(void) {
2179    return wrap(PassRegistry::getPassRegistry());
2180  }
2181  
2182  /*===-- Pass Manager ------------------------------------------------------===*/
2183  
LLVMCreatePassManager()2184  LLVMPassManagerRef LLVMCreatePassManager() {
2185    return wrap(new PassManager());
2186  }
2187  
LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M)2188  LLVMPassManagerRef LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M) {
2189    return wrap(new FunctionPassManager(unwrap(M)));
2190  }
2191  
LLVMCreateFunctionPassManager(LLVMModuleProviderRef P)2192  LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef P) {
2193    return LLVMCreateFunctionPassManagerForModule(
2194                                              reinterpret_cast<LLVMModuleRef>(P));
2195  }
2196  
LLVMRunPassManager(LLVMPassManagerRef PM,LLVMModuleRef M)2197  LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M) {
2198    return unwrap<PassManager>(PM)->run(*unwrap(M));
2199  }
2200  
LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM)2201  LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM) {
2202    return unwrap<FunctionPassManager>(FPM)->doInitialization();
2203  }
2204  
LLVMRunFunctionPassManager(LLVMPassManagerRef FPM,LLVMValueRef F)2205  LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F) {
2206    return unwrap<FunctionPassManager>(FPM)->run(*unwrap<Function>(F));
2207  }
2208  
LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM)2209  LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM) {
2210    return unwrap<FunctionPassManager>(FPM)->doFinalization();
2211  }
2212  
LLVMDisposePassManager(LLVMPassManagerRef PM)2213  void LLVMDisposePassManager(LLVMPassManagerRef PM) {
2214    delete unwrap(PM);
2215  }
2216