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