blob: b59f6c78c52035ae9f70c3775f53af6e4c3fce04 [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//
Owen Andersonb8a1ccf2010-10-07 19:51:21 +000010// This file implements the common infrastructure (including the C bindings)
11// for libLLVMCore.a, which implements the LLVM intermediate representation.
Gordon Henriksen8b94a142007-09-18 03:18:57 +000012//
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"
Chris Lattner851ba392008-12-17 21:39:50 +000022#include "llvm/InlineAsm.h"
Gordon Henriksen2a9c6712008-12-19 18:39:45 +000023#include "llvm/IntrinsicInst.h"
Dan Gohman11112e02010-08-07 00:43:20 +000024#include "llvm/PassManager.h"
Gordon Henriksene2435da2008-04-28 17:37:06 +000025#include "llvm/Support/CallSite.h"
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +000026#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000027#include "llvm/Support/ErrorHandling.h"
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +000028#include "llvm/Support/MemoryBuffer.h"
29#include "llvm/Support/raw_ostream.h"
Michael J. Spencer333fb042010-12-09 17:36:48 +000030#include "llvm/Support/system_error.h"
Gordon Henriksen8b94a142007-09-18 03:18:57 +000031#include <cassert>
Gordon Henriksenda1435f2007-12-19 22:30:40 +000032#include <cstdlib>
Anton Korobeynikovae9f3a32008-02-20 11:08:44 +000033#include <cstring>
Gordon Henriksen8b94a142007-09-18 03:18:57 +000034
35using namespace llvm;
36
Owen Andersonb8a1ccf2010-10-07 19:51:21 +000037void llvm::initializeCore(PassRegistry &Registry) {
38 initializeDominatorTreePass(Registry);
Owen Andersonb8a1ccf2010-10-07 19:51:21 +000039 initializePrintModulePassPass(Registry);
40 initializePrintFunctionPassPass(Registry);
41 initializeVerifierPass(Registry);
42 initializePreVerifierPass(Registry);
43}
44
45void LLVMInitializeCore(LLVMPassRegistryRef R) {
46 initializeCore(*unwrap(R));
47}
Gordon Henriksen8b94a142007-09-18 03:18:57 +000048
Gordon Henriksenda1435f2007-12-19 22:30:40 +000049/*===-- Error handling ----------------------------------------------------===*/
50
51void LLVMDisposeMessage(char *Message) {
52 free(Message);
53}
54
55
Owen Anderson8b477ed2009-07-01 16:58:40 +000056/*===-- Operations on contexts --------------------------------------------===*/
57
58LLVMContextRef LLVMContextCreate() {
59 return wrap(new LLVMContext());
60}
61
Owen Andersonc70e6212009-07-02 00:16:38 +000062LLVMContextRef LLVMGetGlobalContext() {
63 return wrap(&getGlobalContext());
64}
65
Owen Anderson8b477ed2009-07-01 16:58:40 +000066void LLVMContextDispose(LLVMContextRef C) {
67 delete unwrap(C);
68}
69
Erick Tryzelaar46c80e02010-02-28 09:45:59 +000070unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char* Name,
71 unsigned SLen) {
72 return unwrap(C)->getMDKindID(StringRef(Name, SLen));
73}
74
75unsigned LLVMGetMDKindID(const char* Name, unsigned SLen) {
76 return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name, SLen);
77}
78
Owen Anderson8b477ed2009-07-01 16:58:40 +000079
Gordon Henriksen8b94a142007-09-18 03:18:57 +000080/*===-- Operations on modules ---------------------------------------------===*/
81
Owen Andersonc8897d92009-07-02 07:17:57 +000082LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) {
83 return wrap(new Module(ModuleID, getGlobalContext()));
84}
85
86LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
87 LLVMContextRef C) {
Owen Anderson31895e72009-07-01 21:22:36 +000088 return wrap(new Module(ModuleID, *unwrap(C)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +000089}
90
91void LLVMDisposeModule(LLVMModuleRef M) {
92 delete unwrap(M);
93}
94
Gordon Henriksena353ffa2007-12-27 20:13:47 +000095/*--.. Data layout .........................................................--*/
96const char * LLVMGetDataLayout(LLVMModuleRef M) {
97 return unwrap(M)->getDataLayout().c_str();
98}
99
100void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple) {
101 unwrap(M)->setDataLayout(Triple);
102}
103
104/*--.. Target triple .......................................................--*/
105const char * LLVMGetTarget(LLVMModuleRef M) {
106 return unwrap(M)->getTargetTriple().c_str();
107}
108
109void LLVMSetTarget(LLVMModuleRef M, const char *Triple) {
110 unwrap(M)->setTargetTriple(Triple);
111}
112
Gordon Henriksenaf59b102008-03-14 23:58:56 +0000113void LLVMDumpModule(LLVMModuleRef M) {
114 unwrap(M)->dump();
115}
116
Chris Lattner09415342010-04-10 17:52:58 +0000117/*--.. Operations on inline assembler ......................................--*/
118void LLVMSetModuleInlineAsm(LLVMModuleRef M, const char *Asm) {
119 unwrap(M)->setModuleInlineAsm(StringRef(Asm));
120}
121
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000122
Chris Lattnera1ac3bb2010-11-28 20:03:44 +0000123/*--.. Operations on module contexts ......................................--*/
124LLVMContextRef LLVMGetModuleContext(LLVMModuleRef M) {
125 return wrap(&unwrap(M)->getContext());
126}
127
128
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000129/*===-- Operations on types -----------------------------------------------===*/
130
131/*--.. Operations on all types (mostly) ....................................--*/
132
133LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty) {
Chris Lattner0df5c8e2009-07-15 22:00:31 +0000134 switch (unwrap(Ty)->getTypeID()) {
Daniel Dunbarefd280b2009-07-16 22:06:22 +0000135 default:
136 assert(false && "Unhandled TypeID.");
Chris Lattner0df5c8e2009-07-15 22:00:31 +0000137 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;
Chris Lattner0df5c8e2009-07-15 22:00:31 +0000163 case Type::VectorTyID:
164 return LLVMVectorTypeKind;
Dale Johannesenbb811a22010-09-10 20:55:01 +0000165 case Type::X86_MMXTyID:
166 return LLVMX86_MMXTypeKind;
Chris Lattner0df5c8e2009-07-15 22:00:31 +0000167 }
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000168}
169
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000170LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty) {
171 return wrap(&unwrap(Ty)->getContext());
172}
173
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000174/*--.. Operations on integer types .........................................--*/
175
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000176LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C) {
177 return (LLVMTypeRef) Type::getInt1Ty(*unwrap(C));
Owen Anderson1d0be152009-08-13 21:58:54 +0000178}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000179LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C) {
180 return (LLVMTypeRef) Type::getInt8Ty(*unwrap(C));
Owen Anderson1d0be152009-08-13 21:58:54 +0000181}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000182LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C) {
183 return (LLVMTypeRef) Type::getInt16Ty(*unwrap(C));
Owen Anderson1d0be152009-08-13 21:58:54 +0000184}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000185LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C) {
186 return (LLVMTypeRef) Type::getInt32Ty(*unwrap(C));
Owen Anderson1d0be152009-08-13 21:58:54 +0000187}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000188LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C) {
189 return (LLVMTypeRef) Type::getInt64Ty(*unwrap(C));
190}
191LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits) {
192 return wrap(IntegerType::get(*unwrap(C), NumBits));
Owen Anderson1d0be152009-08-13 21:58:54 +0000193}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000194
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000195LLVMTypeRef LLVMInt1Type(void) {
196 return LLVMInt1TypeInContext(LLVMGetGlobalContext());
197}
198LLVMTypeRef LLVMInt8Type(void) {
199 return LLVMInt8TypeInContext(LLVMGetGlobalContext());
200}
201LLVMTypeRef LLVMInt16Type(void) {
202 return LLVMInt16TypeInContext(LLVMGetGlobalContext());
203}
204LLVMTypeRef LLVMInt32Type(void) {
205 return LLVMInt32TypeInContext(LLVMGetGlobalContext());
206}
207LLVMTypeRef LLVMInt64Type(void) {
208 return LLVMInt64TypeInContext(LLVMGetGlobalContext());
209}
Gordon Henriksen81a78812007-10-06 16:05:20 +0000210LLVMTypeRef LLVMIntType(unsigned NumBits) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000211 return LLVMIntTypeInContext(LLVMGetGlobalContext(), NumBits);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000212}
213
Gordon Henriksen46abf912007-09-26 20:56:12 +0000214unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000215 return unwrap<IntegerType>(IntegerTy)->getBitWidth();
216}
217
218/*--.. Operations on real types ............................................--*/
219
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000220LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C) {
221 return (LLVMTypeRef) Type::getFloatTy(*unwrap(C));
222}
223LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C) {
224 return (LLVMTypeRef) Type::getDoubleTy(*unwrap(C));
225}
226LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C) {
227 return (LLVMTypeRef) Type::getX86_FP80Ty(*unwrap(C));
228}
229LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C) {
230 return (LLVMTypeRef) Type::getFP128Ty(*unwrap(C));
231}
232LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C) {
233 return (LLVMTypeRef) Type::getPPC_FP128Ty(*unwrap(C));
234}
Dale Johannesenbb811a22010-09-10 20:55:01 +0000235LLVMTypeRef LLVMX86MMXTypeInContext(LLVMContextRef C) {
236 return (LLVMTypeRef) Type::getX86_MMXTy(*unwrap(C));
237}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000238
Owen Anderson1d0be152009-08-13 21:58:54 +0000239LLVMTypeRef LLVMFloatType(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000240 return LLVMFloatTypeInContext(LLVMGetGlobalContext());
Owen Anderson1d0be152009-08-13 21:58:54 +0000241}
242LLVMTypeRef LLVMDoubleType(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000243 return LLVMDoubleTypeInContext(LLVMGetGlobalContext());
Owen Anderson1d0be152009-08-13 21:58:54 +0000244}
245LLVMTypeRef LLVMX86FP80Type(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000246 return LLVMX86FP80TypeInContext(LLVMGetGlobalContext());
Owen Anderson1d0be152009-08-13 21:58:54 +0000247}
248LLVMTypeRef LLVMFP128Type(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000249 return LLVMFP128TypeInContext(LLVMGetGlobalContext());
Owen Anderson1d0be152009-08-13 21:58:54 +0000250}
251LLVMTypeRef LLVMPPCFP128Type(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000252 return LLVMPPCFP128TypeInContext(LLVMGetGlobalContext());
Owen Anderson1d0be152009-08-13 21:58:54 +0000253}
Dale Johannesenbb811a22010-09-10 20:55:01 +0000254LLVMTypeRef LLVMX86MMXType(void) {
255 return LLVMX86MMXTypeInContext(LLVMGetGlobalContext());
256}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000257
258/*--.. Operations on function types ........................................--*/
259
Gordon Henriksen81a78812007-10-06 16:05:20 +0000260LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
261 LLVMTypeRef *ParamTypes, unsigned ParamCount,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000262 LLVMBool IsVarArg) {
Frits van Bommeld1559452011-07-14 11:44:09 +0000263 ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount);
Owen Andersondebcb012009-07-29 22:17:13 +0000264 return wrap(FunctionType::get(unwrap(ReturnType), Tys, IsVarArg != 0));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000265}
266
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000267LLVMBool LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000268 return unwrap<FunctionType>(FunctionTy)->isVarArg();
269}
270
Gordon Henriksen46abf912007-09-26 20:56:12 +0000271LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000272 return wrap(unwrap<FunctionType>(FunctionTy)->getReturnType());
273}
274
Gordon Henriksen46abf912007-09-26 20:56:12 +0000275unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000276 return unwrap<FunctionType>(FunctionTy)->getNumParams();
277}
278
Gordon Henriksen46abf912007-09-26 20:56:12 +0000279void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000280 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
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000288LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000289 unsigned ElementCount, LLVMBool Packed) {
Frits van Bommeld1559452011-07-14 11:44:09 +0000290 ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000291 return wrap(StructType::get(*unwrap(C), Tys, Packed != 0));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000292}
293
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000294LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000295 unsigned ElementCount, LLVMBool Packed) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000296 return LLVMStructTypeInContext(LLVMGetGlobalContext(), ElementTypes,
297 ElementCount, Packed);
298}
299
Chris Lattnerd91aa142011-07-14 05:53:17 +0000300LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name)
301{
302 return wrap(StructType::createNamed(*unwrap(C), Name));
303}
304
305void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes,
306 unsigned ElementCount, LLVMBool Packed) {
Frits van Bommeld1559452011-07-14 11:44:09 +0000307 ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
Chris Lattnerd91aa142011-07-14 05:53:17 +0000308 unwrap<StructType>(StructTy)->setBody(Tys, Packed != 0);
309}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000310
Gordon Henriksen46abf912007-09-26 20:56:12 +0000311unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000312 return unwrap<StructType>(StructTy)->getNumElements();
313}
314
315void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest) {
316 StructType *Ty = unwrap<StructType>(StructTy);
Nick Lewycky8c6d1962011-04-20 22:52:37 +0000317 for (StructType::element_iterator I = Ty->element_begin(),
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000318 E = Ty->element_end(); I != E; ++I)
319 *Dest++ = wrap(*I);
320}
321
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000322LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000323 return unwrap<StructType>(StructTy)->isPacked();
324}
325
Chris Lattner61afc882011-07-14 16:20:28 +0000326LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy) {
327 return unwrap<StructType>(StructTy)->isOpaque();
328}
329
330LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) {
331 return wrap(unwrap(M)->getTypeByName(Name));
332}
333
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000334/*--.. Operations on array, pointer, and vector types (sequence types) .....--*/
335
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000336LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) {
Owen Andersondebcb012009-07-29 22:17:13 +0000337 return wrap(ArrayType::get(unwrap(ElementType), ElementCount));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000338}
339
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000340LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace) {
Owen Andersondebcb012009-07-29 22:17:13 +0000341 return wrap(PointerType::get(unwrap(ElementType), AddressSpace));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000342}
343
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000344LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) {
Owen Andersondebcb012009-07-29 22:17:13 +0000345 return wrap(VectorType::get(unwrap(ElementType), ElementCount));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000346}
347
348LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty) {
349 return wrap(unwrap<SequentialType>(Ty)->getElementType());
350}
351
352unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) {
353 return unwrap<ArrayType>(ArrayTy)->getNumElements();
354}
355
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000356unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy) {
357 return unwrap<PointerType>(PointerTy)->getAddressSpace();
358}
359
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000360unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy) {
361 return unwrap<VectorType>(VectorTy)->getNumElements();
362}
363
364/*--.. Operations on other types ...........................................--*/
365
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000366LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C) {
367 return wrap(Type::getVoidTy(*unwrap(C)));
Owen Anderson1d0be152009-08-13 21:58:54 +0000368}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000369LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C) {
370 return wrap(Type::getLabelTy(*unwrap(C)));
371}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000372
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000373LLVMTypeRef LLVMVoidType(void) {
374 return LLVMVoidTypeInContext(LLVMGetGlobalContext());
375}
376LLVMTypeRef LLVMLabelType(void) {
377 return LLVMLabelTypeInContext(LLVMGetGlobalContext());
378}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000379
380/*===-- Operations on values ----------------------------------------------===*/
381
382/*--.. Operations on all values ............................................--*/
383
Gordon Henriksen46abf912007-09-26 20:56:12 +0000384LLVMTypeRef LLVMTypeOf(LLVMValueRef Val) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000385 return wrap(unwrap(Val)->getType());
386}
387
388const char *LLVMGetValueName(LLVMValueRef Val) {
Daniel Dunbar93b67e42009-07-26 07:49:05 +0000389 return unwrap(Val)->getName().data();
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000390}
391
392void LLVMSetValueName(LLVMValueRef Val, const char *Name) {
393 unwrap(Val)->setName(Name);
394}
395
Gordon Henriksen88cc6992007-10-06 00:08:49 +0000396void LLVMDumpValue(LLVMValueRef Val) {
397 unwrap(Val)->dump();
398}
399
Chris Lattner885dffc2009-10-12 04:01:02 +0000400void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal) {
401 unwrap(OldVal)->replaceAllUsesWith(unwrap(NewVal));
402}
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000403
Erick Tryzelaar46c80e02010-02-28 09:45:59 +0000404int LLVMHasMetadata(LLVMValueRef Inst) {
405 return unwrap<Instruction>(Inst)->hasMetadata();
406}
407
408LLVMValueRef LLVMGetMetadata(LLVMValueRef Inst, unsigned KindID) {
409 return wrap(unwrap<Instruction>(Inst)->getMetadata(KindID));
410}
411
412void LLVMSetMetadata(LLVMValueRef Inst, unsigned KindID, LLVMValueRef MD) {
413 unwrap<Instruction>(Inst)->setMetadata(KindID, MD? unwrap<MDNode>(MD) : NULL);
414}
415
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000416/*--.. 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
423LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST)
424
Chris Lattner885dffc2009-10-12 04:01:02 +0000425/*--.. Operations on Uses ..................................................--*/
Erick Tryzelaar24b37332010-03-02 20:32:28 +0000426LLVMUseRef LLVMGetFirstUse(LLVMValueRef Val) {
Chris Lattner885dffc2009-10-12 04:01:02 +0000427 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
Erick Tryzelaar24b37332010-03-02 20:32:28 +0000434LLVMUseRef LLVMGetNextUse(LLVMUseRef U) {
435 Use *Next = unwrap(U)->getNext();
436 if (Next)
437 return wrap(Next);
438 return 0;
Chris Lattner885dffc2009-10-12 04:01:02 +0000439}
440
Erick Tryzelaar24b37332010-03-02 20:32:28 +0000441LLVMValueRef LLVMGetUser(LLVMUseRef U) {
442 return wrap(unwrap(U)->getUser());
Chris Lattner885dffc2009-10-12 04:01:02 +0000443}
444
Erick Tryzelaar24b37332010-03-02 20:32:28 +0000445LLVMValueRef LLVMGetUsedValue(LLVMUseRef U) {
446 return wrap(unwrap(U)->get());
Chris Lattner885dffc2009-10-12 04:01:02 +0000447}
448
449/*--.. Operations on Users .................................................--*/
450LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index) {
451 return wrap(unwrap<User>(Val)->getOperand(Index));
452}
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000453
Erick Tryzelaarf7af9312010-08-20 14:51:22 +0000454void LLVMSetOperand(LLVMValueRef Val, unsigned Index, LLVMValueRef Op) {
455 unwrap<User>(Val)->setOperand(Index, unwrap(Op));
456}
457
458int LLVMGetNumOperands(LLVMValueRef Val) {
459 return unwrap<User>(Val)->getNumOperands();
460}
461
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000462/*--.. Operations on constants of any type .................................--*/
463
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000464LLVMValueRef LLVMConstNull(LLVMTypeRef Ty) {
Owen Andersona7235ea2009-07-31 20:28:14 +0000465 return wrap(Constant::getNullValue(unwrap(Ty)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000466}
467
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000468LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty) {
Owen Andersona7235ea2009-07-31 20:28:14 +0000469 return wrap(Constant::getAllOnesValue(unwrap(Ty)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000470}
471
472LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty) {
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000473 return wrap(UndefValue::get(unwrap(Ty)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000474}
475
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000476LLVMBool LLVMIsConstant(LLVMValueRef Ty) {
Gordon Henriksen344be5f2007-09-18 18:07:51 +0000477 return isa<Constant>(unwrap(Ty));
478}
479
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000480LLVMBool LLVMIsNull(LLVMValueRef Val) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000481 if (Constant *C = dyn_cast<Constant>(unwrap(Val)))
482 return C->isNullValue();
483 return false;
484}
485
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000486LLVMBool LLVMIsUndef(LLVMValueRef Val) {
Gordon Henriksen344be5f2007-09-18 18:07:51 +0000487 return isa<UndefValue>(unwrap(Val));
488}
489
Chris Lattnere4840bc2009-07-06 17:29:59 +0000490LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty) {
Owen Anderson62e744b2009-07-07 21:33:58 +0000491 return
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000492 wrap(ConstantPointerNull::get(unwrap<PointerType>(Ty)));
Chris Lattnere4840bc2009-07-06 17:29:59 +0000493}
494
Erick Tryzelaar46c80e02010-02-28 09:45:59 +0000495/*--.. Operations on metadata nodes ........................................--*/
496
497LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str,
498 unsigned SLen) {
499 return wrap(MDString::get(*unwrap(C), StringRef(Str, SLen)));
500}
501
502LLVMValueRef LLVMMDString(const char *Str, unsigned SLen) {
503 return LLVMMDStringInContext(LLVMGetGlobalContext(), Str, SLen);
504}
505
506LLVMValueRef LLVMMDNodeInContext(LLVMContextRef C, LLVMValueRef *Vals,
507 unsigned Count) {
Jay Foadec9186b2011-04-21 19:59:31 +0000508 return wrap(MDNode::get(*unwrap(C),
509 ArrayRef<Value*>(unwrap<Value>(Vals, Count), Count)));
Erick Tryzelaar46c80e02010-02-28 09:45:59 +0000510}
511
512LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count) {
513 return LLVMMDNodeInContext(LLVMGetGlobalContext(), Vals, Count);
514}
515
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000516/*--.. Operations on scalar constants ......................................--*/
517
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000518LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000519 LLVMBool SignExtend) {
Owen Andersoneed707b2009-07-24 23:12:02 +0000520 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), N, SignExtend != 0));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000521}
522
Chris Lattner54005702010-11-23 02:47:22 +0000523LLVMValueRef 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(), NumWords, Words)));
529}
530
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000531LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char Str[],
532 uint8_t Radix) {
533 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str),
534 Radix));
535}
536
537LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char Str[],
538 unsigned SLen, uint8_t Radix) {
539 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str, SLen),
540 Radix));
Gordon Henriksene62a8a32008-02-02 01:07:50 +0000541}
542
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000543LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) {
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000544 return wrap(ConstantFP::get(unwrap(RealTy), N));
Gordon Henriksene62a8a32008-02-02 01:07:50 +0000545}
546
547LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) {
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000548 return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Text)));
549}
550
551LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char Str[],
552 unsigned SLen) {
553 return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Str, SLen)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000554}
555
Chris Lattner885dffc2009-10-12 04:01:02 +0000556unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal) {
557 return unwrap<ConstantInt>(ConstantVal)->getZExtValue();
558}
559
560long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal) {
561 return unwrap<ConstantInt>(ConstantVal)->getSExtValue();
562}
563
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000564/*--.. Operations on composite constants ...................................--*/
565
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000566LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000567 unsigned Length,
568 LLVMBool DontNullTerminate) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000569 /* Inverted the sense of AddNull because ', 0)' is a
570 better mnemonic for null termination than ', 1)'. */
Benjamin Kramer4c8a9852010-10-17 07:39:34 +0000571 return wrap(ConstantArray::get(*unwrap(C), StringRef(Str, Length),
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000572 DontNullTerminate == 0));
573}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000574LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
575 LLVMValueRef *ConstantVals,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000576 unsigned Count, LLVMBool Packed) {
Chris Lattnerb065b062011-06-20 04:01:31 +0000577 Constant **Elements = unwrap<Constant>(ConstantVals, Count);
578 return wrap(ConstantStruct::getAnon(*unwrap(C),
579 ArrayRef<Constant*>(Elements, Count),
580 Packed != 0));
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000581}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000582
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000583LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000584 LLVMBool DontNullTerminate) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000585 return LLVMConstStringInContext(LLVMGetGlobalContext(), Str, Length,
586 DontNullTerminate);
587}
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000588LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
589 LLVMValueRef *ConstantVals, unsigned Length) {
Jay Foad26701082011-06-22 09:24:39 +0000590 ArrayRef<Constant*> V(unwrap<Constant>(ConstantVals, Length), Length);
591 return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length), V));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000592}
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000593LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000594 LLVMBool Packed) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000595 return LLVMConstStructInContext(LLVMGetGlobalContext(), ConstantVals, Count,
596 Packed);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000597}
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000598LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000599 return wrap(ConstantVector::get(ArrayRef<Constant*>(
600 unwrap<Constant>(ScalarConstantVals, Size), Size)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000601}
Gordon Henriksen46475692007-10-06 14:29:36 +0000602/*--.. Constant expressions ................................................--*/
603
Chris Lattner885dffc2009-10-12 04:01:02 +0000604LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal) {
605 return (LLVMOpcode)unwrap<ConstantExpr>(ConstantVal)->getOpcode();
606}
607
Duncan Sandsef854af2009-05-21 15:52:21 +0000608LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000609 return wrap(ConstantExpr::getAlignOf(unwrap(Ty)));
Duncan Sandsef854af2009-05-21 15:52:21 +0000610}
611
Gordon Henriksen46475692007-10-06 14:29:36 +0000612LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000613 return wrap(ConstantExpr::getSizeOf(unwrap(Ty)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000614}
615
616LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000617 return wrap(ConstantExpr::getNeg(unwrap<Constant>(ConstantVal)));
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000618}
619
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000620LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000621 return wrap(ConstantExpr::getNSWNeg(unwrap<Constant>(ConstantVal)));
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000622}
623
624LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000625 return wrap(ConstantExpr::getNUWNeg(unwrap<Constant>(ConstantVal)));
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000626}
627
628
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000629LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000630 return wrap(ConstantExpr::getFNeg(unwrap<Constant>(ConstantVal)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000631}
632
633LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000634 return wrap(ConstantExpr::getNot(unwrap<Constant>(ConstantVal)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000635}
636
637LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000638 return wrap(ConstantExpr::getAdd(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000639 unwrap<Constant>(RHSConstant)));
640}
641
Dan Gohman6e7ad952009-09-03 23:34:49 +0000642LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant,
643 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000644 return wrap(ConstantExpr::getNSWAdd(unwrap<Constant>(LHSConstant),
Dan Gohman6e7ad952009-09-03 23:34:49 +0000645 unwrap<Constant>(RHSConstant)));
646}
647
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000648LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant,
649 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000650 return wrap(ConstantExpr::getNUWAdd(unwrap<Constant>(LHSConstant),
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000651 unwrap<Constant>(RHSConstant)));
652}
653
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000654LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000655 return wrap(ConstantExpr::getFAdd(unwrap<Constant>(LHSConstant),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000656 unwrap<Constant>(RHSConstant)));
657}
658
Gordon Henriksen46475692007-10-06 14:29:36 +0000659LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000660 return wrap(ConstantExpr::getSub(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000661 unwrap<Constant>(RHSConstant)));
662}
663
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000664LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant,
665 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000666 return wrap(ConstantExpr::getNSWSub(unwrap<Constant>(LHSConstant),
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000667 unwrap<Constant>(RHSConstant)));
668}
669
670LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant,
671 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000672 return wrap(ConstantExpr::getNUWSub(unwrap<Constant>(LHSConstant),
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000673 unwrap<Constant>(RHSConstant)));
674}
675
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000676LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
677 return wrap(ConstantExpr::getFSub(unwrap<Constant>(LHSConstant),
678 unwrap<Constant>(RHSConstant)));
679}
680
Gordon Henriksen46475692007-10-06 14:29:36 +0000681LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000682 return wrap(ConstantExpr::getMul(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000683 unwrap<Constant>(RHSConstant)));
684}
685
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000686LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant,
687 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000688 return wrap(ConstantExpr::getNSWMul(unwrap<Constant>(LHSConstant),
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000689 unwrap<Constant>(RHSConstant)));
690}
691
692LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant,
693 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000694 return wrap(ConstantExpr::getNUWMul(unwrap<Constant>(LHSConstant),
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000695 unwrap<Constant>(RHSConstant)));
696}
697
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000698LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000699 return wrap(ConstantExpr::getFMul(unwrap<Constant>(LHSConstant),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000700 unwrap<Constant>(RHSConstant)));
701}
702
Gordon Henriksen46475692007-10-06 14:29:36 +0000703LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000704 return wrap(ConstantExpr::getUDiv(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000705 unwrap<Constant>(RHSConstant)));
706}
707
708LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000709 return wrap(ConstantExpr::getSDiv(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000710 unwrap<Constant>(RHSConstant)));
711}
712
Dan Gohman6e7ad952009-09-03 23:34:49 +0000713LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant,
714 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000715 return wrap(ConstantExpr::getExactSDiv(unwrap<Constant>(LHSConstant),
Dan Gohman6e7ad952009-09-03 23:34:49 +0000716 unwrap<Constant>(RHSConstant)));
717}
718
Gordon Henriksen46475692007-10-06 14:29:36 +0000719LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000720 return wrap(ConstantExpr::getFDiv(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000721 unwrap<Constant>(RHSConstant)));
722}
723
724LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000725 return wrap(ConstantExpr::getURem(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000726 unwrap<Constant>(RHSConstant)));
727}
728
729LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000730 return wrap(ConstantExpr::getSRem(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000731 unwrap<Constant>(RHSConstant)));
732}
733
734LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000735 return wrap(ConstantExpr::getFRem(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000736 unwrap<Constant>(RHSConstant)));
737}
738
739LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000740 return wrap(ConstantExpr::getAnd(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000741 unwrap<Constant>(RHSConstant)));
742}
743
744LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000745 return wrap(ConstantExpr::getOr(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000746 unwrap<Constant>(RHSConstant)));
747}
748
749LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000750 return wrap(ConstantExpr::getXor(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000751 unwrap<Constant>(RHSConstant)));
752}
753
754LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
755 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000756 return wrap(ConstantExpr::getICmp(Predicate,
Gordon Henriksen46475692007-10-06 14:29:36 +0000757 unwrap<Constant>(LHSConstant),
758 unwrap<Constant>(RHSConstant)));
759}
760
761LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
762 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000763 return wrap(ConstantExpr::getFCmp(Predicate,
Gordon Henriksen46475692007-10-06 14:29:36 +0000764 unwrap<Constant>(LHSConstant),
765 unwrap<Constant>(RHSConstant)));
766}
767
768LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000769 return wrap(ConstantExpr::getShl(unwrap<Constant>(LHSConstant),
770 unwrap<Constant>(RHSConstant)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000771}
772
773LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000774 return wrap(ConstantExpr::getLShr(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000775 unwrap<Constant>(RHSConstant)));
776}
777
778LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000779 return wrap(ConstantExpr::getAShr(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000780 unwrap<Constant>(RHSConstant)));
781}
782
783LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
784 LLVMValueRef *ConstantIndices, unsigned NumIndices) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000785 return wrap(ConstantExpr::getGetElementPtr(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000786 unwrap<Constant>(ConstantIndices,
787 NumIndices),
788 NumIndices));
789}
790
Dan Gohman6e7ad952009-09-03 23:34:49 +0000791LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
792 LLVMValueRef *ConstantIndices,
793 unsigned NumIndices) {
794 Constant* Val = unwrap<Constant>(ConstantVal);
795 Constant** Idxs = unwrap<Constant>(ConstantIndices, NumIndices);
796 return wrap(ConstantExpr::getInBoundsGetElementPtr(Val, Idxs, NumIndices));
797}
798
Gordon Henriksen46475692007-10-06 14:29:36 +0000799LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000800 return wrap(ConstantExpr::getTrunc(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000801 unwrap(ToType)));
802}
803
804LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000805 return wrap(ConstantExpr::getSExt(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000806 unwrap(ToType)));
807}
808
809LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000810 return wrap(ConstantExpr::getZExt(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000811 unwrap(ToType)));
812}
813
814LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000815 return wrap(ConstantExpr::getFPTrunc(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000816 unwrap(ToType)));
817}
818
819LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000820 return wrap(ConstantExpr::getFPExtend(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000821 unwrap(ToType)));
822}
823
824LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000825 return wrap(ConstantExpr::getUIToFP(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000826 unwrap(ToType)));
827}
828
829LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000830 return wrap(ConstantExpr::getSIToFP(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000831 unwrap(ToType)));
832}
833
834LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000835 return wrap(ConstantExpr::getFPToUI(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000836 unwrap(ToType)));
837}
838
839LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000840 return wrap(ConstantExpr::getFPToSI(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000841 unwrap(ToType)));
842}
843
844LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000845 return wrap(ConstantExpr::getPtrToInt(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000846 unwrap(ToType)));
847}
848
849LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000850 return wrap(ConstantExpr::getIntToPtr(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000851 unwrap(ToType)));
852}
853
854LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000855 return wrap(ConstantExpr::getBitCast(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000856 unwrap(ToType)));
857}
858
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000859LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
860 LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000861 return wrap(ConstantExpr::getZExtOrBitCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000862 unwrap(ToType)));
863}
864
865LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
866 LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000867 return wrap(ConstantExpr::getSExtOrBitCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000868 unwrap(ToType)));
869}
870
871LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
872 LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000873 return wrap(ConstantExpr::getTruncOrBitCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000874 unwrap(ToType)));
875}
876
877LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
878 LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000879 return wrap(ConstantExpr::getPointerCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000880 unwrap(ToType)));
881}
882
883LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000884 LLVMBool isSigned) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000885 return wrap(ConstantExpr::getIntegerCast(unwrap<Constant>(ConstantVal),
886 unwrap(ToType), isSigned));
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000887}
888
889LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000890 return wrap(ConstantExpr::getFPCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000891 unwrap(ToType)));
892}
893
Gordon Henriksen46475692007-10-06 14:29:36 +0000894LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
895 LLVMValueRef ConstantIfTrue,
896 LLVMValueRef ConstantIfFalse) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000897 return wrap(ConstantExpr::getSelect(unwrap<Constant>(ConstantCondition),
Gordon Henriksen46475692007-10-06 14:29:36 +0000898 unwrap<Constant>(ConstantIfTrue),
899 unwrap<Constant>(ConstantIfFalse)));
900}
901
902LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
903 LLVMValueRef IndexConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000904 return wrap(ConstantExpr::getExtractElement(unwrap<Constant>(VectorConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000905 unwrap<Constant>(IndexConstant)));
906}
907
908LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
909 LLVMValueRef ElementValueConstant,
910 LLVMValueRef IndexConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000911 return wrap(ConstantExpr::getInsertElement(unwrap<Constant>(VectorConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000912 unwrap<Constant>(ElementValueConstant),
913 unwrap<Constant>(IndexConstant)));
914}
915
916LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
917 LLVMValueRef VectorBConstant,
918 LLVMValueRef MaskConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000919 return wrap(ConstantExpr::getShuffleVector(unwrap<Constant>(VectorAConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000920 unwrap<Constant>(VectorBConstant),
921 unwrap<Constant>(MaskConstant)));
922}
923
Dan Gohmanb5931172008-11-03 22:55:43 +0000924LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
925 unsigned NumIdx) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000926 return wrap(ConstantExpr::getExtractValue(unwrap<Constant>(AggConstant),
Jay Foadfc6d3a42011-07-13 10:26:04 +0000927 ArrayRef<unsigned>(IdxList,
928 NumIdx)));
Dan Gohmanb5931172008-11-03 22:55:43 +0000929}
930
931LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
932 LLVMValueRef ElementValueConstant,
933 unsigned *IdxList, unsigned NumIdx) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000934 return wrap(ConstantExpr::getInsertValue(unwrap<Constant>(AggConstant),
Dan Gohmanb5931172008-11-03 22:55:43 +0000935 unwrap<Constant>(ElementValueConstant),
Jay Foadfc6d3a42011-07-13 10:26:04 +0000936 ArrayRef<unsigned>(IdxList,
937 NumIdx)));
Dan Gohmanb5931172008-11-03 22:55:43 +0000938}
939
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000940LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
941 const char *Constraints,
942 LLVMBool HasSideEffects,
943 LLVMBool IsAlignStack) {
944 return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString,
Dale Johannesen8ba2d5b2009-10-21 23:28:00 +0000945 Constraints, HasSideEffects, IsAlignStack));
Chris Lattner851ba392008-12-17 21:39:50 +0000946}
947
Erick Tryzelaarc59286b2010-02-28 09:46:06 +0000948LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB) {
949 return wrap(BlockAddress::get(unwrap<Function>(F), unwrap(BB)));
950}
951
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000952/*--.. Operations on global variables, functions, and aliases (globals) ....--*/
953
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +0000954LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) {
955 return wrap(unwrap<GlobalValue>(Global)->getParent());
956}
957
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000958LLVMBool LLVMIsDeclaration(LLVMValueRef Global) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000959 return unwrap<GlobalValue>(Global)->isDeclaration();
960}
961
962LLVMLinkage LLVMGetLinkage(LLVMValueRef Global) {
Bill Wendling4aebcb42009-07-20 20:34:46 +0000963 switch (unwrap<GlobalValue>(Global)->getLinkage()) {
964 default:
965 assert(false && "Unhandled Linkage Type.");
966 case GlobalValue::ExternalLinkage:
967 return LLVMExternalLinkage;
968 case GlobalValue::AvailableExternallyLinkage:
969 return LLVMAvailableExternallyLinkage;
970 case GlobalValue::LinkOnceAnyLinkage:
971 return LLVMLinkOnceAnyLinkage;
972 case GlobalValue::LinkOnceODRLinkage:
973 return LLVMLinkOnceODRLinkage;
974 case GlobalValue::WeakAnyLinkage:
975 return LLVMWeakAnyLinkage;
976 case GlobalValue::WeakODRLinkage:
977 return LLVMWeakODRLinkage;
978 case GlobalValue::AppendingLinkage:
979 return LLVMAppendingLinkage;
980 case GlobalValue::InternalLinkage:
981 return LLVMInternalLinkage;
982 case GlobalValue::PrivateLinkage:
983 return LLVMPrivateLinkage;
984 case GlobalValue::LinkerPrivateLinkage:
985 return LLVMLinkerPrivateLinkage;
Bill Wendling5e721d72010-07-01 21:55:59 +0000986 case GlobalValue::LinkerPrivateWeakLinkage:
987 return LLVMLinkerPrivateWeakLinkage;
Bill Wendling55ae5152010-08-20 22:05:50 +0000988 case GlobalValue::LinkerPrivateWeakDefAutoLinkage:
989 return LLVMLinkerPrivateWeakDefAutoLinkage;
Bill Wendling4aebcb42009-07-20 20:34:46 +0000990 case GlobalValue::DLLImportLinkage:
991 return LLVMDLLImportLinkage;
992 case GlobalValue::DLLExportLinkage:
993 return LLVMDLLExportLinkage;
994 case GlobalValue::ExternalWeakLinkage:
995 return LLVMExternalWeakLinkage;
Bill Wendling4aebcb42009-07-20 20:34:46 +0000996 case GlobalValue::CommonLinkage:
997 return LLVMCommonLinkage;
998 }
999
1000 // Should never get here.
1001 return static_cast<LLVMLinkage>(0);
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001002}
1003
1004void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage) {
Bill Wendling4aebcb42009-07-20 20:34:46 +00001005 GlobalValue *GV = unwrap<GlobalValue>(Global);
1006
1007 switch (Linkage) {
1008 default:
1009 assert(false && "Unhandled Linkage Type.");
1010 case LLVMExternalLinkage:
1011 GV->setLinkage(GlobalValue::ExternalLinkage);
1012 break;
1013 case LLVMAvailableExternallyLinkage:
1014 GV->setLinkage(GlobalValue::AvailableExternallyLinkage);
1015 break;
1016 case LLVMLinkOnceAnyLinkage:
1017 GV->setLinkage(GlobalValue::LinkOnceAnyLinkage);
1018 break;
1019 case LLVMLinkOnceODRLinkage:
1020 GV->setLinkage(GlobalValue::LinkOnceODRLinkage);
1021 break;
1022 case LLVMWeakAnyLinkage:
1023 GV->setLinkage(GlobalValue::WeakAnyLinkage);
1024 break;
1025 case LLVMWeakODRLinkage:
1026 GV->setLinkage(GlobalValue::WeakODRLinkage);
1027 break;
1028 case LLVMAppendingLinkage:
1029 GV->setLinkage(GlobalValue::AppendingLinkage);
1030 break;
1031 case LLVMInternalLinkage:
1032 GV->setLinkage(GlobalValue::InternalLinkage);
1033 break;
1034 case LLVMPrivateLinkage:
1035 GV->setLinkage(GlobalValue::PrivateLinkage);
1036 break;
1037 case LLVMLinkerPrivateLinkage:
1038 GV->setLinkage(GlobalValue::LinkerPrivateLinkage);
1039 break;
Bill Wendling5e721d72010-07-01 21:55:59 +00001040 case LLVMLinkerPrivateWeakLinkage:
1041 GV->setLinkage(GlobalValue::LinkerPrivateWeakLinkage);
1042 break;
Bill Wendling55ae5152010-08-20 22:05:50 +00001043 case LLVMLinkerPrivateWeakDefAutoLinkage:
1044 GV->setLinkage(GlobalValue::LinkerPrivateWeakDefAutoLinkage);
1045 break;
Bill Wendling4aebcb42009-07-20 20:34:46 +00001046 case LLVMDLLImportLinkage:
1047 GV->setLinkage(GlobalValue::DLLImportLinkage);
1048 break;
1049 case LLVMDLLExportLinkage:
1050 GV->setLinkage(GlobalValue::DLLExportLinkage);
1051 break;
1052 case LLVMExternalWeakLinkage:
1053 GV->setLinkage(GlobalValue::ExternalWeakLinkage);
1054 break;
1055 case LLVMGhostLinkage:
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +00001056 DEBUG(errs()
1057 << "LLVMSetLinkage(): LLVMGhostLinkage is no longer supported.");
Bill Wendling4aebcb42009-07-20 20:34:46 +00001058 break;
1059 case LLVMCommonLinkage:
1060 GV->setLinkage(GlobalValue::CommonLinkage);
1061 break;
1062 }
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001063}
1064
1065const char *LLVMGetSection(LLVMValueRef Global) {
1066 return unwrap<GlobalValue>(Global)->getSection().c_str();
1067}
1068
1069void LLVMSetSection(LLVMValueRef Global, const char *Section) {
1070 unwrap<GlobalValue>(Global)->setSection(Section);
1071}
1072
1073LLVMVisibility LLVMGetVisibility(LLVMValueRef Global) {
1074 return static_cast<LLVMVisibility>(
1075 unwrap<GlobalValue>(Global)->getVisibility());
1076}
1077
1078void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz) {
1079 unwrap<GlobalValue>(Global)
1080 ->setVisibility(static_cast<GlobalValue::VisibilityTypes>(Viz));
1081}
1082
1083unsigned LLVMGetAlignment(LLVMValueRef Global) {
1084 return unwrap<GlobalValue>(Global)->getAlignment();
1085}
1086
1087void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes) {
1088 unwrap<GlobalValue>(Global)->setAlignment(Bytes);
1089}
1090
1091/*--.. Operations on global variables ......................................--*/
1092
1093LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) {
Owen Andersone9b11b42009-07-08 19:03:57 +00001094 return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
1095 GlobalValue::ExternalLinkage, 0, Name));
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001096}
1097
Erick Tryzelaar8e130b12010-02-28 09:46:13 +00001098LLVMValueRef LLVMAddGlobalInAddressSpace(LLVMModuleRef M, LLVMTypeRef Ty,
1099 const char *Name,
1100 unsigned AddressSpace) {
1101 return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
Duncan Sands6d521022010-03-02 11:18:43 +00001102 GlobalValue::ExternalLinkage, 0, Name, 0,
1103 false, AddressSpace));
Erick Tryzelaar8e130b12010-02-28 09:46:13 +00001104}
1105
Gordon Henriksen6d6203d2007-10-08 03:45:09 +00001106LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name) {
1107 return wrap(unwrap(M)->getNamedGlobal(Name));
1108}
1109
Gordon Henriksen34000972008-03-19 03:47:18 +00001110LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M) {
1111 Module *Mod = unwrap(M);
1112 Module::global_iterator I = Mod->global_begin();
1113 if (I == Mod->global_end())
1114 return 0;
1115 return wrap(I);
1116}
1117
1118LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M) {
1119 Module *Mod = unwrap(M);
1120 Module::global_iterator I = Mod->global_end();
1121 if (I == Mod->global_begin())
1122 return 0;
1123 return wrap(--I);
1124}
1125
1126LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar) {
1127 GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1128 Module::global_iterator I = GV;
1129 if (++I == GV->getParent()->global_end())
1130 return 0;
1131 return wrap(I);
1132}
1133
1134LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar) {
1135 GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1136 Module::global_iterator I = GV;
Gordon Henriksen4733be32008-03-23 22:21:29 +00001137 if (I == GV->getParent()->global_begin())
Gordon Henriksen34000972008-03-19 03:47:18 +00001138 return 0;
1139 return wrap(--I);
1140}
1141
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001142void LLVMDeleteGlobal(LLVMValueRef GlobalVar) {
1143 unwrap<GlobalVariable>(GlobalVar)->eraseFromParent();
1144}
1145
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001146LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar) {
Chris Lattner885dffc2009-10-12 04:01:02 +00001147 GlobalVariable* GV = unwrap<GlobalVariable>(GlobalVar);
1148 if ( !GV->hasInitializer() )
1149 return 0;
1150 return wrap(GV->getInitializer());
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001151}
1152
1153void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) {
1154 unwrap<GlobalVariable>(GlobalVar)
1155 ->setInitializer(unwrap<Constant>(ConstantVal));
1156}
1157
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001158LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001159 return unwrap<GlobalVariable>(GlobalVar)->isThreadLocal();
1160}
1161
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001162void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001163 unwrap<GlobalVariable>(GlobalVar)->setThreadLocal(IsThreadLocal != 0);
1164}
1165
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001166LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar) {
Gordon Henriksenc84c16b2007-10-07 17:31:42 +00001167 return unwrap<GlobalVariable>(GlobalVar)->isConstant();
1168}
1169
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001170void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant) {
Gordon Henriksenc84c16b2007-10-07 17:31:42 +00001171 unwrap<GlobalVariable>(GlobalVar)->setConstant(IsConstant != 0);
1172}
1173
Chris Lattner851ba392008-12-17 21:39:50 +00001174/*--.. Operations on aliases ......................................--*/
1175
1176LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
1177 const char *Name) {
1178 return wrap(new GlobalAlias(unwrap(Ty), GlobalValue::ExternalLinkage, Name,
1179 unwrap<Constant>(Aliasee), unwrap (M)));
1180}
1181
Gordon Henriksen46abf912007-09-26 20:56:12 +00001182/*--.. Operations on functions .............................................--*/
1183
1184LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
1185 LLVMTypeRef FunctionTy) {
Gabor Greif051a9502008-04-06 20:25:17 +00001186 return wrap(Function::Create(unwrap<FunctionType>(FunctionTy),
1187 GlobalValue::ExternalLinkage, Name, unwrap(M)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001188}
1189
Gordon Henriksen6d6203d2007-10-08 03:45:09 +00001190LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name) {
1191 return wrap(unwrap(M)->getFunction(Name));
1192}
1193
Gordon Henriksen34000972008-03-19 03:47:18 +00001194LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M) {
1195 Module *Mod = unwrap(M);
1196 Module::iterator I = Mod->begin();
1197 if (I == Mod->end())
1198 return 0;
1199 return wrap(I);
1200}
1201
1202LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) {
1203 Module *Mod = unwrap(M);
1204 Module::iterator I = Mod->end();
1205 if (I == Mod->begin())
1206 return 0;
1207 return wrap(--I);
1208}
1209
1210LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) {
1211 Function *Func = unwrap<Function>(Fn);
1212 Module::iterator I = Func;
1213 if (++I == Func->getParent()->end())
1214 return 0;
1215 return wrap(I);
1216}
1217
1218LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn) {
1219 Function *Func = unwrap<Function>(Fn);
1220 Module::iterator I = Func;
Gordon Henriksen4733be32008-03-23 22:21:29 +00001221 if (I == Func->getParent()->begin())
Gordon Henriksen34000972008-03-19 03:47:18 +00001222 return 0;
1223 return wrap(--I);
1224}
1225
Gordon Henriksen46abf912007-09-26 20:56:12 +00001226void LLVMDeleteFunction(LLVMValueRef Fn) {
1227 unwrap<Function>(Fn)->eraseFromParent();
1228}
1229
Gordon Henriksen46abf912007-09-26 20:56:12 +00001230unsigned LLVMGetIntrinsicID(LLVMValueRef Fn) {
1231 if (Function *F = dyn_cast<Function>(unwrap(Fn)))
1232 return F->getIntrinsicID();
1233 return 0;
1234}
1235
1236unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn) {
1237 return unwrap<Function>(Fn)->getCallingConv();
1238}
1239
1240void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) {
Sandeep Patel65c3c8f2009-09-02 08:44:58 +00001241 return unwrap<Function>(Fn)->setCallingConv(
1242 static_cast<CallingConv::ID>(CC));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001243}
1244
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001245const char *LLVMGetGC(LLVMValueRef Fn) {
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001246 Function *F = unwrap<Function>(Fn);
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001247 return F->hasGC()? F->getGC() : 0;
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001248}
1249
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001250void LLVMSetGC(LLVMValueRef Fn, const char *GC) {
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001251 Function *F = unwrap<Function>(Fn);
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001252 if (GC)
1253 F->setGC(GC);
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001254 else
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001255 F->clearGC();
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001256}
1257
Duncan Sandse149e992009-05-06 12:21:17 +00001258void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
1259 Function *Func = unwrap<Function>(Fn);
1260 const AttrListPtr PAL = Func->getAttributes();
Kenneth Uildriksf1ac0fd2010-02-16 19:28:02 +00001261 const AttrListPtr PALnew = PAL.addAttr(~0U, PA);
Duncan Sandse149e992009-05-06 12:21:17 +00001262 Func->setAttributes(PALnew);
1263}
1264
1265void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
1266 Function *Func = unwrap<Function>(Fn);
1267 const AttrListPtr PAL = Func->getAttributes();
Kenneth Uildriksf1ac0fd2010-02-16 19:28:02 +00001268 const AttrListPtr PALnew = PAL.removeAttr(~0U, PA);
Duncan Sandse149e992009-05-06 12:21:17 +00001269 Func->setAttributes(PALnew);
1270}
1271
Chris Lattner885dffc2009-10-12 04:01:02 +00001272LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn) {
1273 Function *Func = unwrap<Function>(Fn);
1274 const AttrListPtr PAL = Func->getAttributes();
1275 Attributes attr = PAL.getFnAttributes();
1276 return (LLVMAttribute)attr;
1277}
1278
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001279/*--.. Operations on parameters ............................................--*/
1280
1281unsigned LLVMCountParams(LLVMValueRef FnRef) {
1282 // This function is strictly redundant to
1283 // LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef)))
Dan Gohman4d515d02008-06-21 22:06:54 +00001284 return unwrap<Function>(FnRef)->arg_size();
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001285}
1286
1287void LLVMGetParams(LLVMValueRef FnRef, LLVMValueRef *ParamRefs) {
1288 Function *Fn = unwrap<Function>(FnRef);
1289 for (Function::arg_iterator I = Fn->arg_begin(),
1290 E = Fn->arg_end(); I != E; I++)
1291 *ParamRefs++ = wrap(I);
1292}
1293
1294LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) {
1295 Function::arg_iterator AI = unwrap<Function>(FnRef)->arg_begin();
1296 while (index --> 0)
1297 AI++;
1298 return wrap(AI);
1299}
1300
1301LLVMValueRef LLVMGetParamParent(LLVMValueRef V) {
1302 return wrap(unwrap<Argument>(V)->getParent());
1303}
1304
Gordon Henriksen4733be32008-03-23 22:21:29 +00001305LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn) {
1306 Function *Func = unwrap<Function>(Fn);
1307 Function::arg_iterator I = Func->arg_begin();
1308 if (I == Func->arg_end())
1309 return 0;
1310 return wrap(I);
1311}
1312
1313LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn) {
1314 Function *Func = unwrap<Function>(Fn);
1315 Function::arg_iterator I = Func->arg_end();
1316 if (I == Func->arg_begin())
1317 return 0;
1318 return wrap(--I);
1319}
1320
1321LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg) {
1322 Argument *A = unwrap<Argument>(Arg);
1323 Function::arg_iterator I = A;
1324 if (++I == A->getParent()->arg_end())
1325 return 0;
1326 return wrap(I);
1327}
1328
1329LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg) {
1330 Argument *A = unwrap<Argument>(Arg);
1331 Function::arg_iterator I = A;
1332 if (I == A->getParent()->arg_begin())
1333 return 0;
1334 return wrap(--I);
1335}
1336
Devang Patel05988662008-09-25 21:00:45 +00001337void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001338 unwrap<Argument>(Arg)->addAttr(PA);
1339}
1340
Devang Patel05988662008-09-25 21:00:45 +00001341void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001342 unwrap<Argument>(Arg)->removeAttr(PA);
1343}
1344
Chris Lattner885dffc2009-10-12 04:01:02 +00001345LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg) {
1346 Argument *A = unwrap<Argument>(Arg);
1347 Attributes attr = A->getParent()->getAttributes().getParamAttributes(
1348 A->getArgNo()+1);
1349 return (LLVMAttribute)attr;
1350}
1351
1352
Gordon Henriksene2435da2008-04-28 17:37:06 +00001353void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) {
1354 unwrap<Argument>(Arg)->addAttr(
Devang Patel05988662008-09-25 21:00:45 +00001355 Attribute::constructAlignmentFromInt(align));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001356}
1357
Gordon Henriksen46abf912007-09-26 20:56:12 +00001358/*--.. Operations on basic blocks ..........................................--*/
1359
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001360LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB) {
1361 return wrap(static_cast<Value*>(unwrap(BB)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001362}
1363
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001364LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val) {
Gordon Henriksen46abf912007-09-26 20:56:12 +00001365 return isa<BasicBlock>(unwrap(Val));
1366}
1367
1368LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val) {
1369 return wrap(unwrap<BasicBlock>(Val));
1370}
1371
Gordon Henriksen4733be32008-03-23 22:21:29 +00001372LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB) {
1373 return wrap(unwrap(BB)->getParent());
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001374}
1375
Gordon Henriksen46abf912007-09-26 20:56:12 +00001376unsigned LLVMCountBasicBlocks(LLVMValueRef FnRef) {
Dan Gohman4d515d02008-06-21 22:06:54 +00001377 return unwrap<Function>(FnRef)->size();
Gordon Henriksen46abf912007-09-26 20:56:12 +00001378}
1379
1380void LLVMGetBasicBlocks(LLVMValueRef FnRef, LLVMBasicBlockRef *BasicBlocksRefs){
1381 Function *Fn = unwrap<Function>(FnRef);
1382 for (Function::iterator I = Fn->begin(), E = Fn->end(); I != E; I++)
1383 *BasicBlocksRefs++ = wrap(I);
1384}
1385
1386LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn) {
1387 return wrap(&unwrap<Function>(Fn)->getEntryBlock());
1388}
1389
Gordon Henriksen34000972008-03-19 03:47:18 +00001390LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn) {
1391 Function *Func = unwrap<Function>(Fn);
1392 Function::iterator I = Func->begin();
1393 if (I == Func->end())
1394 return 0;
1395 return wrap(I);
1396}
1397
1398LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn) {
1399 Function *Func = unwrap<Function>(Fn);
1400 Function::iterator I = Func->end();
1401 if (I == Func->begin())
1402 return 0;
1403 return wrap(--I);
1404}
1405
1406LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB) {
1407 BasicBlock *Block = unwrap(BB);
1408 Function::iterator I = Block;
1409 if (++I == Block->getParent()->end())
1410 return 0;
1411 return wrap(I);
1412}
1413
1414LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB) {
1415 BasicBlock *Block = unwrap(BB);
1416 Function::iterator I = Block;
1417 if (I == Block->getParent()->begin())
1418 return 0;
1419 return wrap(--I);
1420}
1421
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001422LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
1423 LLVMValueRef FnRef,
1424 const char *Name) {
1425 return wrap(BasicBlock::Create(*unwrap(C), Name, unwrap<Function>(FnRef)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001426}
1427
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001428LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef FnRef, const char *Name) {
1429 return LLVMAppendBasicBlockInContext(LLVMGetGlobalContext(), FnRef, Name);
1430}
1431
1432LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
1433 LLVMBasicBlockRef BBRef,
1434 const char *Name) {
1435 BasicBlock *BB = unwrap(BBRef);
1436 return wrap(BasicBlock::Create(*unwrap(C), Name, BB->getParent(), BB));
1437}
1438
1439LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef BBRef,
Gordon Henriksen46abf912007-09-26 20:56:12 +00001440 const char *Name) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001441 return LLVMInsertBasicBlockInContext(LLVMGetGlobalContext(), BBRef, Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +00001442}
1443
1444void LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef) {
1445 unwrap(BBRef)->eraseFromParent();
1446}
1447
Duncan Sands837a0c32010-07-19 15:31:07 +00001448void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) {
1449 unwrap(BB)->moveBefore(unwrap(MovePos));
1450}
1451
1452void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) {
1453 unwrap(BB)->moveAfter(unwrap(MovePos));
1454}
1455
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001456/*--.. Operations on instructions ..........................................--*/
1457
1458LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst) {
1459 return wrap(unwrap<Instruction>(Inst)->getParent());
1460}
1461
Gordon Henriksen34000972008-03-19 03:47:18 +00001462LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB) {
1463 BasicBlock *Block = unwrap(BB);
1464 BasicBlock::iterator I = Block->begin();
1465 if (I == Block->end())
1466 return 0;
1467 return wrap(I);
1468}
1469
1470LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB) {
1471 BasicBlock *Block = unwrap(BB);
1472 BasicBlock::iterator I = Block->end();
1473 if (I == Block->begin())
1474 return 0;
1475 return wrap(--I);
1476}
1477
1478LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst) {
1479 Instruction *Instr = unwrap<Instruction>(Inst);
1480 BasicBlock::iterator I = Instr;
1481 if (++I == Instr->getParent()->end())
1482 return 0;
1483 return wrap(I);
1484}
1485
1486LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst) {
1487 Instruction *Instr = unwrap<Instruction>(Inst);
1488 BasicBlock::iterator I = Instr;
1489 if (I == Instr->getParent()->begin())
1490 return 0;
1491 return wrap(--I);
1492}
1493
Gordon Henriksen46abf912007-09-26 20:56:12 +00001494/*--.. Call and invoke instructions ........................................--*/
1495
1496unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) {
1497 Value *V = unwrap(Instr);
1498 if (CallInst *CI = dyn_cast<CallInst>(V))
1499 return CI->getCallingConv();
1500 else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
1501 return II->getCallingConv();
Torok Edwinc23197a2009-07-14 16:55:14 +00001502 llvm_unreachable("LLVMGetInstructionCallConv applies only to call and invoke!");
Gordon Henriksen46abf912007-09-26 20:56:12 +00001503 return 0;
1504}
1505
1506void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC) {
1507 Value *V = unwrap(Instr);
1508 if (CallInst *CI = dyn_cast<CallInst>(V))
Sandeep Patel65c3c8f2009-09-02 08:44:58 +00001509 return CI->setCallingConv(static_cast<CallingConv::ID>(CC));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001510 else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
Sandeep Patel65c3c8f2009-09-02 08:44:58 +00001511 return II->setCallingConv(static_cast<CallingConv::ID>(CC));
Torok Edwinc23197a2009-07-14 16:55:14 +00001512 llvm_unreachable("LLVMSetInstructionCallConv applies only to call and invoke!");
Gordon Henriksen46abf912007-09-26 20:56:12 +00001513}
1514
Devang Patel05988662008-09-25 21:00:45 +00001515void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index,
1516 LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001517 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Devang Patel05988662008-09-25 21:00:45 +00001518 Call.setAttributes(
1519 Call.getAttributes().addAttr(index, PA));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001520}
1521
Devang Patel05988662008-09-25 21:00:45 +00001522void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
1523 LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001524 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Devang Patel05988662008-09-25 21:00:45 +00001525 Call.setAttributes(
1526 Call.getAttributes().removeAttr(index, PA));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001527}
1528
1529void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
1530 unsigned align) {
1531 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Devang Patel05988662008-09-25 21:00:45 +00001532 Call.setAttributes(
1533 Call.getAttributes().addAttr(index,
1534 Attribute::constructAlignmentFromInt(align)));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001535}
1536
Gordon Henriksen07cabf62008-08-30 16:34:54 +00001537/*--.. Operations on call instructions (only) ..............................--*/
1538
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001539LLVMBool LLVMIsTailCall(LLVMValueRef Call) {
Gordon Henriksen07cabf62008-08-30 16:34:54 +00001540 return unwrap<CallInst>(Call)->isTailCall();
1541}
1542
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001543void LLVMSetTailCall(LLVMValueRef Call, LLVMBool isTailCall) {
Gordon Henriksen07cabf62008-08-30 16:34:54 +00001544 unwrap<CallInst>(Call)->setTailCall(isTailCall);
1545}
1546
Gordon Henriksen2618a6c2007-10-08 18:14:39 +00001547/*--.. Operations on phi nodes .............................................--*/
1548
1549void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
1550 LLVMBasicBlockRef *IncomingBlocks, unsigned Count) {
1551 PHINode *PhiVal = unwrap<PHINode>(PhiNode);
1552 for (unsigned I = 0; I != Count; ++I)
1553 PhiVal->addIncoming(unwrap(IncomingValues[I]), unwrap(IncomingBlocks[I]));
1554}
1555
1556unsigned LLVMCountIncoming(LLVMValueRef PhiNode) {
1557 return unwrap<PHINode>(PhiNode)->getNumIncomingValues();
1558}
1559
1560LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index) {
1561 return wrap(unwrap<PHINode>(PhiNode)->getIncomingValue(Index));
1562}
1563
1564LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index) {
1565 return wrap(unwrap<PHINode>(PhiNode)->getIncomingBlock(Index));
1566}
1567
Gordon Henriksen46abf912007-09-26 20:56:12 +00001568
1569/*===-- Instruction builders ----------------------------------------------===*/
1570
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001571LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C) {
1572 return wrap(new IRBuilder<>(*unwrap(C)));
1573}
1574
Gordon Henriksen16c1f442008-05-04 12:55:34 +00001575LLVMBuilderRef LLVMCreateBuilder(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001576 return LLVMCreateBuilderInContext(LLVMGetGlobalContext());
Gordon Henriksen46abf912007-09-26 20:56:12 +00001577}
1578
Gordon Henriksen34000972008-03-19 03:47:18 +00001579void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
1580 LLVMValueRef Instr) {
1581 BasicBlock *BB = unwrap(Block);
1582 Instruction *I = Instr? unwrap<Instruction>(Instr) : (Instruction*) BB->end();
1583 unwrap(Builder)->SetInsertPoint(BB, I);
1584}
1585
Gordon Henriksen46abf912007-09-26 20:56:12 +00001586void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1587 Instruction *I = unwrap<Instruction>(Instr);
1588 unwrap(Builder)->SetInsertPoint(I->getParent(), I);
1589}
1590
1591void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block) {
1592 BasicBlock *BB = unwrap(Block);
1593 unwrap(Builder)->SetInsertPoint(BB);
1594}
1595
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001596LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder) {
1597 return wrap(unwrap(Builder)->GetInsertBlock());
1598}
1599
Chris Lattner851ba392008-12-17 21:39:50 +00001600void LLVMClearInsertionPosition(LLVMBuilderRef Builder) {
Chris Lattnera41b9152010-04-01 06:31:45 +00001601 unwrap(Builder)->ClearInsertionPoint();
Chris Lattner851ba392008-12-17 21:39:50 +00001602}
1603
1604void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1605 unwrap(Builder)->Insert(unwrap<Instruction>(Instr));
1606}
1607
Erick Tryzelaar5c1c2082009-08-16 02:20:57 +00001608void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
1609 const char *Name) {
1610 unwrap(Builder)->Insert(unwrap<Instruction>(Instr), Name);
1611}
1612
Gordon Henriksen46abf912007-09-26 20:56:12 +00001613void LLVMDisposeBuilder(LLVMBuilderRef Builder) {
1614 delete unwrap(Builder);
1615}
1616
Erick Tryzelaar46c80e02010-02-28 09:45:59 +00001617/*--.. Metadata builders ...................................................--*/
1618
1619void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L) {
Chris Lattnera41b9152010-04-01 06:31:45 +00001620 MDNode *Loc = L ? unwrap<MDNode>(L) : NULL;
Chris Lattner84e679b2010-04-02 20:21:22 +00001621 unwrap(Builder)->SetCurrentDebugLocation(DebugLoc::getFromDILocation(Loc));
Erick Tryzelaar46c80e02010-02-28 09:45:59 +00001622}
1623
1624LLVMValueRef LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder) {
Chris Lattnera41b9152010-04-01 06:31:45 +00001625 return wrap(unwrap(Builder)->getCurrentDebugLocation()
1626 .getAsMDNode(unwrap(Builder)->getContext()));
Erick Tryzelaar46c80e02010-02-28 09:45:59 +00001627}
1628
1629void LLVMSetInstDebugLocation(LLVMBuilderRef Builder, LLVMValueRef Inst) {
1630 unwrap(Builder)->SetInstDebugLocation(unwrap<Instruction>(Inst));
1631}
1632
1633
Gordon Henriksen46abf912007-09-26 20:56:12 +00001634/*--.. Instruction builders ................................................--*/
1635
1636LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef B) {
1637 return wrap(unwrap(B)->CreateRetVoid());
1638}
1639
1640LLVMValueRef LLVMBuildRet(LLVMBuilderRef B, LLVMValueRef V) {
1641 return wrap(unwrap(B)->CreateRet(unwrap(V)));
1642}
1643
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001644LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef B, LLVMValueRef *RetVals,
1645 unsigned N) {
1646 return wrap(unwrap(B)->CreateAggregateRet(unwrap(RetVals), N));
1647}
1648
Gordon Henriksen46abf912007-09-26 20:56:12 +00001649LLVMValueRef LLVMBuildBr(LLVMBuilderRef B, LLVMBasicBlockRef Dest) {
1650 return wrap(unwrap(B)->CreateBr(unwrap(Dest)));
1651}
1652
1653LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef B, LLVMValueRef If,
1654 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else) {
1655 return wrap(unwrap(B)->CreateCondBr(unwrap(If), unwrap(Then), unwrap(Else)));
1656}
1657
1658LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef B, LLVMValueRef V,
1659 LLVMBasicBlockRef Else, unsigned NumCases) {
1660 return wrap(unwrap(B)->CreateSwitch(unwrap(V), unwrap(Else), NumCases));
1661}
1662
Erick Tryzelaarc59286b2010-02-28 09:46:06 +00001663LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
1664 unsigned NumDests) {
1665 return wrap(unwrap(B)->CreateIndirectBr(unwrap(Addr), NumDests));
1666}
1667
Gordon Henriksen46abf912007-09-26 20:56:12 +00001668LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
1669 LLVMValueRef *Args, unsigned NumArgs,
1670 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
1671 const char *Name) {
1672 return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch),
1673 unwrap(Args), unwrap(Args) + NumArgs,
1674 Name));
1675}
1676
1677LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef B) {
1678 return wrap(unwrap(B)->CreateUnwind());
1679}
1680
1681LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) {
1682 return wrap(unwrap(B)->CreateUnreachable());
1683}
1684
Gordon Henriksenab477cc2008-01-01 05:50:53 +00001685void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
1686 LLVMBasicBlockRef Dest) {
1687 unwrap<SwitchInst>(Switch)->addCase(unwrap<ConstantInt>(OnVal), unwrap(Dest));
1688}
1689
Erick Tryzelaarc59286b2010-02-28 09:46:06 +00001690void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest) {
1691 unwrap<IndirectBrInst>(IndirectBr)->addDestination(unwrap(Dest));
1692}
1693
Gordon Henriksen46abf912007-09-26 20:56:12 +00001694/*--.. Arithmetic ..........................................................--*/
1695
1696LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1697 const char *Name) {
1698 return wrap(unwrap(B)->CreateAdd(unwrap(LHS), unwrap(RHS), Name));
1699}
1700
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001701LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1702 const char *Name) {
1703 return wrap(unwrap(B)->CreateNSWAdd(unwrap(LHS), unwrap(RHS), Name));
1704}
1705
Erick Tryzelaar19f047f2010-02-28 05:51:43 +00001706LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1707 const char *Name) {
1708 return wrap(unwrap(B)->CreateNUWAdd(unwrap(LHS), unwrap(RHS), Name));
1709}
1710
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001711LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1712 const char *Name) {
1713 return wrap(unwrap(B)->CreateFAdd(unwrap(LHS), unwrap(RHS), Name));
1714}
1715
Gordon Henriksen46abf912007-09-26 20:56:12 +00001716LLVMValueRef LLVMBuildSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1717 const char *Name) {
1718 return wrap(unwrap(B)->CreateSub(unwrap(LHS), unwrap(RHS), Name));
1719}
1720
Erick Tryzelaar19f047f2010-02-28 05:51:43 +00001721LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1722 const char *Name) {
1723 return wrap(unwrap(B)->CreateNSWSub(unwrap(LHS), unwrap(RHS), Name));
1724}
1725
1726LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1727 const char *Name) {
1728 return wrap(unwrap(B)->CreateNUWSub(unwrap(LHS), unwrap(RHS), Name));
1729}
1730
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001731LLVMValueRef LLVMBuildFSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1732 const char *Name) {
1733 return wrap(unwrap(B)->CreateFSub(unwrap(LHS), unwrap(RHS), Name));
1734}
1735
Gordon Henriksen46abf912007-09-26 20:56:12 +00001736LLVMValueRef LLVMBuildMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1737 const char *Name) {
1738 return wrap(unwrap(B)->CreateMul(unwrap(LHS), unwrap(RHS), Name));
1739}
1740
Erick Tryzelaar19f047f2010-02-28 05:51:43 +00001741LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1742 const char *Name) {
1743 return wrap(unwrap(B)->CreateNSWMul(unwrap(LHS), unwrap(RHS), Name));
1744}
1745
1746LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1747 const char *Name) {
1748 return wrap(unwrap(B)->CreateNUWMul(unwrap(LHS), unwrap(RHS), Name));
1749}
1750
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001751LLVMValueRef LLVMBuildFMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1752 const char *Name) {
1753 return wrap(unwrap(B)->CreateFMul(unwrap(LHS), unwrap(RHS), Name));
1754}
1755
Gordon Henriksen46abf912007-09-26 20:56:12 +00001756LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1757 const char *Name) {
1758 return wrap(unwrap(B)->CreateUDiv(unwrap(LHS), unwrap(RHS), Name));
1759}
1760
1761LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1762 const char *Name) {
1763 return wrap(unwrap(B)->CreateSDiv(unwrap(LHS), unwrap(RHS), Name));
1764}
1765
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001766LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef B, LLVMValueRef LHS,
1767 LLVMValueRef RHS, const char *Name) {
1768 return wrap(unwrap(B)->CreateExactSDiv(unwrap(LHS), unwrap(RHS), Name));
1769}
1770
Gordon Henriksen46abf912007-09-26 20:56:12 +00001771LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1772 const char *Name) {
1773 return wrap(unwrap(B)->CreateFDiv(unwrap(LHS), unwrap(RHS), Name));
1774}
1775
1776LLVMValueRef LLVMBuildURem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1777 const char *Name) {
1778 return wrap(unwrap(B)->CreateURem(unwrap(LHS), unwrap(RHS), Name));
1779}
1780
1781LLVMValueRef LLVMBuildSRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1782 const char *Name) {
1783 return wrap(unwrap(B)->CreateSRem(unwrap(LHS), unwrap(RHS), Name));
1784}
1785
1786LLVMValueRef LLVMBuildFRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1787 const char *Name) {
1788 return wrap(unwrap(B)->CreateFRem(unwrap(LHS), unwrap(RHS), Name));
1789}
1790
1791LLVMValueRef LLVMBuildShl(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1792 const char *Name) {
1793 return wrap(unwrap(B)->CreateShl(unwrap(LHS), unwrap(RHS), Name));
1794}
1795
1796LLVMValueRef LLVMBuildLShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1797 const char *Name) {
1798 return wrap(unwrap(B)->CreateLShr(unwrap(LHS), unwrap(RHS), Name));
1799}
1800
1801LLVMValueRef LLVMBuildAShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1802 const char *Name) {
1803 return wrap(unwrap(B)->CreateAShr(unwrap(LHS), unwrap(RHS), Name));
1804}
1805
1806LLVMValueRef LLVMBuildAnd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1807 const char *Name) {
1808 return wrap(unwrap(B)->CreateAnd(unwrap(LHS), unwrap(RHS), Name));
1809}
1810
1811LLVMValueRef LLVMBuildOr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1812 const char *Name) {
1813 return wrap(unwrap(B)->CreateOr(unwrap(LHS), unwrap(RHS), Name));
1814}
1815
1816LLVMValueRef LLVMBuildXor(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1817 const char *Name) {
1818 return wrap(unwrap(B)->CreateXor(unwrap(LHS), unwrap(RHS), Name));
1819}
1820
Erick Tryzelaarabbcc5e2010-02-28 05:51:27 +00001821LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op,
1822 LLVMValueRef LHS, LLVMValueRef RHS,
1823 const char *Name) {
1824 return wrap(unwrap(B)->CreateBinOp(Instruction::BinaryOps(Op), unwrap(LHS),
1825 unwrap(RHS), Name));
1826}
1827
Gordon Henriksen46abf912007-09-26 20:56:12 +00001828LLVMValueRef LLVMBuildNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1829 return wrap(unwrap(B)->CreateNeg(unwrap(V), Name));
1830}
1831
Erick Tryzelaar19f047f2010-02-28 05:51:43 +00001832LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
1833 const char *Name) {
1834 return wrap(unwrap(B)->CreateNSWNeg(unwrap(V), Name));
1835}
1836
1837LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V,
1838 const char *Name) {
1839 return wrap(unwrap(B)->CreateNUWNeg(unwrap(V), Name));
1840}
1841
Dan Gohmand0c5a292009-09-28 21:51:41 +00001842LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1843 return wrap(unwrap(B)->CreateFNeg(unwrap(V), Name));
1844}
1845
Gordon Henriksen46abf912007-09-26 20:56:12 +00001846LLVMValueRef LLVMBuildNot(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1847 return wrap(unwrap(B)->CreateNot(unwrap(V), Name));
1848}
1849
1850/*--.. Memory ..............................................................--*/
1851
1852LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
1853 const char *Name) {
Victor Hernandez9d0b7042009-11-07 00:16:28 +00001854 const Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext());
1855 Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty));
1856 AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy);
1857 Instruction* Malloc = CallInst::CreateMalloc(unwrap(B)->GetInsertBlock(),
1858 ITy, unwrap(Ty), AllocSize,
1859 0, 0, "");
1860 return wrap(unwrap(B)->Insert(Malloc, Twine(Name)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001861}
1862
1863LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
1864 LLVMValueRef Val, const char *Name) {
Victor Hernandez9d0b7042009-11-07 00:16:28 +00001865 const Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext());
1866 Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty));
1867 AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy);
1868 Instruction* Malloc = CallInst::CreateMalloc(unwrap(B)->GetInsertBlock(),
1869 ITy, unwrap(Ty), AllocSize,
1870 unwrap(Val), 0, "");
1871 return wrap(unwrap(B)->Insert(Malloc, Twine(Name)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001872}
1873
1874LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
1875 const char *Name) {
1876 return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), 0, Name));
1877}
1878
1879LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
1880 LLVMValueRef Val, const char *Name) {
1881 return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), unwrap(Val), Name));
1882}
1883
1884LLVMValueRef LLVMBuildFree(LLVMBuilderRef B, LLVMValueRef PointerVal) {
Victor Hernandez046e78c2009-10-26 23:43:48 +00001885 return wrap(unwrap(B)->Insert(
1886 CallInst::CreateFree(unwrap(PointerVal), unwrap(B)->GetInsertBlock())));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001887}
1888
1889
1890LLVMValueRef LLVMBuildLoad(LLVMBuilderRef B, LLVMValueRef PointerVal,
1891 const char *Name) {
1892 return wrap(unwrap(B)->CreateLoad(unwrap(PointerVal), Name));
1893}
1894
1895LLVMValueRef LLVMBuildStore(LLVMBuilderRef B, LLVMValueRef Val,
1896 LLVMValueRef PointerVal) {
1897 return wrap(unwrap(B)->CreateStore(unwrap(Val), unwrap(PointerVal)));
1898}
1899
1900LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1901 LLVMValueRef *Indices, unsigned NumIndices,
1902 const char *Name) {
1903 return wrap(unwrap(B)->CreateGEP(unwrap(Pointer), unwrap(Indices),
1904 unwrap(Indices) + NumIndices, Name));
1905}
1906
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001907LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1908 LLVMValueRef *Indices, unsigned NumIndices,
1909 const char *Name) {
1910 return wrap(unwrap(B)->CreateInBoundsGEP(unwrap(Pointer), unwrap(Indices),
1911 unwrap(Indices) + NumIndices, Name));
1912}
1913
1914LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1915 unsigned Idx, const char *Name) {
1916 return wrap(unwrap(B)->CreateStructGEP(unwrap(Pointer), Idx, Name));
1917}
1918
1919LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
1920 const char *Name) {
1921 return wrap(unwrap(B)->CreateGlobalString(Str, Name));
1922}
1923
1924LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
1925 const char *Name) {
1926 return wrap(unwrap(B)->CreateGlobalStringPtr(Str, Name));
1927}
1928
Gordon Henriksen46abf912007-09-26 20:56:12 +00001929/*--.. Casts ...............................................................--*/
1930
1931LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef B, LLVMValueRef Val,
1932 LLVMTypeRef DestTy, const char *Name) {
1933 return wrap(unwrap(B)->CreateTrunc(unwrap(Val), unwrap(DestTy), Name));
1934}
1935
1936LLVMValueRef LLVMBuildZExt(LLVMBuilderRef B, LLVMValueRef Val,
1937 LLVMTypeRef DestTy, const char *Name) {
1938 return wrap(unwrap(B)->CreateZExt(unwrap(Val), unwrap(DestTy), Name));
1939}
1940
1941LLVMValueRef LLVMBuildSExt(LLVMBuilderRef B, LLVMValueRef Val,
1942 LLVMTypeRef DestTy, const char *Name) {
1943 return wrap(unwrap(B)->CreateSExt(unwrap(Val), unwrap(DestTy), Name));
1944}
1945
1946LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef B, LLVMValueRef Val,
1947 LLVMTypeRef DestTy, const char *Name) {
1948 return wrap(unwrap(B)->CreateFPToUI(unwrap(Val), unwrap(DestTy), Name));
1949}
1950
1951LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef B, LLVMValueRef Val,
1952 LLVMTypeRef DestTy, const char *Name) {
1953 return wrap(unwrap(B)->CreateFPToSI(unwrap(Val), unwrap(DestTy), Name));
1954}
1955
1956LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef B, LLVMValueRef Val,
1957 LLVMTypeRef DestTy, const char *Name) {
1958 return wrap(unwrap(B)->CreateUIToFP(unwrap(Val), unwrap(DestTy), Name));
1959}
1960
1961LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef B, LLVMValueRef Val,
1962 LLVMTypeRef DestTy, const char *Name) {
1963 return wrap(unwrap(B)->CreateSIToFP(unwrap(Val), unwrap(DestTy), Name));
1964}
1965
1966LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef B, LLVMValueRef Val,
1967 LLVMTypeRef DestTy, const char *Name) {
1968 return wrap(unwrap(B)->CreateFPTrunc(unwrap(Val), unwrap(DestTy), Name));
1969}
1970
1971LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef B, LLVMValueRef Val,
1972 LLVMTypeRef DestTy, const char *Name) {
1973 return wrap(unwrap(B)->CreateFPExt(unwrap(Val), unwrap(DestTy), Name));
1974}
1975
1976LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef B, LLVMValueRef Val,
1977 LLVMTypeRef DestTy, const char *Name) {
1978 return wrap(unwrap(B)->CreatePtrToInt(unwrap(Val), unwrap(DestTy), Name));
1979}
1980
1981LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef B, LLVMValueRef Val,
1982 LLVMTypeRef DestTy, const char *Name) {
1983 return wrap(unwrap(B)->CreateIntToPtr(unwrap(Val), unwrap(DestTy), Name));
1984}
1985
1986LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef B, LLVMValueRef Val,
1987 LLVMTypeRef DestTy, const char *Name) {
1988 return wrap(unwrap(B)->CreateBitCast(unwrap(Val), unwrap(DestTy), Name));
1989}
1990
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001991LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
1992 LLVMTypeRef DestTy, const char *Name) {
1993 return wrap(unwrap(B)->CreateZExtOrBitCast(unwrap(Val), unwrap(DestTy),
1994 Name));
1995}
1996
1997LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
1998 LLVMTypeRef DestTy, const char *Name) {
1999 return wrap(unwrap(B)->CreateSExtOrBitCast(unwrap(Val), unwrap(DestTy),
2000 Name));
2001}
2002
2003LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2004 LLVMTypeRef DestTy, const char *Name) {
2005 return wrap(unwrap(B)->CreateTruncOrBitCast(unwrap(Val), unwrap(DestTy),
2006 Name));
2007}
2008
Erick Tryzelaarabbcc5e2010-02-28 05:51:27 +00002009LLVMValueRef LLVMBuildCast(LLVMBuilderRef B, LLVMOpcode Op, LLVMValueRef Val,
2010 LLVMTypeRef DestTy, const char *Name) {
2011 return wrap(unwrap(B)->CreateCast(Instruction::CastOps(Op), unwrap(Val),
2012 unwrap(DestTy), Name));
2013}
2014
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00002015LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef B, LLVMValueRef Val,
2016 LLVMTypeRef DestTy, const char *Name) {
2017 return wrap(unwrap(B)->CreatePointerCast(unwrap(Val), unwrap(DestTy), Name));
2018}
2019
2020LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef B, LLVMValueRef Val,
Duncan Sandse8e01b62009-11-23 10:49:03 +00002021 LLVMTypeRef DestTy, const char *Name) {
2022 return wrap(unwrap(B)->CreateIntCast(unwrap(Val), unwrap(DestTy),
2023 /*isSigned*/true, Name));
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00002024}
2025
2026LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef B, LLVMValueRef Val,
2027 LLVMTypeRef DestTy, const char *Name) {
2028 return wrap(unwrap(B)->CreateFPCast(unwrap(Val), unwrap(DestTy), Name));
2029}
2030
Gordon Henriksen46abf912007-09-26 20:56:12 +00002031/*--.. Comparisons .........................................................--*/
2032
2033LLVMValueRef LLVMBuildICmp(LLVMBuilderRef B, LLVMIntPredicate Op,
2034 LLVMValueRef LHS, LLVMValueRef RHS,
2035 const char *Name) {
2036 return wrap(unwrap(B)->CreateICmp(static_cast<ICmpInst::Predicate>(Op),
2037 unwrap(LHS), unwrap(RHS), Name));
2038}
2039
2040LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef B, LLVMRealPredicate Op,
2041 LLVMValueRef LHS, LLVMValueRef RHS,
2042 const char *Name) {
2043 return wrap(unwrap(B)->CreateFCmp(static_cast<FCmpInst::Predicate>(Op),
2044 unwrap(LHS), unwrap(RHS), Name));
2045}
2046
2047/*--.. Miscellaneous instructions ..........................................--*/
2048
2049LLVMValueRef LLVMBuildPhi(LLVMBuilderRef B, LLVMTypeRef Ty, const char *Name) {
Jay Foad3ecfc862011-03-30 11:28:46 +00002050 return wrap(unwrap(B)->CreatePHI(unwrap(Ty), 0, Name));
Gordon Henriksen46abf912007-09-26 20:56:12 +00002051}
2052
2053LLVMValueRef LLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn,
2054 LLVMValueRef *Args, unsigned NumArgs,
2055 const char *Name) {
2056 return wrap(unwrap(B)->CreateCall(unwrap(Fn), unwrap(Args),
2057 unwrap(Args) + NumArgs, Name));
2058}
2059
2060LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If,
2061 LLVMValueRef Then, LLVMValueRef Else,
2062 const char *Name) {
2063 return wrap(unwrap(B)->CreateSelect(unwrap(If), unwrap(Then), unwrap(Else),
2064 Name));
2065}
2066
2067LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef B, LLVMValueRef List,
2068 LLVMTypeRef Ty, const char *Name) {
2069 return wrap(unwrap(B)->CreateVAArg(unwrap(List), unwrap(Ty), Name));
2070}
2071
2072LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef B, LLVMValueRef VecVal,
2073 LLVMValueRef Index, const char *Name) {
2074 return wrap(unwrap(B)->CreateExtractElement(unwrap(VecVal), unwrap(Index),
2075 Name));
2076}
2077
2078LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef B, LLVMValueRef VecVal,
2079 LLVMValueRef EltVal, LLVMValueRef Index,
2080 const char *Name) {
2081 return wrap(unwrap(B)->CreateInsertElement(unwrap(VecVal), unwrap(EltVal),
2082 unwrap(Index), Name));
2083}
2084
2085LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1,
2086 LLVMValueRef V2, LLVMValueRef Mask,
2087 const char *Name) {
2088 return wrap(unwrap(B)->CreateShuffleVector(unwrap(V1), unwrap(V2),
2089 unwrap(Mask), Name));
2090}
Gordon Henriksen1ae61352007-12-12 01:04:30 +00002091
Dan Gohmanb5931172008-11-03 22:55:43 +00002092LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef B, LLVMValueRef AggVal,
2093 unsigned Index, const char *Name) {
2094 return wrap(unwrap(B)->CreateExtractValue(unwrap(AggVal), Index, Name));
2095}
2096
2097LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef B, LLVMValueRef AggVal,
2098 LLVMValueRef EltVal, unsigned Index,
2099 const char *Name) {
2100 return wrap(unwrap(B)->CreateInsertValue(unwrap(AggVal), unwrap(EltVal),
2101 Index, Name));
2102}
2103
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00002104LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef B, LLVMValueRef Val,
2105 const char *Name) {
2106 return wrap(unwrap(B)->CreateIsNull(unwrap(Val), Name));
2107}
2108
2109LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef B, LLVMValueRef Val,
2110 const char *Name) {
2111 return wrap(unwrap(B)->CreateIsNotNull(unwrap(Val), Name));
2112}
2113
2114LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef B, LLVMValueRef LHS,
2115 LLVMValueRef RHS, const char *Name) {
2116 return wrap(unwrap(B)->CreatePtrDiff(unwrap(LHS), unwrap(RHS), Name));
2117}
2118
Gordon Henriksen1ae61352007-12-12 01:04:30 +00002119
2120/*===-- Module providers --------------------------------------------------===*/
2121
2122LLVMModuleProviderRef
2123LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M) {
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +00002124 return reinterpret_cast<LLVMModuleProviderRef>(M);
Gordon Henriksen1ae61352007-12-12 01:04:30 +00002125}
2126
2127void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP) {
2128 delete unwrap(MP);
2129}
2130
Gordon Henriksenda1435f2007-12-19 22:30:40 +00002131
2132/*===-- Memory buffers ----------------------------------------------------===*/
2133
Chris Lattnerd686c8e2010-01-09 22:27:07 +00002134LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(
2135 const char *Path,
2136 LLVMMemoryBufferRef *OutMemBuf,
2137 char **OutMessage) {
2138
Michael J. Spencer3ff95632010-12-16 03:29:14 +00002139 OwningPtr<MemoryBuffer> MB;
Michael J. Spencer333fb042010-12-09 17:36:48 +00002140 error_code ec;
Michael J. Spencer3ff95632010-12-16 03:29:14 +00002141 if (!(ec = MemoryBuffer::getFile(Path, MB))) {
2142 *OutMemBuf = wrap(MB.take());
Gordon Henriksenda1435f2007-12-19 22:30:40 +00002143 return 0;
2144 }
Michael J. Spencer333fb042010-12-09 17:36:48 +00002145
2146 *OutMessage = strdup(ec.message().c_str());
Gordon Henriksenda1435f2007-12-19 22:30:40 +00002147 return 1;
2148}
2149
Chris Lattnerd686c8e2010-01-09 22:27:07 +00002150LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
2151 char **OutMessage) {
Michael J. Spencer3ff95632010-12-16 03:29:14 +00002152 OwningPtr<MemoryBuffer> MB;
Michael J. Spencer333fb042010-12-09 17:36:48 +00002153 error_code ec;
Michael J. Spencer3ff95632010-12-16 03:29:14 +00002154 if (!(ec = MemoryBuffer::getSTDIN(MB))) {
2155 *OutMemBuf = wrap(MB.take());
Dan Gohman30377e72010-05-27 17:31:51 +00002156 return 0;
Gordon Henriksenda1435f2007-12-19 22:30:40 +00002157 }
Daniel Dunbard65267e2009-11-10 00:43:58 +00002158
Michael J. Spencer333fb042010-12-09 17:36:48 +00002159 *OutMessage = strdup(ec.message().c_str());
Dan Gohman30377e72010-05-27 17:31:51 +00002160 return 1;
Gordon Henriksenda1435f2007-12-19 22:30:40 +00002161}
2162
2163void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
2164 delete unwrap(MemBuf);
2165}
Dan Gohman11112e02010-08-07 00:43:20 +00002166
Owen Anderson1a3d2332010-10-07 17:55:47 +00002167/*===-- Pass Registry -----------------------------------------------------===*/
2168
2169LLVMPassRegistryRef LLVMGetGlobalPassRegistry(void) {
2170 return wrap(PassRegistry::getPassRegistry());
2171}
Dan Gohman11112e02010-08-07 00:43:20 +00002172
2173/*===-- Pass Manager ------------------------------------------------------===*/
2174
2175LLVMPassManagerRef LLVMCreatePassManager() {
2176 return wrap(new PassManager());
2177}
2178
2179LLVMPassManagerRef LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M) {
2180 return wrap(new FunctionPassManager(unwrap(M)));
2181}
2182
2183LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef P) {
2184 return LLVMCreateFunctionPassManagerForModule(
2185 reinterpret_cast<LLVMModuleRef>(P));
2186}
2187
2188LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M) {
2189 return unwrap<PassManager>(PM)->run(*unwrap(M));
2190}
2191
2192LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM) {
2193 return unwrap<FunctionPassManager>(FPM)->doInitialization();
2194}
2195
2196LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F) {
2197 return unwrap<FunctionPassManager>(FPM)->run(*unwrap<Function>(F));
2198}
2199
2200LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM) {
2201 return unwrap<FunctionPassManager>(FPM)->doFinalization();
2202}
2203
2204void LLVMDisposePassManager(LLVMPassManagerRef PM) {
2205 delete unwrap(PM);
2206}