blob: c7f653fc8c033c206f14e6345980720f45376c08 [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
Chandler Carruth56869f22009-10-26 01:35:46 +000036#include "llvm/System/DataTypes.h"
Erick Tryzelaardd991352009-08-16 23:36:46 +000037
Gordon Henriksen76a03742007-09-18 03:18:57 +000038#ifdef __cplusplus
Gordon Henriksen7330acd2007-10-05 23:59:36 +000039
40/* Need these includes to support the LLVM 'cast' template for the C++ 'wrap'
41 and 'unwrap' conversion functions. */
42#include "llvm/Module.h"
Duncan Sandsa07136e2008-04-13 06:22:09 +000043#include "llvm/Support/IRBuilder.h"
Gordon Henriksen7330acd2007-10-05 23:59:36 +000044
Gordon Henriksen76a03742007-09-18 03:18:57 +000045extern "C" {
46#endif
47
48
49/* Opaque types. */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000050
51/**
Owen Anderson6773d382009-07-01 16:58:40 +000052 * The top-level container for all LLVM global data. See the LLVMContext class.
53 */
Erick Tryzelaar262332f2009-08-14 00:01:31 +000054typedef struct LLVMOpaqueContext *LLVMContextRef;
Owen Anderson6773d382009-07-01 16:58:40 +000055
56/**
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000057 * The top-level container for all other LLVM Intermediate Representation (IR)
58 * objects. See the llvm::Module class.
59 */
Gordon Henriksen76a03742007-09-18 03:18:57 +000060typedef struct LLVMOpaqueModule *LLVMModuleRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000061
62/**
Gordon Henriksena49d4352008-03-07 19:13:06 +000063 * Each value in the LLVM IR has a type, an LLVMTypeRef. See the llvm::Type
64 * class.
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000065 */
Gordon Henriksen76a03742007-09-18 03:18:57 +000066typedef struct LLVMOpaqueType *LLVMTypeRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000067
68/**
Gordon Henriksena49d4352008-03-07 19:13:06 +000069 * When building recursive types using LLVMRefineType, LLVMTypeRef values may
70 * become invalid; use LLVMTypeHandleRef to resolve this problem. See the
71 * llvm::AbstractTypeHolder class.
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000072 */
Gordon Henriksenffb48762007-10-07 00:13:35 +000073typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000074
Gordon Henriksen76a03742007-09-18 03:18:57 +000075typedef struct LLVMOpaqueValue *LLVMValueRef;
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000076typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
77typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000078
79/* Used to provide a module to JIT or interpreter.
80 * See the llvm::ModuleProvider class.
81 */
Gordon Henriksen0a68fe22007-12-12 01:04:30 +000082typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef;
Gordon Henriksen76a03742007-09-18 03:18:57 +000083
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000084/* Used to provide a module to JIT or interpreter.
85 * See the llvm::MemoryBuffer class.
86 */
87typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef;
88
Gordon Henriksen878114b2008-03-16 04:20:44 +000089/** See the llvm::PassManagerBase class. */
90typedef struct LLVMOpaquePassManager *LLVMPassManagerRef;
91
Chris Lattner40cf28d2009-10-12 04:01:02 +000092/**
93 * Used to iterate through the uses of a Value, allowing access to all Values
94 * that use this Value. See the llvm::Use and llvm::value_use_iterator classes.
95 */
96typedef struct LLVMOpaqueUseIterator *LLVMUseIteratorRef;
97
Gordon Henriksen76a03742007-09-18 03:18:57 +000098typedef enum {
Devang Patel4c758ea2008-09-25 21:00:45 +000099 LLVMZExtAttribute = 1<<0,
100 LLVMSExtAttribute = 1<<1,
101 LLVMNoReturnAttribute = 1<<2,
102 LLVMInRegAttribute = 1<<3,
103 LLVMStructRetAttribute = 1<<4,
104 LLVMNoUnwindAttribute = 1<<5,
105 LLVMNoAliasAttribute = 1<<6,
106 LLVMByValAttribute = 1<<7,
107 LLVMNestAttribute = 1<<8,
108 LLVMReadNoneAttribute = 1<<9,
Anton Korobeynikovc8ce7b082009-07-17 18:07:26 +0000109 LLVMReadOnlyAttribute = 1<<10,
Anton Korobeynikov9750be92009-07-17 18:57:16 +0000110 LLVMNoInlineAttribute = 1<<11,
111 LLVMAlwaysInlineAttribute = 1<<12,
112 LLVMOptimizeForSizeAttribute = 1<<13,
113 LLVMStackProtectAttribute = 1<<14,
114 LLVMStackProtectReqAttribute = 1<<15,
115 LLVMNoCaptureAttribute = 1<<21,
116 LLVMNoRedZoneAttribute = 1<<22,
117 LLVMNoImplicitFloatAttribute = 1<<23,
Dale Johannesen2aaf5392009-08-26 01:08:21 +0000118 LLVMNakedAttribute = 1<<24,
119 LLVMInlineHintAttribute = 1<<25
Devang Patel4c758ea2008-09-25 21:00:45 +0000120} LLVMAttribute;
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000121
122typedef enum {
Chris Lattner40cf28d2009-10-12 04:01:02 +0000123 LLVMRet = 1,
124 LLVMBr = 2,
125 LLVMSwitch = 3,
126 LLVMInvoke = 4,
127 LLVMUnwind = 5,
128 LLVMUnreachable = 6,
129 LLVMAdd = 7,
130 LLVMFAdd = 8,
131 LLVMSub = 9,
132 LLVMFSub = 10,
133 LLVMMul = 11,
134 LLVMFMul = 12,
135 LLVMUDiv = 13,
136 LLVMSDiv = 14,
137 LLVMFDiv = 15,
138 LLVMURem = 16,
139 LLVMSRem = 17,
140 LLVMFRem = 18,
141 LLVMShl = 19,
142 LLVMLShr = 20,
143 LLVMAShr = 21,
144 LLVMAnd = 22,
145 LLVMOr = 23,
146 LLVMXor = 24,
147 LLVMMalloc = 25,
148 LLVMFree = 26,
149 LLVMAlloca = 27,
150 LLVMLoad = 28,
151 LLVMStore = 29,
152 LLVMGetElementPtr = 30,
153 LLVMTrunk = 31,
154 LLVMZExt = 32,
155 LLVMSExt = 33,
156 LLVMFPToUI = 34,
157 LLVMFPToSI = 35,
158 LLVMUIToFP = 36,
159 LLVMSIToFP = 37,
160 LLVMFPTrunc = 38,
161 LLVMFPExt = 39,
162 LLVMPtrToInt = 40,
163 LLVMIntToPtr = 41,
164 LLVMBitCast = 42,
165 LLVMICmp = 43,
166 LLVMFCmp = 44,
167 LLVMPHI = 45,
168 LLVMCall = 46,
169 LLVMSelect = 47,
170 LLVMVAArg = 50,
171 LLVMExtractElement = 51,
172 LLVMInsertElement = 52,
173 LLVMShuffleVector = 53,
174 LLVMExtractValue = 54,
175 LLVMInsertValue = 55
176} LLVMOpcode;
177
178typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000179 LLVMVoidTypeKind, /**< type with no size */
180 LLVMFloatTypeKind, /**< 32 bit floating point type */
181 LLVMDoubleTypeKind, /**< 64 bit floating point type */
182 LLVMX86_FP80TypeKind, /**< 80 bit floating point type (X87) */
183 LLVMFP128TypeKind, /**< 128 bit floating point type (112-bit mantissa)*/
184 LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */
185 LLVMLabelTypeKind, /**< Labels */
186 LLVMIntegerTypeKind, /**< Arbitrary bit width integers */
187 LLVMFunctionTypeKind, /**< Functions */
188 LLVMStructTypeKind, /**< Structures */
189 LLVMArrayTypeKind, /**< Arrays */
190 LLVMPointerTypeKind, /**< Pointers */
191 LLVMOpaqueTypeKind, /**< Opaque: type with unknown structure */
Chris Lattnerdac44ec2009-07-15 22:00:31 +0000192 LLVMVectorTypeKind, /**< SIMD 'packed' format, or other vector type */
193 LLVMMetadataTypeKind /**< Metadata */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000194} LLVMTypeKind;
195
196typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000197 LLVMExternalLinkage, /**< Externally visible function */
Chris Lattner2dba0f02009-04-13 06:25:37 +0000198 LLVMAvailableExternallyLinkage,
Duncan Sands12da8ce2009-03-07 15:45:40 +0000199 LLVMLinkOnceAnyLinkage, /**< Keep one copy of function when linking (inline)*/
200 LLVMLinkOnceODRLinkage, /**< Same, but only replaced by something
201 equivalent. */
202 LLVMWeakAnyLinkage, /**< Keep one copy of function when linking (weak) */
203 LLVMWeakODRLinkage, /**< Same, but only replaced by something
204 equivalent. */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000205 LLVMAppendingLinkage, /**< Special purpose, only applies to global arrays */
206 LLVMInternalLinkage, /**< Rename collisions when linking (static
207 functions) */
Duncan Sands12da8ce2009-03-07 15:45:40 +0000208 LLVMPrivateLinkage, /**< Like Internal, but omit from symbol table */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000209 LLVMDLLImportLinkage, /**< Function to be imported from DLL */
210 LLVMDLLExportLinkage, /**< Function to be accessible from DLL */
Duncan Sandse2881052009-03-11 08:08:06 +0000211 LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
Duncan Sands12da8ce2009-03-07 15:45:40 +0000212 LLVMGhostLinkage, /**< Stand-in functions for streaming fns from
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000213 bitcode */
Bill Wendling002b1672009-07-20 18:22:52 +0000214 LLVMCommonLinkage, /**< Tentative definitions */
215 LLVMLinkerPrivateLinkage /**< Like Private, but linker removes. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000216} LLVMLinkage;
217
218typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000219 LLVMDefaultVisibility, /**< The GV is visible */
220 LLVMHiddenVisibility, /**< The GV is hidden */
221 LLVMProtectedVisibility /**< The GV is protected */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000222} LLVMVisibility;
223
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000224typedef enum {
225 LLVMCCallConv = 0,
226 LLVMFastCallConv = 8,
227 LLVMColdCallConv = 9,
228 LLVMX86StdcallCallConv = 64,
229 LLVMX86FastcallCallConv = 65
230} LLVMCallConv;
231
232typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000233 LLVMIntEQ = 32, /**< equal */
234 LLVMIntNE, /**< not equal */
235 LLVMIntUGT, /**< unsigned greater than */
236 LLVMIntUGE, /**< unsigned greater or equal */
237 LLVMIntULT, /**< unsigned less than */
238 LLVMIntULE, /**< unsigned less or equal */
239 LLVMIntSGT, /**< signed greater than */
240 LLVMIntSGE, /**< signed greater or equal */
241 LLVMIntSLT, /**< signed less than */
242 LLVMIntSLE /**< signed less or equal */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000243} LLVMIntPredicate;
244
245typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000246 LLVMRealPredicateFalse, /**< Always false (always folded) */
247 LLVMRealOEQ, /**< True if ordered and equal */
248 LLVMRealOGT, /**< True if ordered and greater than */
249 LLVMRealOGE, /**< True if ordered and greater than or equal */
250 LLVMRealOLT, /**< True if ordered and less than */
251 LLVMRealOLE, /**< True if ordered and less than or equal */
252 LLVMRealONE, /**< True if ordered and operands are unequal */
253 LLVMRealORD, /**< True if ordered (no nans) */
254 LLVMRealUNO, /**< True if unordered: isnan(X) | isnan(Y) */
255 LLVMRealUEQ, /**< True if unordered or equal */
256 LLVMRealUGT, /**< True if unordered or greater than */
257 LLVMRealUGE, /**< True if unordered, greater than, or equal */
258 LLVMRealULT, /**< True if unordered or less than */
259 LLVMRealULE, /**< True if unordered, less than, or equal */
260 LLVMRealUNE, /**< True if unordered or not equal */
261 LLVMRealPredicateTrue /**< Always true (always folded) */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000262} LLVMRealPredicate;
263
Gordon Henriksen76a03742007-09-18 03:18:57 +0000264
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000265/*===-- Error handling ----------------------------------------------------===*/
266
267void LLVMDisposeMessage(char *Message);
268
269
Gordon Henriksen76a03742007-09-18 03:18:57 +0000270/*===-- Modules -----------------------------------------------------------===*/
271
Owen Anderson6773d382009-07-01 16:58:40 +0000272/* Create and destroy contexts. */
Erick Tryzelaarf34cb0c2009-08-30 23:38:06 +0000273LLVMContextRef LLVMContextCreate(void);
274LLVMContextRef LLVMGetGlobalContext(void);
Owen Anderson6773d382009-07-01 16:58:40 +0000275void LLVMContextDispose(LLVMContextRef C);
276
Gordon Henriksen76a03742007-09-18 03:18:57 +0000277/* Create and destroy modules. */
Gordon Henriksena49d4352008-03-07 19:13:06 +0000278/** See llvm::Module::Module. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000279LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
Owen Anderson31d44e42009-07-02 07:17:57 +0000280LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
281 LLVMContextRef C);
Gordon Henriksena49d4352008-03-07 19:13:06 +0000282
283/** See llvm::Module::~Module. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000284void LLVMDisposeModule(LLVMModuleRef M);
285
Gordon Henriksena49d4352008-03-07 19:13:06 +0000286/** Data layout. See Module::getDataLayout. */
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000287const char *LLVMGetDataLayout(LLVMModuleRef M);
288void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple);
289
Gordon Henriksena49d4352008-03-07 19:13:06 +0000290/** Target triple. See Module::getTargetTriple. */
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000291const char *LLVMGetTarget(LLVMModuleRef M);
292void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
293
Gordon Henriksena49d4352008-03-07 19:13:06 +0000294/** See Module::addTypeName. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000295int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000296void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
Chris Lattner7f318242009-07-06 17:29:59 +0000297LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000298
Gordon Henriksen6c6075e2008-03-14 23:58:56 +0000299/** See Module::dump. */
300void LLVMDumpModule(LLVMModuleRef M);
301
Gordon Henriksen76a03742007-09-18 03:18:57 +0000302
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000303/*===-- Types -------------------------------------------------------------===*/
Gordon Henriksen76a03742007-09-18 03:18:57 +0000304
305/* LLVM types conform to the following hierarchy:
306 *
307 * types:
308 * integer type
309 * real type
310 * function type
311 * sequence types:
312 * array type
313 * pointer type
314 * vector type
315 * void type
316 * label type
317 * opaque type
318 */
319
Gordon Henriksena49d4352008-03-07 19:13:06 +0000320/** See llvm::LLVMTypeKind::getTypeID. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000321LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
Gordon Henriksena49d4352008-03-07 19:13:06 +0000322
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000323/** See llvm::LLVMType::getContext. */
324LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty);
325
Gordon Henriksen76a03742007-09-18 03:18:57 +0000326/* Operations on integer types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000327LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C);
328LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C);
329LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C);
330LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C);
331LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C);
332LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits);
333
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000334LLVMTypeRef LLVMInt1Type(void);
335LLVMTypeRef LLVMInt8Type(void);
336LLVMTypeRef LLVMInt16Type(void);
337LLVMTypeRef LLVMInt32Type(void);
338LLVMTypeRef LLVMInt64Type(void);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000339LLVMTypeRef LLVMIntType(unsigned NumBits);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000340unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000341
342/* Operations on real types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000343LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C);
344LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C);
345LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C);
346LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C);
347LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C);
348
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000349LLVMTypeRef LLVMFloatType(void);
350LLVMTypeRef LLVMDoubleType(void);
351LLVMTypeRef LLVMX86FP80Type(void);
352LLVMTypeRef LLVMFP128Type(void);
353LLVMTypeRef LLVMPPCFP128Type(void);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000354
355/* Operations on function types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000356LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
357 LLVMTypeRef *ParamTypes, unsigned ParamCount,
358 int IsVarArg);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000359int LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000360LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
361unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
362void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000363
364/* Operations on struct types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000365LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
366 unsigned ElementCount, int Packed);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000367LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
368 int Packed);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000369unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000370void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
371int LLVMIsPackedStruct(LLVMTypeRef StructTy);
372
373/* Operations on array, pointer, and vector types (sequence types) */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000374LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000375LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000376LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000377
378LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
379unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000380unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000381unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
382
383/* Operations on other types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000384LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C);
385LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C);
386LLVMTypeRef LLVMOpaqueTypeInContext(LLVMContextRef C);
387
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000388LLVMTypeRef LLVMVoidType(void);
389LLVMTypeRef LLVMLabelType(void);
390LLVMTypeRef LLVMOpaqueType(void);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000391
Gordon Henriksenffb48762007-10-07 00:13:35 +0000392/* Operations on type handles */
393LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
394void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
395LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
396void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
397
Gordon Henriksen76a03742007-09-18 03:18:57 +0000398
399/*===-- Values ------------------------------------------------------------===*/
400
401/* The bulk of LLVM's object model consists of values, which comprise a very
402 * rich type hierarchy.
Gordon Henriksen76a03742007-09-18 03:18:57 +0000403 */
404
Gordon Henriksen29e38942008-12-19 18:39:45 +0000405#define LLVM_FOR_EACH_VALUE_SUBCLASS(macro) \
406 macro(Argument) \
407 macro(BasicBlock) \
408 macro(InlineAsm) \
409 macro(User) \
410 macro(Constant) \
411 macro(ConstantAggregateZero) \
412 macro(ConstantArray) \
413 macro(ConstantExpr) \
414 macro(ConstantFP) \
415 macro(ConstantInt) \
416 macro(ConstantPointerNull) \
417 macro(ConstantStruct) \
418 macro(ConstantVector) \
419 macro(GlobalValue) \
420 macro(Function) \
421 macro(GlobalAlias) \
422 macro(GlobalVariable) \
423 macro(UndefValue) \
424 macro(Instruction) \
425 macro(BinaryOperator) \
426 macro(CallInst) \
427 macro(IntrinsicInst) \
428 macro(DbgInfoIntrinsic) \
429 macro(DbgDeclareInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000430 macro(EHSelectorInst) \
431 macro(MemIntrinsic) \
432 macro(MemCpyInst) \
433 macro(MemMoveInst) \
434 macro(MemSetInst) \
435 macro(CmpInst) \
436 macro(FCmpInst) \
437 macro(ICmpInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000438 macro(ExtractElementInst) \
439 macro(GetElementPtrInst) \
440 macro(InsertElementInst) \
441 macro(InsertValueInst) \
442 macro(PHINode) \
443 macro(SelectInst) \
444 macro(ShuffleVectorInst) \
445 macro(StoreInst) \
446 macro(TerminatorInst) \
447 macro(BranchInst) \
448 macro(InvokeInst) \
449 macro(ReturnInst) \
450 macro(SwitchInst) \
451 macro(UnreachableInst) \
452 macro(UnwindInst) \
453 macro(UnaryInstruction) \
Victor Hernandez8acf2952009-10-23 21:09:37 +0000454 macro(AllocaInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000455 macro(CastInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000456 macro(BitCastInst) \
457 macro(FPExtInst) \
458 macro(FPToSIInst) \
459 macro(FPToUIInst) \
460 macro(FPTruncInst) \
461 macro(IntToPtrInst) \
462 macro(PtrToIntInst) \
463 macro(SExtInst) \
464 macro(SIToFPInst) \
465 macro(TruncInst) \
466 macro(UIToFPInst) \
467 macro(ZExtInst) \
468 macro(ExtractValueInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000469 macro(LoadInst) \
470 macro(VAArgInst)
Gordon Henriksen29e38942008-12-19 18:39:45 +0000471
Gordon Henriksen76a03742007-09-18 03:18:57 +0000472/* Operations on all values */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000473LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000474const char *LLVMGetValueName(LLVMValueRef Val);
475void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000476void LLVMDumpValue(LLVMValueRef Val);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000477void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000478
Gordon Henriksen29e38942008-12-19 18:39:45 +0000479/* Conversion functions. Return the input value if it is an instance of the
480 specified class, otherwise NULL. See llvm::dyn_cast_or_null<>. */
481#define LLVM_DECLARE_VALUE_CAST(name) \
482 LLVMValueRef LLVMIsA##name(LLVMValueRef Val);
483LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DECLARE_VALUE_CAST)
484
Chris Lattner40cf28d2009-10-12 04:01:02 +0000485/* Operations on Uses */
486LLVMUseIteratorRef LLVMGetFirstUse(LLVMValueRef Val);
487LLVMUseIteratorRef LLVMGetNextUse(LLVMUseIteratorRef U);
488LLVMValueRef LLVMGetUser(LLVMUseIteratorRef U);
489LLVMValueRef LLVMGetUsedValue(LLVMUseIteratorRef U);
490
491/* Operations on Users */
492LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index);
493
Gordon Henriksen76a03742007-09-18 03:18:57 +0000494/* Operations on constants of any type */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000495LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
496LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000497LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000498int LLVMIsConstant(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000499int LLVMIsNull(LLVMValueRef Val);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000500int LLVMIsUndef(LLVMValueRef Val);
Chris Lattner7f318242009-07-06 17:29:59 +0000501LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000502
503/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000504LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
505 int SignExtend);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000506LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text,
507 uint8_t Radix);
508LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text,
509 unsigned SLen, uint8_t Radix);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000510LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen931e1212008-02-02 01:07:50 +0000511LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000512LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text,
513 unsigned SLen);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000514unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal);
515long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000516
Gordon Henriksen76a03742007-09-18 03:18:57 +0000517
518/* Operations on composite constants */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000519LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
520 unsigned Length, int DontNullTerminate);
521LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
522 LLVMValueRef *ConstantVals,
523 unsigned Count, int Packed);
524
Gordon Henriksen1046c732007-10-06 15:11:06 +0000525LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
526 int DontNullTerminate);
Gordon Henriksen2ad5aef2008-04-25 03:21:19 +0000527LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
Gordon Henriksen1046c732007-10-06 15:11:06 +0000528 LLVMValueRef *ConstantVals, unsigned Length);
529LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000530 int Packed);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000531LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000532
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000533/* Constant expressions */
Chris Lattner40cf28d2009-10-12 04:01:02 +0000534LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000535LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000536LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
537LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000538LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000539LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
540LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000541LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000542LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000543LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000544LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000545LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000546LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000547LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
548LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000549LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000550LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
551LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
552LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
553LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
554LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
555LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
556LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
557LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
558 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
559LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
560 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
561LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
562LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
563LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
564LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
565 LLVMValueRef *ConstantIndices, unsigned NumIndices);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000566LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
567 LLVMValueRef *ConstantIndices,
568 unsigned NumIndices);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000569LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
570LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
571LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
572LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
573LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
574LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
575LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
576LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
577LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
578LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
579LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
580LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000581LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
582 LLVMTypeRef ToType);
583LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
584 LLVMTypeRef ToType);
585LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
586 LLVMTypeRef ToType);
587LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
588 LLVMTypeRef ToType);
589LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
590 unsigned isSigned);
591LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000592LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
593 LLVMValueRef ConstantIfTrue,
594 LLVMValueRef ConstantIfFalse);
595LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
596 LLVMValueRef IndexConstant);
597LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
598 LLVMValueRef ElementValueConstant,
599 LLVMValueRef IndexConstant);
600LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
601 LLVMValueRef VectorBConstant,
602 LLVMValueRef MaskConstant);
Dan Gohmand5104a52008-11-03 22:55:43 +0000603LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
604 unsigned NumIdx);
605LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
606 LLVMValueRef ElementValueConstant,
607 unsigned *IdxList, unsigned NumIdx);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000608LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
609 const char *AsmString, const char *Constraints,
610 int HasSideEffects);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000611
Gordon Henriksen76a03742007-09-18 03:18:57 +0000612/* Operations on global variables, functions, and aliases (globals) */
Gordon Henriksen265f7802008-03-19 01:11:35 +0000613LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000614int LLVMIsDeclaration(LLVMValueRef Global);
615LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
616void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
617const char *LLVMGetSection(LLVMValueRef Global);
618void LLVMSetSection(LLVMValueRef Global, const char *Section);
619LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
620void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
621unsigned LLVMGetAlignment(LLVMValueRef Global);
622void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
623
624/* Operations on global variables */
625LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000626LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000627LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
628LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
629LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
630LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000631void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000632LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
633void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
634int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
635void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
Gordon Henriksen751ebf72007-10-07 17:31:42 +0000636int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
637void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000638
Chris Lattner3d1f5522008-12-17 21:39:50 +0000639/* Operations on aliases */
640LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
641 const char *Name);
642
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000643/* Operations on functions */
644LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
645 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000646LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000647LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
648LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
649LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
650LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000651void LLVMDeleteFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000652unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
653unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
654void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksend930f912008-08-17 18:44:35 +0000655const char *LLVMGetGC(LLVMValueRef Fn);
656void LLVMSetGC(LLVMValueRef Fn, const char *Name);
Duncan Sands7374a012009-05-06 12:21:17 +0000657void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000658LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn);
Duncan Sands7374a012009-05-06 12:21:17 +0000659void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000660
Gordon Henriksen265f7802008-03-19 01:11:35 +0000661/* Operations on parameters */
662unsigned LLVMCountParams(LLVMValueRef Fn);
663void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
664LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
665LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000666LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
667LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
668LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
669LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
Devang Patel4c758ea2008-09-25 21:00:45 +0000670void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
671void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000672LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000673void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000674
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000675/* Operations on basic blocks */
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000676LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000677int LLVMValueIsBasicBlock(LLVMValueRef Val);
678LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000679LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000680unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
681void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000682LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
683LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
684LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
685LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000686LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000687
688LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
689 LLVMValueRef Fn,
690 const char *Name);
691LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
692 LLVMBasicBlockRef BB,
693 const char *Name);
694
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000695LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
696LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
697 const char *Name);
698void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
699
Gordon Henriksen265f7802008-03-19 01:11:35 +0000700/* Operations on instructions */
701LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000702LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
703LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
704LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
705LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000706
Gordon Henriksen1158c532007-12-29 20:45:00 +0000707/* Operations on call sites */
708void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
709unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
Devang Patel4c758ea2008-09-25 21:00:45 +0000710void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
711void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
712 LLVMAttribute);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000713void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
714 unsigned align);
Gordon Henriksen1158c532007-12-29 20:45:00 +0000715
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000716/* Operations on call instructions (only) */
717int LLVMIsTailCall(LLVMValueRef CallInst);
718void LLVMSetTailCall(LLVMValueRef CallInst, int IsTailCall);
719
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000720/* Operations on phi nodes */
721void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
722 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
723unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
724LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
725LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000726
727/*===-- Instruction builders ----------------------------------------------===*/
728
729/* An instruction builder represents a point within a basic block, and is the
730 * exclusive means of building instructions using the C interface.
731 */
732
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000733LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C);
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000734LLVMBuilderRef LLVMCreateBuilder(void);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000735void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
736 LLVMValueRef Instr);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000737void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
738void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000739LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000740void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
741void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
Erick Tryzelaar9813bea2009-08-16 02:20:57 +0000742void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
743 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000744void LLVMDisposeBuilder(LLVMBuilderRef Builder);
745
746/* Terminators */
747LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
748LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000749LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef, LLVMValueRef *RetVals,
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000750 unsigned N);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000751LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
752LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
753 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
754LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
755 LLVMBasicBlockRef Else, unsigned NumCases);
756LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
757 LLVMValueRef *Args, unsigned NumArgs,
758 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
759 const char *Name);
760LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
761LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
762
Gordon Henriksen097102c2008-01-01 05:50:53 +0000763/* Add a case to the switch instruction */
764void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
765 LLVMBasicBlockRef Dest);
766
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000767/* Arithmetic */
768LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
769 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000770LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
771 const char *Name);
772LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
773 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000774LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
775 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000776LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
777 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000778LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
779 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000780LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
781 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000782LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
783 const char *Name);
784LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
785 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000786LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
787 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000788LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
789 const char *Name);
790LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
791 const char *Name);
792LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
793 const char *Name);
794LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
795 const char *Name);
796LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
797 const char *Name);
798LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
799 const char *Name);
800LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
801 const char *Name);
802LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
803 const char *Name);
804LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
805 const char *Name);
806LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
807 const char *Name);
808LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Dan Gohmanf919bd62009-09-28 21:51:41 +0000809LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000810LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
811
812/* Memory */
813LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
814LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
815 LLVMValueRef Val, const char *Name);
816LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
817LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
818 LLVMValueRef Val, const char *Name);
819LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
820LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
821 const char *Name);
822LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
823LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
824 LLVMValueRef *Indices, unsigned NumIndices,
825 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000826LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
827 LLVMValueRef *Indices, unsigned NumIndices,
828 const char *Name);
829LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
830 unsigned Idx, const char *Name);
831LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
832 const char *Name);
833LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
834 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000835
836/* Casts */
837LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
838 LLVMTypeRef DestTy, const char *Name);
839LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
840 LLVMTypeRef DestTy, const char *Name);
841LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
842 LLVMTypeRef DestTy, const char *Name);
843LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
844 LLVMTypeRef DestTy, const char *Name);
845LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
846 LLVMTypeRef DestTy, const char *Name);
847LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
848 LLVMTypeRef DestTy, const char *Name);
849LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
850 LLVMTypeRef DestTy, const char *Name);
851LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
852 LLVMTypeRef DestTy, const char *Name);
853LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
854 LLVMTypeRef DestTy, const char *Name);
855LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
856 LLVMTypeRef DestTy, const char *Name);
857LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
858 LLVMTypeRef DestTy, const char *Name);
859LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
860 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000861LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
862 LLVMTypeRef DestTy, const char *Name);
863LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
864 LLVMTypeRef DestTy, const char *Name);
865LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
866 LLVMTypeRef DestTy, const char *Name);
867LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef, LLVMValueRef Val,
868 LLVMTypeRef DestTy, const char *Name);
Duncan Sands9d786d72009-11-23 10:49:03 +0000869LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef, LLVMValueRef Val, /*Signed cast!*/
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000870 LLVMTypeRef DestTy, const char *Name);
871LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef, LLVMValueRef Val,
872 LLVMTypeRef DestTy, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000873
874/* Comparisons */
875LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
876 LLVMValueRef LHS, LLVMValueRef RHS,
877 const char *Name);
878LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
879 LLVMValueRef LHS, LLVMValueRef RHS,
880 const char *Name);
881
882/* Miscellaneous instructions */
883LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
884LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
885 LLVMValueRef *Args, unsigned NumArgs,
886 const char *Name);
887LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
888 LLVMValueRef Then, LLVMValueRef Else,
889 const char *Name);
890LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
891 const char *Name);
892LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
893 LLVMValueRef Index, const char *Name);
894LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
895 LLVMValueRef EltVal, LLVMValueRef Index,
896 const char *Name);
897LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
898 LLVMValueRef V2, LLVMValueRef Mask,
899 const char *Name);
Dan Gohmand5104a52008-11-03 22:55:43 +0000900LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
901 unsigned Index, const char *Name);
902LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
903 LLVMValueRef EltVal, unsigned Index,
904 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000905
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000906LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val,
907 const char *Name);
908LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef, LLVMValueRef Val,
909 const char *Name);
910LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef, LLVMValueRef LHS,
911 LLVMValueRef RHS, const char *Name);
912
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000913
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000914/*===-- Module providers --------------------------------------------------===*/
915
916/* Encapsulates the module M in a module provider, taking ownership of the
917 * module.
918 * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
919 */
920LLVMModuleProviderRef
921LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
922
923/* Destroys the module provider MP as well as the contained module.
924 * See the destructor llvm::ModuleProvider::~ModuleProvider.
925 */
926void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
927
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000928
929/*===-- Memory buffers ----------------------------------------------------===*/
930
931int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
932 LLVMMemoryBufferRef *OutMemBuf,
933 char **OutMessage);
934int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
935 char **OutMessage);
936void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
937
Gordon Henriksen878114b2008-03-16 04:20:44 +0000938
939/*===-- Pass Managers -----------------------------------------------------===*/
940
941/** Constructs a new whole-module pass pipeline. This type of pipeline is
942 suitable for link-time optimization and whole-module transformations.
943 See llvm::PassManager::PassManager. */
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000944LLVMPassManagerRef LLVMCreatePassManager(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +0000945
946/** Constructs a new function-by-function pass pipeline over the module
947 provider. It does not take ownership of the module provider. This type of
948 pipeline is suitable for code generation and JIT compilation tasks.
949 See llvm::FunctionPassManager::FunctionPassManager. */
950LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
951
952/** Initializes, executes on the provided module, and finalizes all of the
953 passes scheduled in the pass manager. Returns 1 if any of the passes
954 modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
955int LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
956
957/** Initializes all of the function passes scheduled in the function pass
958 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
959 See llvm::FunctionPassManager::doInitialization. */
960int LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
961
962/** Executes all of the function passes scheduled in the function pass manager
963 on the provided function. Returns 1 if any of the passes modified the
964 function, false otherwise.
965 See llvm::FunctionPassManager::run(Function&). */
966int LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
967
968/** Finalizes all of the function passes scheduled in in the function pass
969 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
970 See llvm::FunctionPassManager::doFinalization. */
971int LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
972
973/** Frees the memory of a pass pipeline. For function pipelines, does not free
974 the module provider.
975 See llvm::PassManagerBase::~PassManagerBase. */
976void LLVMDisposePassManager(LLVMPassManagerRef PM);
977
978
Gordon Henriksen76a03742007-09-18 03:18:57 +0000979#ifdef __cplusplus
980}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000981
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000982namespace llvm {
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000983 class ModuleProvider;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000984 class MemoryBuffer;
Gordon Henriksen96571492008-03-16 15:55:43 +0000985 class PassManagerBase;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000986
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000987 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
988 inline ty *unwrap(ref P) { \
989 return reinterpret_cast<ty*>(P); \
990 } \
991 \
992 inline ref wrap(const ty *P) { \
993 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
994 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000995
Gordon Henriksen878114b2008-03-16 04:20:44 +0000996 #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref) \
997 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
998 \
999 template<typename T> \
1000 inline T *unwrap(ref P) { \
1001 return cast<T>(unwrap(P)); \
1002 }
1003
1004 #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref) \
1005 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1006 \
1007 template<typename T> \
1008 inline T *unwrap(ref P) { \
1009 T *Q = dynamic_cast<T*>(unwrap(P)); \
1010 assert(Q && "Invalid cast!"); \
1011 return Q; \
1012 }
1013
1014 DEFINE_ISA_CONVERSION_FUNCTIONS (Type, LLVMTypeRef )
1015 DEFINE_ISA_CONVERSION_FUNCTIONS (Value, LLVMValueRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001016 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
1017 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
Eric Christopher59278832008-08-08 19:39:37 +00001018 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001019 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
1020 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider, LLVMModuleProviderRef)
1021 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Owen Anderson6773d382009-07-01 16:58:40 +00001022 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMContext, LLVMContextRef )
Chris Lattner40cf28d2009-10-12 04:01:02 +00001023 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Use, LLVMUseIteratorRef )
Gordon Henriksen878114b2008-03-16 04:20:44 +00001024 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef )
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001025
Gordon Henriksen878114b2008-03-16 04:20:44 +00001026 #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS
1027 #undef DEFINE_ISA_CONVERSION_FUNCTIONS
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001028 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001029
1030 /* Specialized opaque context conversions.
1031 */
1032 inline LLVMContext **unwrap(LLVMContextRef* Tys) {
1033 return reinterpret_cast<LLVMContext**>(Tys);
1034 }
1035
1036 inline LLVMContextRef *wrap(const LLVMContext **Tys) {
1037 return reinterpret_cast<LLVMContextRef*>(const_cast<LLVMContext**>(Tys));
1038 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001039
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001040 /* Specialized opaque type conversions.
1041 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001042 inline Type **unwrap(LLVMTypeRef* Tys) {
1043 return reinterpret_cast<Type**>(Tys);
1044 }
1045
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001046 inline LLVMTypeRef *wrap(const Type **Tys) {
1047 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
1048 }
1049
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001050 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001051 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001052 inline Value **unwrap(LLVMValueRef *Vals) {
1053 return reinterpret_cast<Value**>(Vals);
1054 }
1055
1056 template<typename T>
1057 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
1058 #if DEBUG
Chris Lattnerb7971152009-07-10 18:28:19 +00001059 for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I)
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001060 cast<T>(*I);
1061 #endif
1062 return reinterpret_cast<T**>(Vals);
1063 }
1064
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001065 inline LLVMValueRef *wrap(const Value **Vals) {
1066 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
1067 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001068}
1069
1070#endif /* !defined(__cplusplus) */
1071
1072#endif /* !defined(LLVM_C_CORE_H) */