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