blob: fd8c6d31f89f994f5ff3c0f56df26a303f7a4046 [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
Erick Tryzelaardd991352009-08-16 23:36:46 +000036#include "llvm/Support/DataTypes.h"
37
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) \
430 macro(DbgFuncStartInst) \
431 macro(DbgRegionEndInst) \
432 macro(DbgRegionStartInst) \
433 macro(DbgStopPointInst) \
434 macro(EHSelectorInst) \
435 macro(MemIntrinsic) \
436 macro(MemCpyInst) \
437 macro(MemMoveInst) \
438 macro(MemSetInst) \
439 macro(CmpInst) \
440 macro(FCmpInst) \
441 macro(ICmpInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000442 macro(ExtractElementInst) \
443 macro(GetElementPtrInst) \
444 macro(InsertElementInst) \
445 macro(InsertValueInst) \
446 macro(PHINode) \
447 macro(SelectInst) \
448 macro(ShuffleVectorInst) \
449 macro(StoreInst) \
450 macro(TerminatorInst) \
451 macro(BranchInst) \
452 macro(InvokeInst) \
453 macro(ReturnInst) \
454 macro(SwitchInst) \
455 macro(UnreachableInst) \
456 macro(UnwindInst) \
457 macro(UnaryInstruction) \
Victor Hernandez8acf2952009-10-23 21:09:37 +0000458 macro(AllocaInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000459 macro(CastInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000460 macro(BitCastInst) \
461 macro(FPExtInst) \
462 macro(FPToSIInst) \
463 macro(FPToUIInst) \
464 macro(FPTruncInst) \
465 macro(IntToPtrInst) \
466 macro(PtrToIntInst) \
467 macro(SExtInst) \
468 macro(SIToFPInst) \
469 macro(TruncInst) \
470 macro(UIToFPInst) \
471 macro(ZExtInst) \
472 macro(ExtractValueInst) \
473 macro(FreeInst) \
474 macro(LoadInst) \
475 macro(VAArgInst)
Gordon Henriksen29e38942008-12-19 18:39:45 +0000476
Gordon Henriksen76a03742007-09-18 03:18:57 +0000477/* Operations on all values */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000478LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000479const char *LLVMGetValueName(LLVMValueRef Val);
480void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000481void LLVMDumpValue(LLVMValueRef Val);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000482void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000483
Gordon Henriksen29e38942008-12-19 18:39:45 +0000484/* Conversion functions. Return the input value if it is an instance of the
485 specified class, otherwise NULL. See llvm::dyn_cast_or_null<>. */
486#define LLVM_DECLARE_VALUE_CAST(name) \
487 LLVMValueRef LLVMIsA##name(LLVMValueRef Val);
488LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DECLARE_VALUE_CAST)
489
Chris Lattner40cf28d2009-10-12 04:01:02 +0000490/* Operations on Uses */
491LLVMUseIteratorRef LLVMGetFirstUse(LLVMValueRef Val);
492LLVMUseIteratorRef LLVMGetNextUse(LLVMUseIteratorRef U);
493LLVMValueRef LLVMGetUser(LLVMUseIteratorRef U);
494LLVMValueRef LLVMGetUsedValue(LLVMUseIteratorRef U);
495
496/* Operations on Users */
497LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index);
498
Gordon Henriksen76a03742007-09-18 03:18:57 +0000499/* Operations on constants of any type */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000500LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
501LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000502LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000503int LLVMIsConstant(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000504int LLVMIsNull(LLVMValueRef Val);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000505int LLVMIsUndef(LLVMValueRef Val);
Chris Lattner7f318242009-07-06 17:29:59 +0000506LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000507
508/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000509LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
510 int SignExtend);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000511LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text,
512 uint8_t Radix);
513LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text,
514 unsigned SLen, uint8_t Radix);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000515LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen931e1212008-02-02 01:07:50 +0000516LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000517LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text,
518 unsigned SLen);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000519unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal);
520long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000521
Gordon Henriksen76a03742007-09-18 03:18:57 +0000522
523/* Operations on composite constants */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000524LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
525 unsigned Length, int DontNullTerminate);
526LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
527 LLVMValueRef *ConstantVals,
528 unsigned Count, int Packed);
529
Gordon Henriksen1046c732007-10-06 15:11:06 +0000530LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
531 int DontNullTerminate);
Gordon Henriksen2ad5aef2008-04-25 03:21:19 +0000532LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
Gordon Henriksen1046c732007-10-06 15:11:06 +0000533 LLVMValueRef *ConstantVals, unsigned Length);
534LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000535 int Packed);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000536LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000537
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000538/* Constant expressions */
Chris Lattner40cf28d2009-10-12 04:01:02 +0000539LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000540LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000541LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
542LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000543LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000544LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
545LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000546LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000547LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000548LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000549LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000550LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000551LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000552LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
553LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000554LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000555LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
556LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
557LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
558LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
559LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
560LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
561LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
562LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
563 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
564LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
565 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
566LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
567LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
568LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
569LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
570 LLVMValueRef *ConstantIndices, unsigned NumIndices);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000571LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
572 LLVMValueRef *ConstantIndices,
573 unsigned NumIndices);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000574LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
575LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
576LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
577LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
578LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
579LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
580LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
581LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
582LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
583LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
584LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
585LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000586LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
587 LLVMTypeRef ToType);
588LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
589 LLVMTypeRef ToType);
590LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
591 LLVMTypeRef ToType);
592LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
593 LLVMTypeRef ToType);
594LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
595 unsigned isSigned);
596LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000597LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
598 LLVMValueRef ConstantIfTrue,
599 LLVMValueRef ConstantIfFalse);
600LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
601 LLVMValueRef IndexConstant);
602LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
603 LLVMValueRef ElementValueConstant,
604 LLVMValueRef IndexConstant);
605LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
606 LLVMValueRef VectorBConstant,
607 LLVMValueRef MaskConstant);
Dan Gohmand5104a52008-11-03 22:55:43 +0000608LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
609 unsigned NumIdx);
610LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
611 LLVMValueRef ElementValueConstant,
612 unsigned *IdxList, unsigned NumIdx);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000613LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
614 const char *AsmString, const char *Constraints,
615 int HasSideEffects);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000616
Gordon Henriksen76a03742007-09-18 03:18:57 +0000617/* Operations on global variables, functions, and aliases (globals) */
Gordon Henriksen265f7802008-03-19 01:11:35 +0000618LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000619int LLVMIsDeclaration(LLVMValueRef Global);
620LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
621void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
622const char *LLVMGetSection(LLVMValueRef Global);
623void LLVMSetSection(LLVMValueRef Global, const char *Section);
624LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
625void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
626unsigned LLVMGetAlignment(LLVMValueRef Global);
627void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
628
629/* Operations on global variables */
630LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000631LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000632LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
633LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
634LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
635LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000636void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000637LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
638void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
639int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
640void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
Gordon Henriksen751ebf72007-10-07 17:31:42 +0000641int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
642void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000643
Chris Lattner3d1f5522008-12-17 21:39:50 +0000644/* Operations on aliases */
645LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
646 const char *Name);
647
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000648/* Operations on functions */
649LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
650 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000651LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000652LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
653LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
654LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
655LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000656void LLVMDeleteFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000657unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
658unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
659void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksend930f912008-08-17 18:44:35 +0000660const char *LLVMGetGC(LLVMValueRef Fn);
661void LLVMSetGC(LLVMValueRef Fn, const char *Name);
Duncan Sands7374a012009-05-06 12:21:17 +0000662void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000663LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn);
Duncan Sands7374a012009-05-06 12:21:17 +0000664void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000665
Gordon Henriksen265f7802008-03-19 01:11:35 +0000666/* Operations on parameters */
667unsigned LLVMCountParams(LLVMValueRef Fn);
668void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
669LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
670LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000671LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
672LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
673LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
674LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
Devang Patel4c758ea2008-09-25 21:00:45 +0000675void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
676void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000677LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000678void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000679
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000680/* Operations on basic blocks */
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000681LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000682int LLVMValueIsBasicBlock(LLVMValueRef Val);
683LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000684LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000685unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
686void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000687LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
688LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
689LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
690LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000691LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000692
693LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
694 LLVMValueRef Fn,
695 const char *Name);
696LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
697 LLVMBasicBlockRef BB,
698 const char *Name);
699
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000700LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
701LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
702 const char *Name);
703void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
704
Gordon Henriksen265f7802008-03-19 01:11:35 +0000705/* Operations on instructions */
706LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000707LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
708LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
709LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
710LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000711
Gordon Henriksen1158c532007-12-29 20:45:00 +0000712/* Operations on call sites */
713void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
714unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
Devang Patel4c758ea2008-09-25 21:00:45 +0000715void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
716void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
717 LLVMAttribute);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000718void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
719 unsigned align);
Gordon Henriksen1158c532007-12-29 20:45:00 +0000720
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000721/* Operations on call instructions (only) */
722int LLVMIsTailCall(LLVMValueRef CallInst);
723void LLVMSetTailCall(LLVMValueRef CallInst, int IsTailCall);
724
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000725/* Operations on phi nodes */
726void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
727 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
728unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
729LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
730LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000731
732/*===-- Instruction builders ----------------------------------------------===*/
733
734/* An instruction builder represents a point within a basic block, and is the
735 * exclusive means of building instructions using the C interface.
736 */
737
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000738LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C);
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000739LLVMBuilderRef LLVMCreateBuilder(void);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000740void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
741 LLVMValueRef Instr);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000742void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
743void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000744LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000745void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
746void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
Erick Tryzelaar9813bea2009-08-16 02:20:57 +0000747void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
748 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000749void LLVMDisposeBuilder(LLVMBuilderRef Builder);
750
751/* Terminators */
752LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
753LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000754LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef, LLVMValueRef *RetVals,
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000755 unsigned N);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000756LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
757LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
758 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
759LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
760 LLVMBasicBlockRef Else, unsigned NumCases);
761LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
762 LLVMValueRef *Args, unsigned NumArgs,
763 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
764 const char *Name);
765LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
766LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
767
Gordon Henriksen097102c2008-01-01 05:50:53 +0000768/* Add a case to the switch instruction */
769void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
770 LLVMBasicBlockRef Dest);
771
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000772/* Arithmetic */
773LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
774 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000775LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
776 const char *Name);
777LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
778 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000779LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
780 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000781LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
782 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000783LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
784 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000785LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
786 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000787LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
788 const char *Name);
789LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
790 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000791LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
792 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000793LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
794 const char *Name);
795LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
796 const char *Name);
797LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
798 const char *Name);
799LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
800 const char *Name);
801LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
802 const char *Name);
803LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
804 const char *Name);
805LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
806 const char *Name);
807LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
808 const char *Name);
809LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
810 const char *Name);
811LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
812 const char *Name);
813LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Dan Gohmanf919bd62009-09-28 21:51:41 +0000814LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000815LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
816
817/* Memory */
818LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
819LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
820 LLVMValueRef Val, const char *Name);
821LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
822LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
823 LLVMValueRef Val, const char *Name);
824LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
825LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
826 const char *Name);
827LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
828LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
829 LLVMValueRef *Indices, unsigned NumIndices,
830 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000831LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
832 LLVMValueRef *Indices, unsigned NumIndices,
833 const char *Name);
834LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
835 unsigned Idx, const char *Name);
836LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
837 const char *Name);
838LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
839 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000840
841/* Casts */
842LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
843 LLVMTypeRef DestTy, const char *Name);
844LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
845 LLVMTypeRef DestTy, const char *Name);
846LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
847 LLVMTypeRef DestTy, const char *Name);
848LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
849 LLVMTypeRef DestTy, const char *Name);
850LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
851 LLVMTypeRef DestTy, const char *Name);
852LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
853 LLVMTypeRef DestTy, const char *Name);
854LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
855 LLVMTypeRef DestTy, const char *Name);
856LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
857 LLVMTypeRef DestTy, const char *Name);
858LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
859 LLVMTypeRef DestTy, const char *Name);
860LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
861 LLVMTypeRef DestTy, const char *Name);
862LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
863 LLVMTypeRef DestTy, const char *Name);
864LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
865 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000866LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
867 LLVMTypeRef DestTy, const char *Name);
868LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
869 LLVMTypeRef DestTy, const char *Name);
870LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
871 LLVMTypeRef DestTy, const char *Name);
872LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef, LLVMValueRef Val,
873 LLVMTypeRef DestTy, const char *Name);
874LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef, LLVMValueRef Val,
875 LLVMTypeRef DestTy, const char *Name);
876LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef, LLVMValueRef Val,
877 LLVMTypeRef DestTy, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000878
879/* Comparisons */
880LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
881 LLVMValueRef LHS, LLVMValueRef RHS,
882 const char *Name);
883LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
884 LLVMValueRef LHS, LLVMValueRef RHS,
885 const char *Name);
886
887/* Miscellaneous instructions */
888LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
889LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
890 LLVMValueRef *Args, unsigned NumArgs,
891 const char *Name);
892LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
893 LLVMValueRef Then, LLVMValueRef Else,
894 const char *Name);
895LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
896 const char *Name);
897LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
898 LLVMValueRef Index, const char *Name);
899LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
900 LLVMValueRef EltVal, LLVMValueRef Index,
901 const char *Name);
902LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
903 LLVMValueRef V2, LLVMValueRef Mask,
904 const char *Name);
Dan Gohmand5104a52008-11-03 22:55:43 +0000905LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
906 unsigned Index, const char *Name);
907LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
908 LLVMValueRef EltVal, unsigned Index,
909 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000910
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000911LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val,
912 const char *Name);
913LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef, LLVMValueRef Val,
914 const char *Name);
915LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef, LLVMValueRef LHS,
916 LLVMValueRef RHS, const char *Name);
917
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000918
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000919/*===-- Module providers --------------------------------------------------===*/
920
921/* Encapsulates the module M in a module provider, taking ownership of the
922 * module.
923 * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
924 */
925LLVMModuleProviderRef
926LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
927
928/* Destroys the module provider MP as well as the contained module.
929 * See the destructor llvm::ModuleProvider::~ModuleProvider.
930 */
931void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
932
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000933
934/*===-- Memory buffers ----------------------------------------------------===*/
935
936int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
937 LLVMMemoryBufferRef *OutMemBuf,
938 char **OutMessage);
939int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
940 char **OutMessage);
941void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
942
Gordon Henriksen878114b2008-03-16 04:20:44 +0000943
944/*===-- Pass Managers -----------------------------------------------------===*/
945
946/** Constructs a new whole-module pass pipeline. This type of pipeline is
947 suitable for link-time optimization and whole-module transformations.
948 See llvm::PassManager::PassManager. */
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000949LLVMPassManagerRef LLVMCreatePassManager(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +0000950
951/** Constructs a new function-by-function pass pipeline over the module
952 provider. It does not take ownership of the module provider. This type of
953 pipeline is suitable for code generation and JIT compilation tasks.
954 See llvm::FunctionPassManager::FunctionPassManager. */
955LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
956
957/** Initializes, executes on the provided module, and finalizes all of the
958 passes scheduled in the pass manager. Returns 1 if any of the passes
959 modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
960int LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
961
962/** Initializes all of the function passes scheduled in the function pass
963 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
964 See llvm::FunctionPassManager::doInitialization. */
965int LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
966
967/** Executes all of the function passes scheduled in the function pass manager
968 on the provided function. Returns 1 if any of the passes modified the
969 function, false otherwise.
970 See llvm::FunctionPassManager::run(Function&). */
971int LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
972
973/** Finalizes all of the function passes scheduled in in the function pass
974 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
975 See llvm::FunctionPassManager::doFinalization. */
976int LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
977
978/** Frees the memory of a pass pipeline. For function pipelines, does not free
979 the module provider.
980 See llvm::PassManagerBase::~PassManagerBase. */
981void LLVMDisposePassManager(LLVMPassManagerRef PM);
982
983
Gordon Henriksen76a03742007-09-18 03:18:57 +0000984#ifdef __cplusplus
985}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000986
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000987namespace llvm {
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000988 class ModuleProvider;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000989 class MemoryBuffer;
Gordon Henriksen96571492008-03-16 15:55:43 +0000990 class PassManagerBase;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000991
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000992 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
993 inline ty *unwrap(ref P) { \
994 return reinterpret_cast<ty*>(P); \
995 } \
996 \
997 inline ref wrap(const ty *P) { \
998 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
999 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001000
Gordon Henriksen878114b2008-03-16 04:20:44 +00001001 #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref) \
1002 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1003 \
1004 template<typename T> \
1005 inline T *unwrap(ref P) { \
1006 return cast<T>(unwrap(P)); \
1007 }
1008
1009 #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref) \
1010 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1011 \
1012 template<typename T> \
1013 inline T *unwrap(ref P) { \
1014 T *Q = dynamic_cast<T*>(unwrap(P)); \
1015 assert(Q && "Invalid cast!"); \
1016 return Q; \
1017 }
1018
1019 DEFINE_ISA_CONVERSION_FUNCTIONS (Type, LLVMTypeRef )
1020 DEFINE_ISA_CONVERSION_FUNCTIONS (Value, LLVMValueRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001021 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
1022 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
Eric Christopher59278832008-08-08 19:39:37 +00001023 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001024 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
1025 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider, LLVMModuleProviderRef)
1026 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Owen Anderson6773d382009-07-01 16:58:40 +00001027 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMContext, LLVMContextRef )
Chris Lattner40cf28d2009-10-12 04:01:02 +00001028 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Use, LLVMUseIteratorRef )
Gordon Henriksen878114b2008-03-16 04:20:44 +00001029 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef )
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001030
Gordon Henriksen878114b2008-03-16 04:20:44 +00001031 #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS
1032 #undef DEFINE_ISA_CONVERSION_FUNCTIONS
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001033 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001034
1035 /* Specialized opaque context conversions.
1036 */
1037 inline LLVMContext **unwrap(LLVMContextRef* Tys) {
1038 return reinterpret_cast<LLVMContext**>(Tys);
1039 }
1040
1041 inline LLVMContextRef *wrap(const LLVMContext **Tys) {
1042 return reinterpret_cast<LLVMContextRef*>(const_cast<LLVMContext**>(Tys));
1043 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001044
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001045 /* Specialized opaque type conversions.
1046 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001047 inline Type **unwrap(LLVMTypeRef* Tys) {
1048 return reinterpret_cast<Type**>(Tys);
1049 }
1050
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001051 inline LLVMTypeRef *wrap(const Type **Tys) {
1052 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
1053 }
1054
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001055 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001056 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001057 inline Value **unwrap(LLVMValueRef *Vals) {
1058 return reinterpret_cast<Value**>(Vals);
1059 }
1060
1061 template<typename T>
1062 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
1063 #if DEBUG
Chris Lattnerb7971152009-07-10 18:28:19 +00001064 for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I)
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001065 cast<T>(*I);
1066 #endif
1067 return reinterpret_cast<T**>(Vals);
1068 }
1069
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001070 inline LLVMValueRef *wrap(const Value **Vals) {
1071 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
1072 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001073}
1074
1075#endif /* !defined(__cplusplus) */
1076
1077#endif /* !defined(LLVM_C_CORE_H) */