blob: 47a8e1bfe008917f399e07668677c38092652b3c [file] [log] [blame]
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001//===-- Core.cpp ----------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Gordon Henriksen8b94a142007-09-18 03:18:57 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the C bindings for libLLVMCore.a, which implements
11// the LLVM intermediate representation.
12//
13//===----------------------------------------------------------------------===//
14
15#include "llvm-c/Core.h"
16#include "llvm/Bitcode/ReaderWriter.h"
Gordon Henriksen8b94a142007-09-18 03:18:57 +000017#include "llvm/Constants.h"
18#include "llvm/DerivedTypes.h"
19#include "llvm/GlobalVariable.h"
Chris Lattner851ba392008-12-17 21:39:50 +000020#include "llvm/GlobalAlias.h"
Owen Anderson8b477ed2009-07-01 16:58:40 +000021#include "llvm/LLVMContext.h"
Gordon Henriksen46abf912007-09-26 20:56:12 +000022#include "llvm/TypeSymbolTable.h"
Gordon Henriksen1ae61352007-12-12 01:04:30 +000023#include "llvm/ModuleProvider.h"
Chris Lattner851ba392008-12-17 21:39:50 +000024#include "llvm/InlineAsm.h"
Gordon Henriksen2a9c6712008-12-19 18:39:45 +000025#include "llvm/IntrinsicInst.h"
Gordon Henriksenda1435f2007-12-19 22:30:40 +000026#include "llvm/Support/MemoryBuffer.h"
Gordon Henriksene2435da2008-04-28 17:37:06 +000027#include "llvm/Support/CallSite.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000028#include "llvm/Support/ErrorHandling.h"
Gordon Henriksen8b94a142007-09-18 03:18:57 +000029#include <cassert>
Gordon Henriksenda1435f2007-12-19 22:30:40 +000030#include <cstdlib>
Anton Korobeynikovae9f3a32008-02-20 11:08:44 +000031#include <cstring>
Gordon Henriksen8b94a142007-09-18 03:18:57 +000032
33using namespace llvm;
34
35
Gordon Henriksenda1435f2007-12-19 22:30:40 +000036/*===-- Error handling ----------------------------------------------------===*/
37
38void LLVMDisposeMessage(char *Message) {
39 free(Message);
40}
41
42
Owen Anderson8b477ed2009-07-01 16:58:40 +000043/*===-- Operations on contexts --------------------------------------------===*/
44
45LLVMContextRef LLVMContextCreate() {
46 return wrap(new LLVMContext());
47}
48
Owen Andersonc70e6212009-07-02 00:16:38 +000049LLVMContextRef LLVMGetGlobalContext() {
50 return wrap(&getGlobalContext());
51}
52
Owen Anderson8b477ed2009-07-01 16:58:40 +000053void LLVMContextDispose(LLVMContextRef C) {
54 delete unwrap(C);
55}
56
57
Gordon Henriksen8b94a142007-09-18 03:18:57 +000058/*===-- Operations on modules ---------------------------------------------===*/
59
Owen Andersonc8897d92009-07-02 07:17:57 +000060LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) {
61 return wrap(new Module(ModuleID, getGlobalContext()));
62}
63
64LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
65 LLVMContextRef C) {
Owen Anderson31895e72009-07-01 21:22:36 +000066 return wrap(new Module(ModuleID, *unwrap(C)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +000067}
68
69void LLVMDisposeModule(LLVMModuleRef M) {
70 delete unwrap(M);
71}
72
Gordon Henriksena353ffa2007-12-27 20:13:47 +000073/*--.. Data layout .........................................................--*/
74const char * LLVMGetDataLayout(LLVMModuleRef M) {
75 return unwrap(M)->getDataLayout().c_str();
76}
77
78void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple) {
79 unwrap(M)->setDataLayout(Triple);
80}
81
82/*--.. Target triple .......................................................--*/
83const char * LLVMGetTarget(LLVMModuleRef M) {
84 return unwrap(M)->getTargetTriple().c_str();
85}
86
87void LLVMSetTarget(LLVMModuleRef M, const char *Triple) {
88 unwrap(M)->setTargetTriple(Triple);
89}
90
91/*--.. Type names ..........................................................--*/
Gordon Henriksen8b94a142007-09-18 03:18:57 +000092int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty) {
93 return unwrap(M)->addTypeName(Name, unwrap(Ty));
94}
95
Gordon Henriksen46abf912007-09-26 20:56:12 +000096void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name) {
Gordon Henriksen46abf912007-09-26 20:56:12 +000097 TypeSymbolTable &TST = unwrap(M)->getTypeSymbolTable();
Daniel Dunbar8113c672009-08-06 06:04:35 +000098
99 TypeSymbolTable::iterator I = TST.find(Name);
100 if (I != TST.end())
101 TST.remove(I);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000102}
103
Chris Lattnere4840bc2009-07-06 17:29:59 +0000104LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) {
Daniel Dunbar8113c672009-08-06 06:04:35 +0000105 return wrap(unwrap(M)->getTypeByName(Name));
Chris Lattnere4840bc2009-07-06 17:29:59 +0000106}
107
Gordon Henriksenaf59b102008-03-14 23:58:56 +0000108void LLVMDumpModule(LLVMModuleRef M) {
109 unwrap(M)->dump();
110}
111
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000112
113/*===-- Operations on types -----------------------------------------------===*/
114
115/*--.. Operations on all types (mostly) ....................................--*/
116
117LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty) {
Chris Lattner0df5c8e2009-07-15 22:00:31 +0000118 switch (unwrap(Ty)->getTypeID()) {
Daniel Dunbarefd280b2009-07-16 22:06:22 +0000119 default:
120 assert(false && "Unhandled TypeID.");
Chris Lattner0df5c8e2009-07-15 22:00:31 +0000121 case Type::VoidTyID:
122 return LLVMVoidTypeKind;
123 case Type::FloatTyID:
124 return LLVMFloatTypeKind;
125 case Type::DoubleTyID:
126 return LLVMDoubleTypeKind;
127 case Type::X86_FP80TyID:
128 return LLVMX86_FP80TypeKind;
129 case Type::FP128TyID:
130 return LLVMFP128TypeKind;
131 case Type::PPC_FP128TyID:
132 return LLVMPPC_FP128TypeKind;
133 case Type::LabelTyID:
134 return LLVMLabelTypeKind;
135 case Type::MetadataTyID:
136 return LLVMMetadataTypeKind;
137 case Type::IntegerTyID:
138 return LLVMIntegerTypeKind;
139 case Type::FunctionTyID:
140 return LLVMFunctionTypeKind;
141 case Type::StructTyID:
142 return LLVMStructTypeKind;
143 case Type::ArrayTyID:
144 return LLVMArrayTypeKind;
145 case Type::PointerTyID:
146 return LLVMPointerTypeKind;
147 case Type::OpaqueTyID:
148 return LLVMOpaqueTypeKind;
149 case Type::VectorTyID:
150 return LLVMVectorTypeKind;
Chris Lattner0df5c8e2009-07-15 22:00:31 +0000151 }
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000152}
153
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000154LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty) {
155 return wrap(&unwrap(Ty)->getContext());
156}
157
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000158/*--.. Operations on integer types .........................................--*/
159
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000160LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C) {
161 return (LLVMTypeRef) Type::getInt1Ty(*unwrap(C));
Owen Anderson1d0be152009-08-13 21:58:54 +0000162}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000163LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C) {
164 return (LLVMTypeRef) Type::getInt8Ty(*unwrap(C));
Owen Anderson1d0be152009-08-13 21:58:54 +0000165}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000166LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C) {
167 return (LLVMTypeRef) Type::getInt16Ty(*unwrap(C));
Owen Anderson1d0be152009-08-13 21:58:54 +0000168}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000169LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C) {
170 return (LLVMTypeRef) Type::getInt32Ty(*unwrap(C));
Owen Anderson1d0be152009-08-13 21:58:54 +0000171}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000172LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C) {
173 return (LLVMTypeRef) Type::getInt64Ty(*unwrap(C));
174}
175LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits) {
176 return wrap(IntegerType::get(*unwrap(C), NumBits));
Owen Anderson1d0be152009-08-13 21:58:54 +0000177}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000178
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000179LLVMTypeRef LLVMInt1Type(void) {
180 return LLVMInt1TypeInContext(LLVMGetGlobalContext());
181}
182LLVMTypeRef LLVMInt8Type(void) {
183 return LLVMInt8TypeInContext(LLVMGetGlobalContext());
184}
185LLVMTypeRef LLVMInt16Type(void) {
186 return LLVMInt16TypeInContext(LLVMGetGlobalContext());
187}
188LLVMTypeRef LLVMInt32Type(void) {
189 return LLVMInt32TypeInContext(LLVMGetGlobalContext());
190}
191LLVMTypeRef LLVMInt64Type(void) {
192 return LLVMInt64TypeInContext(LLVMGetGlobalContext());
193}
Gordon Henriksen81a78812007-10-06 16:05:20 +0000194LLVMTypeRef LLVMIntType(unsigned NumBits) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000195 return LLVMIntTypeInContext(LLVMGetGlobalContext(), NumBits);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000196}
197
Gordon Henriksen46abf912007-09-26 20:56:12 +0000198unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000199 return unwrap<IntegerType>(IntegerTy)->getBitWidth();
200}
201
202/*--.. Operations on real types ............................................--*/
203
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000204LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C) {
205 return (LLVMTypeRef) Type::getFloatTy(*unwrap(C));
206}
207LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C) {
208 return (LLVMTypeRef) Type::getDoubleTy(*unwrap(C));
209}
210LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C) {
211 return (LLVMTypeRef) Type::getX86_FP80Ty(*unwrap(C));
212}
213LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C) {
214 return (LLVMTypeRef) Type::getFP128Ty(*unwrap(C));
215}
216LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C) {
217 return (LLVMTypeRef) Type::getPPC_FP128Ty(*unwrap(C));
218}
219
Owen Anderson1d0be152009-08-13 21:58:54 +0000220LLVMTypeRef LLVMFloatType(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000221 return LLVMFloatTypeInContext(LLVMGetGlobalContext());
Owen Anderson1d0be152009-08-13 21:58:54 +0000222}
223LLVMTypeRef LLVMDoubleType(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000224 return LLVMDoubleTypeInContext(LLVMGetGlobalContext());
Owen Anderson1d0be152009-08-13 21:58:54 +0000225}
226LLVMTypeRef LLVMX86FP80Type(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000227 return LLVMX86FP80TypeInContext(LLVMGetGlobalContext());
Owen Anderson1d0be152009-08-13 21:58:54 +0000228}
229LLVMTypeRef LLVMFP128Type(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000230 return LLVMFP128TypeInContext(LLVMGetGlobalContext());
Owen Anderson1d0be152009-08-13 21:58:54 +0000231}
232LLVMTypeRef LLVMPPCFP128Type(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000233 return LLVMPPCFP128TypeInContext(LLVMGetGlobalContext());
Owen Anderson1d0be152009-08-13 21:58:54 +0000234}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000235
236/*--.. Operations on function types ........................................--*/
237
Gordon Henriksen81a78812007-10-06 16:05:20 +0000238LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
239 LLVMTypeRef *ParamTypes, unsigned ParamCount,
240 int IsVarArg) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000241 std::vector<const Type*> Tys;
242 for (LLVMTypeRef *I = ParamTypes, *E = ParamTypes + ParamCount; I != E; ++I)
243 Tys.push_back(unwrap(*I));
244
Owen Andersondebcb012009-07-29 22:17:13 +0000245 return wrap(FunctionType::get(unwrap(ReturnType), Tys, IsVarArg != 0));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000246}
247
248int LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy) {
249 return unwrap<FunctionType>(FunctionTy)->isVarArg();
250}
251
Gordon Henriksen46abf912007-09-26 20:56:12 +0000252LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000253 return wrap(unwrap<FunctionType>(FunctionTy)->getReturnType());
254}
255
Gordon Henriksen46abf912007-09-26 20:56:12 +0000256unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000257 return unwrap<FunctionType>(FunctionTy)->getNumParams();
258}
259
Gordon Henriksen46abf912007-09-26 20:56:12 +0000260void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000261 FunctionType *Ty = unwrap<FunctionType>(FunctionTy);
262 for (FunctionType::param_iterator I = Ty->param_begin(),
263 E = Ty->param_end(); I != E; ++I)
264 *Dest++ = wrap(*I);
265}
266
267/*--.. Operations on struct types ..........................................--*/
268
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000269LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
Gordon Henriksen81a78812007-10-06 16:05:20 +0000270 unsigned ElementCount, int Packed) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000271 std::vector<const Type*> Tys;
272 for (LLVMTypeRef *I = ElementTypes,
273 *E = ElementTypes + ElementCount; I != E; ++I)
274 Tys.push_back(unwrap(*I));
275
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000276 return wrap(StructType::get(*unwrap(C), Tys, Packed != 0));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000277}
278
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000279LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes,
280 unsigned ElementCount, int Packed) {
281 return LLVMStructTypeInContext(LLVMGetGlobalContext(), ElementTypes,
282 ElementCount, Packed);
283}
284
285
Gordon Henriksen46abf912007-09-26 20:56:12 +0000286unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000287 return unwrap<StructType>(StructTy)->getNumElements();
288}
289
290void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest) {
291 StructType *Ty = unwrap<StructType>(StructTy);
292 for (FunctionType::param_iterator I = Ty->element_begin(),
293 E = Ty->element_end(); I != E; ++I)
294 *Dest++ = wrap(*I);
295}
296
297int LLVMIsPackedStruct(LLVMTypeRef StructTy) {
298 return unwrap<StructType>(StructTy)->isPacked();
299}
300
301/*--.. Operations on array, pointer, and vector types (sequence types) .....--*/
302
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000303LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) {
Owen Andersondebcb012009-07-29 22:17:13 +0000304 return wrap(ArrayType::get(unwrap(ElementType), ElementCount));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000305}
306
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000307LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace) {
Owen Andersondebcb012009-07-29 22:17:13 +0000308 return wrap(PointerType::get(unwrap(ElementType), AddressSpace));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000309}
310
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000311LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) {
Owen Andersondebcb012009-07-29 22:17:13 +0000312 return wrap(VectorType::get(unwrap(ElementType), ElementCount));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000313}
314
315LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty) {
316 return wrap(unwrap<SequentialType>(Ty)->getElementType());
317}
318
319unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) {
320 return unwrap<ArrayType>(ArrayTy)->getNumElements();
321}
322
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000323unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy) {
324 return unwrap<PointerType>(PointerTy)->getAddressSpace();
325}
326
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000327unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy) {
328 return unwrap<VectorType>(VectorTy)->getNumElements();
329}
330
331/*--.. Operations on other types ...........................................--*/
332
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000333LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C) {
334 return wrap(Type::getVoidTy(*unwrap(C)));
Owen Anderson1d0be152009-08-13 21:58:54 +0000335}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000336LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C) {
337 return wrap(Type::getLabelTy(*unwrap(C)));
338}
339LLVMTypeRef LLVMOpaqueTypeInContext(LLVMContextRef C) {
340 return wrap(OpaqueType::get(*unwrap(C)));
Owen Anderson1d0be152009-08-13 21:58:54 +0000341}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000342
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000343LLVMTypeRef LLVMVoidType(void) {
344 return LLVMVoidTypeInContext(LLVMGetGlobalContext());
345}
346LLVMTypeRef LLVMLabelType(void) {
347 return LLVMLabelTypeInContext(LLVMGetGlobalContext());
348}
Gordon Henriksen16c1f442008-05-04 12:55:34 +0000349LLVMTypeRef LLVMOpaqueType(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000350 return LLVMOpaqueTypeInContext(LLVMGetGlobalContext());
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000351}
352
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +0000353/*--.. Operations on type handles ..........................................--*/
Gordon Henriksen1cf08fd2007-10-07 00:13:35 +0000354
355LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy) {
356 return wrap(new PATypeHolder(unwrap(PotentiallyAbstractTy)));
357}
358
359void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle) {
360 delete unwrap(TypeHandle);
361}
362
363LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle) {
364 return wrap(unwrap(TypeHandle)->get());
365}
366
367void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy) {
368 unwrap<DerivedType>(AbstractTy)->refineAbstractTypeTo(unwrap(ConcreteTy));
369}
370
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000371
372/*===-- Operations on values ----------------------------------------------===*/
373
374/*--.. Operations on all values ............................................--*/
375
Gordon Henriksen46abf912007-09-26 20:56:12 +0000376LLVMTypeRef LLVMTypeOf(LLVMValueRef Val) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000377 return wrap(unwrap(Val)->getType());
378}
379
380const char *LLVMGetValueName(LLVMValueRef Val) {
Daniel Dunbar93b67e42009-07-26 07:49:05 +0000381 return unwrap(Val)->getName().data();
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000382}
383
384void LLVMSetValueName(LLVMValueRef Val, const char *Name) {
385 unwrap(Val)->setName(Name);
386}
387
Gordon Henriksen88cc6992007-10-06 00:08:49 +0000388void LLVMDumpValue(LLVMValueRef Val) {
389 unwrap(Val)->dump();
390}
391
Chris Lattner885dffc2009-10-12 04:01:02 +0000392void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal) {
393 unwrap(OldVal)->replaceAllUsesWith(unwrap(NewVal));
394}
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000395
396/*--.. Conversion functions ................................................--*/
397
398#define LLVM_DEFINE_VALUE_CAST(name) \
399 LLVMValueRef LLVMIsA##name(LLVMValueRef Val) { \
400 return wrap(static_cast<Value*>(dyn_cast_or_null<name>(unwrap(Val)))); \
401 }
402
403LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST)
404
Chris Lattner885dffc2009-10-12 04:01:02 +0000405/*--.. Operations on Uses ..................................................--*/
406LLVMUseIteratorRef LLVMGetFirstUse(LLVMValueRef Val) {
407 Value *V = unwrap(Val);
408 Value::use_iterator I = V->use_begin();
409 if (I == V->use_end())
410 return 0;
411 return wrap(&(I.getUse()));
412}
413
414LLVMUseIteratorRef LLVMGetNextUse(LLVMUseIteratorRef UR) {
415 return wrap(unwrap(UR)->getNext());
416}
417
418LLVMValueRef LLVMGetUser(LLVMUseIteratorRef UR) {
419 return wrap(unwrap(UR)->getUser());
420}
421
422LLVMValueRef LLVMGetUsedValue(LLVMUseIteratorRef UR) {
423 return wrap(unwrap(UR)->get());
424}
425
426/*--.. Operations on Users .................................................--*/
427LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index) {
428 return wrap(unwrap<User>(Val)->getOperand(Index));
429}
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000430
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000431/*--.. Operations on constants of any type .................................--*/
432
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000433LLVMValueRef LLVMConstNull(LLVMTypeRef Ty) {
Owen Andersona7235ea2009-07-31 20:28:14 +0000434 return wrap(Constant::getNullValue(unwrap(Ty)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000435}
436
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000437LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty) {
Owen Andersona7235ea2009-07-31 20:28:14 +0000438 return wrap(Constant::getAllOnesValue(unwrap(Ty)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000439}
440
441LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty) {
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000442 return wrap(UndefValue::get(unwrap(Ty)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000443}
444
Gordon Henriksen344be5f2007-09-18 18:07:51 +0000445int LLVMIsConstant(LLVMValueRef Ty) {
446 return isa<Constant>(unwrap(Ty));
447}
448
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000449int LLVMIsNull(LLVMValueRef Val) {
450 if (Constant *C = dyn_cast<Constant>(unwrap(Val)))
451 return C->isNullValue();
452 return false;
453}
454
Gordon Henriksen344be5f2007-09-18 18:07:51 +0000455int LLVMIsUndef(LLVMValueRef Val) {
456 return isa<UndefValue>(unwrap(Val));
457}
458
Chris Lattnere4840bc2009-07-06 17:29:59 +0000459LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty) {
Owen Anderson62e744b2009-07-07 21:33:58 +0000460 return
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000461 wrap(ConstantPointerNull::get(unwrap<PointerType>(Ty)));
Chris Lattnere4840bc2009-07-06 17:29:59 +0000462}
463
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000464/*--.. Operations on scalar constants ......................................--*/
465
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000466LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
467 int SignExtend) {
Owen Andersoneed707b2009-07-24 23:12:02 +0000468 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), N, SignExtend != 0));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000469}
470
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000471LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char Str[],
472 uint8_t Radix) {
473 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str),
474 Radix));
475}
476
477LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char Str[],
478 unsigned SLen, uint8_t Radix) {
479 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str, SLen),
480 Radix));
Gordon Henriksene62a8a32008-02-02 01:07:50 +0000481}
482
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000483LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) {
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000484 return wrap(ConstantFP::get(unwrap(RealTy), N));
Gordon Henriksene62a8a32008-02-02 01:07:50 +0000485}
486
487LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) {
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000488 return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Text)));
489}
490
491LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char Str[],
492 unsigned SLen) {
493 return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Str, SLen)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000494}
495
Chris Lattner885dffc2009-10-12 04:01:02 +0000496unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal) {
497 return unwrap<ConstantInt>(ConstantVal)->getZExtValue();
498}
499
500long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal) {
501 return unwrap<ConstantInt>(ConstantVal)->getSExtValue();
502}
503
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000504/*--.. Operations on composite constants ...................................--*/
505
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000506LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
507 unsigned Length, int DontNullTerminate) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000508 /* Inverted the sense of AddNull because ', 0)' is a
509 better mnemonic for null termination than ', 1)'. */
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000510 return wrap(ConstantArray::get(*unwrap(C), std::string(Str, Length),
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000511 DontNullTerminate == 0));
512}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000513LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
514 LLVMValueRef *ConstantVals,
515 unsigned Count, int Packed) {
516 return wrap(ConstantStruct::get(*unwrap(C),
517 unwrap<Constant>(ConstantVals, Count),
518 Count, Packed != 0));
519}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000520
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000521LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
522 int DontNullTerminate) {
523 return LLVMConstStringInContext(LLVMGetGlobalContext(), Str, Length,
524 DontNullTerminate);
525}
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000526LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
527 LLVMValueRef *ConstantVals, unsigned Length) {
Owen Andersondebcb012009-07-29 22:17:13 +0000528 return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length),
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000529 unwrap<Constant>(ConstantVals, Length),
530 Length));
531}
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000532LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
533 int Packed) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000534 return LLVMConstStructInContext(LLVMGetGlobalContext(), ConstantVals, Count,
535 Packed);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000536}
537
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000538LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) {
Owen Andersonaf7ec972009-07-28 21:19:26 +0000539 return wrap(ConstantVector::get(
Owen Anderson62e744b2009-07-07 21:33:58 +0000540 unwrap<Constant>(ScalarConstantVals, Size), Size));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000541}
542
Gordon Henriksen46475692007-10-06 14:29:36 +0000543/*--.. Constant expressions ................................................--*/
544
Chris Lattner885dffc2009-10-12 04:01:02 +0000545LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal) {
546 return (LLVMOpcode)unwrap<ConstantExpr>(ConstantVal)->getOpcode();
547}
548
Duncan Sandsef854af2009-05-21 15:52:21 +0000549LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000550 return wrap(ConstantExpr::getAlignOf(unwrap(Ty)));
Duncan Sandsef854af2009-05-21 15:52:21 +0000551}
552
Gordon Henriksen46475692007-10-06 14:29:36 +0000553LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000554 return wrap(ConstantExpr::getSizeOf(unwrap(Ty)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000555}
556
557LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000558 return wrap(ConstantExpr::getNeg(
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000559 unwrap<Constant>(ConstantVal)));
560}
561
562LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal) {
563 return wrap(ConstantExpr::getFNeg(
564 unwrap<Constant>(ConstantVal)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000565}
566
567LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000568 return wrap(ConstantExpr::getNot(
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000569 unwrap<Constant>(ConstantVal)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000570}
571
572LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000573 return wrap(ConstantExpr::getAdd(
Owen Anderson62e744b2009-07-07 21:33:58 +0000574 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000575 unwrap<Constant>(RHSConstant)));
576}
577
Dan Gohman6e7ad952009-09-03 23:34:49 +0000578LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant,
579 LLVMValueRef RHSConstant) {
580 return wrap(ConstantExpr::getNSWAdd(
581 unwrap<Constant>(LHSConstant),
582 unwrap<Constant>(RHSConstant)));
583}
584
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000585LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
586 return wrap(ConstantExpr::getFAdd(
587 unwrap<Constant>(LHSConstant),
588 unwrap<Constant>(RHSConstant)));
589}
590
Gordon Henriksen46475692007-10-06 14:29:36 +0000591LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000592 return wrap(ConstantExpr::getSub(
Owen Anderson62e744b2009-07-07 21:33:58 +0000593 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000594 unwrap<Constant>(RHSConstant)));
595}
596
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000597LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
598 return wrap(ConstantExpr::getFSub(unwrap<Constant>(LHSConstant),
599 unwrap<Constant>(RHSConstant)));
600}
601
Gordon Henriksen46475692007-10-06 14:29:36 +0000602LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000603 return wrap(ConstantExpr::getMul(
Owen Anderson62e744b2009-07-07 21:33:58 +0000604 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000605 unwrap<Constant>(RHSConstant)));
606}
607
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000608LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
609 return wrap(ConstantExpr::getFMul(
610 unwrap<Constant>(LHSConstant),
611 unwrap<Constant>(RHSConstant)));
612}
613
Gordon Henriksen46475692007-10-06 14:29:36 +0000614LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000615 return wrap(ConstantExpr::getUDiv(
Owen Anderson62e744b2009-07-07 21:33:58 +0000616 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000617 unwrap<Constant>(RHSConstant)));
618}
619
620LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000621 return wrap(ConstantExpr::getSDiv(
Owen Anderson62e744b2009-07-07 21:33:58 +0000622 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000623 unwrap<Constant>(RHSConstant)));
624}
625
Dan Gohman6e7ad952009-09-03 23:34:49 +0000626LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant,
627 LLVMValueRef RHSConstant) {
628 return wrap(ConstantExpr::getExactSDiv(
629 unwrap<Constant>(LHSConstant),
630 unwrap<Constant>(RHSConstant)));
631}
632
Gordon Henriksen46475692007-10-06 14:29:36 +0000633LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000634 return wrap(ConstantExpr::getFDiv(
Owen Anderson62e744b2009-07-07 21:33:58 +0000635 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000636 unwrap<Constant>(RHSConstant)));
637}
638
639LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000640 return wrap(ConstantExpr::getURem(
Owen Anderson62e744b2009-07-07 21:33:58 +0000641 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000642 unwrap<Constant>(RHSConstant)));
643}
644
645LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000646 return wrap(ConstantExpr::getSRem(
Owen Anderson62e744b2009-07-07 21:33:58 +0000647 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000648 unwrap<Constant>(RHSConstant)));
649}
650
651LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000652 return wrap(ConstantExpr::getFRem(
Owen Anderson62e744b2009-07-07 21:33:58 +0000653 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000654 unwrap<Constant>(RHSConstant)));
655}
656
657LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000658 return wrap(ConstantExpr::getAnd(
Owen Anderson62e744b2009-07-07 21:33:58 +0000659 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000660 unwrap<Constant>(RHSConstant)));
661}
662
663LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000664 return wrap(ConstantExpr::getOr(
Owen Anderson62e744b2009-07-07 21:33:58 +0000665 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000666 unwrap<Constant>(RHSConstant)));
667}
668
669LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000670 return wrap(ConstantExpr::getXor(
Owen Anderson62e744b2009-07-07 21:33:58 +0000671 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000672 unwrap<Constant>(RHSConstant)));
673}
674
675LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
676 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000677 return wrap(ConstantExpr::getICmp(Predicate,
Gordon Henriksen46475692007-10-06 14:29:36 +0000678 unwrap<Constant>(LHSConstant),
679 unwrap<Constant>(RHSConstant)));
680}
681
682LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
683 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000684 return wrap(ConstantExpr::getFCmp(Predicate,
Gordon Henriksen46475692007-10-06 14:29:36 +0000685 unwrap<Constant>(LHSConstant),
686 unwrap<Constant>(RHSConstant)));
687}
688
689LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000690 return wrap(ConstantExpr::getShl(
Owen Anderson62e744b2009-07-07 21:33:58 +0000691 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000692 unwrap<Constant>(RHSConstant)));
693}
694
695LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000696 return wrap(ConstantExpr::getLShr(
Owen Anderson62e744b2009-07-07 21:33:58 +0000697 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000698 unwrap<Constant>(RHSConstant)));
699}
700
701LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000702 return wrap(ConstantExpr::getAShr(
Owen Anderson62e744b2009-07-07 21:33:58 +0000703 unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000704 unwrap<Constant>(RHSConstant)));
705}
706
707LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
708 LLVMValueRef *ConstantIndices, unsigned NumIndices) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000709 return wrap(ConstantExpr::getGetElementPtr(
Owen Anderson62e744b2009-07-07 21:33:58 +0000710 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000711 unwrap<Constant>(ConstantIndices,
712 NumIndices),
713 NumIndices));
714}
715
Dan Gohman6e7ad952009-09-03 23:34:49 +0000716LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
717 LLVMValueRef *ConstantIndices,
718 unsigned NumIndices) {
719 Constant* Val = unwrap<Constant>(ConstantVal);
720 Constant** Idxs = unwrap<Constant>(ConstantIndices, NumIndices);
721 return wrap(ConstantExpr::getInBoundsGetElementPtr(Val, Idxs, NumIndices));
722}
723
Gordon Henriksen46475692007-10-06 14:29:36 +0000724LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000725 return wrap(ConstantExpr::getTrunc(
Owen Anderson62e744b2009-07-07 21:33:58 +0000726 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000727 unwrap(ToType)));
728}
729
730LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000731 return wrap(ConstantExpr::getSExt(
Owen Anderson62e744b2009-07-07 21:33:58 +0000732 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000733 unwrap(ToType)));
734}
735
736LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000737 return wrap(ConstantExpr::getZExt(
Owen Anderson62e744b2009-07-07 21:33:58 +0000738 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000739 unwrap(ToType)));
740}
741
742LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000743 return wrap(ConstantExpr::getFPTrunc(
Owen Anderson62e744b2009-07-07 21:33:58 +0000744 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000745 unwrap(ToType)));
746}
747
748LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000749 return wrap(ConstantExpr::getFPExtend(
Owen Anderson62e744b2009-07-07 21:33:58 +0000750 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000751 unwrap(ToType)));
752}
753
754LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000755 return wrap(ConstantExpr::getUIToFP(
Owen Anderson62e744b2009-07-07 21:33:58 +0000756 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000757 unwrap(ToType)));
758}
759
760LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000761 return wrap(ConstantExpr::getSIToFP(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000762 unwrap(ToType)));
763}
764
765LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000766 return wrap(ConstantExpr::getFPToUI(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000767 unwrap(ToType)));
768}
769
770LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000771 return wrap(ConstantExpr::getFPToSI(
Owen Anderson62e744b2009-07-07 21:33:58 +0000772 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000773 unwrap(ToType)));
774}
775
776LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000777 return wrap(ConstantExpr::getPtrToInt(
Owen Anderson62e744b2009-07-07 21:33:58 +0000778 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000779 unwrap(ToType)));
780}
781
782LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000783 return wrap(ConstantExpr::getIntToPtr(
Owen Anderson62e744b2009-07-07 21:33:58 +0000784 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000785 unwrap(ToType)));
786}
787
788LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000789 return wrap(ConstantExpr::getBitCast(
Owen Anderson62e744b2009-07-07 21:33:58 +0000790 unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000791 unwrap(ToType)));
792}
793
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000794LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
795 LLVMTypeRef ToType) {
796 return wrap(ConstantExpr::getZExtOrBitCast(
797 unwrap<Constant>(ConstantVal),
798 unwrap(ToType)));
799}
800
801LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
802 LLVMTypeRef ToType) {
803 return wrap(ConstantExpr::getSExtOrBitCast(
804 unwrap<Constant>(ConstantVal),
805 unwrap(ToType)));
806}
807
808LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
809 LLVMTypeRef ToType) {
810 return wrap(ConstantExpr::getTruncOrBitCast(
811 unwrap<Constant>(ConstantVal),
812 unwrap(ToType)));
813}
814
815LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
816 LLVMTypeRef ToType) {
817 return wrap(ConstantExpr::getPointerCast(
818 unwrap<Constant>(ConstantVal),
819 unwrap(ToType)));
820}
821
822LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
823 unsigned isSigned) {
824 return wrap(ConstantExpr::getIntegerCast(
825 unwrap<Constant>(ConstantVal),
826 unwrap(ToType),
827 isSigned));
828}
829
830LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
831 return wrap(ConstantExpr::getFPCast(
832 unwrap<Constant>(ConstantVal),
833 unwrap(ToType)));
834}
835
Gordon Henriksen46475692007-10-06 14:29:36 +0000836LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
837 LLVMValueRef ConstantIfTrue,
838 LLVMValueRef ConstantIfFalse) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000839 return wrap(ConstantExpr::getSelect(
Owen Anderson62e744b2009-07-07 21:33:58 +0000840 unwrap<Constant>(ConstantCondition),
Gordon Henriksen46475692007-10-06 14:29:36 +0000841 unwrap<Constant>(ConstantIfTrue),
842 unwrap<Constant>(ConstantIfFalse)));
843}
844
845LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
846 LLVMValueRef IndexConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000847 return wrap(ConstantExpr::getExtractElement(
Owen Anderson62e744b2009-07-07 21:33:58 +0000848 unwrap<Constant>(VectorConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000849 unwrap<Constant>(IndexConstant)));
850}
851
852LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
853 LLVMValueRef ElementValueConstant,
854 LLVMValueRef IndexConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000855 return wrap(ConstantExpr::getInsertElement(
Owen Anderson62e744b2009-07-07 21:33:58 +0000856 unwrap<Constant>(VectorConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000857 unwrap<Constant>(ElementValueConstant),
858 unwrap<Constant>(IndexConstant)));
859}
860
861LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
862 LLVMValueRef VectorBConstant,
863 LLVMValueRef MaskConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000864 return wrap(ConstantExpr::getShuffleVector(
Owen Anderson62e744b2009-07-07 21:33:58 +0000865 unwrap<Constant>(VectorAConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000866 unwrap<Constant>(VectorBConstant),
867 unwrap<Constant>(MaskConstant)));
868}
869
Dan Gohmanb5931172008-11-03 22:55:43 +0000870LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
871 unsigned NumIdx) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000872 return wrap(ConstantExpr::getExtractValue(
Owen Anderson62e744b2009-07-07 21:33:58 +0000873 unwrap<Constant>(AggConstant),
Dan Gohmanb5931172008-11-03 22:55:43 +0000874 IdxList, NumIdx));
875}
876
877LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
878 LLVMValueRef ElementValueConstant,
879 unsigned *IdxList, unsigned NumIdx) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000880 return wrap(ConstantExpr::getInsertValue(
Owen Anderson62e744b2009-07-07 21:33:58 +0000881 unwrap<Constant>(AggConstant),
Dan Gohmanb5931172008-11-03 22:55:43 +0000882 unwrap<Constant>(ElementValueConstant),
883 IdxList, NumIdx));
884}
885
Chris Lattner851ba392008-12-17 21:39:50 +0000886LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
887 const char *Constraints, int HasSideEffects) {
888 return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString,
889 Constraints, HasSideEffects));
890}
891
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000892/*--.. Operations on global variables, functions, and aliases (globals) ....--*/
893
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +0000894LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) {
895 return wrap(unwrap<GlobalValue>(Global)->getParent());
896}
897
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000898int LLVMIsDeclaration(LLVMValueRef Global) {
899 return unwrap<GlobalValue>(Global)->isDeclaration();
900}
901
902LLVMLinkage LLVMGetLinkage(LLVMValueRef Global) {
Bill Wendling4aebcb42009-07-20 20:34:46 +0000903 switch (unwrap<GlobalValue>(Global)->getLinkage()) {
904 default:
905 assert(false && "Unhandled Linkage Type.");
906 case GlobalValue::ExternalLinkage:
907 return LLVMExternalLinkage;
908 case GlobalValue::AvailableExternallyLinkage:
909 return LLVMAvailableExternallyLinkage;
910 case GlobalValue::LinkOnceAnyLinkage:
911 return LLVMLinkOnceAnyLinkage;
912 case GlobalValue::LinkOnceODRLinkage:
913 return LLVMLinkOnceODRLinkage;
914 case GlobalValue::WeakAnyLinkage:
915 return LLVMWeakAnyLinkage;
916 case GlobalValue::WeakODRLinkage:
917 return LLVMWeakODRLinkage;
918 case GlobalValue::AppendingLinkage:
919 return LLVMAppendingLinkage;
920 case GlobalValue::InternalLinkage:
921 return LLVMInternalLinkage;
922 case GlobalValue::PrivateLinkage:
923 return LLVMPrivateLinkage;
924 case GlobalValue::LinkerPrivateLinkage:
925 return LLVMLinkerPrivateLinkage;
926 case GlobalValue::DLLImportLinkage:
927 return LLVMDLLImportLinkage;
928 case GlobalValue::DLLExportLinkage:
929 return LLVMDLLExportLinkage;
930 case GlobalValue::ExternalWeakLinkage:
931 return LLVMExternalWeakLinkage;
932 case GlobalValue::GhostLinkage:
933 return LLVMGhostLinkage;
934 case GlobalValue::CommonLinkage:
935 return LLVMCommonLinkage;
936 }
937
938 // Should never get here.
939 return static_cast<LLVMLinkage>(0);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000940}
941
942void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage) {
Bill Wendling4aebcb42009-07-20 20:34:46 +0000943 GlobalValue *GV = unwrap<GlobalValue>(Global);
944
945 switch (Linkage) {
946 default:
947 assert(false && "Unhandled Linkage Type.");
948 case LLVMExternalLinkage:
949 GV->setLinkage(GlobalValue::ExternalLinkage);
950 break;
951 case LLVMAvailableExternallyLinkage:
952 GV->setLinkage(GlobalValue::AvailableExternallyLinkage);
953 break;
954 case LLVMLinkOnceAnyLinkage:
955 GV->setLinkage(GlobalValue::LinkOnceAnyLinkage);
956 break;
957 case LLVMLinkOnceODRLinkage:
958 GV->setLinkage(GlobalValue::LinkOnceODRLinkage);
959 break;
960 case LLVMWeakAnyLinkage:
961 GV->setLinkage(GlobalValue::WeakAnyLinkage);
962 break;
963 case LLVMWeakODRLinkage:
964 GV->setLinkage(GlobalValue::WeakODRLinkage);
965 break;
966 case LLVMAppendingLinkage:
967 GV->setLinkage(GlobalValue::AppendingLinkage);
968 break;
969 case LLVMInternalLinkage:
970 GV->setLinkage(GlobalValue::InternalLinkage);
971 break;
972 case LLVMPrivateLinkage:
973 GV->setLinkage(GlobalValue::PrivateLinkage);
974 break;
975 case LLVMLinkerPrivateLinkage:
976 GV->setLinkage(GlobalValue::LinkerPrivateLinkage);
977 break;
978 case LLVMDLLImportLinkage:
979 GV->setLinkage(GlobalValue::DLLImportLinkage);
980 break;
981 case LLVMDLLExportLinkage:
982 GV->setLinkage(GlobalValue::DLLExportLinkage);
983 break;
984 case LLVMExternalWeakLinkage:
985 GV->setLinkage(GlobalValue::ExternalWeakLinkage);
986 break;
987 case LLVMGhostLinkage:
988 GV->setLinkage(GlobalValue::GhostLinkage);
989 break;
990 case LLVMCommonLinkage:
991 GV->setLinkage(GlobalValue::CommonLinkage);
992 break;
993 }
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000994}
995
996const char *LLVMGetSection(LLVMValueRef Global) {
997 return unwrap<GlobalValue>(Global)->getSection().c_str();
998}
999
1000void LLVMSetSection(LLVMValueRef Global, const char *Section) {
1001 unwrap<GlobalValue>(Global)->setSection(Section);
1002}
1003
1004LLVMVisibility LLVMGetVisibility(LLVMValueRef Global) {
1005 return static_cast<LLVMVisibility>(
1006 unwrap<GlobalValue>(Global)->getVisibility());
1007}
1008
1009void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz) {
1010 unwrap<GlobalValue>(Global)
1011 ->setVisibility(static_cast<GlobalValue::VisibilityTypes>(Viz));
1012}
1013
1014unsigned LLVMGetAlignment(LLVMValueRef Global) {
1015 return unwrap<GlobalValue>(Global)->getAlignment();
1016}
1017
1018void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes) {
1019 unwrap<GlobalValue>(Global)->setAlignment(Bytes);
1020}
1021
1022/*--.. Operations on global variables ......................................--*/
1023
1024LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) {
Owen Andersone9b11b42009-07-08 19:03:57 +00001025 return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
1026 GlobalValue::ExternalLinkage, 0, Name));
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001027}
1028
Gordon Henriksen6d6203d2007-10-08 03:45:09 +00001029LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name) {
1030 return wrap(unwrap(M)->getNamedGlobal(Name));
1031}
1032
Gordon Henriksen34000972008-03-19 03:47:18 +00001033LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M) {
1034 Module *Mod = unwrap(M);
1035 Module::global_iterator I = Mod->global_begin();
1036 if (I == Mod->global_end())
1037 return 0;
1038 return wrap(I);
1039}
1040
1041LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M) {
1042 Module *Mod = unwrap(M);
1043 Module::global_iterator I = Mod->global_end();
1044 if (I == Mod->global_begin())
1045 return 0;
1046 return wrap(--I);
1047}
1048
1049LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar) {
1050 GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1051 Module::global_iterator I = GV;
1052 if (++I == GV->getParent()->global_end())
1053 return 0;
1054 return wrap(I);
1055}
1056
1057LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar) {
1058 GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1059 Module::global_iterator I = GV;
Gordon Henriksen4733be32008-03-23 22:21:29 +00001060 if (I == GV->getParent()->global_begin())
Gordon Henriksen34000972008-03-19 03:47:18 +00001061 return 0;
1062 return wrap(--I);
1063}
1064
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001065void LLVMDeleteGlobal(LLVMValueRef GlobalVar) {
1066 unwrap<GlobalVariable>(GlobalVar)->eraseFromParent();
1067}
1068
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001069LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar) {
Chris Lattner885dffc2009-10-12 04:01:02 +00001070 GlobalVariable* GV = unwrap<GlobalVariable>(GlobalVar);
1071 if ( !GV->hasInitializer() )
1072 return 0;
1073 return wrap(GV->getInitializer());
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001074}
1075
1076void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) {
1077 unwrap<GlobalVariable>(GlobalVar)
1078 ->setInitializer(unwrap<Constant>(ConstantVal));
1079}
1080
1081int LLVMIsThreadLocal(LLVMValueRef GlobalVar) {
1082 return unwrap<GlobalVariable>(GlobalVar)->isThreadLocal();
1083}
1084
1085void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal) {
1086 unwrap<GlobalVariable>(GlobalVar)->setThreadLocal(IsThreadLocal != 0);
1087}
1088
Gordon Henriksenc84c16b2007-10-07 17:31:42 +00001089int LLVMIsGlobalConstant(LLVMValueRef GlobalVar) {
Gordon Henriksenc84c16b2007-10-07 17:31:42 +00001090 return unwrap<GlobalVariable>(GlobalVar)->isConstant();
1091}
1092
1093void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant) {
1094 unwrap<GlobalVariable>(GlobalVar)->setConstant(IsConstant != 0);
1095}
1096
Chris Lattner851ba392008-12-17 21:39:50 +00001097/*--.. Operations on aliases ......................................--*/
1098
1099LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
1100 const char *Name) {
1101 return wrap(new GlobalAlias(unwrap(Ty), GlobalValue::ExternalLinkage, Name,
1102 unwrap<Constant>(Aliasee), unwrap (M)));
1103}
1104
Gordon Henriksen46abf912007-09-26 20:56:12 +00001105/*--.. Operations on functions .............................................--*/
1106
1107LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
1108 LLVMTypeRef FunctionTy) {
Gabor Greif051a9502008-04-06 20:25:17 +00001109 return wrap(Function::Create(unwrap<FunctionType>(FunctionTy),
1110 GlobalValue::ExternalLinkage, Name, unwrap(M)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001111}
1112
Gordon Henriksen6d6203d2007-10-08 03:45:09 +00001113LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name) {
1114 return wrap(unwrap(M)->getFunction(Name));
1115}
1116
Gordon Henriksen34000972008-03-19 03:47:18 +00001117LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M) {
1118 Module *Mod = unwrap(M);
1119 Module::iterator I = Mod->begin();
1120 if (I == Mod->end())
1121 return 0;
1122 return wrap(I);
1123}
1124
1125LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) {
1126 Module *Mod = unwrap(M);
1127 Module::iterator I = Mod->end();
1128 if (I == Mod->begin())
1129 return 0;
1130 return wrap(--I);
1131}
1132
1133LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) {
1134 Function *Func = unwrap<Function>(Fn);
1135 Module::iterator I = Func;
1136 if (++I == Func->getParent()->end())
1137 return 0;
1138 return wrap(I);
1139}
1140
1141LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn) {
1142 Function *Func = unwrap<Function>(Fn);
1143 Module::iterator I = Func;
Gordon Henriksen4733be32008-03-23 22:21:29 +00001144 if (I == Func->getParent()->begin())
Gordon Henriksen34000972008-03-19 03:47:18 +00001145 return 0;
1146 return wrap(--I);
1147}
1148
Gordon Henriksen46abf912007-09-26 20:56:12 +00001149void LLVMDeleteFunction(LLVMValueRef Fn) {
1150 unwrap<Function>(Fn)->eraseFromParent();
1151}
1152
Gordon Henriksen46abf912007-09-26 20:56:12 +00001153unsigned LLVMGetIntrinsicID(LLVMValueRef Fn) {
1154 if (Function *F = dyn_cast<Function>(unwrap(Fn)))
1155 return F->getIntrinsicID();
1156 return 0;
1157}
1158
1159unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn) {
1160 return unwrap<Function>(Fn)->getCallingConv();
1161}
1162
1163void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) {
Sandeep Patel65c3c8f2009-09-02 08:44:58 +00001164 return unwrap<Function>(Fn)->setCallingConv(
1165 static_cast<CallingConv::ID>(CC));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001166}
1167
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001168const char *LLVMGetGC(LLVMValueRef Fn) {
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001169 Function *F = unwrap<Function>(Fn);
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001170 return F->hasGC()? F->getGC() : 0;
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001171}
1172
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001173void LLVMSetGC(LLVMValueRef Fn, const char *GC) {
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001174 Function *F = unwrap<Function>(Fn);
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001175 if (GC)
1176 F->setGC(GC);
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001177 else
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001178 F->clearGC();
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001179}
1180
Duncan Sandse149e992009-05-06 12:21:17 +00001181void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
1182 Function *Func = unwrap<Function>(Fn);
1183 const AttrListPtr PAL = Func->getAttributes();
1184 const AttrListPtr PALnew = PAL.addAttr(0, PA);
1185 Func->setAttributes(PALnew);
1186}
1187
1188void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
1189 Function *Func = unwrap<Function>(Fn);
1190 const AttrListPtr PAL = Func->getAttributes();
1191 const AttrListPtr PALnew = PAL.removeAttr(0, PA);
1192 Func->setAttributes(PALnew);
1193}
1194
Chris Lattner885dffc2009-10-12 04:01:02 +00001195LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn) {
1196 Function *Func = unwrap<Function>(Fn);
1197 const AttrListPtr PAL = Func->getAttributes();
1198 Attributes attr = PAL.getFnAttributes();
1199 return (LLVMAttribute)attr;
1200}
1201
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001202/*--.. Operations on parameters ............................................--*/
1203
1204unsigned LLVMCountParams(LLVMValueRef FnRef) {
1205 // This function is strictly redundant to
1206 // LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef)))
Dan Gohman4d515d02008-06-21 22:06:54 +00001207 return unwrap<Function>(FnRef)->arg_size();
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001208}
1209
1210void LLVMGetParams(LLVMValueRef FnRef, LLVMValueRef *ParamRefs) {
1211 Function *Fn = unwrap<Function>(FnRef);
1212 for (Function::arg_iterator I = Fn->arg_begin(),
1213 E = Fn->arg_end(); I != E; I++)
1214 *ParamRefs++ = wrap(I);
1215}
1216
1217LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) {
1218 Function::arg_iterator AI = unwrap<Function>(FnRef)->arg_begin();
1219 while (index --> 0)
1220 AI++;
1221 return wrap(AI);
1222}
1223
1224LLVMValueRef LLVMGetParamParent(LLVMValueRef V) {
1225 return wrap(unwrap<Argument>(V)->getParent());
1226}
1227
Gordon Henriksen4733be32008-03-23 22:21:29 +00001228LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn) {
1229 Function *Func = unwrap<Function>(Fn);
1230 Function::arg_iterator I = Func->arg_begin();
1231 if (I == Func->arg_end())
1232 return 0;
1233 return wrap(I);
1234}
1235
1236LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn) {
1237 Function *Func = unwrap<Function>(Fn);
1238 Function::arg_iterator I = Func->arg_end();
1239 if (I == Func->arg_begin())
1240 return 0;
1241 return wrap(--I);
1242}
1243
1244LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg) {
1245 Argument *A = unwrap<Argument>(Arg);
1246 Function::arg_iterator I = A;
1247 if (++I == A->getParent()->arg_end())
1248 return 0;
1249 return wrap(I);
1250}
1251
1252LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg) {
1253 Argument *A = unwrap<Argument>(Arg);
1254 Function::arg_iterator I = A;
1255 if (I == A->getParent()->arg_begin())
1256 return 0;
1257 return wrap(--I);
1258}
1259
Devang Patel05988662008-09-25 21:00:45 +00001260void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001261 unwrap<Argument>(Arg)->addAttr(PA);
1262}
1263
Devang Patel05988662008-09-25 21:00:45 +00001264void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001265 unwrap<Argument>(Arg)->removeAttr(PA);
1266}
1267
Chris Lattner885dffc2009-10-12 04:01:02 +00001268LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg) {
1269 Argument *A = unwrap<Argument>(Arg);
1270 Attributes attr = A->getParent()->getAttributes().getParamAttributes(
1271 A->getArgNo()+1);
1272 return (LLVMAttribute)attr;
1273}
1274
1275
Gordon Henriksene2435da2008-04-28 17:37:06 +00001276void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) {
1277 unwrap<Argument>(Arg)->addAttr(
Devang Patel05988662008-09-25 21:00:45 +00001278 Attribute::constructAlignmentFromInt(align));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001279}
1280
Gordon Henriksen46abf912007-09-26 20:56:12 +00001281/*--.. Operations on basic blocks ..........................................--*/
1282
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001283LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB) {
1284 return wrap(static_cast<Value*>(unwrap(BB)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001285}
1286
1287int LLVMValueIsBasicBlock(LLVMValueRef Val) {
1288 return isa<BasicBlock>(unwrap(Val));
1289}
1290
1291LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val) {
1292 return wrap(unwrap<BasicBlock>(Val));
1293}
1294
Gordon Henriksen4733be32008-03-23 22:21:29 +00001295LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB) {
1296 return wrap(unwrap(BB)->getParent());
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001297}
1298
Gordon Henriksen46abf912007-09-26 20:56:12 +00001299unsigned LLVMCountBasicBlocks(LLVMValueRef FnRef) {
Dan Gohman4d515d02008-06-21 22:06:54 +00001300 return unwrap<Function>(FnRef)->size();
Gordon Henriksen46abf912007-09-26 20:56:12 +00001301}
1302
1303void LLVMGetBasicBlocks(LLVMValueRef FnRef, LLVMBasicBlockRef *BasicBlocksRefs){
1304 Function *Fn = unwrap<Function>(FnRef);
1305 for (Function::iterator I = Fn->begin(), E = Fn->end(); I != E; I++)
1306 *BasicBlocksRefs++ = wrap(I);
1307}
1308
1309LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn) {
1310 return wrap(&unwrap<Function>(Fn)->getEntryBlock());
1311}
1312
Gordon Henriksen34000972008-03-19 03:47:18 +00001313LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn) {
1314 Function *Func = unwrap<Function>(Fn);
1315 Function::iterator I = Func->begin();
1316 if (I == Func->end())
1317 return 0;
1318 return wrap(I);
1319}
1320
1321LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn) {
1322 Function *Func = unwrap<Function>(Fn);
1323 Function::iterator I = Func->end();
1324 if (I == Func->begin())
1325 return 0;
1326 return wrap(--I);
1327}
1328
1329LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB) {
1330 BasicBlock *Block = unwrap(BB);
1331 Function::iterator I = Block;
1332 if (++I == Block->getParent()->end())
1333 return 0;
1334 return wrap(I);
1335}
1336
1337LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB) {
1338 BasicBlock *Block = unwrap(BB);
1339 Function::iterator I = Block;
1340 if (I == Block->getParent()->begin())
1341 return 0;
1342 return wrap(--I);
1343}
1344
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001345LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
1346 LLVMValueRef FnRef,
1347 const char *Name) {
1348 return wrap(BasicBlock::Create(*unwrap(C), Name, unwrap<Function>(FnRef)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001349}
1350
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001351LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef FnRef, const char *Name) {
1352 return LLVMAppendBasicBlockInContext(LLVMGetGlobalContext(), FnRef, Name);
1353}
1354
1355LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
1356 LLVMBasicBlockRef BBRef,
1357 const char *Name) {
1358 BasicBlock *BB = unwrap(BBRef);
1359 return wrap(BasicBlock::Create(*unwrap(C), Name, BB->getParent(), BB));
1360}
1361
1362LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef BBRef,
Gordon Henriksen46abf912007-09-26 20:56:12 +00001363 const char *Name) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001364 return LLVMInsertBasicBlockInContext(LLVMGetGlobalContext(), BBRef, Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +00001365}
1366
1367void LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef) {
1368 unwrap(BBRef)->eraseFromParent();
1369}
1370
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001371/*--.. Operations on instructions ..........................................--*/
1372
1373LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst) {
1374 return wrap(unwrap<Instruction>(Inst)->getParent());
1375}
1376
Gordon Henriksen34000972008-03-19 03:47:18 +00001377LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB) {
1378 BasicBlock *Block = unwrap(BB);
1379 BasicBlock::iterator I = Block->begin();
1380 if (I == Block->end())
1381 return 0;
1382 return wrap(I);
1383}
1384
1385LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB) {
1386 BasicBlock *Block = unwrap(BB);
1387 BasicBlock::iterator I = Block->end();
1388 if (I == Block->begin())
1389 return 0;
1390 return wrap(--I);
1391}
1392
1393LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst) {
1394 Instruction *Instr = unwrap<Instruction>(Inst);
1395 BasicBlock::iterator I = Instr;
1396 if (++I == Instr->getParent()->end())
1397 return 0;
1398 return wrap(I);
1399}
1400
1401LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst) {
1402 Instruction *Instr = unwrap<Instruction>(Inst);
1403 BasicBlock::iterator I = Instr;
1404 if (I == Instr->getParent()->begin())
1405 return 0;
1406 return wrap(--I);
1407}
1408
Gordon Henriksen46abf912007-09-26 20:56:12 +00001409/*--.. Call and invoke instructions ........................................--*/
1410
1411unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) {
1412 Value *V = unwrap(Instr);
1413 if (CallInst *CI = dyn_cast<CallInst>(V))
1414 return CI->getCallingConv();
1415 else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
1416 return II->getCallingConv();
Torok Edwinc23197a2009-07-14 16:55:14 +00001417 llvm_unreachable("LLVMGetInstructionCallConv applies only to call and invoke!");
Gordon Henriksen46abf912007-09-26 20:56:12 +00001418 return 0;
1419}
1420
1421void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC) {
1422 Value *V = unwrap(Instr);
1423 if (CallInst *CI = dyn_cast<CallInst>(V))
Sandeep Patel65c3c8f2009-09-02 08:44:58 +00001424 return CI->setCallingConv(static_cast<CallingConv::ID>(CC));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001425 else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
Sandeep Patel65c3c8f2009-09-02 08:44:58 +00001426 return II->setCallingConv(static_cast<CallingConv::ID>(CC));
Torok Edwinc23197a2009-07-14 16:55:14 +00001427 llvm_unreachable("LLVMSetInstructionCallConv applies only to call and invoke!");
Gordon Henriksen46abf912007-09-26 20:56:12 +00001428}
1429
Devang Patel05988662008-09-25 21:00:45 +00001430void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index,
1431 LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001432 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Devang Patel05988662008-09-25 21:00:45 +00001433 Call.setAttributes(
1434 Call.getAttributes().addAttr(index, PA));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001435}
1436
Devang Patel05988662008-09-25 21:00:45 +00001437void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
1438 LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001439 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Devang Patel05988662008-09-25 21:00:45 +00001440 Call.setAttributes(
1441 Call.getAttributes().removeAttr(index, PA));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001442}
1443
1444void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
1445 unsigned align) {
1446 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Devang Patel05988662008-09-25 21:00:45 +00001447 Call.setAttributes(
1448 Call.getAttributes().addAttr(index,
1449 Attribute::constructAlignmentFromInt(align)));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001450}
1451
Gordon Henriksen07cabf62008-08-30 16:34:54 +00001452/*--.. Operations on call instructions (only) ..............................--*/
1453
1454int LLVMIsTailCall(LLVMValueRef Call) {
1455 return unwrap<CallInst>(Call)->isTailCall();
1456}
1457
1458void LLVMSetTailCall(LLVMValueRef Call, int isTailCall) {
1459 unwrap<CallInst>(Call)->setTailCall(isTailCall);
1460}
1461
Gordon Henriksen2618a6c2007-10-08 18:14:39 +00001462/*--.. Operations on phi nodes .............................................--*/
1463
1464void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
1465 LLVMBasicBlockRef *IncomingBlocks, unsigned Count) {
1466 PHINode *PhiVal = unwrap<PHINode>(PhiNode);
1467 for (unsigned I = 0; I != Count; ++I)
1468 PhiVal->addIncoming(unwrap(IncomingValues[I]), unwrap(IncomingBlocks[I]));
1469}
1470
1471unsigned LLVMCountIncoming(LLVMValueRef PhiNode) {
1472 return unwrap<PHINode>(PhiNode)->getNumIncomingValues();
1473}
1474
1475LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index) {
1476 return wrap(unwrap<PHINode>(PhiNode)->getIncomingValue(Index));
1477}
1478
1479LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index) {
1480 return wrap(unwrap<PHINode>(PhiNode)->getIncomingBlock(Index));
1481}
1482
Gordon Henriksen46abf912007-09-26 20:56:12 +00001483
1484/*===-- Instruction builders ----------------------------------------------===*/
1485
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001486LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C) {
1487 return wrap(new IRBuilder<>(*unwrap(C)));
1488}
1489
Gordon Henriksen16c1f442008-05-04 12:55:34 +00001490LLVMBuilderRef LLVMCreateBuilder(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001491 return LLVMCreateBuilderInContext(LLVMGetGlobalContext());
Gordon Henriksen46abf912007-09-26 20:56:12 +00001492}
1493
Gordon Henriksen34000972008-03-19 03:47:18 +00001494void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
1495 LLVMValueRef Instr) {
1496 BasicBlock *BB = unwrap(Block);
1497 Instruction *I = Instr? unwrap<Instruction>(Instr) : (Instruction*) BB->end();
1498 unwrap(Builder)->SetInsertPoint(BB, I);
1499}
1500
Gordon Henriksen46abf912007-09-26 20:56:12 +00001501void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1502 Instruction *I = unwrap<Instruction>(Instr);
1503 unwrap(Builder)->SetInsertPoint(I->getParent(), I);
1504}
1505
1506void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block) {
1507 BasicBlock *BB = unwrap(Block);
1508 unwrap(Builder)->SetInsertPoint(BB);
1509}
1510
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001511LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder) {
1512 return wrap(unwrap(Builder)->GetInsertBlock());
1513}
1514
Chris Lattner851ba392008-12-17 21:39:50 +00001515void LLVMClearInsertionPosition(LLVMBuilderRef Builder) {
1516 unwrap(Builder)->ClearInsertionPoint ();
1517}
1518
1519void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1520 unwrap(Builder)->Insert(unwrap<Instruction>(Instr));
1521}
1522
Erick Tryzelaar5c1c2082009-08-16 02:20:57 +00001523void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
1524 const char *Name) {
1525 unwrap(Builder)->Insert(unwrap<Instruction>(Instr), Name);
1526}
1527
Gordon Henriksen46abf912007-09-26 20:56:12 +00001528void LLVMDisposeBuilder(LLVMBuilderRef Builder) {
1529 delete unwrap(Builder);
1530}
1531
1532/*--.. Instruction builders ................................................--*/
1533
1534LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef B) {
1535 return wrap(unwrap(B)->CreateRetVoid());
1536}
1537
1538LLVMValueRef LLVMBuildRet(LLVMBuilderRef B, LLVMValueRef V) {
1539 return wrap(unwrap(B)->CreateRet(unwrap(V)));
1540}
1541
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001542LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef B, LLVMValueRef *RetVals,
1543 unsigned N) {
1544 return wrap(unwrap(B)->CreateAggregateRet(unwrap(RetVals), N));
1545}
1546
Gordon Henriksen46abf912007-09-26 20:56:12 +00001547LLVMValueRef LLVMBuildBr(LLVMBuilderRef B, LLVMBasicBlockRef Dest) {
1548 return wrap(unwrap(B)->CreateBr(unwrap(Dest)));
1549}
1550
1551LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef B, LLVMValueRef If,
1552 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else) {
1553 return wrap(unwrap(B)->CreateCondBr(unwrap(If), unwrap(Then), unwrap(Else)));
1554}
1555
1556LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef B, LLVMValueRef V,
1557 LLVMBasicBlockRef Else, unsigned NumCases) {
1558 return wrap(unwrap(B)->CreateSwitch(unwrap(V), unwrap(Else), NumCases));
1559}
1560
1561LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
1562 LLVMValueRef *Args, unsigned NumArgs,
1563 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
1564 const char *Name) {
1565 return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch),
1566 unwrap(Args), unwrap(Args) + NumArgs,
1567 Name));
1568}
1569
1570LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef B) {
1571 return wrap(unwrap(B)->CreateUnwind());
1572}
1573
1574LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) {
1575 return wrap(unwrap(B)->CreateUnreachable());
1576}
1577
Gordon Henriksenab477cc2008-01-01 05:50:53 +00001578void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
1579 LLVMBasicBlockRef Dest) {
1580 unwrap<SwitchInst>(Switch)->addCase(unwrap<ConstantInt>(OnVal), unwrap(Dest));
1581}
1582
Gordon Henriksen46abf912007-09-26 20:56:12 +00001583/*--.. Arithmetic ..........................................................--*/
1584
1585LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1586 const char *Name) {
1587 return wrap(unwrap(B)->CreateAdd(unwrap(LHS), unwrap(RHS), Name));
1588}
1589
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001590LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1591 const char *Name) {
1592 return wrap(unwrap(B)->CreateNSWAdd(unwrap(LHS), unwrap(RHS), Name));
1593}
1594
1595LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1596 const char *Name) {
1597 return wrap(unwrap(B)->CreateFAdd(unwrap(LHS), unwrap(RHS), Name));
1598}
1599
Gordon Henriksen46abf912007-09-26 20:56:12 +00001600LLVMValueRef LLVMBuildSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1601 const char *Name) {
1602 return wrap(unwrap(B)->CreateSub(unwrap(LHS), unwrap(RHS), Name));
1603}
1604
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001605LLVMValueRef LLVMBuildFSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1606 const char *Name) {
1607 return wrap(unwrap(B)->CreateFSub(unwrap(LHS), unwrap(RHS), Name));
1608}
1609
Gordon Henriksen46abf912007-09-26 20:56:12 +00001610LLVMValueRef LLVMBuildMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1611 const char *Name) {
1612 return wrap(unwrap(B)->CreateMul(unwrap(LHS), unwrap(RHS), Name));
1613}
1614
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001615LLVMValueRef LLVMBuildFMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1616 const char *Name) {
1617 return wrap(unwrap(B)->CreateFMul(unwrap(LHS), unwrap(RHS), Name));
1618}
1619
Gordon Henriksen46abf912007-09-26 20:56:12 +00001620LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1621 const char *Name) {
1622 return wrap(unwrap(B)->CreateUDiv(unwrap(LHS), unwrap(RHS), Name));
1623}
1624
1625LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1626 const char *Name) {
1627 return wrap(unwrap(B)->CreateSDiv(unwrap(LHS), unwrap(RHS), Name));
1628}
1629
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001630LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef B, LLVMValueRef LHS,
1631 LLVMValueRef RHS, const char *Name) {
1632 return wrap(unwrap(B)->CreateExactSDiv(unwrap(LHS), unwrap(RHS), Name));
1633}
1634
Gordon Henriksen46abf912007-09-26 20:56:12 +00001635LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1636 const char *Name) {
1637 return wrap(unwrap(B)->CreateFDiv(unwrap(LHS), unwrap(RHS), Name));
1638}
1639
1640LLVMValueRef LLVMBuildURem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1641 const char *Name) {
1642 return wrap(unwrap(B)->CreateURem(unwrap(LHS), unwrap(RHS), Name));
1643}
1644
1645LLVMValueRef LLVMBuildSRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1646 const char *Name) {
1647 return wrap(unwrap(B)->CreateSRem(unwrap(LHS), unwrap(RHS), Name));
1648}
1649
1650LLVMValueRef LLVMBuildFRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1651 const char *Name) {
1652 return wrap(unwrap(B)->CreateFRem(unwrap(LHS), unwrap(RHS), Name));
1653}
1654
1655LLVMValueRef LLVMBuildShl(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1656 const char *Name) {
1657 return wrap(unwrap(B)->CreateShl(unwrap(LHS), unwrap(RHS), Name));
1658}
1659
1660LLVMValueRef LLVMBuildLShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1661 const char *Name) {
1662 return wrap(unwrap(B)->CreateLShr(unwrap(LHS), unwrap(RHS), Name));
1663}
1664
1665LLVMValueRef LLVMBuildAShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1666 const char *Name) {
1667 return wrap(unwrap(B)->CreateAShr(unwrap(LHS), unwrap(RHS), Name));
1668}
1669
1670LLVMValueRef LLVMBuildAnd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1671 const char *Name) {
1672 return wrap(unwrap(B)->CreateAnd(unwrap(LHS), unwrap(RHS), Name));
1673}
1674
1675LLVMValueRef LLVMBuildOr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1676 const char *Name) {
1677 return wrap(unwrap(B)->CreateOr(unwrap(LHS), unwrap(RHS), Name));
1678}
1679
1680LLVMValueRef LLVMBuildXor(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1681 const char *Name) {
1682 return wrap(unwrap(B)->CreateXor(unwrap(LHS), unwrap(RHS), Name));
1683}
1684
1685LLVMValueRef LLVMBuildNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1686 return wrap(unwrap(B)->CreateNeg(unwrap(V), Name));
1687}
1688
Dan Gohmand0c5a292009-09-28 21:51:41 +00001689LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1690 return wrap(unwrap(B)->CreateFNeg(unwrap(V), Name));
1691}
1692
Gordon Henriksen46abf912007-09-26 20:56:12 +00001693LLVMValueRef LLVMBuildNot(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1694 return wrap(unwrap(B)->CreateNot(unwrap(V), Name));
1695}
1696
1697/*--.. Memory ..............................................................--*/
1698
1699LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
1700 const char *Name) {
Victor Hernandez3e0c99a2009-09-25 18:11:52 +00001701 return wrap(unwrap(B)->CreateMalloc(unwrap(Ty), 0, Name));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001702}
1703
1704LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
1705 LLVMValueRef Val, const char *Name) {
Victor Hernandez3e0c99a2009-09-25 18:11:52 +00001706 return wrap(unwrap(B)->CreateMalloc(unwrap(Ty), unwrap(Val), Name));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001707}
1708
1709LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
1710 const char *Name) {
1711 return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), 0, Name));
1712}
1713
1714LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
1715 LLVMValueRef Val, const char *Name) {
1716 return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), unwrap(Val), Name));
1717}
1718
1719LLVMValueRef LLVMBuildFree(LLVMBuilderRef B, LLVMValueRef PointerVal) {
1720 return wrap(unwrap(B)->CreateFree(unwrap(PointerVal)));
1721}
1722
1723
1724LLVMValueRef LLVMBuildLoad(LLVMBuilderRef B, LLVMValueRef PointerVal,
1725 const char *Name) {
1726 return wrap(unwrap(B)->CreateLoad(unwrap(PointerVal), Name));
1727}
1728
1729LLVMValueRef LLVMBuildStore(LLVMBuilderRef B, LLVMValueRef Val,
1730 LLVMValueRef PointerVal) {
1731 return wrap(unwrap(B)->CreateStore(unwrap(Val), unwrap(PointerVal)));
1732}
1733
1734LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1735 LLVMValueRef *Indices, unsigned NumIndices,
1736 const char *Name) {
1737 return wrap(unwrap(B)->CreateGEP(unwrap(Pointer), unwrap(Indices),
1738 unwrap(Indices) + NumIndices, Name));
1739}
1740
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001741LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1742 LLVMValueRef *Indices, unsigned NumIndices,
1743 const char *Name) {
1744 return wrap(unwrap(B)->CreateInBoundsGEP(unwrap(Pointer), unwrap(Indices),
1745 unwrap(Indices) + NumIndices, Name));
1746}
1747
1748LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1749 unsigned Idx, const char *Name) {
1750 return wrap(unwrap(B)->CreateStructGEP(unwrap(Pointer), Idx, Name));
1751}
1752
1753LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
1754 const char *Name) {
1755 return wrap(unwrap(B)->CreateGlobalString(Str, Name));
1756}
1757
1758LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
1759 const char *Name) {
1760 return wrap(unwrap(B)->CreateGlobalStringPtr(Str, Name));
1761}
1762
Gordon Henriksen46abf912007-09-26 20:56:12 +00001763/*--.. Casts ...............................................................--*/
1764
1765LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef B, LLVMValueRef Val,
1766 LLVMTypeRef DestTy, const char *Name) {
1767 return wrap(unwrap(B)->CreateTrunc(unwrap(Val), unwrap(DestTy), Name));
1768}
1769
1770LLVMValueRef LLVMBuildZExt(LLVMBuilderRef B, LLVMValueRef Val,
1771 LLVMTypeRef DestTy, const char *Name) {
1772 return wrap(unwrap(B)->CreateZExt(unwrap(Val), unwrap(DestTy), Name));
1773}
1774
1775LLVMValueRef LLVMBuildSExt(LLVMBuilderRef B, LLVMValueRef Val,
1776 LLVMTypeRef DestTy, const char *Name) {
1777 return wrap(unwrap(B)->CreateSExt(unwrap(Val), unwrap(DestTy), Name));
1778}
1779
1780LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef B, LLVMValueRef Val,
1781 LLVMTypeRef DestTy, const char *Name) {
1782 return wrap(unwrap(B)->CreateFPToUI(unwrap(Val), unwrap(DestTy), Name));
1783}
1784
1785LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef B, LLVMValueRef Val,
1786 LLVMTypeRef DestTy, const char *Name) {
1787 return wrap(unwrap(B)->CreateFPToSI(unwrap(Val), unwrap(DestTy), Name));
1788}
1789
1790LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef B, LLVMValueRef Val,
1791 LLVMTypeRef DestTy, const char *Name) {
1792 return wrap(unwrap(B)->CreateUIToFP(unwrap(Val), unwrap(DestTy), Name));
1793}
1794
1795LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef B, LLVMValueRef Val,
1796 LLVMTypeRef DestTy, const char *Name) {
1797 return wrap(unwrap(B)->CreateSIToFP(unwrap(Val), unwrap(DestTy), Name));
1798}
1799
1800LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef B, LLVMValueRef Val,
1801 LLVMTypeRef DestTy, const char *Name) {
1802 return wrap(unwrap(B)->CreateFPTrunc(unwrap(Val), unwrap(DestTy), Name));
1803}
1804
1805LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef B, LLVMValueRef Val,
1806 LLVMTypeRef DestTy, const char *Name) {
1807 return wrap(unwrap(B)->CreateFPExt(unwrap(Val), unwrap(DestTy), Name));
1808}
1809
1810LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef B, LLVMValueRef Val,
1811 LLVMTypeRef DestTy, const char *Name) {
1812 return wrap(unwrap(B)->CreatePtrToInt(unwrap(Val), unwrap(DestTy), Name));
1813}
1814
1815LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef B, LLVMValueRef Val,
1816 LLVMTypeRef DestTy, const char *Name) {
1817 return wrap(unwrap(B)->CreateIntToPtr(unwrap(Val), unwrap(DestTy), Name));
1818}
1819
1820LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef B, LLVMValueRef Val,
1821 LLVMTypeRef DestTy, const char *Name) {
1822 return wrap(unwrap(B)->CreateBitCast(unwrap(Val), unwrap(DestTy), Name));
1823}
1824
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001825LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
1826 LLVMTypeRef DestTy, const char *Name) {
1827 return wrap(unwrap(B)->CreateZExtOrBitCast(unwrap(Val), unwrap(DestTy),
1828 Name));
1829}
1830
1831LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
1832 LLVMTypeRef DestTy, const char *Name) {
1833 return wrap(unwrap(B)->CreateSExtOrBitCast(unwrap(Val), unwrap(DestTy),
1834 Name));
1835}
1836
1837LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
1838 LLVMTypeRef DestTy, const char *Name) {
1839 return wrap(unwrap(B)->CreateTruncOrBitCast(unwrap(Val), unwrap(DestTy),
1840 Name));
1841}
1842
1843LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef B, LLVMValueRef Val,
1844 LLVMTypeRef DestTy, const char *Name) {
1845 return wrap(unwrap(B)->CreatePointerCast(unwrap(Val), unwrap(DestTy), Name));
1846}
1847
1848LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef B, LLVMValueRef Val,
1849 LLVMTypeRef DestTy, const char *Name) {
1850 return wrap(unwrap(B)->CreateIntCast(unwrap(Val), unwrap(DestTy), Name));
1851}
1852
1853LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef B, LLVMValueRef Val,
1854 LLVMTypeRef DestTy, const char *Name) {
1855 return wrap(unwrap(B)->CreateFPCast(unwrap(Val), unwrap(DestTy), Name));
1856}
1857
Gordon Henriksen46abf912007-09-26 20:56:12 +00001858/*--.. Comparisons .........................................................--*/
1859
1860LLVMValueRef LLVMBuildICmp(LLVMBuilderRef B, LLVMIntPredicate Op,
1861 LLVMValueRef LHS, LLVMValueRef RHS,
1862 const char *Name) {
1863 return wrap(unwrap(B)->CreateICmp(static_cast<ICmpInst::Predicate>(Op),
1864 unwrap(LHS), unwrap(RHS), Name));
1865}
1866
1867LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef B, LLVMRealPredicate Op,
1868 LLVMValueRef LHS, LLVMValueRef RHS,
1869 const char *Name) {
1870 return wrap(unwrap(B)->CreateFCmp(static_cast<FCmpInst::Predicate>(Op),
1871 unwrap(LHS), unwrap(RHS), Name));
1872}
1873
1874/*--.. Miscellaneous instructions ..........................................--*/
1875
1876LLVMValueRef LLVMBuildPhi(LLVMBuilderRef B, LLVMTypeRef Ty, const char *Name) {
1877 return wrap(unwrap(B)->CreatePHI(unwrap(Ty), Name));
1878}
1879
1880LLVMValueRef LLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn,
1881 LLVMValueRef *Args, unsigned NumArgs,
1882 const char *Name) {
1883 return wrap(unwrap(B)->CreateCall(unwrap(Fn), unwrap(Args),
1884 unwrap(Args) + NumArgs, Name));
1885}
1886
1887LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If,
1888 LLVMValueRef Then, LLVMValueRef Else,
1889 const char *Name) {
1890 return wrap(unwrap(B)->CreateSelect(unwrap(If), unwrap(Then), unwrap(Else),
1891 Name));
1892}
1893
1894LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef B, LLVMValueRef List,
1895 LLVMTypeRef Ty, const char *Name) {
1896 return wrap(unwrap(B)->CreateVAArg(unwrap(List), unwrap(Ty), Name));
1897}
1898
1899LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef B, LLVMValueRef VecVal,
1900 LLVMValueRef Index, const char *Name) {
1901 return wrap(unwrap(B)->CreateExtractElement(unwrap(VecVal), unwrap(Index),
1902 Name));
1903}
1904
1905LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef B, LLVMValueRef VecVal,
1906 LLVMValueRef EltVal, LLVMValueRef Index,
1907 const char *Name) {
1908 return wrap(unwrap(B)->CreateInsertElement(unwrap(VecVal), unwrap(EltVal),
1909 unwrap(Index), Name));
1910}
1911
1912LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1,
1913 LLVMValueRef V2, LLVMValueRef Mask,
1914 const char *Name) {
1915 return wrap(unwrap(B)->CreateShuffleVector(unwrap(V1), unwrap(V2),
1916 unwrap(Mask), Name));
1917}
Gordon Henriksen1ae61352007-12-12 01:04:30 +00001918
Dan Gohmanb5931172008-11-03 22:55:43 +00001919LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef B, LLVMValueRef AggVal,
1920 unsigned Index, const char *Name) {
1921 return wrap(unwrap(B)->CreateExtractValue(unwrap(AggVal), Index, Name));
1922}
1923
1924LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef B, LLVMValueRef AggVal,
1925 LLVMValueRef EltVal, unsigned Index,
1926 const char *Name) {
1927 return wrap(unwrap(B)->CreateInsertValue(unwrap(AggVal), unwrap(EltVal),
1928 Index, Name));
1929}
1930
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001931LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef B, LLVMValueRef Val,
1932 const char *Name) {
1933 return wrap(unwrap(B)->CreateIsNull(unwrap(Val), Name));
1934}
1935
1936LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef B, LLVMValueRef Val,
1937 const char *Name) {
1938 return wrap(unwrap(B)->CreateIsNotNull(unwrap(Val), Name));
1939}
1940
1941LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef B, LLVMValueRef LHS,
1942 LLVMValueRef RHS, const char *Name) {
1943 return wrap(unwrap(B)->CreatePtrDiff(unwrap(LHS), unwrap(RHS), Name));
1944}
1945
Gordon Henriksen1ae61352007-12-12 01:04:30 +00001946
1947/*===-- Module providers --------------------------------------------------===*/
1948
1949LLVMModuleProviderRef
1950LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M) {
1951 return wrap(new ExistingModuleProvider(unwrap(M)));
1952}
1953
1954void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP) {
1955 delete unwrap(MP);
1956}
1957
Gordon Henriksenda1435f2007-12-19 22:30:40 +00001958
1959/*===-- Memory buffers ----------------------------------------------------===*/
1960
1961int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
1962 LLVMMemoryBufferRef *OutMemBuf,
1963 char **OutMessage) {
1964 std::string Error;
Chris Lattner038112a2008-04-01 18:04:03 +00001965 if (MemoryBuffer *MB = MemoryBuffer::getFile(Path, &Error)) {
Gordon Henriksenda1435f2007-12-19 22:30:40 +00001966 *OutMemBuf = wrap(MB);
1967 return 0;
1968 }
1969
1970 *OutMessage = strdup(Error.c_str());
1971 return 1;
1972}
1973
1974int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
1975 char **OutMessage) {
1976 if (MemoryBuffer *MB = MemoryBuffer::getSTDIN()) {
1977 *OutMemBuf = wrap(MB);
1978 return 0;
1979 }
1980
1981 *OutMessage = strdup("stdin is empty.");
1982 return 1;
1983}
1984
1985void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
1986 delete unwrap(MemBuf);
1987}