blob: 8cb2ef584d7ddd059a38fd5b7dde4dafaa0bc500 [file] [log] [blame]
Gordon Henriksen76a03742007-09-18 03:18:57 +00001/*===-- llvm-c/Core.h - Core Library C Interface ------------------*- C -*-===*\
2|* *|
3|* The LLVM Compiler Infrastructure *|
4|* *|
Chris Lattnere9cc7422007-12-29 19:59:42 +00005|* This file is distributed under the University of Illinois Open Source *|
6|* License. See LICENSE.TXT for details. *|
Gordon Henriksen76a03742007-09-18 03:18:57 +00007|* *|
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|* *|
Gordon Henriksen7330acd2007-10-05 23:59:36 +000026|* 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|* *|
Gordon Henriksen76a03742007-09-18 03:18:57 +000031\*===----------------------------------------------------------------------===*/
32
33#ifndef LLVM_C_CORE_H
34#define LLVM_C_CORE_H
35
36#ifdef __cplusplus
Gordon Henriksen7330acd2007-10-05 23:59:36 +000037
38/* Need these includes to support the LLVM 'cast' template for the C++ 'wrap'
39 and 'unwrap' conversion functions. */
40#include "llvm/Module.h"
Duncan Sandsa07136e2008-04-13 06:22:09 +000041#include "llvm/Support/IRBuilder.h"
Gordon Henriksen7330acd2007-10-05 23:59:36 +000042
Gordon Henriksen76a03742007-09-18 03:18:57 +000043extern "C" {
44#endif
45
46
47/* Opaque types. */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000048
49/**
50 * The top-level container for all other LLVM Intermediate Representation (IR)
51 * objects. See the llvm::Module class.
52 */
Gordon Henriksen76a03742007-09-18 03:18:57 +000053typedef struct LLVMOpaqueModule *LLVMModuleRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000054
55/**
Gordon Henriksena49d4352008-03-07 19:13:06 +000056 * Each value in the LLVM IR has a type, an LLVMTypeRef. See the llvm::Type
57 * class.
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000058 */
Gordon Henriksen76a03742007-09-18 03:18:57 +000059typedef struct LLVMOpaqueType *LLVMTypeRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000060
61/**
Gordon Henriksena49d4352008-03-07 19:13:06 +000062 * When building recursive types using LLVMRefineType, LLVMTypeRef values may
63 * become invalid; use LLVMTypeHandleRef to resolve this problem. See the
64 * llvm::AbstractTypeHolder class.
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000065 */
Gordon Henriksenffb48762007-10-07 00:13:35 +000066typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000067
Gordon Henriksen76a03742007-09-18 03:18:57 +000068typedef struct LLVMOpaqueValue *LLVMValueRef;
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000069typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
70typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000071
72/* Used to provide a module to JIT or interpreter.
73 * See the llvm::ModuleProvider class.
74 */
Gordon Henriksen0a68fe22007-12-12 01:04:30 +000075typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef;
Gordon Henriksen76a03742007-09-18 03:18:57 +000076
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000077/* Used to provide a module to JIT or interpreter.
78 * See the llvm::MemoryBuffer class.
79 */
80typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef;
81
Gordon Henriksen878114b2008-03-16 04:20:44 +000082/** See the llvm::PassManagerBase class. */
83typedef struct LLVMOpaquePassManager *LLVMPassManagerRef;
84
Gordon Henriksen76a03742007-09-18 03:18:57 +000085typedef enum {
Devang Patel4c758ea2008-09-25 21:00:45 +000086 LLVMZExtAttribute = 1<<0,
87 LLVMSExtAttribute = 1<<1,
88 LLVMNoReturnAttribute = 1<<2,
89 LLVMInRegAttribute = 1<<3,
90 LLVMStructRetAttribute = 1<<4,
91 LLVMNoUnwindAttribute = 1<<5,
92 LLVMNoAliasAttribute = 1<<6,
93 LLVMByValAttribute = 1<<7,
94 LLVMNestAttribute = 1<<8,
95 LLVMReadNoneAttribute = 1<<9,
96 LLVMReadOnlyAttribute = 1<<10
97} LLVMAttribute;
Gordon Henriksen2d9cc212008-04-28 17:37:06 +000098
99typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000100 LLVMVoidTypeKind, /**< type with no size */
101 LLVMFloatTypeKind, /**< 32 bit floating point type */
102 LLVMDoubleTypeKind, /**< 64 bit floating point type */
103 LLVMX86_FP80TypeKind, /**< 80 bit floating point type (X87) */
104 LLVMFP128TypeKind, /**< 128 bit floating point type (112-bit mantissa)*/
105 LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */
106 LLVMLabelTypeKind, /**< Labels */
107 LLVMIntegerTypeKind, /**< Arbitrary bit width integers */
108 LLVMFunctionTypeKind, /**< Functions */
109 LLVMStructTypeKind, /**< Structures */
110 LLVMArrayTypeKind, /**< Arrays */
111 LLVMPointerTypeKind, /**< Pointers */
112 LLVMOpaqueTypeKind, /**< Opaque: type with unknown structure */
113 LLVMVectorTypeKind /**< SIMD 'packed' format, or other vector type */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000114} LLVMTypeKind;
115
116typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000117 LLVMExternalLinkage, /**< Externally visible function */
118 LLVMLinkOnceLinkage, /**< Keep one copy of function when linking (inline)*/
119 LLVMWeakLinkage, /**< Keep one copy of function when linking (weak) */
120 LLVMAppendingLinkage, /**< Special purpose, only applies to global arrays */
121 LLVMInternalLinkage, /**< Rename collisions when linking (static
122 functions) */
123 LLVMDLLImportLinkage, /**< Function to be imported from DLL */
124 LLVMDLLExportLinkage, /**< Function to be accessible from DLL */
125 LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
126 LLVMGhostLinkage /**< Stand-in functions for streaming fns from
127 bitcode */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000128} LLVMLinkage;
129
130typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000131 LLVMDefaultVisibility, /**< The GV is visible */
132 LLVMHiddenVisibility, /**< The GV is hidden */
133 LLVMProtectedVisibility /**< The GV is protected */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000134} LLVMVisibility;
135
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000136typedef enum {
137 LLVMCCallConv = 0,
138 LLVMFastCallConv = 8,
139 LLVMColdCallConv = 9,
140 LLVMX86StdcallCallConv = 64,
141 LLVMX86FastcallCallConv = 65
142} LLVMCallConv;
143
144typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000145 LLVMIntEQ = 32, /**< equal */
146 LLVMIntNE, /**< not equal */
147 LLVMIntUGT, /**< unsigned greater than */
148 LLVMIntUGE, /**< unsigned greater or equal */
149 LLVMIntULT, /**< unsigned less than */
150 LLVMIntULE, /**< unsigned less or equal */
151 LLVMIntSGT, /**< signed greater than */
152 LLVMIntSGE, /**< signed greater or equal */
153 LLVMIntSLT, /**< signed less than */
154 LLVMIntSLE /**< signed less or equal */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000155} LLVMIntPredicate;
156
157typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000158 LLVMRealPredicateFalse, /**< Always false (always folded) */
159 LLVMRealOEQ, /**< True if ordered and equal */
160 LLVMRealOGT, /**< True if ordered and greater than */
161 LLVMRealOGE, /**< True if ordered and greater than or equal */
162 LLVMRealOLT, /**< True if ordered and less than */
163 LLVMRealOLE, /**< True if ordered and less than or equal */
164 LLVMRealONE, /**< True if ordered and operands are unequal */
165 LLVMRealORD, /**< True if ordered (no nans) */
166 LLVMRealUNO, /**< True if unordered: isnan(X) | isnan(Y) */
167 LLVMRealUEQ, /**< True if unordered or equal */
168 LLVMRealUGT, /**< True if unordered or greater than */
169 LLVMRealUGE, /**< True if unordered, greater than, or equal */
170 LLVMRealULT, /**< True if unordered or less than */
171 LLVMRealULE, /**< True if unordered, less than, or equal */
172 LLVMRealUNE, /**< True if unordered or not equal */
173 LLVMRealPredicateTrue /**< Always true (always folded) */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000174} LLVMRealPredicate;
175
Gordon Henriksen76a03742007-09-18 03:18:57 +0000176
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000177/*===-- Error handling ----------------------------------------------------===*/
178
179void LLVMDisposeMessage(char *Message);
180
181
Gordon Henriksen76a03742007-09-18 03:18:57 +0000182/*===-- Modules -----------------------------------------------------------===*/
183
184/* Create and destroy modules. */
Gordon Henriksena49d4352008-03-07 19:13:06 +0000185/** See llvm::Module::Module. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000186LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
Gordon Henriksena49d4352008-03-07 19:13:06 +0000187
188/** See llvm::Module::~Module. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000189void LLVMDisposeModule(LLVMModuleRef M);
190
Gordon Henriksena49d4352008-03-07 19:13:06 +0000191/** Data layout. See Module::getDataLayout. */
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000192const char *LLVMGetDataLayout(LLVMModuleRef M);
193void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple);
194
Gordon Henriksena49d4352008-03-07 19:13:06 +0000195/** Target triple. See Module::getTargetTriple. */
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000196const char *LLVMGetTarget(LLVMModuleRef M);
197void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
198
Gordon Henriksena49d4352008-03-07 19:13:06 +0000199/** See Module::addTypeName. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000200int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000201void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000202
Gordon Henriksen6c6075e2008-03-14 23:58:56 +0000203/** See Module::dump. */
204void LLVMDumpModule(LLVMModuleRef M);
205
Gordon Henriksen76a03742007-09-18 03:18:57 +0000206
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000207/*===-- Types -------------------------------------------------------------===*/
Gordon Henriksen76a03742007-09-18 03:18:57 +0000208
209/* LLVM types conform to the following hierarchy:
210 *
211 * types:
212 * integer type
213 * real type
214 * function type
215 * sequence types:
216 * array type
217 * pointer type
218 * vector type
219 * void type
220 * label type
221 * opaque type
222 */
223
Gordon Henriksena49d4352008-03-07 19:13:06 +0000224/** See llvm::LLVMTypeKind::getTypeID. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000225LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
Gordon Henriksena49d4352008-03-07 19:13:06 +0000226
Gordon Henriksen76a03742007-09-18 03:18:57 +0000227/* Operations on integer types */
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000228LLVMTypeRef LLVMInt1Type(void);
229LLVMTypeRef LLVMInt8Type(void);
230LLVMTypeRef LLVMInt16Type(void);
231LLVMTypeRef LLVMInt32Type(void);
232LLVMTypeRef LLVMInt64Type(void);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000233LLVMTypeRef LLVMIntType(unsigned NumBits);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000234unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000235
236/* Operations on real types */
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000237LLVMTypeRef LLVMFloatType(void);
238LLVMTypeRef LLVMDoubleType(void);
239LLVMTypeRef LLVMX86FP80Type(void);
240LLVMTypeRef LLVMFP128Type(void);
241LLVMTypeRef LLVMPPCFP128Type(void);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000242
243/* Operations on function types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000244LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
245 LLVMTypeRef *ParamTypes, unsigned ParamCount,
246 int IsVarArg);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000247int LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000248LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
249unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
250void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000251
252/* Operations on struct types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000253LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
254 int Packed);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000255unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000256void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
257int LLVMIsPackedStruct(LLVMTypeRef StructTy);
258
259/* Operations on array, pointer, and vector types (sequence types) */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000260LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000261LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000262LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000263
264LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
265unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000266unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000267unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
268
269/* Operations on other types */
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000270LLVMTypeRef LLVMVoidType(void);
271LLVMTypeRef LLVMLabelType(void);
272LLVMTypeRef LLVMOpaqueType(void);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000273
Gordon Henriksenffb48762007-10-07 00:13:35 +0000274/* Operations on type handles */
275LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
276void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
277LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
278void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
279
Gordon Henriksen76a03742007-09-18 03:18:57 +0000280
281/*===-- Values ------------------------------------------------------------===*/
282
283/* The bulk of LLVM's object model consists of values, which comprise a very
284 * rich type hierarchy.
285 *
286 * values:
287 * constants:
288 * scalar constants
289 * composite contants
290 * globals:
291 * global variable
292 * function
293 * alias
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000294 * basic blocks
Gordon Henriksen76a03742007-09-18 03:18:57 +0000295 */
296
297/* Operations on all values */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000298LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000299const char *LLVMGetValueName(LLVMValueRef Val);
300void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000301void LLVMDumpValue(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000302
303/* Operations on constants of any type */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000304LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
305LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000306LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000307int LLVMIsConstant(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000308int LLVMIsNull(LLVMValueRef Val);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000309int LLVMIsUndef(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000310
311/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000312LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
313 int SignExtend);
314LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen931e1212008-02-02 01:07:50 +0000315LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000316
317/* Operations on composite constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000318LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
319 int DontNullTerminate);
Gordon Henriksen2ad5aef2008-04-25 03:21:19 +0000320LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
Gordon Henriksen1046c732007-10-06 15:11:06 +0000321 LLVMValueRef *ConstantVals, unsigned Length);
322LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
323 int packed);
324LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000325
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000326/* Constant expressions */
327LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
328LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
329LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
330LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
331LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
332LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
333LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
334LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
335LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
336LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
337LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
338LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
339LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
340LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
341LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
342LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
343 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
344LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
345 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
346LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
347LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
348LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
349LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
350 LLVMValueRef *ConstantIndices, unsigned NumIndices);
351LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
352LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
353LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
354LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
355LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
356LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
357LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
358LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
359LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
360LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
361LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
362LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
363LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
364 LLVMValueRef ConstantIfTrue,
365 LLVMValueRef ConstantIfFalse);
366LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
367 LLVMValueRef IndexConstant);
368LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
369 LLVMValueRef ElementValueConstant,
370 LLVMValueRef IndexConstant);
371LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
372 LLVMValueRef VectorBConstant,
373 LLVMValueRef MaskConstant);
Dan Gohmand5104a52008-11-03 22:55:43 +0000374LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
375 unsigned NumIdx);
376LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
377 LLVMValueRef ElementValueConstant,
378 unsigned *IdxList, unsigned NumIdx);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000379LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
380 const char *AsmString, const char *Constraints,
381 int HasSideEffects);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000382
Gordon Henriksen76a03742007-09-18 03:18:57 +0000383/* Operations on global variables, functions, and aliases (globals) */
Gordon Henriksen265f7802008-03-19 01:11:35 +0000384LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000385int LLVMIsDeclaration(LLVMValueRef Global);
386LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
387void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
388const char *LLVMGetSection(LLVMValueRef Global);
389void LLVMSetSection(LLVMValueRef Global, const char *Section);
390LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
391void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
392unsigned LLVMGetAlignment(LLVMValueRef Global);
393void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
394
395/* Operations on global variables */
396LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000397LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000398LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
399LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
400LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
401LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000402void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000403LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
404void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
405int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
406void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
Gordon Henriksen751ebf72007-10-07 17:31:42 +0000407int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
408void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000409
Chris Lattner3d1f5522008-12-17 21:39:50 +0000410/* Operations on aliases */
411LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
412 const char *Name);
413
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000414/* Operations on functions */
415LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
416 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000417LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000418LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
419LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
420LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
421LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000422void LLVMDeleteFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000423unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
424unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
425void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksend930f912008-08-17 18:44:35 +0000426const char *LLVMGetGC(LLVMValueRef Fn);
427void LLVMSetGC(LLVMValueRef Fn, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000428
Gordon Henriksen265f7802008-03-19 01:11:35 +0000429/* Operations on parameters */
430unsigned LLVMCountParams(LLVMValueRef Fn);
431void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
432LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
433LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000434LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
435LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
436LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
437LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
Devang Patel4c758ea2008-09-25 21:00:45 +0000438void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
439void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000440void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000441
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000442/* Operations on basic blocks */
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000443LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000444int LLVMValueIsBasicBlock(LLVMValueRef Val);
445LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000446LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000447unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
448void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000449LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
450LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
451LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
452LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000453LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
454LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
455LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
456 const char *Name);
457void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
458
Gordon Henriksen265f7802008-03-19 01:11:35 +0000459/* Operations on instructions */
460LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000461LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
462LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
463LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
464LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000465
Gordon Henriksen1158c532007-12-29 20:45:00 +0000466/* Operations on call sites */
467void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
468unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
Devang Patel4c758ea2008-09-25 21:00:45 +0000469void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
470void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
471 LLVMAttribute);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000472void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
473 unsigned align);
Gordon Henriksen1158c532007-12-29 20:45:00 +0000474
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000475/* Operations on call instructions (only) */
476int LLVMIsTailCall(LLVMValueRef CallInst);
477void LLVMSetTailCall(LLVMValueRef CallInst, int IsTailCall);
478
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000479/* Operations on phi nodes */
480void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
481 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
482unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
483LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
484LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000485
486/*===-- Instruction builders ----------------------------------------------===*/
487
488/* An instruction builder represents a point within a basic block, and is the
489 * exclusive means of building instructions using the C interface.
490 */
491
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000492LLVMBuilderRef LLVMCreateBuilder(void);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000493void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
494 LLVMValueRef Instr);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000495void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
496void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000497LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000498void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
499void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000500void LLVMDisposeBuilder(LLVMBuilderRef Builder);
501
502/* Terminators */
503LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
504LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
505LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
506LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
507 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
508LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
509 LLVMBasicBlockRef Else, unsigned NumCases);
510LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
511 LLVMValueRef *Args, unsigned NumArgs,
512 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
513 const char *Name);
514LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
515LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
516
Gordon Henriksen097102c2008-01-01 05:50:53 +0000517/* Add a case to the switch instruction */
518void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
519 LLVMBasicBlockRef Dest);
520
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000521/* Arithmetic */
522LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
523 const char *Name);
524LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
525 const char *Name);
526LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
527 const char *Name);
528LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
529 const char *Name);
530LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
531 const char *Name);
532LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
533 const char *Name);
534LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
535 const char *Name);
536LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
537 const char *Name);
538LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
539 const char *Name);
540LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
541 const char *Name);
542LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
543 const char *Name);
544LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
545 const char *Name);
546LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
547 const char *Name);
548LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
549 const char *Name);
550LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
551 const char *Name);
552LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
553LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
554
555/* Memory */
556LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
557LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
558 LLVMValueRef Val, const char *Name);
559LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
560LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
561 LLVMValueRef Val, const char *Name);
562LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
563LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
564 const char *Name);
565LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
566LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
567 LLVMValueRef *Indices, unsigned NumIndices,
568 const char *Name);
569
570/* Casts */
571LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
572 LLVMTypeRef DestTy, const char *Name);
573LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
574 LLVMTypeRef DestTy, const char *Name);
575LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
576 LLVMTypeRef DestTy, const char *Name);
577LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
578 LLVMTypeRef DestTy, const char *Name);
579LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
580 LLVMTypeRef DestTy, const char *Name);
581LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
582 LLVMTypeRef DestTy, const char *Name);
583LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
584 LLVMTypeRef DestTy, const char *Name);
585LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
586 LLVMTypeRef DestTy, const char *Name);
587LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
588 LLVMTypeRef DestTy, const char *Name);
589LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
590 LLVMTypeRef DestTy, const char *Name);
591LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
592 LLVMTypeRef DestTy, const char *Name);
593LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
594 LLVMTypeRef DestTy, const char *Name);
595
596/* Comparisons */
597LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
598 LLVMValueRef LHS, LLVMValueRef RHS,
599 const char *Name);
600LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
601 LLVMValueRef LHS, LLVMValueRef RHS,
602 const char *Name);
603
604/* Miscellaneous instructions */
605LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
606LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
607 LLVMValueRef *Args, unsigned NumArgs,
608 const char *Name);
609LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
610 LLVMValueRef Then, LLVMValueRef Else,
611 const char *Name);
612LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
613 const char *Name);
614LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
615 LLVMValueRef Index, const char *Name);
616LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
617 LLVMValueRef EltVal, LLVMValueRef Index,
618 const char *Name);
619LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
620 LLVMValueRef V2, LLVMValueRef Mask,
621 const char *Name);
Dan Gohmand5104a52008-11-03 22:55:43 +0000622LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
623 unsigned Index, const char *Name);
624LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
625 LLVMValueRef EltVal, unsigned Index,
626 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000627
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000628
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000629/*===-- Module providers --------------------------------------------------===*/
630
631/* Encapsulates the module M in a module provider, taking ownership of the
632 * module.
633 * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
634 */
635LLVMModuleProviderRef
636LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
637
638/* Destroys the module provider MP as well as the contained module.
639 * See the destructor llvm::ModuleProvider::~ModuleProvider.
640 */
641void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
642
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000643
644/*===-- Memory buffers ----------------------------------------------------===*/
645
646int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
647 LLVMMemoryBufferRef *OutMemBuf,
648 char **OutMessage);
649int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
650 char **OutMessage);
651void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
652
Gordon Henriksen878114b2008-03-16 04:20:44 +0000653
654/*===-- Pass Managers -----------------------------------------------------===*/
655
656/** Constructs a new whole-module pass pipeline. This type of pipeline is
657 suitable for link-time optimization and whole-module transformations.
658 See llvm::PassManager::PassManager. */
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000659LLVMPassManagerRef LLVMCreatePassManager(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +0000660
661/** Constructs a new function-by-function pass pipeline over the module
662 provider. It does not take ownership of the module provider. This type of
663 pipeline is suitable for code generation and JIT compilation tasks.
664 See llvm::FunctionPassManager::FunctionPassManager. */
665LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
666
667/** Initializes, executes on the provided module, and finalizes all of the
668 passes scheduled in the pass manager. Returns 1 if any of the passes
669 modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
670int LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
671
672/** Initializes all of the function passes scheduled in the function pass
673 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
674 See llvm::FunctionPassManager::doInitialization. */
675int LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
676
677/** Executes all of the function passes scheduled in the function pass manager
678 on the provided function. Returns 1 if any of the passes modified the
679 function, false otherwise.
680 See llvm::FunctionPassManager::run(Function&). */
681int LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
682
683/** Finalizes all of the function passes scheduled in in the function pass
684 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
685 See llvm::FunctionPassManager::doFinalization. */
686int LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
687
688/** Frees the memory of a pass pipeline. For function pipelines, does not free
689 the module provider.
690 See llvm::PassManagerBase::~PassManagerBase. */
691void LLVMDisposePassManager(LLVMPassManagerRef PM);
692
693
Gordon Henriksen76a03742007-09-18 03:18:57 +0000694#ifdef __cplusplus
695}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000696
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000697namespace llvm {
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000698 class ModuleProvider;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000699 class MemoryBuffer;
Gordon Henriksen96571492008-03-16 15:55:43 +0000700 class PassManagerBase;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000701
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000702 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
703 inline ty *unwrap(ref P) { \
704 return reinterpret_cast<ty*>(P); \
705 } \
706 \
707 inline ref wrap(const ty *P) { \
708 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
709 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000710
Gordon Henriksen878114b2008-03-16 04:20:44 +0000711 #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref) \
712 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
713 \
714 template<typename T> \
715 inline T *unwrap(ref P) { \
716 return cast<T>(unwrap(P)); \
717 }
718
719 #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref) \
720 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
721 \
722 template<typename T> \
723 inline T *unwrap(ref P) { \
724 T *Q = dynamic_cast<T*>(unwrap(P)); \
725 assert(Q && "Invalid cast!"); \
726 return Q; \
727 }
728
729 DEFINE_ISA_CONVERSION_FUNCTIONS (Type, LLVMTypeRef )
730 DEFINE_ISA_CONVERSION_FUNCTIONS (Value, LLVMValueRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +0000731 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
732 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
Eric Christopher59278832008-08-08 19:39:37 +0000733 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +0000734 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
735 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider, LLVMModuleProviderRef)
736 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Gordon Henriksen878114b2008-03-16 04:20:44 +0000737 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef )
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000738
Gordon Henriksen878114b2008-03-16 04:20:44 +0000739 #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS
740 #undef DEFINE_ISA_CONVERSION_FUNCTIONS
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000741 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000742
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000743 /* Specialized opaque type conversions.
744 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000745 inline Type **unwrap(LLVMTypeRef* Tys) {
746 return reinterpret_cast<Type**>(Tys);
747 }
748
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000749 inline LLVMTypeRef *wrap(const Type **Tys) {
750 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
751 }
752
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000753 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000754 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000755 inline Value **unwrap(LLVMValueRef *Vals) {
756 return reinterpret_cast<Value**>(Vals);
757 }
758
759 template<typename T>
760 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
761 #if DEBUG
762 for (LLVMValueRef *I = Vals, E = Vals + Length; I != E; ++I)
763 cast<T>(*I);
764 #endif
765 return reinterpret_cast<T**>(Vals);
766 }
767
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000768 inline LLVMValueRef *wrap(const Value **Vals) {
769 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
770 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000771}
772
773#endif /* !defined(__cplusplus) */
774
775#endif /* !defined(LLVM_C_CORE_H) */