blob: ed301030b66f268e69a27a543367f0ea189938c4 [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);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000379
Gordon Henriksen76a03742007-09-18 03:18:57 +0000380/* Operations on global variables, functions, and aliases (globals) */
Gordon Henriksen265f7802008-03-19 01:11:35 +0000381LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000382int LLVMIsDeclaration(LLVMValueRef Global);
383LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
384void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
385const char *LLVMGetSection(LLVMValueRef Global);
386void LLVMSetSection(LLVMValueRef Global, const char *Section);
387LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
388void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
389unsigned LLVMGetAlignment(LLVMValueRef Global);
390void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
391
392/* Operations on global variables */
393LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000394LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000395LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
396LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
397LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
398LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000399void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000400LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
401void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
402int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
403void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
Gordon Henriksen751ebf72007-10-07 17:31:42 +0000404int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
405void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000406
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000407/* Operations on functions */
408LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
409 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000410LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000411LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
412LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
413LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
414LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000415void LLVMDeleteFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000416unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
417unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
418void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksend930f912008-08-17 18:44:35 +0000419const char *LLVMGetGC(LLVMValueRef Fn);
420void LLVMSetGC(LLVMValueRef Fn, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000421
Gordon Henriksen265f7802008-03-19 01:11:35 +0000422/* Operations on parameters */
423unsigned LLVMCountParams(LLVMValueRef Fn);
424void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
425LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
426LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000427LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
428LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
429LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
430LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
Devang Patel4c758ea2008-09-25 21:00:45 +0000431void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
432void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000433void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000434
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000435/* Operations on basic blocks */
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000436LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000437int LLVMValueIsBasicBlock(LLVMValueRef Val);
438LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000439LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000440unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
441void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000442LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
443LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
444LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
445LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000446LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
447LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
448LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
449 const char *Name);
450void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
451
Gordon Henriksen265f7802008-03-19 01:11:35 +0000452/* Operations on instructions */
453LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000454LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
455LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
456LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
457LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000458
Gordon Henriksen1158c532007-12-29 20:45:00 +0000459/* Operations on call sites */
460void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
461unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
Devang Patel4c758ea2008-09-25 21:00:45 +0000462void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
463void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
464 LLVMAttribute);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000465void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
466 unsigned align);
Gordon Henriksen1158c532007-12-29 20:45:00 +0000467
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000468/* Operations on call instructions (only) */
469int LLVMIsTailCall(LLVMValueRef CallInst);
470void LLVMSetTailCall(LLVMValueRef CallInst, int IsTailCall);
471
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000472/* Operations on phi nodes */
473void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
474 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
475unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
476LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
477LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000478
479/*===-- Instruction builders ----------------------------------------------===*/
480
481/* An instruction builder represents a point within a basic block, and is the
482 * exclusive means of building instructions using the C interface.
483 */
484
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000485LLVMBuilderRef LLVMCreateBuilder(void);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000486void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
487 LLVMValueRef Instr);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000488void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
489void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000490LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000491void LLVMDisposeBuilder(LLVMBuilderRef Builder);
492
493/* Terminators */
494LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
495LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
496LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
497LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
498 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
499LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
500 LLVMBasicBlockRef Else, unsigned NumCases);
501LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
502 LLVMValueRef *Args, unsigned NumArgs,
503 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
504 const char *Name);
505LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
506LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
507
Gordon Henriksen097102c2008-01-01 05:50:53 +0000508/* Add a case to the switch instruction */
509void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
510 LLVMBasicBlockRef Dest);
511
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000512/* Arithmetic */
513LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
514 const char *Name);
515LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
516 const char *Name);
517LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
518 const char *Name);
519LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
520 const char *Name);
521LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
522 const char *Name);
523LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
524 const char *Name);
525LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
526 const char *Name);
527LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
528 const char *Name);
529LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
530 const char *Name);
531LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
532 const char *Name);
533LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
534 const char *Name);
535LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
536 const char *Name);
537LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
538 const char *Name);
539LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
540 const char *Name);
541LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
542 const char *Name);
543LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
544LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
545
546/* Memory */
547LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
548LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
549 LLVMValueRef Val, const char *Name);
550LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
551LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
552 LLVMValueRef Val, const char *Name);
553LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
554LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
555 const char *Name);
556LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
557LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
558 LLVMValueRef *Indices, unsigned NumIndices,
559 const char *Name);
560
561/* Casts */
562LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
563 LLVMTypeRef DestTy, const char *Name);
564LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
565 LLVMTypeRef DestTy, const char *Name);
566LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
567 LLVMTypeRef DestTy, const char *Name);
568LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
569 LLVMTypeRef DestTy, const char *Name);
570LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
571 LLVMTypeRef DestTy, const char *Name);
572LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
573 LLVMTypeRef DestTy, const char *Name);
574LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
575 LLVMTypeRef DestTy, const char *Name);
576LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
577 LLVMTypeRef DestTy, const char *Name);
578LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
579 LLVMTypeRef DestTy, const char *Name);
580LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
581 LLVMTypeRef DestTy, const char *Name);
582LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
583 LLVMTypeRef DestTy, const char *Name);
584LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
585 LLVMTypeRef DestTy, const char *Name);
586
587/* Comparisons */
588LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
589 LLVMValueRef LHS, LLVMValueRef RHS,
590 const char *Name);
591LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
592 LLVMValueRef LHS, LLVMValueRef RHS,
593 const char *Name);
594
595/* Miscellaneous instructions */
596LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
597LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
598 LLVMValueRef *Args, unsigned NumArgs,
599 const char *Name);
600LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
601 LLVMValueRef Then, LLVMValueRef Else,
602 const char *Name);
603LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
604 const char *Name);
605LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
606 LLVMValueRef Index, const char *Name);
607LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
608 LLVMValueRef EltVal, LLVMValueRef Index,
609 const char *Name);
610LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
611 LLVMValueRef V2, LLVMValueRef Mask,
612 const char *Name);
Dan Gohmand5104a52008-11-03 22:55:43 +0000613LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
614 unsigned Index, const char *Name);
615LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
616 LLVMValueRef EltVal, unsigned Index,
617 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000618
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000619
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000620/*===-- Module providers --------------------------------------------------===*/
621
622/* Encapsulates the module M in a module provider, taking ownership of the
623 * module.
624 * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
625 */
626LLVMModuleProviderRef
627LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
628
629/* Destroys the module provider MP as well as the contained module.
630 * See the destructor llvm::ModuleProvider::~ModuleProvider.
631 */
632void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
633
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000634
635/*===-- Memory buffers ----------------------------------------------------===*/
636
637int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
638 LLVMMemoryBufferRef *OutMemBuf,
639 char **OutMessage);
640int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
641 char **OutMessage);
642void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
643
Gordon Henriksen878114b2008-03-16 04:20:44 +0000644
645/*===-- Pass Managers -----------------------------------------------------===*/
646
647/** Constructs a new whole-module pass pipeline. This type of pipeline is
648 suitable for link-time optimization and whole-module transformations.
649 See llvm::PassManager::PassManager. */
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000650LLVMPassManagerRef LLVMCreatePassManager(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +0000651
652/** Constructs a new function-by-function pass pipeline over the module
653 provider. It does not take ownership of the module provider. This type of
654 pipeline is suitable for code generation and JIT compilation tasks.
655 See llvm::FunctionPassManager::FunctionPassManager. */
656LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
657
658/** Initializes, executes on the provided module, and finalizes all of the
659 passes scheduled in the pass manager. Returns 1 if any of the passes
660 modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
661int LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
662
663/** Initializes all of the function passes scheduled in the function pass
664 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
665 See llvm::FunctionPassManager::doInitialization. */
666int LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
667
668/** Executes all of the function passes scheduled in the function pass manager
669 on the provided function. Returns 1 if any of the passes modified the
670 function, false otherwise.
671 See llvm::FunctionPassManager::run(Function&). */
672int LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
673
674/** Finalizes all of the function passes scheduled in in the function pass
675 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
676 See llvm::FunctionPassManager::doFinalization. */
677int LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
678
679/** Frees the memory of a pass pipeline. For function pipelines, does not free
680 the module provider.
681 See llvm::PassManagerBase::~PassManagerBase. */
682void LLVMDisposePassManager(LLVMPassManagerRef PM);
683
684
Gordon Henriksen76a03742007-09-18 03:18:57 +0000685#ifdef __cplusplus
686}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000687
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000688namespace llvm {
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000689 class ModuleProvider;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000690 class MemoryBuffer;
Gordon Henriksen96571492008-03-16 15:55:43 +0000691 class PassManagerBase;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000692
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000693 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
694 inline ty *unwrap(ref P) { \
695 return reinterpret_cast<ty*>(P); \
696 } \
697 \
698 inline ref wrap(const ty *P) { \
699 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
700 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000701
Gordon Henriksen878114b2008-03-16 04:20:44 +0000702 #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref) \
703 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
704 \
705 template<typename T> \
706 inline T *unwrap(ref P) { \
707 return cast<T>(unwrap(P)); \
708 }
709
710 #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref) \
711 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
712 \
713 template<typename T> \
714 inline T *unwrap(ref P) { \
715 T *Q = dynamic_cast<T*>(unwrap(P)); \
716 assert(Q && "Invalid cast!"); \
717 return Q; \
718 }
719
720 DEFINE_ISA_CONVERSION_FUNCTIONS (Type, LLVMTypeRef )
721 DEFINE_ISA_CONVERSION_FUNCTIONS (Value, LLVMValueRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +0000722 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
723 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
Eric Christopher59278832008-08-08 19:39:37 +0000724 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +0000725 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
726 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider, LLVMModuleProviderRef)
727 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Gordon Henriksen878114b2008-03-16 04:20:44 +0000728 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef )
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000729
Gordon Henriksen878114b2008-03-16 04:20:44 +0000730 #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS
731 #undef DEFINE_ISA_CONVERSION_FUNCTIONS
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000732 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000733
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000734 /* Specialized opaque type conversions.
735 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000736 inline Type **unwrap(LLVMTypeRef* Tys) {
737 return reinterpret_cast<Type**>(Tys);
738 }
739
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000740 inline LLVMTypeRef *wrap(const Type **Tys) {
741 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
742 }
743
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000744 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000745 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000746 inline Value **unwrap(LLVMValueRef *Vals) {
747 return reinterpret_cast<Value**>(Vals);
748 }
749
750 template<typename T>
751 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
752 #if DEBUG
753 for (LLVMValueRef *I = Vals, E = Vals + Length; I != E; ++I)
754 cast<T>(*I);
755 #endif
756 return reinterpret_cast<T**>(Vals);
757 }
758
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000759 inline LLVMValueRef *wrap(const Value **Vals) {
760 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
761 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000762}
763
764#endif /* !defined(__cplusplus) */
765
766#endif /* !defined(LLVM_C_CORE_H) */