blob: b8d2baf1e36ffb21c118ce178823185053a576a7 [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{
Chris Lattnerc4d0e9f2011-08-12 18:07:07 +0000302 return wrap(StructType::create(*unwrap(C), Name));
Chris Lattnerd91aa142011-07-14 05:53:17 +0000303}
304
Torok Edwinc44943e2011-10-06 12:12:50 +0000305const char *LLVMGetStructName(LLVMTypeRef Ty)
306{
307 StructType *Type = unwrap<StructType>(Ty);
308 if (!Type->hasName())
309 return 0;
310 return Type->getName().data();
311}
312
Chris Lattnerd91aa142011-07-14 05:53:17 +0000313void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes,
314 unsigned ElementCount, LLVMBool Packed) {
Frits van Bommeld1559452011-07-14 11:44:09 +0000315 ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
Chris Lattnerd91aa142011-07-14 05:53:17 +0000316 unwrap<StructType>(StructTy)->setBody(Tys, Packed != 0);
317}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000318
Gordon Henriksen46abf912007-09-26 20:56:12 +0000319unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000320 return unwrap<StructType>(StructTy)->getNumElements();
321}
322
323void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest) {
324 StructType *Ty = unwrap<StructType>(StructTy);
Nick Lewycky8c6d1962011-04-20 22:52:37 +0000325 for (StructType::element_iterator I = Ty->element_begin(),
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000326 E = Ty->element_end(); I != E; ++I)
327 *Dest++ = wrap(*I);
328}
329
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000330LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000331 return unwrap<StructType>(StructTy)->isPacked();
332}
333
Chris Lattner61afc882011-07-14 16:20:28 +0000334LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy) {
335 return unwrap<StructType>(StructTy)->isOpaque();
336}
337
338LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) {
339 return wrap(unwrap(M)->getTypeByName(Name));
340}
341
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000342/*--.. Operations on array, pointer, and vector types (sequence types) .....--*/
343
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000344LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) {
Owen Andersondebcb012009-07-29 22:17:13 +0000345 return wrap(ArrayType::get(unwrap(ElementType), ElementCount));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000346}
347
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000348LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace) {
Owen Andersondebcb012009-07-29 22:17:13 +0000349 return wrap(PointerType::get(unwrap(ElementType), AddressSpace));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000350}
351
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000352LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) {
Owen Andersondebcb012009-07-29 22:17:13 +0000353 return wrap(VectorType::get(unwrap(ElementType), ElementCount));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000354}
355
356LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty) {
357 return wrap(unwrap<SequentialType>(Ty)->getElementType());
358}
359
360unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) {
361 return unwrap<ArrayType>(ArrayTy)->getNumElements();
362}
363
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000364unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy) {
365 return unwrap<PointerType>(PointerTy)->getAddressSpace();
366}
367
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000368unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy) {
369 return unwrap<VectorType>(VectorTy)->getNumElements();
370}
371
372/*--.. Operations on other types ...........................................--*/
373
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000374LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C) {
375 return wrap(Type::getVoidTy(*unwrap(C)));
Owen Anderson1d0be152009-08-13 21:58:54 +0000376}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000377LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C) {
378 return wrap(Type::getLabelTy(*unwrap(C)));
379}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000380
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000381LLVMTypeRef LLVMVoidType(void) {
382 return LLVMVoidTypeInContext(LLVMGetGlobalContext());
383}
384LLVMTypeRef LLVMLabelType(void) {
385 return LLVMLabelTypeInContext(LLVMGetGlobalContext());
386}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000387
388/*===-- Operations on values ----------------------------------------------===*/
389
390/*--.. Operations on all values ............................................--*/
391
Gordon Henriksen46abf912007-09-26 20:56:12 +0000392LLVMTypeRef LLVMTypeOf(LLVMValueRef Val) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000393 return wrap(unwrap(Val)->getType());
394}
395
396const char *LLVMGetValueName(LLVMValueRef Val) {
Daniel Dunbar93b67e42009-07-26 07:49:05 +0000397 return unwrap(Val)->getName().data();
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000398}
399
400void LLVMSetValueName(LLVMValueRef Val, const char *Name) {
401 unwrap(Val)->setName(Name);
402}
403
Gordon Henriksen88cc6992007-10-06 00:08:49 +0000404void LLVMDumpValue(LLVMValueRef Val) {
405 unwrap(Val)->dump();
406}
407
Chris Lattner885dffc2009-10-12 04:01:02 +0000408void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal) {
409 unwrap(OldVal)->replaceAllUsesWith(unwrap(NewVal));
410}
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000411
Erick Tryzelaar46c80e02010-02-28 09:45:59 +0000412int LLVMHasMetadata(LLVMValueRef Inst) {
413 return unwrap<Instruction>(Inst)->hasMetadata();
414}
415
416LLVMValueRef LLVMGetMetadata(LLVMValueRef Inst, unsigned KindID) {
417 return wrap(unwrap<Instruction>(Inst)->getMetadata(KindID));
418}
419
420void LLVMSetMetadata(LLVMValueRef Inst, unsigned KindID, LLVMValueRef MD) {
421 unwrap<Instruction>(Inst)->setMetadata(KindID, MD? unwrap<MDNode>(MD) : NULL);
422}
423
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000424/*--.. Conversion functions ................................................--*/
425
426#define LLVM_DEFINE_VALUE_CAST(name) \
427 LLVMValueRef LLVMIsA##name(LLVMValueRef Val) { \
428 return wrap(static_cast<Value*>(dyn_cast_or_null<name>(unwrap(Val)))); \
429 }
430
431LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST)
432
Chris Lattner885dffc2009-10-12 04:01:02 +0000433/*--.. Operations on Uses ..................................................--*/
Erick Tryzelaar24b37332010-03-02 20:32:28 +0000434LLVMUseRef LLVMGetFirstUse(LLVMValueRef Val) {
Chris Lattner885dffc2009-10-12 04:01:02 +0000435 Value *V = unwrap(Val);
436 Value::use_iterator I = V->use_begin();
437 if (I == V->use_end())
438 return 0;
439 return wrap(&(I.getUse()));
440}
441
Erick Tryzelaar24b37332010-03-02 20:32:28 +0000442LLVMUseRef LLVMGetNextUse(LLVMUseRef U) {
443 Use *Next = unwrap(U)->getNext();
444 if (Next)
445 return wrap(Next);
446 return 0;
Chris Lattner885dffc2009-10-12 04:01:02 +0000447}
448
Erick Tryzelaar24b37332010-03-02 20:32:28 +0000449LLVMValueRef LLVMGetUser(LLVMUseRef U) {
450 return wrap(unwrap(U)->getUser());
Chris Lattner885dffc2009-10-12 04:01:02 +0000451}
452
Erick Tryzelaar24b37332010-03-02 20:32:28 +0000453LLVMValueRef LLVMGetUsedValue(LLVMUseRef U) {
454 return wrap(unwrap(U)->get());
Chris Lattner885dffc2009-10-12 04:01:02 +0000455}
456
457/*--.. Operations on Users .................................................--*/
458LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index) {
Torok Edwin4f661ab2011-10-06 12:13:11 +0000459 Value *V = unwrap(Val);
460 if (MDNode *MD = dyn_cast<MDNode>(V))
461 return wrap(MD->getOperand(Index));
462 return wrap(cast<User>(V)->getOperand(Index));
Chris Lattner885dffc2009-10-12 04:01:02 +0000463}
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000464
Erick Tryzelaarf7af9312010-08-20 14:51:22 +0000465void LLVMSetOperand(LLVMValueRef Val, unsigned Index, LLVMValueRef Op) {
466 unwrap<User>(Val)->setOperand(Index, unwrap(Op));
467}
468
469int LLVMGetNumOperands(LLVMValueRef Val) {
Torok Edwin4f661ab2011-10-06 12:13:11 +0000470 Value *V = unwrap(Val);
471 if (MDNode *MD = dyn_cast<MDNode>(V))
472 return MD->getNumOperands();
473 return cast<User>(V)->getNumOperands();
Erick Tryzelaarf7af9312010-08-20 14:51:22 +0000474}
475
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000476/*--.. Operations on constants of any type .................................--*/
477
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000478LLVMValueRef LLVMConstNull(LLVMTypeRef Ty) {
Owen Andersona7235ea2009-07-31 20:28:14 +0000479 return wrap(Constant::getNullValue(unwrap(Ty)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000480}
481
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000482LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty) {
Owen Andersona7235ea2009-07-31 20:28:14 +0000483 return wrap(Constant::getAllOnesValue(unwrap(Ty)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000484}
485
486LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty) {
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000487 return wrap(UndefValue::get(unwrap(Ty)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000488}
489
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000490LLVMBool LLVMIsConstant(LLVMValueRef Ty) {
Gordon Henriksen344be5f2007-09-18 18:07:51 +0000491 return isa<Constant>(unwrap(Ty));
492}
493
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000494LLVMBool LLVMIsNull(LLVMValueRef Val) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000495 if (Constant *C = dyn_cast<Constant>(unwrap(Val)))
496 return C->isNullValue();
497 return false;
498}
499
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000500LLVMBool LLVMIsUndef(LLVMValueRef Val) {
Gordon Henriksen344be5f2007-09-18 18:07:51 +0000501 return isa<UndefValue>(unwrap(Val));
502}
503
Chris Lattnere4840bc2009-07-06 17:29:59 +0000504LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty) {
Owen Anderson62e744b2009-07-07 21:33:58 +0000505 return
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000506 wrap(ConstantPointerNull::get(unwrap<PointerType>(Ty)));
Chris Lattnere4840bc2009-07-06 17:29:59 +0000507}
508
Erick Tryzelaar46c80e02010-02-28 09:45:59 +0000509/*--.. Operations on metadata nodes ........................................--*/
510
511LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str,
512 unsigned SLen) {
513 return wrap(MDString::get(*unwrap(C), StringRef(Str, SLen)));
514}
515
516LLVMValueRef LLVMMDString(const char *Str, unsigned SLen) {
517 return LLVMMDStringInContext(LLVMGetGlobalContext(), Str, SLen);
518}
519
520LLVMValueRef LLVMMDNodeInContext(LLVMContextRef C, LLVMValueRef *Vals,
521 unsigned Count) {
Jay Foadec9186b2011-04-21 19:59:31 +0000522 return wrap(MDNode::get(*unwrap(C),
Frits van Bommel39b5abf2011-07-18 12:00:32 +0000523 makeArrayRef(unwrap<Value>(Vals, Count), Count)));
Erick Tryzelaar46c80e02010-02-28 09:45:59 +0000524}
525
526LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count) {
527 return LLVMMDNodeInContext(LLVMGetGlobalContext(), Vals, Count);
528}
529
Torok Edwin4f661ab2011-10-06 12:13:11 +0000530const char *LLVMGetMDString(LLVMValueRef V, unsigned* Len) {
531 if (const MDString *S = dyn_cast<MDString>(unwrap(V))) {
532 *Len = S->getString().size();
533 return S->getString().data();
534 }
535 *Len = 0;
536 return 0;
537}
538
539unsigned LLVMGetNamedMetadataNumOperands(LLVMModuleRef M, const char* name)
540{
541 if (NamedMDNode *N = unwrap(M)->getNamedMetadata(name)) {
542 return N->getNumOperands();
543 }
544 return 0;
545}
546
547void LLVMGetNamedMetadataOperands(LLVMModuleRef M, const char* name, LLVMValueRef *Dest)
548{
549 NamedMDNode *N = unwrap(M)->getNamedMetadata(name);
550 if (!N)
551 return;
552 for (unsigned i=0;i<N->getNumOperands();i++)
553 Dest[i] = wrap(N->getOperand(i));
554}
555
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000556/*--.. Operations on scalar constants ......................................--*/
557
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000558LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000559 LLVMBool SignExtend) {
Owen Andersoneed707b2009-07-24 23:12:02 +0000560 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), N, SignExtend != 0));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000561}
562
Chris Lattner54005702010-11-23 02:47:22 +0000563LLVMValueRef LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy,
564 unsigned NumWords,
565 const uint64_t Words[]) {
566 IntegerType *Ty = unwrap<IntegerType>(IntTy);
567 return wrap(ConstantInt::get(Ty->getContext(),
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +0000568 APInt(Ty->getBitWidth(),
569 makeArrayRef(Words, NumWords))));
Chris Lattner54005702010-11-23 02:47:22 +0000570}
571
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000572LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char Str[],
573 uint8_t Radix) {
574 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str),
575 Radix));
576}
577
578LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char Str[],
579 unsigned SLen, uint8_t Radix) {
580 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str, SLen),
581 Radix));
Gordon Henriksene62a8a32008-02-02 01:07:50 +0000582}
583
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000584LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) {
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000585 return wrap(ConstantFP::get(unwrap(RealTy), N));
Gordon Henriksene62a8a32008-02-02 01:07:50 +0000586}
587
588LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) {
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000589 return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Text)));
590}
591
592LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char Str[],
593 unsigned SLen) {
594 return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Str, SLen)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000595}
596
Chris Lattner885dffc2009-10-12 04:01:02 +0000597unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal) {
598 return unwrap<ConstantInt>(ConstantVal)->getZExtValue();
599}
600
601long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal) {
602 return unwrap<ConstantInt>(ConstantVal)->getSExtValue();
603}
604
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000605/*--.. Operations on composite constants ...................................--*/
606
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000607LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000608 unsigned Length,
609 LLVMBool DontNullTerminate) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000610 /* Inverted the sense of AddNull because ', 0)' is a
611 better mnemonic for null termination than ', 1)'. */
Benjamin Kramer4c8a9852010-10-17 07:39:34 +0000612 return wrap(ConstantArray::get(*unwrap(C), StringRef(Str, Length),
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000613 DontNullTerminate == 0));
614}
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000615LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
616 LLVMValueRef *ConstantVals,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000617 unsigned Count, LLVMBool Packed) {
Chris Lattnerb065b062011-06-20 04:01:31 +0000618 Constant **Elements = unwrap<Constant>(ConstantVals, Count);
Frits van Bommel39b5abf2011-07-18 12:00:32 +0000619 return wrap(ConstantStruct::getAnon(*unwrap(C), makeArrayRef(Elements, Count),
Chris Lattnerb065b062011-06-20 04:01:31 +0000620 Packed != 0));
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000621}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000622
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000623LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000624 LLVMBool DontNullTerminate) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000625 return LLVMConstStringInContext(LLVMGetGlobalContext(), Str, Length,
626 DontNullTerminate);
627}
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000628LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
629 LLVMValueRef *ConstantVals, unsigned Length) {
Jay Foad26701082011-06-22 09:24:39 +0000630 ArrayRef<Constant*> V(unwrap<Constant>(ConstantVals, Length), Length);
631 return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length), V));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000632}
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000633LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000634 LLVMBool Packed) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000635 return LLVMConstStructInContext(LLVMGetGlobalContext(), ConstantVals, Count,
636 Packed);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000637}
Rafael Espindola64090bd2011-07-14 19:09:08 +0000638
639LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy,
640 LLVMValueRef *ConstantVals,
641 unsigned Count) {
642 Constant **Elements = unwrap<Constant>(ConstantVals, Count);
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000643 StructType *Ty = cast<StructType>(unwrap(StructTy));
Rafael Espindola64090bd2011-07-14 19:09:08 +0000644
Frits van Bommel39b5abf2011-07-18 12:00:32 +0000645 return wrap(ConstantStruct::get(Ty, makeArrayRef(Elements, Count)));
Rafael Espindola64090bd2011-07-14 19:09:08 +0000646}
647
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000648LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) {
Frits van Bommel39b5abf2011-07-18 12:00:32 +0000649 return wrap(ConstantVector::get(makeArrayRef(
Chris Lattner2ca5c862011-02-15 00:14:00 +0000650 unwrap<Constant>(ScalarConstantVals, Size), Size)));
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000651}
Gordon Henriksen46475692007-10-06 14:29:36 +0000652/*--.. Constant expressions ................................................--*/
653
Chris Lattner885dffc2009-10-12 04:01:02 +0000654LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal) {
655 return (LLVMOpcode)unwrap<ConstantExpr>(ConstantVal)->getOpcode();
656}
657
Duncan Sandsef854af2009-05-21 15:52:21 +0000658LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000659 return wrap(ConstantExpr::getAlignOf(unwrap(Ty)));
Duncan Sandsef854af2009-05-21 15:52:21 +0000660}
661
Gordon Henriksen46475692007-10-06 14:29:36 +0000662LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000663 return wrap(ConstantExpr::getSizeOf(unwrap(Ty)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000664}
665
666LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000667 return wrap(ConstantExpr::getNeg(unwrap<Constant>(ConstantVal)));
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000668}
669
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000670LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000671 return wrap(ConstantExpr::getNSWNeg(unwrap<Constant>(ConstantVal)));
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000672}
673
674LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000675 return wrap(ConstantExpr::getNUWNeg(unwrap<Constant>(ConstantVal)));
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000676}
677
678
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000679LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000680 return wrap(ConstantExpr::getFNeg(unwrap<Constant>(ConstantVal)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000681}
682
683LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000684 return wrap(ConstantExpr::getNot(unwrap<Constant>(ConstantVal)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000685}
686
687LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000688 return wrap(ConstantExpr::getAdd(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000689 unwrap<Constant>(RHSConstant)));
690}
691
Dan Gohman6e7ad952009-09-03 23:34:49 +0000692LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant,
693 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000694 return wrap(ConstantExpr::getNSWAdd(unwrap<Constant>(LHSConstant),
Dan Gohman6e7ad952009-09-03 23:34:49 +0000695 unwrap<Constant>(RHSConstant)));
696}
697
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000698LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant,
699 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000700 return wrap(ConstantExpr::getNUWAdd(unwrap<Constant>(LHSConstant),
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000701 unwrap<Constant>(RHSConstant)));
702}
703
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000704LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000705 return wrap(ConstantExpr::getFAdd(unwrap<Constant>(LHSConstant),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000706 unwrap<Constant>(RHSConstant)));
707}
708
Gordon Henriksen46475692007-10-06 14:29:36 +0000709LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000710 return wrap(ConstantExpr::getSub(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000711 unwrap<Constant>(RHSConstant)));
712}
713
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000714LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant,
715 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000716 return wrap(ConstantExpr::getNSWSub(unwrap<Constant>(LHSConstant),
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000717 unwrap<Constant>(RHSConstant)));
718}
719
720LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant,
721 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000722 return wrap(ConstantExpr::getNUWSub(unwrap<Constant>(LHSConstant),
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000723 unwrap<Constant>(RHSConstant)));
724}
725
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000726LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
727 return wrap(ConstantExpr::getFSub(unwrap<Constant>(LHSConstant),
728 unwrap<Constant>(RHSConstant)));
729}
730
Gordon Henriksen46475692007-10-06 14:29:36 +0000731LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000732 return wrap(ConstantExpr::getMul(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000733 unwrap<Constant>(RHSConstant)));
734}
735
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000736LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant,
737 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000738 return wrap(ConstantExpr::getNSWMul(unwrap<Constant>(LHSConstant),
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000739 unwrap<Constant>(RHSConstant)));
740}
741
742LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant,
743 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000744 return wrap(ConstantExpr::getNUWMul(unwrap<Constant>(LHSConstant),
Erick Tryzelaar19f047f2010-02-28 05:51:43 +0000745 unwrap<Constant>(RHSConstant)));
746}
747
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000748LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000749 return wrap(ConstantExpr::getFMul(unwrap<Constant>(LHSConstant),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000750 unwrap<Constant>(RHSConstant)));
751}
752
Gordon Henriksen46475692007-10-06 14:29:36 +0000753LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000754 return wrap(ConstantExpr::getUDiv(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000755 unwrap<Constant>(RHSConstant)));
756}
757
758LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000759 return wrap(ConstantExpr::getSDiv(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000760 unwrap<Constant>(RHSConstant)));
761}
762
Dan Gohman6e7ad952009-09-03 23:34:49 +0000763LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant,
764 LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000765 return wrap(ConstantExpr::getExactSDiv(unwrap<Constant>(LHSConstant),
Dan Gohman6e7ad952009-09-03 23:34:49 +0000766 unwrap<Constant>(RHSConstant)));
767}
768
Gordon Henriksen46475692007-10-06 14:29:36 +0000769LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000770 return wrap(ConstantExpr::getFDiv(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000771 unwrap<Constant>(RHSConstant)));
772}
773
774LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000775 return wrap(ConstantExpr::getURem(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000776 unwrap<Constant>(RHSConstant)));
777}
778
779LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000780 return wrap(ConstantExpr::getSRem(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000781 unwrap<Constant>(RHSConstant)));
782}
783
784LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000785 return wrap(ConstantExpr::getFRem(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000786 unwrap<Constant>(RHSConstant)));
787}
788
789LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000790 return wrap(ConstantExpr::getAnd(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000791 unwrap<Constant>(RHSConstant)));
792}
793
794LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000795 return wrap(ConstantExpr::getOr(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000796 unwrap<Constant>(RHSConstant)));
797}
798
799LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000800 return wrap(ConstantExpr::getXor(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000801 unwrap<Constant>(RHSConstant)));
802}
803
804LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
805 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000806 return wrap(ConstantExpr::getICmp(Predicate,
Gordon Henriksen46475692007-10-06 14:29:36 +0000807 unwrap<Constant>(LHSConstant),
808 unwrap<Constant>(RHSConstant)));
809}
810
811LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
812 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000813 return wrap(ConstantExpr::getFCmp(Predicate,
Gordon Henriksen46475692007-10-06 14:29:36 +0000814 unwrap<Constant>(LHSConstant),
815 unwrap<Constant>(RHSConstant)));
816}
817
818LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000819 return wrap(ConstantExpr::getShl(unwrap<Constant>(LHSConstant),
820 unwrap<Constant>(RHSConstant)));
Gordon Henriksen46475692007-10-06 14:29:36 +0000821}
822
823LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000824 return wrap(ConstantExpr::getLShr(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000825 unwrap<Constant>(RHSConstant)));
826}
827
828LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000829 return wrap(ConstantExpr::getAShr(unwrap<Constant>(LHSConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000830 unwrap<Constant>(RHSConstant)));
831}
832
833LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
834 LLVMValueRef *ConstantIndices, unsigned NumIndices) {
Jay Foaddab3d292011-07-21 14:31:17 +0000835 ArrayRef<Constant *> IdxList(unwrap<Constant>(ConstantIndices, NumIndices),
836 NumIndices);
Chris Lattner2ca5c862011-02-15 00:14:00 +0000837 return wrap(ConstantExpr::getGetElementPtr(unwrap<Constant>(ConstantVal),
Jay Foaddab3d292011-07-21 14:31:17 +0000838 IdxList));
Gordon Henriksen46475692007-10-06 14:29:36 +0000839}
840
Dan Gohman6e7ad952009-09-03 23:34:49 +0000841LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
842 LLVMValueRef *ConstantIndices,
843 unsigned NumIndices) {
844 Constant* Val = unwrap<Constant>(ConstantVal);
Jay Foaddab3d292011-07-21 14:31:17 +0000845 ArrayRef<Constant *> IdxList(unwrap<Constant>(ConstantIndices, NumIndices),
846 NumIndices);
847 return wrap(ConstantExpr::getInBoundsGetElementPtr(Val, IdxList));
Dan Gohman6e7ad952009-09-03 23:34:49 +0000848}
849
Gordon Henriksen46475692007-10-06 14:29:36 +0000850LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000851 return wrap(ConstantExpr::getTrunc(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000852 unwrap(ToType)));
853}
854
855LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000856 return wrap(ConstantExpr::getSExt(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000857 unwrap(ToType)));
858}
859
860LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000861 return wrap(ConstantExpr::getZExt(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000862 unwrap(ToType)));
863}
864
865LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000866 return wrap(ConstantExpr::getFPTrunc(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000867 unwrap(ToType)));
868}
869
870LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000871 return wrap(ConstantExpr::getFPExtend(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000872 unwrap(ToType)));
873}
874
875LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000876 return wrap(ConstantExpr::getUIToFP(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000877 unwrap(ToType)));
878}
879
880LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000881 return wrap(ConstantExpr::getSIToFP(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000882 unwrap(ToType)));
883}
884
885LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Andersonbaf3c402009-07-29 18:55:55 +0000886 return wrap(ConstantExpr::getFPToUI(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000887 unwrap(ToType)));
888}
889
890LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000891 return wrap(ConstantExpr::getFPToSI(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000892 unwrap(ToType)));
893}
894
895LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000896 return wrap(ConstantExpr::getPtrToInt(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000897 unwrap(ToType)));
898}
899
900LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000901 return wrap(ConstantExpr::getIntToPtr(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000902 unwrap(ToType)));
903}
904
905LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000906 return wrap(ConstantExpr::getBitCast(unwrap<Constant>(ConstantVal),
Gordon Henriksen46475692007-10-06 14:29:36 +0000907 unwrap(ToType)));
908}
909
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000910LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
911 LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000912 return wrap(ConstantExpr::getZExtOrBitCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000913 unwrap(ToType)));
914}
915
916LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
917 LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000918 return wrap(ConstantExpr::getSExtOrBitCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000919 unwrap(ToType)));
920}
921
922LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
923 LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000924 return wrap(ConstantExpr::getTruncOrBitCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000925 unwrap(ToType)));
926}
927
928LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
929 LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000930 return wrap(ConstantExpr::getPointerCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000931 unwrap(ToType)));
932}
933
934LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000935 LLVMBool isSigned) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000936 return wrap(ConstantExpr::getIntegerCast(unwrap<Constant>(ConstantVal),
937 unwrap(ToType), isSigned));
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000938}
939
940LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000941 return wrap(ConstantExpr::getFPCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000942 unwrap(ToType)));
943}
944
Gordon Henriksen46475692007-10-06 14:29:36 +0000945LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
946 LLVMValueRef ConstantIfTrue,
947 LLVMValueRef ConstantIfFalse) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000948 return wrap(ConstantExpr::getSelect(unwrap<Constant>(ConstantCondition),
Gordon Henriksen46475692007-10-06 14:29:36 +0000949 unwrap<Constant>(ConstantIfTrue),
950 unwrap<Constant>(ConstantIfFalse)));
951}
952
953LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
954 LLVMValueRef IndexConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000955 return wrap(ConstantExpr::getExtractElement(unwrap<Constant>(VectorConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000956 unwrap<Constant>(IndexConstant)));
957}
958
959LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
960 LLVMValueRef ElementValueConstant,
961 LLVMValueRef IndexConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000962 return wrap(ConstantExpr::getInsertElement(unwrap<Constant>(VectorConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000963 unwrap<Constant>(ElementValueConstant),
964 unwrap<Constant>(IndexConstant)));
965}
966
967LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
968 LLVMValueRef VectorBConstant,
969 LLVMValueRef MaskConstant) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000970 return wrap(ConstantExpr::getShuffleVector(unwrap<Constant>(VectorAConstant),
Gordon Henriksen46475692007-10-06 14:29:36 +0000971 unwrap<Constant>(VectorBConstant),
972 unwrap<Constant>(MaskConstant)));
973}
974
Dan Gohmanb5931172008-11-03 22:55:43 +0000975LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
976 unsigned NumIdx) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000977 return wrap(ConstantExpr::getExtractValue(unwrap<Constant>(AggConstant),
Frits van Bommel39b5abf2011-07-18 12:00:32 +0000978 makeArrayRef(IdxList, NumIdx)));
Dan Gohmanb5931172008-11-03 22:55:43 +0000979}
980
981LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
982 LLVMValueRef ElementValueConstant,
983 unsigned *IdxList, unsigned NumIdx) {
Chris Lattner2ca5c862011-02-15 00:14:00 +0000984 return wrap(ConstantExpr::getInsertValue(unwrap<Constant>(AggConstant),
Dan Gohmanb5931172008-11-03 22:55:43 +0000985 unwrap<Constant>(ElementValueConstant),
Frits van Bommel39b5abf2011-07-18 12:00:32 +0000986 makeArrayRef(IdxList, NumIdx)));
Dan Gohmanb5931172008-11-03 22:55:43 +0000987}
988
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000989LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
990 const char *Constraints,
991 LLVMBool HasSideEffects,
992 LLVMBool IsAlignStack) {
993 return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString,
Dale Johannesen8ba2d5b2009-10-21 23:28:00 +0000994 Constraints, HasSideEffects, IsAlignStack));
Chris Lattner851ba392008-12-17 21:39:50 +0000995}
996
Erick Tryzelaarc59286b2010-02-28 09:46:06 +0000997LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB) {
998 return wrap(BlockAddress::get(unwrap<Function>(F), unwrap(BB)));
999}
1000
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001001/*--.. Operations on global variables, functions, and aliases (globals) ....--*/
1002
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001003LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) {
1004 return wrap(unwrap<GlobalValue>(Global)->getParent());
1005}
1006
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001007LLVMBool LLVMIsDeclaration(LLVMValueRef Global) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001008 return unwrap<GlobalValue>(Global)->isDeclaration();
1009}
1010
1011LLVMLinkage LLVMGetLinkage(LLVMValueRef Global) {
Bill Wendling4aebcb42009-07-20 20:34:46 +00001012 switch (unwrap<GlobalValue>(Global)->getLinkage()) {
1013 default:
1014 assert(false && "Unhandled Linkage Type.");
1015 case GlobalValue::ExternalLinkage:
1016 return LLVMExternalLinkage;
1017 case GlobalValue::AvailableExternallyLinkage:
1018 return LLVMAvailableExternallyLinkage;
1019 case GlobalValue::LinkOnceAnyLinkage:
1020 return LLVMLinkOnceAnyLinkage;
1021 case GlobalValue::LinkOnceODRLinkage:
1022 return LLVMLinkOnceODRLinkage;
1023 case GlobalValue::WeakAnyLinkage:
1024 return LLVMWeakAnyLinkage;
1025 case GlobalValue::WeakODRLinkage:
1026 return LLVMWeakODRLinkage;
1027 case GlobalValue::AppendingLinkage:
1028 return LLVMAppendingLinkage;
1029 case GlobalValue::InternalLinkage:
1030 return LLVMInternalLinkage;
1031 case GlobalValue::PrivateLinkage:
1032 return LLVMPrivateLinkage;
1033 case GlobalValue::LinkerPrivateLinkage:
1034 return LLVMLinkerPrivateLinkage;
Bill Wendling5e721d72010-07-01 21:55:59 +00001035 case GlobalValue::LinkerPrivateWeakLinkage:
1036 return LLVMLinkerPrivateWeakLinkage;
Bill Wendling55ae5152010-08-20 22:05:50 +00001037 case GlobalValue::LinkerPrivateWeakDefAutoLinkage:
1038 return LLVMLinkerPrivateWeakDefAutoLinkage;
Bill Wendling4aebcb42009-07-20 20:34:46 +00001039 case GlobalValue::DLLImportLinkage:
1040 return LLVMDLLImportLinkage;
1041 case GlobalValue::DLLExportLinkage:
1042 return LLVMDLLExportLinkage;
1043 case GlobalValue::ExternalWeakLinkage:
1044 return LLVMExternalWeakLinkage;
Bill Wendling4aebcb42009-07-20 20:34:46 +00001045 case GlobalValue::CommonLinkage:
1046 return LLVMCommonLinkage;
1047 }
1048
1049 // Should never get here.
1050 return static_cast<LLVMLinkage>(0);
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001051}
1052
1053void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage) {
Bill Wendling4aebcb42009-07-20 20:34:46 +00001054 GlobalValue *GV = unwrap<GlobalValue>(Global);
1055
1056 switch (Linkage) {
1057 default:
1058 assert(false && "Unhandled Linkage Type.");
1059 case LLVMExternalLinkage:
1060 GV->setLinkage(GlobalValue::ExternalLinkage);
1061 break;
1062 case LLVMAvailableExternallyLinkage:
1063 GV->setLinkage(GlobalValue::AvailableExternallyLinkage);
1064 break;
1065 case LLVMLinkOnceAnyLinkage:
1066 GV->setLinkage(GlobalValue::LinkOnceAnyLinkage);
1067 break;
1068 case LLVMLinkOnceODRLinkage:
1069 GV->setLinkage(GlobalValue::LinkOnceODRLinkage);
1070 break;
1071 case LLVMWeakAnyLinkage:
1072 GV->setLinkage(GlobalValue::WeakAnyLinkage);
1073 break;
1074 case LLVMWeakODRLinkage:
1075 GV->setLinkage(GlobalValue::WeakODRLinkage);
1076 break;
1077 case LLVMAppendingLinkage:
1078 GV->setLinkage(GlobalValue::AppendingLinkage);
1079 break;
1080 case LLVMInternalLinkage:
1081 GV->setLinkage(GlobalValue::InternalLinkage);
1082 break;
1083 case LLVMPrivateLinkage:
1084 GV->setLinkage(GlobalValue::PrivateLinkage);
1085 break;
1086 case LLVMLinkerPrivateLinkage:
1087 GV->setLinkage(GlobalValue::LinkerPrivateLinkage);
1088 break;
Bill Wendling5e721d72010-07-01 21:55:59 +00001089 case LLVMLinkerPrivateWeakLinkage:
1090 GV->setLinkage(GlobalValue::LinkerPrivateWeakLinkage);
1091 break;
Bill Wendling55ae5152010-08-20 22:05:50 +00001092 case LLVMLinkerPrivateWeakDefAutoLinkage:
1093 GV->setLinkage(GlobalValue::LinkerPrivateWeakDefAutoLinkage);
1094 break;
Bill Wendling4aebcb42009-07-20 20:34:46 +00001095 case LLVMDLLImportLinkage:
1096 GV->setLinkage(GlobalValue::DLLImportLinkage);
1097 break;
1098 case LLVMDLLExportLinkage:
1099 GV->setLinkage(GlobalValue::DLLExportLinkage);
1100 break;
1101 case LLVMExternalWeakLinkage:
1102 GV->setLinkage(GlobalValue::ExternalWeakLinkage);
1103 break;
1104 case LLVMGhostLinkage:
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +00001105 DEBUG(errs()
1106 << "LLVMSetLinkage(): LLVMGhostLinkage is no longer supported.");
Bill Wendling4aebcb42009-07-20 20:34:46 +00001107 break;
1108 case LLVMCommonLinkage:
1109 GV->setLinkage(GlobalValue::CommonLinkage);
1110 break;
1111 }
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001112}
1113
1114const char *LLVMGetSection(LLVMValueRef Global) {
1115 return unwrap<GlobalValue>(Global)->getSection().c_str();
1116}
1117
1118void LLVMSetSection(LLVMValueRef Global, const char *Section) {
1119 unwrap<GlobalValue>(Global)->setSection(Section);
1120}
1121
1122LLVMVisibility LLVMGetVisibility(LLVMValueRef Global) {
1123 return static_cast<LLVMVisibility>(
1124 unwrap<GlobalValue>(Global)->getVisibility());
1125}
1126
1127void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz) {
1128 unwrap<GlobalValue>(Global)
1129 ->setVisibility(static_cast<GlobalValue::VisibilityTypes>(Viz));
1130}
1131
1132unsigned LLVMGetAlignment(LLVMValueRef Global) {
1133 return unwrap<GlobalValue>(Global)->getAlignment();
1134}
1135
1136void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes) {
1137 unwrap<GlobalValue>(Global)->setAlignment(Bytes);
1138}
1139
1140/*--.. Operations on global variables ......................................--*/
1141
1142LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) {
Owen Andersone9b11b42009-07-08 19:03:57 +00001143 return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
1144 GlobalValue::ExternalLinkage, 0, Name));
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001145}
1146
Erick Tryzelaar8e130b12010-02-28 09:46:13 +00001147LLVMValueRef LLVMAddGlobalInAddressSpace(LLVMModuleRef M, LLVMTypeRef Ty,
1148 const char *Name,
1149 unsigned AddressSpace) {
1150 return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
Duncan Sands6d521022010-03-02 11:18:43 +00001151 GlobalValue::ExternalLinkage, 0, Name, 0,
1152 false, AddressSpace));
Erick Tryzelaar8e130b12010-02-28 09:46:13 +00001153}
1154
Gordon Henriksen6d6203d2007-10-08 03:45:09 +00001155LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name) {
1156 return wrap(unwrap(M)->getNamedGlobal(Name));
1157}
1158
Gordon Henriksen34000972008-03-19 03:47:18 +00001159LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M) {
1160 Module *Mod = unwrap(M);
1161 Module::global_iterator I = Mod->global_begin();
1162 if (I == Mod->global_end())
1163 return 0;
1164 return wrap(I);
1165}
1166
1167LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M) {
1168 Module *Mod = unwrap(M);
1169 Module::global_iterator I = Mod->global_end();
1170 if (I == Mod->global_begin())
1171 return 0;
1172 return wrap(--I);
1173}
1174
1175LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar) {
1176 GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1177 Module::global_iterator I = GV;
1178 if (++I == GV->getParent()->global_end())
1179 return 0;
1180 return wrap(I);
1181}
1182
1183LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar) {
1184 GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1185 Module::global_iterator I = GV;
Gordon Henriksen4733be32008-03-23 22:21:29 +00001186 if (I == GV->getParent()->global_begin())
Gordon Henriksen34000972008-03-19 03:47:18 +00001187 return 0;
1188 return wrap(--I);
1189}
1190
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001191void LLVMDeleteGlobal(LLVMValueRef GlobalVar) {
1192 unwrap<GlobalVariable>(GlobalVar)->eraseFromParent();
1193}
1194
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001195LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar) {
Chris Lattner885dffc2009-10-12 04:01:02 +00001196 GlobalVariable* GV = unwrap<GlobalVariable>(GlobalVar);
1197 if ( !GV->hasInitializer() )
1198 return 0;
1199 return wrap(GV->getInitializer());
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001200}
1201
1202void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) {
1203 unwrap<GlobalVariable>(GlobalVar)
1204 ->setInitializer(unwrap<Constant>(ConstantVal));
1205}
1206
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001207LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001208 return unwrap<GlobalVariable>(GlobalVar)->isThreadLocal();
1209}
1210
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001211void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal) {
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001212 unwrap<GlobalVariable>(GlobalVar)->setThreadLocal(IsThreadLocal != 0);
1213}
1214
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001215LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar) {
Gordon Henriksenc84c16b2007-10-07 17:31:42 +00001216 return unwrap<GlobalVariable>(GlobalVar)->isConstant();
1217}
1218
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001219void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant) {
Gordon Henriksenc84c16b2007-10-07 17:31:42 +00001220 unwrap<GlobalVariable>(GlobalVar)->setConstant(IsConstant != 0);
1221}
1222
Chris Lattner851ba392008-12-17 21:39:50 +00001223/*--.. Operations on aliases ......................................--*/
1224
1225LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
1226 const char *Name) {
1227 return wrap(new GlobalAlias(unwrap(Ty), GlobalValue::ExternalLinkage, Name,
1228 unwrap<Constant>(Aliasee), unwrap (M)));
1229}
1230
Gordon Henriksen46abf912007-09-26 20:56:12 +00001231/*--.. Operations on functions .............................................--*/
1232
1233LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
1234 LLVMTypeRef FunctionTy) {
Gabor Greif051a9502008-04-06 20:25:17 +00001235 return wrap(Function::Create(unwrap<FunctionType>(FunctionTy),
1236 GlobalValue::ExternalLinkage, Name, unwrap(M)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001237}
1238
Gordon Henriksen6d6203d2007-10-08 03:45:09 +00001239LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name) {
1240 return wrap(unwrap(M)->getFunction(Name));
1241}
1242
Gordon Henriksen34000972008-03-19 03:47:18 +00001243LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M) {
1244 Module *Mod = unwrap(M);
1245 Module::iterator I = Mod->begin();
1246 if (I == Mod->end())
1247 return 0;
1248 return wrap(I);
1249}
1250
1251LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) {
1252 Module *Mod = unwrap(M);
1253 Module::iterator I = Mod->end();
1254 if (I == Mod->begin())
1255 return 0;
1256 return wrap(--I);
1257}
1258
1259LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) {
1260 Function *Func = unwrap<Function>(Fn);
1261 Module::iterator I = Func;
1262 if (++I == Func->getParent()->end())
1263 return 0;
1264 return wrap(I);
1265}
1266
1267LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn) {
1268 Function *Func = unwrap<Function>(Fn);
1269 Module::iterator I = Func;
Gordon Henriksen4733be32008-03-23 22:21:29 +00001270 if (I == Func->getParent()->begin())
Gordon Henriksen34000972008-03-19 03:47:18 +00001271 return 0;
1272 return wrap(--I);
1273}
1274
Gordon Henriksen46abf912007-09-26 20:56:12 +00001275void LLVMDeleteFunction(LLVMValueRef Fn) {
1276 unwrap<Function>(Fn)->eraseFromParent();
1277}
1278
Gordon Henriksen46abf912007-09-26 20:56:12 +00001279unsigned LLVMGetIntrinsicID(LLVMValueRef Fn) {
1280 if (Function *F = dyn_cast<Function>(unwrap(Fn)))
1281 return F->getIntrinsicID();
1282 return 0;
1283}
1284
1285unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn) {
1286 return unwrap<Function>(Fn)->getCallingConv();
1287}
1288
1289void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) {
Sandeep Patel65c3c8f2009-09-02 08:44:58 +00001290 return unwrap<Function>(Fn)->setCallingConv(
1291 static_cast<CallingConv::ID>(CC));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001292}
1293
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001294const char *LLVMGetGC(LLVMValueRef Fn) {
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001295 Function *F = unwrap<Function>(Fn);
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001296 return F->hasGC()? F->getGC() : 0;
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001297}
1298
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001299void LLVMSetGC(LLVMValueRef Fn, const char *GC) {
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001300 Function *F = unwrap<Function>(Fn);
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001301 if (GC)
1302 F->setGC(GC);
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001303 else
Gordon Henriksen5eca0752008-08-17 18:44:35 +00001304 F->clearGC();
Gordon Henriksen80a75bf2007-12-10 03:18:06 +00001305}
1306
Duncan Sandse149e992009-05-06 12:21:17 +00001307void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
1308 Function *Func = unwrap<Function>(Fn);
1309 const AttrListPtr PAL = Func->getAttributes();
Kenneth Uildriksf1ac0fd2010-02-16 19:28:02 +00001310 const AttrListPtr PALnew = PAL.addAttr(~0U, PA);
Duncan Sandse149e992009-05-06 12:21:17 +00001311 Func->setAttributes(PALnew);
1312}
1313
1314void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
1315 Function *Func = unwrap<Function>(Fn);
1316 const AttrListPtr PAL = Func->getAttributes();
Kenneth Uildriksf1ac0fd2010-02-16 19:28:02 +00001317 const AttrListPtr PALnew = PAL.removeAttr(~0U, PA);
Duncan Sandse149e992009-05-06 12:21:17 +00001318 Func->setAttributes(PALnew);
1319}
1320
Chris Lattner885dffc2009-10-12 04:01:02 +00001321LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn) {
1322 Function *Func = unwrap<Function>(Fn);
1323 const AttrListPtr PAL = Func->getAttributes();
1324 Attributes attr = PAL.getFnAttributes();
1325 return (LLVMAttribute)attr;
1326}
1327
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001328/*--.. Operations on parameters ............................................--*/
1329
1330unsigned LLVMCountParams(LLVMValueRef FnRef) {
1331 // This function is strictly redundant to
1332 // LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef)))
Dan Gohman4d515d02008-06-21 22:06:54 +00001333 return unwrap<Function>(FnRef)->arg_size();
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001334}
1335
1336void LLVMGetParams(LLVMValueRef FnRef, LLVMValueRef *ParamRefs) {
1337 Function *Fn = unwrap<Function>(FnRef);
1338 for (Function::arg_iterator I = Fn->arg_begin(),
1339 E = Fn->arg_end(); I != E; I++)
1340 *ParamRefs++ = wrap(I);
1341}
1342
1343LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) {
1344 Function::arg_iterator AI = unwrap<Function>(FnRef)->arg_begin();
1345 while (index --> 0)
1346 AI++;
1347 return wrap(AI);
1348}
1349
1350LLVMValueRef LLVMGetParamParent(LLVMValueRef V) {
1351 return wrap(unwrap<Argument>(V)->getParent());
1352}
1353
Gordon Henriksen4733be32008-03-23 22:21:29 +00001354LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn) {
1355 Function *Func = unwrap<Function>(Fn);
1356 Function::arg_iterator I = Func->arg_begin();
1357 if (I == Func->arg_end())
1358 return 0;
1359 return wrap(I);
1360}
1361
1362LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn) {
1363 Function *Func = unwrap<Function>(Fn);
1364 Function::arg_iterator I = Func->arg_end();
1365 if (I == Func->arg_begin())
1366 return 0;
1367 return wrap(--I);
1368}
1369
1370LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg) {
1371 Argument *A = unwrap<Argument>(Arg);
1372 Function::arg_iterator I = A;
1373 if (++I == A->getParent()->arg_end())
1374 return 0;
1375 return wrap(I);
1376}
1377
1378LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg) {
1379 Argument *A = unwrap<Argument>(Arg);
1380 Function::arg_iterator I = A;
1381 if (I == A->getParent()->arg_begin())
1382 return 0;
1383 return wrap(--I);
1384}
1385
Devang Patel05988662008-09-25 21:00:45 +00001386void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001387 unwrap<Argument>(Arg)->addAttr(PA);
1388}
1389
Devang Patel05988662008-09-25 21:00:45 +00001390void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001391 unwrap<Argument>(Arg)->removeAttr(PA);
1392}
1393
Chris Lattner885dffc2009-10-12 04:01:02 +00001394LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg) {
1395 Argument *A = unwrap<Argument>(Arg);
1396 Attributes attr = A->getParent()->getAttributes().getParamAttributes(
1397 A->getArgNo()+1);
1398 return (LLVMAttribute)attr;
1399}
1400
1401
Gordon Henriksene2435da2008-04-28 17:37:06 +00001402void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) {
1403 unwrap<Argument>(Arg)->addAttr(
Devang Patel05988662008-09-25 21:00:45 +00001404 Attribute::constructAlignmentFromInt(align));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001405}
1406
Gordon Henriksen46abf912007-09-26 20:56:12 +00001407/*--.. Operations on basic blocks ..........................................--*/
1408
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001409LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB) {
1410 return wrap(static_cast<Value*>(unwrap(BB)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001411}
1412
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001413LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val) {
Gordon Henriksen46abf912007-09-26 20:56:12 +00001414 return isa<BasicBlock>(unwrap(Val));
1415}
1416
1417LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val) {
1418 return wrap(unwrap<BasicBlock>(Val));
1419}
1420
Gordon Henriksen4733be32008-03-23 22:21:29 +00001421LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB) {
1422 return wrap(unwrap(BB)->getParent());
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001423}
1424
Nate Begeman7ced7762011-08-23 20:27:46 +00001425LLVMValueRef LLVMGetBasicBlockTerminator(LLVMBasicBlockRef BB) {
1426 return wrap(unwrap(BB)->getTerminator());
1427}
1428
Gordon Henriksen46abf912007-09-26 20:56:12 +00001429unsigned LLVMCountBasicBlocks(LLVMValueRef FnRef) {
Dan Gohman4d515d02008-06-21 22:06:54 +00001430 return unwrap<Function>(FnRef)->size();
Gordon Henriksen46abf912007-09-26 20:56:12 +00001431}
1432
1433void LLVMGetBasicBlocks(LLVMValueRef FnRef, LLVMBasicBlockRef *BasicBlocksRefs){
1434 Function *Fn = unwrap<Function>(FnRef);
1435 for (Function::iterator I = Fn->begin(), E = Fn->end(); I != E; I++)
1436 *BasicBlocksRefs++ = wrap(I);
1437}
1438
1439LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn) {
1440 return wrap(&unwrap<Function>(Fn)->getEntryBlock());
1441}
1442
Gordon Henriksen34000972008-03-19 03:47:18 +00001443LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn) {
1444 Function *Func = unwrap<Function>(Fn);
1445 Function::iterator I = Func->begin();
1446 if (I == Func->end())
1447 return 0;
1448 return wrap(I);
1449}
1450
1451LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn) {
1452 Function *Func = unwrap<Function>(Fn);
1453 Function::iterator I = Func->end();
1454 if (I == Func->begin())
1455 return 0;
1456 return wrap(--I);
1457}
1458
1459LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB) {
1460 BasicBlock *Block = unwrap(BB);
1461 Function::iterator I = Block;
1462 if (++I == Block->getParent()->end())
1463 return 0;
1464 return wrap(I);
1465}
1466
1467LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB) {
1468 BasicBlock *Block = unwrap(BB);
1469 Function::iterator I = Block;
1470 if (I == Block->getParent()->begin())
1471 return 0;
1472 return wrap(--I);
1473}
1474
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001475LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
1476 LLVMValueRef FnRef,
1477 const char *Name) {
1478 return wrap(BasicBlock::Create(*unwrap(C), Name, unwrap<Function>(FnRef)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001479}
1480
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001481LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef FnRef, const char *Name) {
1482 return LLVMAppendBasicBlockInContext(LLVMGetGlobalContext(), FnRef, Name);
1483}
1484
1485LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
1486 LLVMBasicBlockRef BBRef,
1487 const char *Name) {
1488 BasicBlock *BB = unwrap(BBRef);
1489 return wrap(BasicBlock::Create(*unwrap(C), Name, BB->getParent(), BB));
1490}
1491
1492LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef BBRef,
Gordon Henriksen46abf912007-09-26 20:56:12 +00001493 const char *Name) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001494 return LLVMInsertBasicBlockInContext(LLVMGetGlobalContext(), BBRef, Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +00001495}
1496
1497void LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef) {
1498 unwrap(BBRef)->eraseFromParent();
1499}
1500
Nate Begeman7ced7762011-08-23 20:27:46 +00001501void LLVMRemoveBasicBlockFromParent(LLVMBasicBlockRef BBRef) {
1502 unwrap(BBRef)->removeFromParent();
1503}
1504
Duncan Sands837a0c32010-07-19 15:31:07 +00001505void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) {
1506 unwrap(BB)->moveBefore(unwrap(MovePos));
1507}
1508
1509void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) {
1510 unwrap(BB)->moveAfter(unwrap(MovePos));
1511}
1512
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001513/*--.. Operations on instructions ..........................................--*/
1514
1515LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst) {
1516 return wrap(unwrap<Instruction>(Inst)->getParent());
1517}
1518
Gordon Henriksen34000972008-03-19 03:47:18 +00001519LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB) {
1520 BasicBlock *Block = unwrap(BB);
1521 BasicBlock::iterator I = Block->begin();
1522 if (I == Block->end())
1523 return 0;
1524 return wrap(I);
1525}
1526
1527LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB) {
1528 BasicBlock *Block = unwrap(BB);
1529 BasicBlock::iterator I = Block->end();
1530 if (I == Block->begin())
1531 return 0;
1532 return wrap(--I);
1533}
1534
1535LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst) {
1536 Instruction *Instr = unwrap<Instruction>(Inst);
1537 BasicBlock::iterator I = Instr;
1538 if (++I == Instr->getParent()->end())
1539 return 0;
1540 return wrap(I);
1541}
1542
1543LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst) {
1544 Instruction *Instr = unwrap<Instruction>(Inst);
1545 BasicBlock::iterator I = Instr;
1546 if (I == Instr->getParent()->begin())
1547 return 0;
1548 return wrap(--I);
1549}
1550
Devang Patel0e6a24d2011-10-03 20:59:18 +00001551void LLVMInstructionEraseFromParent(LLVMValueRef Inst) {
1552 unwrap<Instruction>(Inst)->eraseFromParent();
1553}
1554
Torok Edwin4917ec92011-10-06 12:13:20 +00001555LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst) {
1556 if (ICmpInst *I = dyn_cast<ICmpInst>(unwrap(Inst)))
1557 return (LLVMIntPredicate)I->getPredicate();
1558 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(unwrap(Inst)))
1559 if (CE->getOpcode() == Instruction::ICmp)
1560 return (LLVMIntPredicate)CE->getPredicate();
1561 return (LLVMIntPredicate)0;
1562}
1563
Gordon Henriksen46abf912007-09-26 20:56:12 +00001564/*--.. Call and invoke instructions ........................................--*/
1565
1566unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) {
1567 Value *V = unwrap(Instr);
1568 if (CallInst *CI = dyn_cast<CallInst>(V))
1569 return CI->getCallingConv();
1570 else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
1571 return II->getCallingConv();
Torok Edwinc23197a2009-07-14 16:55:14 +00001572 llvm_unreachable("LLVMGetInstructionCallConv applies only to call and invoke!");
Gordon Henriksen46abf912007-09-26 20:56:12 +00001573 return 0;
1574}
1575
1576void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC) {
1577 Value *V = unwrap(Instr);
1578 if (CallInst *CI = dyn_cast<CallInst>(V))
Sandeep Patel65c3c8f2009-09-02 08:44:58 +00001579 return CI->setCallingConv(static_cast<CallingConv::ID>(CC));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001580 else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
Sandeep Patel65c3c8f2009-09-02 08:44:58 +00001581 return II->setCallingConv(static_cast<CallingConv::ID>(CC));
Torok Edwinc23197a2009-07-14 16:55:14 +00001582 llvm_unreachable("LLVMSetInstructionCallConv applies only to call and invoke!");
Gordon Henriksen46abf912007-09-26 20:56:12 +00001583}
1584
Devang Patel05988662008-09-25 21:00:45 +00001585void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index,
1586 LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001587 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Devang Patel05988662008-09-25 21:00:45 +00001588 Call.setAttributes(
1589 Call.getAttributes().addAttr(index, PA));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001590}
1591
Devang Patel05988662008-09-25 21:00:45 +00001592void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
1593 LLVMAttribute PA) {
Gordon Henriksene2435da2008-04-28 17:37:06 +00001594 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Devang Patel05988662008-09-25 21:00:45 +00001595 Call.setAttributes(
1596 Call.getAttributes().removeAttr(index, PA));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001597}
1598
1599void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
1600 unsigned align) {
1601 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Devang Patel05988662008-09-25 21:00:45 +00001602 Call.setAttributes(
1603 Call.getAttributes().addAttr(index,
1604 Attribute::constructAlignmentFromInt(align)));
Gordon Henriksene2435da2008-04-28 17:37:06 +00001605}
1606
Gordon Henriksen07cabf62008-08-30 16:34:54 +00001607/*--.. Operations on call instructions (only) ..............................--*/
1608
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001609LLVMBool LLVMIsTailCall(LLVMValueRef Call) {
Gordon Henriksen07cabf62008-08-30 16:34:54 +00001610 return unwrap<CallInst>(Call)->isTailCall();
1611}
1612
Chris Lattnerd686c8e2010-01-09 22:27:07 +00001613void LLVMSetTailCall(LLVMValueRef Call, LLVMBool isTailCall) {
Gordon Henriksen07cabf62008-08-30 16:34:54 +00001614 unwrap<CallInst>(Call)->setTailCall(isTailCall);
1615}
1616
Nate Begeman7ced7762011-08-23 20:27:46 +00001617/*--.. Operations on switch instructions (only) ............................--*/
1618
1619LLVMBasicBlockRef LLVMGetSwitchDefaultDest(LLVMValueRef Switch) {
1620 return wrap(unwrap<SwitchInst>(Switch)->getDefaultDest());
1621}
1622
Gordon Henriksen2618a6c2007-10-08 18:14:39 +00001623/*--.. Operations on phi nodes .............................................--*/
1624
1625void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
1626 LLVMBasicBlockRef *IncomingBlocks, unsigned Count) {
1627 PHINode *PhiVal = unwrap<PHINode>(PhiNode);
1628 for (unsigned I = 0; I != Count; ++I)
1629 PhiVal->addIncoming(unwrap(IncomingValues[I]), unwrap(IncomingBlocks[I]));
1630}
1631
1632unsigned LLVMCountIncoming(LLVMValueRef PhiNode) {
1633 return unwrap<PHINode>(PhiNode)->getNumIncomingValues();
1634}
1635
1636LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index) {
1637 return wrap(unwrap<PHINode>(PhiNode)->getIncomingValue(Index));
1638}
1639
1640LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index) {
1641 return wrap(unwrap<PHINode>(PhiNode)->getIncomingBlock(Index));
1642}
1643
Gordon Henriksen46abf912007-09-26 20:56:12 +00001644
1645/*===-- Instruction builders ----------------------------------------------===*/
1646
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001647LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C) {
1648 return wrap(new IRBuilder<>(*unwrap(C)));
1649}
1650
Gordon Henriksen16c1f442008-05-04 12:55:34 +00001651LLVMBuilderRef LLVMCreateBuilder(void) {
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001652 return LLVMCreateBuilderInContext(LLVMGetGlobalContext());
Gordon Henriksen46abf912007-09-26 20:56:12 +00001653}
1654
Gordon Henriksen34000972008-03-19 03:47:18 +00001655void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
1656 LLVMValueRef Instr) {
1657 BasicBlock *BB = unwrap(Block);
1658 Instruction *I = Instr? unwrap<Instruction>(Instr) : (Instruction*) BB->end();
1659 unwrap(Builder)->SetInsertPoint(BB, I);
1660}
1661
Gordon Henriksen46abf912007-09-26 20:56:12 +00001662void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1663 Instruction *I = unwrap<Instruction>(Instr);
1664 unwrap(Builder)->SetInsertPoint(I->getParent(), I);
1665}
1666
1667void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block) {
1668 BasicBlock *BB = unwrap(Block);
1669 unwrap(Builder)->SetInsertPoint(BB);
1670}
1671
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +00001672LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder) {
1673 return wrap(unwrap(Builder)->GetInsertBlock());
1674}
1675
Chris Lattner851ba392008-12-17 21:39:50 +00001676void LLVMClearInsertionPosition(LLVMBuilderRef Builder) {
Chris Lattnera41b9152010-04-01 06:31:45 +00001677 unwrap(Builder)->ClearInsertionPoint();
Chris Lattner851ba392008-12-17 21:39:50 +00001678}
1679
1680void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1681 unwrap(Builder)->Insert(unwrap<Instruction>(Instr));
1682}
1683
Erick Tryzelaar5c1c2082009-08-16 02:20:57 +00001684void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
1685 const char *Name) {
1686 unwrap(Builder)->Insert(unwrap<Instruction>(Instr), Name);
1687}
1688
Gordon Henriksen46abf912007-09-26 20:56:12 +00001689void LLVMDisposeBuilder(LLVMBuilderRef Builder) {
1690 delete unwrap(Builder);
1691}
1692
Erick Tryzelaar46c80e02010-02-28 09:45:59 +00001693/*--.. Metadata builders ...................................................--*/
1694
1695void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L) {
Chris Lattnera41b9152010-04-01 06:31:45 +00001696 MDNode *Loc = L ? unwrap<MDNode>(L) : NULL;
Chris Lattner84e679b2010-04-02 20:21:22 +00001697 unwrap(Builder)->SetCurrentDebugLocation(DebugLoc::getFromDILocation(Loc));
Erick Tryzelaar46c80e02010-02-28 09:45:59 +00001698}
1699
1700LLVMValueRef LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder) {
Chris Lattnera41b9152010-04-01 06:31:45 +00001701 return wrap(unwrap(Builder)->getCurrentDebugLocation()
1702 .getAsMDNode(unwrap(Builder)->getContext()));
Erick Tryzelaar46c80e02010-02-28 09:45:59 +00001703}
1704
1705void LLVMSetInstDebugLocation(LLVMBuilderRef Builder, LLVMValueRef Inst) {
1706 unwrap(Builder)->SetInstDebugLocation(unwrap<Instruction>(Inst));
1707}
1708
1709
Gordon Henriksen46abf912007-09-26 20:56:12 +00001710/*--.. Instruction builders ................................................--*/
1711
1712LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef B) {
1713 return wrap(unwrap(B)->CreateRetVoid());
1714}
1715
1716LLVMValueRef LLVMBuildRet(LLVMBuilderRef B, LLVMValueRef V) {
1717 return wrap(unwrap(B)->CreateRet(unwrap(V)));
1718}
1719
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001720LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef B, LLVMValueRef *RetVals,
1721 unsigned N) {
1722 return wrap(unwrap(B)->CreateAggregateRet(unwrap(RetVals), N));
1723}
1724
Gordon Henriksen46abf912007-09-26 20:56:12 +00001725LLVMValueRef LLVMBuildBr(LLVMBuilderRef B, LLVMBasicBlockRef Dest) {
1726 return wrap(unwrap(B)->CreateBr(unwrap(Dest)));
1727}
1728
1729LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef B, LLVMValueRef If,
1730 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else) {
1731 return wrap(unwrap(B)->CreateCondBr(unwrap(If), unwrap(Then), unwrap(Else)));
1732}
1733
1734LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef B, LLVMValueRef V,
1735 LLVMBasicBlockRef Else, unsigned NumCases) {
1736 return wrap(unwrap(B)->CreateSwitch(unwrap(V), unwrap(Else), NumCases));
1737}
1738
Erick Tryzelaarc59286b2010-02-28 09:46:06 +00001739LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
1740 unsigned NumDests) {
1741 return wrap(unwrap(B)->CreateIndirectBr(unwrap(Addr), NumDests));
1742}
1743
Gordon Henriksen46abf912007-09-26 20:56:12 +00001744LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
1745 LLVMValueRef *Args, unsigned NumArgs,
1746 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
1747 const char *Name) {
1748 return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch),
Frits van Bommel39b5abf2011-07-18 12:00:32 +00001749 makeArrayRef(unwrap(Args), NumArgs),
Gordon Henriksen46abf912007-09-26 20:56:12 +00001750 Name));
1751}
1752
Bill Wendlinge6e88262011-08-12 20:24:12 +00001753LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,
1754 LLVMValueRef PersFn, unsigned NumClauses,
1755 const char *Name) {
1756 return wrap(unwrap(B)->CreateLandingPad(unwrap(Ty),
1757 cast<Function>(unwrap(PersFn)),
1758 NumClauses, Name));
1759}
1760
Bill Wendlingdccc03b2011-07-31 06:30:59 +00001761LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn) {
1762 return wrap(unwrap(B)->CreateResume(unwrap(Exn)));
1763}
1764
Gordon Henriksen46abf912007-09-26 20:56:12 +00001765LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) {
1766 return wrap(unwrap(B)->CreateUnreachable());
1767}
1768
Gordon Henriksenab477cc2008-01-01 05:50:53 +00001769void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
1770 LLVMBasicBlockRef Dest) {
1771 unwrap<SwitchInst>(Switch)->addCase(unwrap<ConstantInt>(OnVal), unwrap(Dest));
1772}
1773
Erick Tryzelaarc59286b2010-02-28 09:46:06 +00001774void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest) {
1775 unwrap<IndirectBrInst>(IndirectBr)->addDestination(unwrap(Dest));
1776}
1777
Bill Wendlinge6e88262011-08-12 20:24:12 +00001778void LLVMAddClause(LLVMValueRef LandingPad, LLVMValueRef ClauseVal) {
1779 unwrap<LandingPadInst>(LandingPad)->
1780 addClause(cast<Constant>(unwrap(ClauseVal)));
1781}
1782
1783void LLVMSetCleanup(LLVMValueRef LandingPad, LLVMBool Val) {
1784 unwrap<LandingPadInst>(LandingPad)->setCleanup(Val);
1785}
1786
Gordon Henriksen46abf912007-09-26 20:56:12 +00001787/*--.. Arithmetic ..........................................................--*/
1788
1789LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1790 const char *Name) {
1791 return wrap(unwrap(B)->CreateAdd(unwrap(LHS), unwrap(RHS), Name));
1792}
1793
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001794LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1795 const char *Name) {
1796 return wrap(unwrap(B)->CreateNSWAdd(unwrap(LHS), unwrap(RHS), Name));
1797}
1798
Erick Tryzelaar19f047f2010-02-28 05:51:43 +00001799LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1800 const char *Name) {
1801 return wrap(unwrap(B)->CreateNUWAdd(unwrap(LHS), unwrap(RHS), Name));
1802}
1803
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001804LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1805 const char *Name) {
1806 return wrap(unwrap(B)->CreateFAdd(unwrap(LHS), unwrap(RHS), Name));
1807}
1808
Gordon Henriksen46abf912007-09-26 20:56:12 +00001809LLVMValueRef LLVMBuildSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1810 const char *Name) {
1811 return wrap(unwrap(B)->CreateSub(unwrap(LHS), unwrap(RHS), Name));
1812}
1813
Erick Tryzelaar19f047f2010-02-28 05:51:43 +00001814LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1815 const char *Name) {
1816 return wrap(unwrap(B)->CreateNSWSub(unwrap(LHS), unwrap(RHS), Name));
1817}
1818
1819LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1820 const char *Name) {
1821 return wrap(unwrap(B)->CreateNUWSub(unwrap(LHS), unwrap(RHS), Name));
1822}
1823
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001824LLVMValueRef LLVMBuildFSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1825 const char *Name) {
1826 return wrap(unwrap(B)->CreateFSub(unwrap(LHS), unwrap(RHS), Name));
1827}
1828
Gordon Henriksen46abf912007-09-26 20:56:12 +00001829LLVMValueRef LLVMBuildMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1830 const char *Name) {
1831 return wrap(unwrap(B)->CreateMul(unwrap(LHS), unwrap(RHS), Name));
1832}
1833
Erick Tryzelaar19f047f2010-02-28 05:51:43 +00001834LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1835 const char *Name) {
1836 return wrap(unwrap(B)->CreateNSWMul(unwrap(LHS), unwrap(RHS), Name));
1837}
1838
1839LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1840 const char *Name) {
1841 return wrap(unwrap(B)->CreateNUWMul(unwrap(LHS), unwrap(RHS), Name));
1842}
1843
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001844LLVMValueRef LLVMBuildFMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1845 const char *Name) {
1846 return wrap(unwrap(B)->CreateFMul(unwrap(LHS), unwrap(RHS), Name));
1847}
1848
Gordon Henriksen46abf912007-09-26 20:56:12 +00001849LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1850 const char *Name) {
1851 return wrap(unwrap(B)->CreateUDiv(unwrap(LHS), unwrap(RHS), Name));
1852}
1853
1854LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1855 const char *Name) {
1856 return wrap(unwrap(B)->CreateSDiv(unwrap(LHS), unwrap(RHS), Name));
1857}
1858
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00001859LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef B, LLVMValueRef LHS,
1860 LLVMValueRef RHS, const char *Name) {
1861 return wrap(unwrap(B)->CreateExactSDiv(unwrap(LHS), unwrap(RHS), Name));
1862}
1863
Gordon Henriksen46abf912007-09-26 20:56:12 +00001864LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1865 const char *Name) {
1866 return wrap(unwrap(B)->CreateFDiv(unwrap(LHS), unwrap(RHS), Name));
1867}
1868
1869LLVMValueRef LLVMBuildURem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1870 const char *Name) {
1871 return wrap(unwrap(B)->CreateURem(unwrap(LHS), unwrap(RHS), Name));
1872}
1873
1874LLVMValueRef LLVMBuildSRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1875 const char *Name) {
1876 return wrap(unwrap(B)->CreateSRem(unwrap(LHS), unwrap(RHS), Name));
1877}
1878
1879LLVMValueRef LLVMBuildFRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1880 const char *Name) {
1881 return wrap(unwrap(B)->CreateFRem(unwrap(LHS), unwrap(RHS), Name));
1882}
1883
1884LLVMValueRef LLVMBuildShl(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1885 const char *Name) {
1886 return wrap(unwrap(B)->CreateShl(unwrap(LHS), unwrap(RHS), Name));
1887}
1888
1889LLVMValueRef LLVMBuildLShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1890 const char *Name) {
1891 return wrap(unwrap(B)->CreateLShr(unwrap(LHS), unwrap(RHS), Name));
1892}
1893
1894LLVMValueRef LLVMBuildAShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1895 const char *Name) {
1896 return wrap(unwrap(B)->CreateAShr(unwrap(LHS), unwrap(RHS), Name));
1897}
1898
1899LLVMValueRef LLVMBuildAnd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1900 const char *Name) {
1901 return wrap(unwrap(B)->CreateAnd(unwrap(LHS), unwrap(RHS), Name));
1902}
1903
1904LLVMValueRef LLVMBuildOr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1905 const char *Name) {
1906 return wrap(unwrap(B)->CreateOr(unwrap(LHS), unwrap(RHS), Name));
1907}
1908
1909LLVMValueRef LLVMBuildXor(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1910 const char *Name) {
1911 return wrap(unwrap(B)->CreateXor(unwrap(LHS), unwrap(RHS), Name));
1912}
1913
Erick Tryzelaarabbcc5e2010-02-28 05:51:27 +00001914LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op,
1915 LLVMValueRef LHS, LLVMValueRef RHS,
1916 const char *Name) {
1917 return wrap(unwrap(B)->CreateBinOp(Instruction::BinaryOps(Op), unwrap(LHS),
1918 unwrap(RHS), Name));
1919}
1920
Gordon Henriksen46abf912007-09-26 20:56:12 +00001921LLVMValueRef LLVMBuildNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1922 return wrap(unwrap(B)->CreateNeg(unwrap(V), Name));
1923}
1924
Erick Tryzelaar19f047f2010-02-28 05:51:43 +00001925LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
1926 const char *Name) {
1927 return wrap(unwrap(B)->CreateNSWNeg(unwrap(V), Name));
1928}
1929
1930LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V,
1931 const char *Name) {
1932 return wrap(unwrap(B)->CreateNUWNeg(unwrap(V), Name));
1933}
1934
Dan Gohmand0c5a292009-09-28 21:51:41 +00001935LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1936 return wrap(unwrap(B)->CreateFNeg(unwrap(V), Name));
1937}
1938
Gordon Henriksen46abf912007-09-26 20:56:12 +00001939LLVMValueRef LLVMBuildNot(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1940 return wrap(unwrap(B)->CreateNot(unwrap(V), Name));
1941}
1942
1943/*--.. Memory ..............................................................--*/
1944
1945LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
1946 const char *Name) {
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001947 Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext());
Victor Hernandez9d0b7042009-11-07 00:16:28 +00001948 Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty));
1949 AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy);
1950 Instruction* Malloc = CallInst::CreateMalloc(unwrap(B)->GetInsertBlock(),
1951 ITy, unwrap(Ty), AllocSize,
1952 0, 0, "");
1953 return wrap(unwrap(B)->Insert(Malloc, Twine(Name)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001954}
1955
1956LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
1957 LLVMValueRef Val, const char *Name) {
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001958 Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext());
Victor Hernandez9d0b7042009-11-07 00:16:28 +00001959 Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty));
1960 AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy);
1961 Instruction* Malloc = CallInst::CreateMalloc(unwrap(B)->GetInsertBlock(),
1962 ITy, unwrap(Ty), AllocSize,
1963 unwrap(Val), 0, "");
1964 return wrap(unwrap(B)->Insert(Malloc, Twine(Name)));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001965}
1966
1967LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
1968 const char *Name) {
1969 return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), 0, Name));
1970}
1971
1972LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
1973 LLVMValueRef Val, const char *Name) {
1974 return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), unwrap(Val), Name));
1975}
1976
1977LLVMValueRef LLVMBuildFree(LLVMBuilderRef B, LLVMValueRef PointerVal) {
Victor Hernandez046e78c2009-10-26 23:43:48 +00001978 return wrap(unwrap(B)->Insert(
1979 CallInst::CreateFree(unwrap(PointerVal), unwrap(B)->GetInsertBlock())));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001980}
1981
1982
1983LLVMValueRef LLVMBuildLoad(LLVMBuilderRef B, LLVMValueRef PointerVal,
1984 const char *Name) {
1985 return wrap(unwrap(B)->CreateLoad(unwrap(PointerVal), Name));
1986}
1987
1988LLVMValueRef LLVMBuildStore(LLVMBuilderRef B, LLVMValueRef Val,
1989 LLVMValueRef PointerVal) {
1990 return wrap(unwrap(B)->CreateStore(unwrap(Val), unwrap(PointerVal)));
1991}
1992
1993LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1994 LLVMValueRef *Indices, unsigned NumIndices,
1995 const char *Name) {
Jay Foad0a2a60a2011-07-22 08:16:57 +00001996 ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
1997 return wrap(unwrap(B)->CreateGEP(unwrap(Pointer), IdxList, Name));
Gordon Henriksen46abf912007-09-26 20:56:12 +00001998}
1999
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00002000LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
2001 LLVMValueRef *Indices, unsigned NumIndices,
2002 const char *Name) {
Jay Foad0a2a60a2011-07-22 08:16:57 +00002003 ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
2004 return wrap(unwrap(B)->CreateInBoundsGEP(unwrap(Pointer), IdxList, Name));
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00002005}
2006
2007LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
2008 unsigned Idx, const char *Name) {
2009 return wrap(unwrap(B)->CreateStructGEP(unwrap(Pointer), Idx, Name));
2010}
2011
2012LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
2013 const char *Name) {
2014 return wrap(unwrap(B)->CreateGlobalString(Str, Name));
2015}
2016
2017LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
2018 const char *Name) {
2019 return wrap(unwrap(B)->CreateGlobalStringPtr(Str, Name));
2020}
2021
Gordon Henriksen46abf912007-09-26 20:56:12 +00002022/*--.. Casts ...............................................................--*/
2023
2024LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef B, LLVMValueRef Val,
2025 LLVMTypeRef DestTy, const char *Name) {
2026 return wrap(unwrap(B)->CreateTrunc(unwrap(Val), unwrap(DestTy), Name));
2027}
2028
2029LLVMValueRef LLVMBuildZExt(LLVMBuilderRef B, LLVMValueRef Val,
2030 LLVMTypeRef DestTy, const char *Name) {
2031 return wrap(unwrap(B)->CreateZExt(unwrap(Val), unwrap(DestTy), Name));
2032}
2033
2034LLVMValueRef LLVMBuildSExt(LLVMBuilderRef B, LLVMValueRef Val,
2035 LLVMTypeRef DestTy, const char *Name) {
2036 return wrap(unwrap(B)->CreateSExt(unwrap(Val), unwrap(DestTy), Name));
2037}
2038
2039LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef B, LLVMValueRef Val,
2040 LLVMTypeRef DestTy, const char *Name) {
2041 return wrap(unwrap(B)->CreateFPToUI(unwrap(Val), unwrap(DestTy), Name));
2042}
2043
2044LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef B, LLVMValueRef Val,
2045 LLVMTypeRef DestTy, const char *Name) {
2046 return wrap(unwrap(B)->CreateFPToSI(unwrap(Val), unwrap(DestTy), Name));
2047}
2048
2049LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef B, LLVMValueRef Val,
2050 LLVMTypeRef DestTy, const char *Name) {
2051 return wrap(unwrap(B)->CreateUIToFP(unwrap(Val), unwrap(DestTy), Name));
2052}
2053
2054LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef B, LLVMValueRef Val,
2055 LLVMTypeRef DestTy, const char *Name) {
2056 return wrap(unwrap(B)->CreateSIToFP(unwrap(Val), unwrap(DestTy), Name));
2057}
2058
2059LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef B, LLVMValueRef Val,
2060 LLVMTypeRef DestTy, const char *Name) {
2061 return wrap(unwrap(B)->CreateFPTrunc(unwrap(Val), unwrap(DestTy), Name));
2062}
2063
2064LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef B, LLVMValueRef Val,
2065 LLVMTypeRef DestTy, const char *Name) {
2066 return wrap(unwrap(B)->CreateFPExt(unwrap(Val), unwrap(DestTy), Name));
2067}
2068
2069LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef B, LLVMValueRef Val,
2070 LLVMTypeRef DestTy, const char *Name) {
2071 return wrap(unwrap(B)->CreatePtrToInt(unwrap(Val), unwrap(DestTy), Name));
2072}
2073
2074LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef B, LLVMValueRef Val,
2075 LLVMTypeRef DestTy, const char *Name) {
2076 return wrap(unwrap(B)->CreateIntToPtr(unwrap(Val), unwrap(DestTy), Name));
2077}
2078
2079LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2080 LLVMTypeRef DestTy, const char *Name) {
2081 return wrap(unwrap(B)->CreateBitCast(unwrap(Val), unwrap(DestTy), Name));
2082}
2083
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00002084LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2085 LLVMTypeRef DestTy, const char *Name) {
2086 return wrap(unwrap(B)->CreateZExtOrBitCast(unwrap(Val), unwrap(DestTy),
2087 Name));
2088}
2089
2090LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2091 LLVMTypeRef DestTy, const char *Name) {
2092 return wrap(unwrap(B)->CreateSExtOrBitCast(unwrap(Val), unwrap(DestTy),
2093 Name));
2094}
2095
2096LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2097 LLVMTypeRef DestTy, const char *Name) {
2098 return wrap(unwrap(B)->CreateTruncOrBitCast(unwrap(Val), unwrap(DestTy),
2099 Name));
2100}
2101
Erick Tryzelaarabbcc5e2010-02-28 05:51:27 +00002102LLVMValueRef LLVMBuildCast(LLVMBuilderRef B, LLVMOpcode Op, LLVMValueRef Val,
2103 LLVMTypeRef DestTy, const char *Name) {
2104 return wrap(unwrap(B)->CreateCast(Instruction::CastOps(Op), unwrap(Val),
2105 unwrap(DestTy), Name));
2106}
2107
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00002108LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef B, LLVMValueRef Val,
2109 LLVMTypeRef DestTy, const char *Name) {
2110 return wrap(unwrap(B)->CreatePointerCast(unwrap(Val), unwrap(DestTy), Name));
2111}
2112
2113LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef B, LLVMValueRef Val,
Duncan Sandse8e01b62009-11-23 10:49:03 +00002114 LLVMTypeRef DestTy, const char *Name) {
2115 return wrap(unwrap(B)->CreateIntCast(unwrap(Val), unwrap(DestTy),
2116 /*isSigned*/true, Name));
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00002117}
2118
2119LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef B, LLVMValueRef Val,
2120 LLVMTypeRef DestTy, const char *Name) {
2121 return wrap(unwrap(B)->CreateFPCast(unwrap(Val), unwrap(DestTy), Name));
2122}
2123
Gordon Henriksen46abf912007-09-26 20:56:12 +00002124/*--.. Comparisons .........................................................--*/
2125
2126LLVMValueRef LLVMBuildICmp(LLVMBuilderRef B, LLVMIntPredicate Op,
2127 LLVMValueRef LHS, LLVMValueRef RHS,
2128 const char *Name) {
2129 return wrap(unwrap(B)->CreateICmp(static_cast<ICmpInst::Predicate>(Op),
2130 unwrap(LHS), unwrap(RHS), Name));
2131}
2132
2133LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef B, LLVMRealPredicate Op,
2134 LLVMValueRef LHS, LLVMValueRef RHS,
2135 const char *Name) {
2136 return wrap(unwrap(B)->CreateFCmp(static_cast<FCmpInst::Predicate>(Op),
2137 unwrap(LHS), unwrap(RHS), Name));
2138}
2139
2140/*--.. Miscellaneous instructions ..........................................--*/
2141
2142LLVMValueRef LLVMBuildPhi(LLVMBuilderRef B, LLVMTypeRef Ty, const char *Name) {
Jay Foad3ecfc862011-03-30 11:28:46 +00002143 return wrap(unwrap(B)->CreatePHI(unwrap(Ty), 0, Name));
Gordon Henriksen46abf912007-09-26 20:56:12 +00002144}
2145
2146LLVMValueRef LLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn,
2147 LLVMValueRef *Args, unsigned NumArgs,
2148 const char *Name) {
Jay Foada3efbb12011-07-15 08:37:34 +00002149 return wrap(unwrap(B)->CreateCall(unwrap(Fn),
Frits van Bommel39b5abf2011-07-18 12:00:32 +00002150 makeArrayRef(unwrap(Args), NumArgs),
Jay Foada3efbb12011-07-15 08:37:34 +00002151 Name));
Gordon Henriksen46abf912007-09-26 20:56:12 +00002152}
2153
2154LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If,
2155 LLVMValueRef Then, LLVMValueRef Else,
2156 const char *Name) {
2157 return wrap(unwrap(B)->CreateSelect(unwrap(If), unwrap(Then), unwrap(Else),
2158 Name));
2159}
2160
2161LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef B, LLVMValueRef List,
2162 LLVMTypeRef Ty, const char *Name) {
2163 return wrap(unwrap(B)->CreateVAArg(unwrap(List), unwrap(Ty), Name));
2164}
2165
2166LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef B, LLVMValueRef VecVal,
2167 LLVMValueRef Index, const char *Name) {
2168 return wrap(unwrap(B)->CreateExtractElement(unwrap(VecVal), unwrap(Index),
2169 Name));
2170}
2171
2172LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef B, LLVMValueRef VecVal,
2173 LLVMValueRef EltVal, LLVMValueRef Index,
2174 const char *Name) {
2175 return wrap(unwrap(B)->CreateInsertElement(unwrap(VecVal), unwrap(EltVal),
2176 unwrap(Index), Name));
2177}
2178
2179LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1,
2180 LLVMValueRef V2, LLVMValueRef Mask,
2181 const char *Name) {
2182 return wrap(unwrap(B)->CreateShuffleVector(unwrap(V1), unwrap(V2),
2183 unwrap(Mask), Name));
2184}
Gordon Henriksen1ae61352007-12-12 01:04:30 +00002185
Dan Gohmanb5931172008-11-03 22:55:43 +00002186LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef B, LLVMValueRef AggVal,
2187 unsigned Index, const char *Name) {
2188 return wrap(unwrap(B)->CreateExtractValue(unwrap(AggVal), Index, Name));
2189}
2190
2191LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef B, LLVMValueRef AggVal,
2192 LLVMValueRef EltVal, unsigned Index,
2193 const char *Name) {
2194 return wrap(unwrap(B)->CreateInsertValue(unwrap(AggVal), unwrap(EltVal),
2195 Index, Name));
2196}
2197
Erick Tryzelaarf72596c2009-08-16 02:19:59 +00002198LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef B, LLVMValueRef Val,
2199 const char *Name) {
2200 return wrap(unwrap(B)->CreateIsNull(unwrap(Val), Name));
2201}
2202
2203LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef B, LLVMValueRef Val,
2204 const char *Name) {
2205 return wrap(unwrap(B)->CreateIsNotNull(unwrap(Val), Name));
2206}
2207
2208LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef B, LLVMValueRef LHS,
2209 LLVMValueRef RHS, const char *Name) {
2210 return wrap(unwrap(B)->CreatePtrDiff(unwrap(LHS), unwrap(RHS), Name));
2211}
2212
Gordon Henriksen1ae61352007-12-12 01:04:30 +00002213
2214/*===-- Module providers --------------------------------------------------===*/
2215
2216LLVMModuleProviderRef
2217LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M) {
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +00002218 return reinterpret_cast<LLVMModuleProviderRef>(M);
Gordon Henriksen1ae61352007-12-12 01:04:30 +00002219}
2220
2221void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP) {
2222 delete unwrap(MP);
2223}
2224
Gordon Henriksenda1435f2007-12-19 22:30:40 +00002225
2226/*===-- Memory buffers ----------------------------------------------------===*/
2227
Chris Lattnerd686c8e2010-01-09 22:27:07 +00002228LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(
2229 const char *Path,
2230 LLVMMemoryBufferRef *OutMemBuf,
2231 char **OutMessage) {
2232
Michael J. Spencer3ff95632010-12-16 03:29:14 +00002233 OwningPtr<MemoryBuffer> MB;
Michael J. Spencer333fb042010-12-09 17:36:48 +00002234 error_code ec;
Michael J. Spencer3ff95632010-12-16 03:29:14 +00002235 if (!(ec = MemoryBuffer::getFile(Path, MB))) {
2236 *OutMemBuf = wrap(MB.take());
Gordon Henriksenda1435f2007-12-19 22:30:40 +00002237 return 0;
2238 }
Michael J. Spencer333fb042010-12-09 17:36:48 +00002239
2240 *OutMessage = strdup(ec.message().c_str());
Gordon Henriksenda1435f2007-12-19 22:30:40 +00002241 return 1;
2242}
2243
Chris Lattnerd686c8e2010-01-09 22:27:07 +00002244LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
2245 char **OutMessage) {
Michael J. Spencer3ff95632010-12-16 03:29:14 +00002246 OwningPtr<MemoryBuffer> MB;
Michael J. Spencer333fb042010-12-09 17:36:48 +00002247 error_code ec;
Michael J. Spencer3ff95632010-12-16 03:29:14 +00002248 if (!(ec = MemoryBuffer::getSTDIN(MB))) {
2249 *OutMemBuf = wrap(MB.take());
Dan Gohman30377e72010-05-27 17:31:51 +00002250 return 0;
Gordon Henriksenda1435f2007-12-19 22:30:40 +00002251 }
Daniel Dunbard65267e2009-11-10 00:43:58 +00002252
Michael J. Spencer333fb042010-12-09 17:36:48 +00002253 *OutMessage = strdup(ec.message().c_str());
Dan Gohman30377e72010-05-27 17:31:51 +00002254 return 1;
Gordon Henriksenda1435f2007-12-19 22:30:40 +00002255}
2256
2257void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
2258 delete unwrap(MemBuf);
2259}
Dan Gohman11112e02010-08-07 00:43:20 +00002260
Owen Anderson1a3d2332010-10-07 17:55:47 +00002261/*===-- Pass Registry -----------------------------------------------------===*/
2262
2263LLVMPassRegistryRef LLVMGetGlobalPassRegistry(void) {
2264 return wrap(PassRegistry::getPassRegistry());
2265}
Dan Gohman11112e02010-08-07 00:43:20 +00002266
2267/*===-- Pass Manager ------------------------------------------------------===*/
2268
2269LLVMPassManagerRef LLVMCreatePassManager() {
2270 return wrap(new PassManager());
2271}
2272
2273LLVMPassManagerRef LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M) {
2274 return wrap(new FunctionPassManager(unwrap(M)));
2275}
2276
2277LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef P) {
2278 return LLVMCreateFunctionPassManagerForModule(
2279 reinterpret_cast<LLVMModuleRef>(P));
2280}
2281
2282LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M) {
2283 return unwrap<PassManager>(PM)->run(*unwrap(M));
2284}
2285
2286LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM) {
2287 return unwrap<FunctionPassManager>(FPM)->doInitialization();
2288}
2289
2290LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F) {
2291 return unwrap<FunctionPassManager>(FPM)->run(*unwrap<Function>(F));
2292}
2293
2294LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM) {
2295 return unwrap<FunctionPassManager>(FPM)->doFinalization();
2296}
2297
2298void LLVMDisposePassManager(LLVMPassManagerRef PM) {
2299 delete unwrap(PM);
2300}