Adding a collector name attribute to Function in the IR. These
[oota-llvm.git] / include / llvm-c / Core.h
1 /*===-- llvm-c/Core.h - Core Library C Interface ------------------*- C -*-===*\
2 |*                                                                            *|
3 |*                     The LLVM Compiler Infrastructure                       *|
4 |*                                                                            *|
5 |* This file was developed by Gordon Henriksen and is distributed under the   *|
6 |* University of Illinois Open Source License. See LICENSE.TXT for details.   *|
7 |*                                                                            *|
8 |*===----------------------------------------------------------------------===*|
9 |*                                                                            *|
10 |* This header declares the C interface to libLLVMCore.a, which implements    *|
11 |* the LLVM intermediate representation.                                      *|
12 |*                                                                            *|
13 |* LLVM uses a polymorphic type hierarchy which C cannot represent, therefore *|
14 |* parameters must be passed as base types. Despite the declared types, most  *|
15 |* of the functions provided operate only on branches of the type hierarchy.  *|
16 |* The declared parameter names are descriptive and specify which type is     *|
17 |* required. Additionally, each type hierarchy is documented along with the   *|
18 |* functions that operate upon it. For more detail, refer to LLVM's C++ code. *|
19 |* If in doubt, refer to Core.cpp, which performs paramter downcasts in the   *|
20 |* form unwrap<RequiredType>(Param).                                          *|
21 |*                                                                            *|
22 |* Many exotic languages can interoperate with C code but have a harder time  *|
23 |* with C++ due to name mangling. So in addition to C, this interface enables *|
24 |* tools written in such languages.                                           *|
25 |*                                                                            *|
26 |* When included into a C++ source file, also declares 'wrap' and 'unwrap'    *|
27 |* helpers to perform opaque reference<-->pointer conversions. These helpers  *|
28 |* are shorter and more tightly typed than writing the casts by hand when     *|
29 |* authoring bindings. In assert builds, they will do runtime type checking.  *|
30 |*                                                                            *|
31 \*===----------------------------------------------------------------------===*/
32
33 #ifndef LLVM_C_CORE_H
34 #define LLVM_C_CORE_H
35
36 #ifdef __cplusplus
37
38 /* Need these includes to support the LLVM 'cast' template for the C++ 'wrap' 
39    and 'unwrap' conversion functions. */
40 #include "llvm/Module.h"
41 #include "llvm/Support/LLVMBuilder.h"
42
43 extern "C" {
44 #endif
45
46
47 /* Opaque types. */
48 typedef struct LLVMOpaqueModule *LLVMModuleRef;
49 typedef struct LLVMOpaqueType *LLVMTypeRef;
50 typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
51 typedef struct LLVMOpaqueValue *LLVMValueRef;
52 typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
53 typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
54
55 typedef enum {
56   LLVMVoidTypeKind,        /* type with no size */
57   LLVMFloatTypeKind,       /* 32 bit floating point type */
58   LLVMDoubleTypeKind,      /* 64 bit floating point type */
59   LLVMX86_FP80TypeKind,    /* 80 bit floating point type (X87) */
60   LLVMFP128TypeKind,       /* 128 bit floating point type (112-bit mantissa) */
61   LLVMPPC_FP128TypeKind,   /* 128 bit floating point type (two 64-bits) */
62   LLVMLabelTypeKind,       /* Labels */
63   LLVMIntegerTypeKind,     /* Arbitrary bit width integers */
64   LLVMFunctionTypeKind,    /* Functions */
65   LLVMStructTypeKind,      /* Structures */
66   LLVMArrayTypeKind,       /* Arrays */
67   LLVMPointerTypeKind,     /* Pointers */
68   LLVMOpaqueTypeKind,      /* Opaque: type with unknown structure */
69   LLVMVectorTypeKind       /* SIMD 'packed' format, or other vector type */
70 } LLVMTypeKind;
71
72 typedef enum {
73   LLVMExternalLinkage,    /* Externally visible function */
74   LLVMLinkOnceLinkage,    /* Keep one copy of function when linking (inline) */
75   LLVMWeakLinkage,        /* Keep one copy of function when linking (weak) */
76   LLVMAppendingLinkage,   /* Special purpose, only applies to global arrays */
77   LLVMInternalLinkage,    /* Rename collisions when linking (static functions)*/
78   LLVMDLLImportLinkage,   /* Function to be imported from DLL */
79   LLVMDLLExportLinkage,   /* Function to be accessible from DLL */
80   LLVMExternalWeakLinkage,/* ExternalWeak linkage description */
81   LLVMGhostLinkage        /* Stand-in functions for streaming fns from bitcode*/
82 } LLVMLinkage;
83
84 typedef enum {
85   LLVMDefaultVisibility,  /* The GV is visible */
86   LLVMHiddenVisibility,   /* The GV is hidden */
87   LLVMProtectedVisibility /* The GV is protected */
88 } LLVMVisibility;
89
90 typedef enum {
91   LLVMCCallConv           = 0,
92   LLVMFastCallConv        = 8,
93   LLVMColdCallConv        = 9,
94   LLVMX86StdcallCallConv  = 64,
95   LLVMX86FastcallCallConv = 65
96 } LLVMCallConv;
97
98 typedef enum {
99   LLVMIntEQ = 32, /* equal */
100   LLVMIntNE,      /* not equal */
101   LLVMIntUGT,     /* unsigned greater than */
102   LLVMIntUGE,     /* unsigned greater or equal */
103   LLVMIntULT,     /* unsigned less than */
104   LLVMIntULE,     /* unsigned less or equal */
105   LLVMIntSGT,     /* signed greater than */
106   LLVMIntSGE,     /* signed greater or equal */
107   LLVMIntSLT,     /* signed less than */
108   LLVMIntSLE      /* signed less or equal */
109 } LLVMIntPredicate;
110
111 typedef enum {
112   LLVMRealPredicateFalse, /* Always false (always folded) */
113   LLVMRealOEQ,            /* True if ordered and equal */
114   LLVMRealOGT,            /* True if ordered and greater than */
115   LLVMRealOGE,            /* True if ordered and greater than or equal */
116   LLVMRealOLT,            /* True if ordered and less than */
117   LLVMRealOLE,            /* True if ordered and less than or equal */
118   LLVMRealONE,            /* True if ordered and operands are unequal */
119   LLVMRealORD,            /* True if ordered (no nans) */
120   LLVMRealUNO,            /* True if unordered: isnan(X) | isnan(Y) */
121   LLVMRealUEQ,            /* True if unordered or equal */
122   LLVMRealUGT,            /* True if unordered or greater than */
123   LLVMRealUGE,            /* True if unordered, greater than, or equal */
124   LLVMRealULT,            /* True if unordered or less than */
125   LLVMRealULE,            /* True if unordered, less than, or equal */
126   LLVMRealUNE,            /* True if unordered or not equal */
127   LLVMRealPredicateTrue   /* Always true (always folded) */
128 } LLVMRealPredicate;
129
130
131 /*===-- Modules -----------------------------------------------------------===*/
132
133 /* Create and destroy modules. */ 
134 LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
135 void LLVMDisposeModule(LLVMModuleRef M);
136
137 /* Same as Module::addTypeName. */
138 int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
139 void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
140
141
142 /*===-- Types -------------------------------------------------------------===*/
143
144 /* LLVM types conform to the following hierarchy:
145  * 
146  *   types:
147  *     integer type
148  *     real type
149  *     function type
150  *     sequence types:
151  *       array type
152  *       pointer type
153  *       vector type
154  *     void type
155  *     label type
156  *     opaque type
157  */
158
159 LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
160 void LLVMRefineAbstractType(LLVMTypeRef AbstractType, LLVMTypeRef ConcreteType);
161
162 /* Operations on integer types */
163 LLVMTypeRef LLVMInt1Type();
164 LLVMTypeRef LLVMInt8Type();
165 LLVMTypeRef LLVMInt16Type();
166 LLVMTypeRef LLVMInt32Type();
167 LLVMTypeRef LLVMInt64Type();
168 LLVMTypeRef LLVMIntType(unsigned NumBits);
169 unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
170
171 /* Operations on real types */
172 LLVMTypeRef LLVMFloatType();
173 LLVMTypeRef LLVMDoubleType();
174 LLVMTypeRef LLVMX86FP80Type();
175 LLVMTypeRef LLVMFP128Type();
176 LLVMTypeRef LLVMPPCFP128Type();
177
178 /* Operations on function types */
179 LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
180                              LLVMTypeRef *ParamTypes, unsigned ParamCount,
181                              int IsVarArg);
182 int LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
183 LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
184 unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
185 void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
186
187 /* Operations on struct types */
188 LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
189                            int Packed);
190 unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
191 void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
192 int LLVMIsPackedStruct(LLVMTypeRef StructTy);
193
194 /* Operations on array, pointer, and vector types (sequence types) */
195 LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
196 LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType);
197 LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
198
199 LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
200 unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
201 unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
202
203 /* Operations on other types */
204 LLVMTypeRef LLVMVoidType();
205 LLVMTypeRef LLVMLabelType();
206 LLVMTypeRef LLVMOpaqueType();
207
208 /* Operations on type handles */
209 LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
210 void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
211 LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
212 void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
213
214
215 /*===-- Values ------------------------------------------------------------===*/
216
217 /* The bulk of LLVM's object model consists of values, which comprise a very
218  * rich type hierarchy.
219  * 
220  *   values:
221  *     constants:
222  *       scalar constants
223  *       composite contants
224  *       globals:
225  *         global variable
226  *         function
227  *         alias
228  *       basic blocks
229  */
230
231 /* Operations on all values */
232 LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
233 const char *LLVMGetValueName(LLVMValueRef Val);
234 void LLVMSetValueName(LLVMValueRef Val, const char *Name);
235 void LLVMDumpValue(LLVMValueRef Val);
236
237 /* Operations on constants of any type */
238 LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
239 LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
240 LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
241 int LLVMIsConstant(LLVMValueRef Val);
242 int LLVMIsNull(LLVMValueRef Val);
243 int LLVMIsUndef(LLVMValueRef Val);
244
245 /* Operations on scalar constants */
246 LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
247                           int SignExtend);
248 LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
249
250 /* Operations on composite constants */
251 LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
252                              int DontNullTerminate);
253 LLVMValueRef LLVMConstArray(LLVMTypeRef ArrayTy,
254                             LLVMValueRef *ConstantVals, unsigned Length);
255 LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
256                              int packed);
257 LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
258
259 /* Constant expressions */
260 LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
261 LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
262 LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
263 LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
264 LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
265 LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
266 LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
267 LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
268 LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
269 LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
270 LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
271 LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
272 LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
273 LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
274 LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
275 LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
276                            LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
277 LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
278                            LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
279 LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
280 LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
281 LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
282 LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
283                           LLVMValueRef *ConstantIndices, unsigned NumIndices);
284 LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
285 LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
286 LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
287 LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
288 LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
289 LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
290 LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
291 LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
292 LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
293 LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
294 LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
295 LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
296 LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
297                              LLVMValueRef ConstantIfTrue,
298                              LLVMValueRef ConstantIfFalse);
299 LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
300                                      LLVMValueRef IndexConstant);
301 LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
302                                     LLVMValueRef ElementValueConstant,
303                                     LLVMValueRef IndexConstant);
304 LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
305                                     LLVMValueRef VectorBConstant,
306                                     LLVMValueRef MaskConstant);
307
308 /* Operations on global variables, functions, and aliases (globals) */
309 int LLVMIsDeclaration(LLVMValueRef Global);
310 LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
311 void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
312 const char *LLVMGetSection(LLVMValueRef Global);
313 void LLVMSetSection(LLVMValueRef Global, const char *Section);
314 LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
315 void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
316 unsigned LLVMGetAlignment(LLVMValueRef Global);
317 void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
318
319 /* Operations on global variables */
320 LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
321 LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
322 void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
323 int LLVMHasInitializer(LLVMValueRef GlobalVar);
324 LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
325 void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
326 int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
327 void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
328 int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
329 void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
330
331 /* Operations on functions */
332 LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
333                              LLVMTypeRef FunctionTy);
334 LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
335 void LLVMDeleteFunction(LLVMValueRef Fn);
336 unsigned LLVMCountParams(LLVMValueRef Fn);
337 void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
338 LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
339 unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
340 unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
341 void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
342 const char *LLVMGetCollector(LLVMValueRef Fn);
343 void LLVMSetCollector(LLVMValueRef Fn, const char *Coll);
344
345 /* Operations on basic blocks */
346 LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef Bb);
347 int LLVMValueIsBasicBlock(LLVMValueRef Val);
348 LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
349 unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
350 void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
351 LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
352 LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
353 LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
354                                        const char *Name);
355 void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
356
357 /* Operations on phi nodes */
358 void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
359                      LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
360 unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
361 LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
362 LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
363
364 /*===-- Instruction builders ----------------------------------------------===*/
365
366 /* An instruction builder represents a point within a basic block, and is the
367  * exclusive means of building instructions using the C interface.
368  */
369
370 LLVMBuilderRef LLVMCreateBuilder();
371 void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
372 void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
373 void LLVMDisposeBuilder(LLVMBuilderRef Builder);
374
375 /* Terminators */
376 LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
377 LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
378 LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
379 LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
380                              LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
381 LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
382                              LLVMBasicBlockRef Else, unsigned NumCases);
383 LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
384                              LLVMValueRef *Args, unsigned NumArgs,
385                              LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
386                              const char *Name);
387 LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
388 LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
389
390 /* Arithmetic */
391 LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
392                           const char *Name);
393 LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
394                           const char *Name);
395 LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
396                           const char *Name);
397 LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
398                            const char *Name);
399 LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
400                            const char *Name);
401 LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
402                            const char *Name);
403 LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
404                            const char *Name);
405 LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
406                            const char *Name);
407 LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
408                            const char *Name);
409 LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
410                            const char *Name);
411 LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
412                            const char *Name);
413 LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
414                            const char *Name);
415 LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
416                           const char *Name);
417 LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
418                           const char *Name);
419 LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
420                           const char *Name);
421 LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
422 LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
423
424 /* Memory */
425 LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
426 LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
427                                   LLVMValueRef Val, const char *Name);
428 LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
429 LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
430                                   LLVMValueRef Val, const char *Name);
431 LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
432 LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
433                            const char *Name);
434 LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
435 LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
436                           LLVMValueRef *Indices, unsigned NumIndices,
437                           const char *Name);
438
439 /* Casts */
440 LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
441                             LLVMTypeRef DestTy, const char *Name);
442 LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
443                            LLVMTypeRef DestTy, const char *Name);
444 LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
445                            LLVMTypeRef DestTy, const char *Name);
446 LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
447                              LLVMTypeRef DestTy, const char *Name);
448 LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
449                              LLVMTypeRef DestTy, const char *Name);
450 LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
451                              LLVMTypeRef DestTy, const char *Name);
452 LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
453                              LLVMTypeRef DestTy, const char *Name);
454 LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
455                               LLVMTypeRef DestTy, const char *Name);
456 LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
457                             LLVMTypeRef DestTy, const char *Name);
458 LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
459                                LLVMTypeRef DestTy, const char *Name);
460 LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
461                                LLVMTypeRef DestTy, const char *Name);
462 LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
463                               LLVMTypeRef DestTy, const char *Name);
464
465 /* Comparisons */
466 LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
467                            LLVMValueRef LHS, LLVMValueRef RHS,
468                            const char *Name);
469 LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
470                            LLVMValueRef LHS, LLVMValueRef RHS,
471                            const char *Name);
472
473 /* Miscellaneous instructions */
474 LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
475 LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
476                            LLVMValueRef *Args, unsigned NumArgs,
477                            const char *Name);
478 LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
479                              LLVMValueRef Then, LLVMValueRef Else,
480                              const char *Name);
481 LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
482                             const char *Name);
483 LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
484                                      LLVMValueRef Index, const char *Name);
485 LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
486                                     LLVMValueRef EltVal, LLVMValueRef Index,
487                                     const char *Name);
488 LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
489                                     LLVMValueRef V2, LLVMValueRef Mask,
490                                     const char *Name);
491
492 #ifdef __cplusplus
493 }
494
495 namespace llvm {
496   /* Opaque module conversions
497    */ 
498   inline Module *unwrap(LLVMModuleRef M) {
499     return reinterpret_cast<Module*>(M);
500   }
501   
502   inline LLVMModuleRef wrap(Module *M) {
503     return reinterpret_cast<LLVMModuleRef>(M);
504   }
505   
506   /* Opaque type conversions
507    */ 
508   inline Type *unwrap(LLVMTypeRef Ty) {
509     return reinterpret_cast<Type*>(Ty);
510   }
511   
512   template<typename T>
513   inline T *unwrap(LLVMTypeRef Ty) {
514     return cast<T>(unwrap(Ty));
515   }
516   
517   inline Type **unwrap(LLVMTypeRef* Tys) {
518     return reinterpret_cast<Type**>(Tys);
519   }
520   
521   inline LLVMTypeRef wrap(const Type *Ty) {
522     return reinterpret_cast<LLVMTypeRef>(const_cast<Type*>(Ty));
523   }
524   
525   inline LLVMTypeRef *wrap(const Type **Tys) {
526     return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
527   }
528   
529   /* Opaque value conversions
530    */ 
531   inline Value *unwrap(LLVMValueRef Val) {
532     return reinterpret_cast<Value*>(Val);
533   }
534   
535   template<typename T>
536   inline T *unwrap(LLVMValueRef Val) {
537     return cast<T>(unwrap(Val));
538   }
539
540   inline Value **unwrap(LLVMValueRef *Vals) {
541     return reinterpret_cast<Value**>(Vals);
542   }
543   
544   template<typename T>
545   inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
546     #if DEBUG
547     for (LLVMValueRef *I = Vals, E = Vals + Length; I != E; ++I)
548       cast<T>(*I);
549     #endif
550     return reinterpret_cast<T**>(Vals);
551   }
552   
553   inline LLVMValueRef wrap(const Value *Val) {
554     return reinterpret_cast<LLVMValueRef>(const_cast<Value*>(Val));
555   }
556   
557   inline LLVMValueRef *wrap(const Value **Vals) {
558     return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
559   }
560   
561   /* Basic block conversions
562    */ 
563   inline BasicBlock *unwrap(LLVMBasicBlockRef BBRef) {
564     return reinterpret_cast<BasicBlock*>(BBRef);
565   }
566   
567   inline LLVMBasicBlockRef wrap(const BasicBlock *BB) {
568     return reinterpret_cast<LLVMBasicBlockRef>(const_cast<BasicBlock*>(BB));
569   }
570   
571   /* Opaque builder conversions.
572    */ 
573   inline LLVMBuilder *unwrap(LLVMBuilderRef B) {
574     return reinterpret_cast<LLVMBuilder*>(B);
575   }
576   
577   inline LLVMBuilderRef wrap(LLVMBuilder *B) {
578     return reinterpret_cast<LLVMBuilderRef>(B);
579   }
580   
581   /* Opaque type handle conversions.
582    */ 
583   inline PATypeHolder *unwrap(LLVMTypeHandleRef B) {
584     return reinterpret_cast<PATypeHolder*>(B);
585   }
586   
587   inline LLVMTypeHandleRef wrap(PATypeHolder *B) {
588     return reinterpret_cast<LLVMTypeHandleRef>(B);
589   }
590 }
591
592 #endif /* !defined(__cplusplus) */
593
594 #endif /* !defined(LLVM_C_CORE_H) */