blob: 353cab20b2c26b2701e522207a59fc6d39b7d7c0 [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) \
458 macro(AllocationInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000459 macro(AllocaInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000460 macro(CastInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000461 macro(BitCastInst) \
462 macro(FPExtInst) \
463 macro(FPToSIInst) \
464 macro(FPToUIInst) \
465 macro(FPTruncInst) \
466 macro(IntToPtrInst) \
467 macro(PtrToIntInst) \
468 macro(SExtInst) \
469 macro(SIToFPInst) \
470 macro(TruncInst) \
471 macro(UIToFPInst) \
472 macro(ZExtInst) \
473 macro(ExtractValueInst) \
474 macro(FreeInst) \
475 macro(LoadInst) \
476 macro(VAArgInst)
Gordon Henriksen29e38942008-12-19 18:39:45 +0000477
Gordon Henriksen76a03742007-09-18 03:18:57 +0000478/* Operations on all values */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000479LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000480const char *LLVMGetValueName(LLVMValueRef Val);
481void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000482void LLVMDumpValue(LLVMValueRef Val);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000483void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000484
Gordon Henriksen29e38942008-12-19 18:39:45 +0000485/* Conversion functions. Return the input value if it is an instance of the
486 specified class, otherwise NULL. See llvm::dyn_cast_or_null<>. */
487#define LLVM_DECLARE_VALUE_CAST(name) \
488 LLVMValueRef LLVMIsA##name(LLVMValueRef Val);
489LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DECLARE_VALUE_CAST)
490
Chris Lattner40cf28d2009-10-12 04:01:02 +0000491/* Operations on Uses */
492LLVMUseIteratorRef LLVMGetFirstUse(LLVMValueRef Val);
493LLVMUseIteratorRef LLVMGetNextUse(LLVMUseIteratorRef U);
494LLVMValueRef LLVMGetUser(LLVMUseIteratorRef U);
495LLVMValueRef LLVMGetUsedValue(LLVMUseIteratorRef U);
496
497/* Operations on Users */
498LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index);
499
Gordon Henriksen76a03742007-09-18 03:18:57 +0000500/* Operations on constants of any type */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000501LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
502LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000503LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000504int LLVMIsConstant(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000505int LLVMIsNull(LLVMValueRef Val);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000506int LLVMIsUndef(LLVMValueRef Val);
Chris Lattner7f318242009-07-06 17:29:59 +0000507LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000508
509/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000510LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
511 int SignExtend);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000512LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text,
513 uint8_t Radix);
514LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text,
515 unsigned SLen, uint8_t Radix);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000516LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen931e1212008-02-02 01:07:50 +0000517LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000518LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text,
519 unsigned SLen);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000520unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal);
521long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000522
Gordon Henriksen76a03742007-09-18 03:18:57 +0000523
524/* Operations on composite constants */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000525LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
526 unsigned Length, int DontNullTerminate);
527LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
528 LLVMValueRef *ConstantVals,
529 unsigned Count, int Packed);
530
Gordon Henriksen1046c732007-10-06 15:11:06 +0000531LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
532 int DontNullTerminate);
Gordon Henriksen2ad5aef2008-04-25 03:21:19 +0000533LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
Gordon Henriksen1046c732007-10-06 15:11:06 +0000534 LLVMValueRef *ConstantVals, unsigned Length);
535LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000536 int Packed);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000537LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000538
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000539/* Constant expressions */
Chris Lattner40cf28d2009-10-12 04:01:02 +0000540LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000541LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000542LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
543LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000544LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000545LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
546LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000547LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000548LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000549LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000550LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000551LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000552LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000553LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
554LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000555LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000556LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
557LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
558LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
559LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
560LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
561LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
562LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
563LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
564 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
565LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
566 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
567LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
568LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
569LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
570LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
571 LLVMValueRef *ConstantIndices, unsigned NumIndices);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000572LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
573 LLVMValueRef *ConstantIndices,
574 unsigned NumIndices);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000575LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
576LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
577LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
578LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
579LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
580LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
581LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
582LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
583LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
584LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
585LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
586LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000587LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
588 LLVMTypeRef ToType);
589LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
590 LLVMTypeRef ToType);
591LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
592 LLVMTypeRef ToType);
593LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
594 LLVMTypeRef ToType);
595LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
596 unsigned isSigned);
597LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000598LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
599 LLVMValueRef ConstantIfTrue,
600 LLVMValueRef ConstantIfFalse);
601LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
602 LLVMValueRef IndexConstant);
603LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
604 LLVMValueRef ElementValueConstant,
605 LLVMValueRef IndexConstant);
606LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
607 LLVMValueRef VectorBConstant,
608 LLVMValueRef MaskConstant);
Dan Gohmand5104a52008-11-03 22:55:43 +0000609LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
610 unsigned NumIdx);
611LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
612 LLVMValueRef ElementValueConstant,
613 unsigned *IdxList, unsigned NumIdx);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000614LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
615 const char *AsmString, const char *Constraints,
616 int HasSideEffects);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000617
Gordon Henriksen76a03742007-09-18 03:18:57 +0000618/* Operations on global variables, functions, and aliases (globals) */
Gordon Henriksen265f7802008-03-19 01:11:35 +0000619LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000620int LLVMIsDeclaration(LLVMValueRef Global);
621LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
622void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
623const char *LLVMGetSection(LLVMValueRef Global);
624void LLVMSetSection(LLVMValueRef Global, const char *Section);
625LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
626void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
627unsigned LLVMGetAlignment(LLVMValueRef Global);
628void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
629
630/* Operations on global variables */
631LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000632LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000633LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
634LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
635LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
636LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000637void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000638LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
639void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
640int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
641void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
Gordon Henriksen751ebf72007-10-07 17:31:42 +0000642int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
643void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000644
Chris Lattner3d1f5522008-12-17 21:39:50 +0000645/* Operations on aliases */
646LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
647 const char *Name);
648
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000649/* Operations on functions */
650LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
651 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000652LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000653LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
654LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
655LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
656LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000657void LLVMDeleteFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000658unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
659unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
660void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksend930f912008-08-17 18:44:35 +0000661const char *LLVMGetGC(LLVMValueRef Fn);
662void LLVMSetGC(LLVMValueRef Fn, const char *Name);
Duncan Sands7374a012009-05-06 12:21:17 +0000663void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000664LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn);
Duncan Sands7374a012009-05-06 12:21:17 +0000665void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000666
Gordon Henriksen265f7802008-03-19 01:11:35 +0000667/* Operations on parameters */
668unsigned LLVMCountParams(LLVMValueRef Fn);
669void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
670LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
671LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000672LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
673LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
674LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
675LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
Devang Patel4c758ea2008-09-25 21:00:45 +0000676void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
677void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000678LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000679void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000680
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000681/* Operations on basic blocks */
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000682LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000683int LLVMValueIsBasicBlock(LLVMValueRef Val);
684LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000685LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000686unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
687void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000688LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
689LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
690LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
691LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000692LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000693
694LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
695 LLVMValueRef Fn,
696 const char *Name);
697LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
698 LLVMBasicBlockRef BB,
699 const char *Name);
700
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000701LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
702LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
703 const char *Name);
704void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
705
Gordon Henriksen265f7802008-03-19 01:11:35 +0000706/* Operations on instructions */
707LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000708LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
709LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
710LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
711LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000712
Gordon Henriksen1158c532007-12-29 20:45:00 +0000713/* Operations on call sites */
714void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
715unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
Devang Patel4c758ea2008-09-25 21:00:45 +0000716void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
717void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
718 LLVMAttribute);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000719void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
720 unsigned align);
Gordon Henriksen1158c532007-12-29 20:45:00 +0000721
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000722/* Operations on call instructions (only) */
723int LLVMIsTailCall(LLVMValueRef CallInst);
724void LLVMSetTailCall(LLVMValueRef CallInst, int IsTailCall);
725
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000726/* Operations on phi nodes */
727void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
728 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
729unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
730LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
731LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000732
733/*===-- Instruction builders ----------------------------------------------===*/
734
735/* An instruction builder represents a point within a basic block, and is the
736 * exclusive means of building instructions using the C interface.
737 */
738
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000739LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C);
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000740LLVMBuilderRef LLVMCreateBuilder(void);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000741void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
742 LLVMValueRef Instr);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000743void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
744void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000745LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000746void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
747void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
Erick Tryzelaar9813bea2009-08-16 02:20:57 +0000748void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
749 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000750void LLVMDisposeBuilder(LLVMBuilderRef Builder);
751
752/* Terminators */
753LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
754LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000755LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef, LLVMValueRef *RetVals,
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000756 unsigned N);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000757LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
758LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
759 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
760LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
761 LLVMBasicBlockRef Else, unsigned NumCases);
762LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
763 LLVMValueRef *Args, unsigned NumArgs,
764 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
765 const char *Name);
766LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
767LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
768
Gordon Henriksen097102c2008-01-01 05:50:53 +0000769/* Add a case to the switch instruction */
770void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
771 LLVMBasicBlockRef Dest);
772
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000773/* Arithmetic */
774LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
775 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000776LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
777 const char *Name);
778LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
779 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000780LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
781 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000782LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
783 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000784LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
785 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000786LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
787 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000788LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
789 const char *Name);
790LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
791 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000792LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
793 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000794LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
795 const char *Name);
796LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
797 const char *Name);
798LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
799 const char *Name);
800LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
801 const char *Name);
802LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
803 const char *Name);
804LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
805 const char *Name);
806LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
807 const char *Name);
808LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
809 const char *Name);
810LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
811 const char *Name);
812LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
813 const char *Name);
814LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Dan Gohmanf919bd62009-09-28 21:51:41 +0000815LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000816LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
817
818/* Memory */
819LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
820LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
821 LLVMValueRef Val, const char *Name);
822LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
823LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
824 LLVMValueRef Val, const char *Name);
825LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
826LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
827 const char *Name);
828LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
829LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
830 LLVMValueRef *Indices, unsigned NumIndices,
831 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000832LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
833 LLVMValueRef *Indices, unsigned NumIndices,
834 const char *Name);
835LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
836 unsigned Idx, const char *Name);
837LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
838 const char *Name);
839LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
840 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000841
842/* Casts */
843LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
844 LLVMTypeRef DestTy, const char *Name);
845LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
846 LLVMTypeRef DestTy, const char *Name);
847LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
848 LLVMTypeRef DestTy, const char *Name);
849LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
850 LLVMTypeRef DestTy, const char *Name);
851LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
852 LLVMTypeRef DestTy, const char *Name);
853LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
854 LLVMTypeRef DestTy, const char *Name);
855LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
856 LLVMTypeRef DestTy, const char *Name);
857LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
858 LLVMTypeRef DestTy, const char *Name);
859LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
860 LLVMTypeRef DestTy, const char *Name);
861LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
862 LLVMTypeRef DestTy, const char *Name);
863LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
864 LLVMTypeRef DestTy, const char *Name);
865LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
866 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000867LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
868 LLVMTypeRef DestTy, const char *Name);
869LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
870 LLVMTypeRef DestTy, const char *Name);
871LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
872 LLVMTypeRef DestTy, const char *Name);
873LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef, LLVMValueRef Val,
874 LLVMTypeRef DestTy, const char *Name);
875LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef, LLVMValueRef Val,
876 LLVMTypeRef DestTy, const char *Name);
877LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef, LLVMValueRef Val,
878 LLVMTypeRef DestTy, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000879
880/* Comparisons */
881LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
882 LLVMValueRef LHS, LLVMValueRef RHS,
883 const char *Name);
884LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
885 LLVMValueRef LHS, LLVMValueRef RHS,
886 const char *Name);
887
888/* Miscellaneous instructions */
889LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
890LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
891 LLVMValueRef *Args, unsigned NumArgs,
892 const char *Name);
893LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
894 LLVMValueRef Then, LLVMValueRef Else,
895 const char *Name);
896LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
897 const char *Name);
898LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
899 LLVMValueRef Index, const char *Name);
900LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
901 LLVMValueRef EltVal, LLVMValueRef Index,
902 const char *Name);
903LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
904 LLVMValueRef V2, LLVMValueRef Mask,
905 const char *Name);
Dan Gohmand5104a52008-11-03 22:55:43 +0000906LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
907 unsigned Index, const char *Name);
908LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
909 LLVMValueRef EltVal, unsigned Index,
910 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000911
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000912LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val,
913 const char *Name);
914LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef, LLVMValueRef Val,
915 const char *Name);
916LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef, LLVMValueRef LHS,
917 LLVMValueRef RHS, const char *Name);
918
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000919
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000920/*===-- Module providers --------------------------------------------------===*/
921
922/* Encapsulates the module M in a module provider, taking ownership of the
923 * module.
924 * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
925 */
926LLVMModuleProviderRef
927LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
928
929/* Destroys the module provider MP as well as the contained module.
930 * See the destructor llvm::ModuleProvider::~ModuleProvider.
931 */
932void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
933
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000934
935/*===-- Memory buffers ----------------------------------------------------===*/
936
937int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
938 LLVMMemoryBufferRef *OutMemBuf,
939 char **OutMessage);
940int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
941 char **OutMessage);
942void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
943
Gordon Henriksen878114b2008-03-16 04:20:44 +0000944
945/*===-- Pass Managers -----------------------------------------------------===*/
946
947/** Constructs a new whole-module pass pipeline. This type of pipeline is
948 suitable for link-time optimization and whole-module transformations.
949 See llvm::PassManager::PassManager. */
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000950LLVMPassManagerRef LLVMCreatePassManager(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +0000951
952/** Constructs a new function-by-function pass pipeline over the module
953 provider. It does not take ownership of the module provider. This type of
954 pipeline is suitable for code generation and JIT compilation tasks.
955 See llvm::FunctionPassManager::FunctionPassManager. */
956LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
957
958/** Initializes, executes on the provided module, and finalizes all of the
959 passes scheduled in the pass manager. Returns 1 if any of the passes
960 modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
961int LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
962
963/** Initializes all of the function passes scheduled in the function pass
964 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
965 See llvm::FunctionPassManager::doInitialization. */
966int LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
967
968/** Executes all of the function passes scheduled in the function pass manager
969 on the provided function. Returns 1 if any of the passes modified the
970 function, false otherwise.
971 See llvm::FunctionPassManager::run(Function&). */
972int LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
973
974/** Finalizes all of the function passes scheduled in in the function pass
975 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
976 See llvm::FunctionPassManager::doFinalization. */
977int LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
978
979/** Frees the memory of a pass pipeline. For function pipelines, does not free
980 the module provider.
981 See llvm::PassManagerBase::~PassManagerBase. */
982void LLVMDisposePassManager(LLVMPassManagerRef PM);
983
984
Gordon Henriksen76a03742007-09-18 03:18:57 +0000985#ifdef __cplusplus
986}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000987
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000988namespace llvm {
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000989 class ModuleProvider;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000990 class MemoryBuffer;
Gordon Henriksen96571492008-03-16 15:55:43 +0000991 class PassManagerBase;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000992
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000993 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
994 inline ty *unwrap(ref P) { \
995 return reinterpret_cast<ty*>(P); \
996 } \
997 \
998 inline ref wrap(const ty *P) { \
999 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
1000 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001001
Gordon Henriksen878114b2008-03-16 04:20:44 +00001002 #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref) \
1003 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1004 \
1005 template<typename T> \
1006 inline T *unwrap(ref P) { \
1007 return cast<T>(unwrap(P)); \
1008 }
1009
1010 #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref) \
1011 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1012 \
1013 template<typename T> \
1014 inline T *unwrap(ref P) { \
1015 T *Q = dynamic_cast<T*>(unwrap(P)); \
1016 assert(Q && "Invalid cast!"); \
1017 return Q; \
1018 }
1019
1020 DEFINE_ISA_CONVERSION_FUNCTIONS (Type, LLVMTypeRef )
1021 DEFINE_ISA_CONVERSION_FUNCTIONS (Value, LLVMValueRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001022 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
1023 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
Eric Christopher59278832008-08-08 19:39:37 +00001024 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001025 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
1026 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider, LLVMModuleProviderRef)
1027 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Owen Anderson6773d382009-07-01 16:58:40 +00001028 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMContext, LLVMContextRef )
Chris Lattner40cf28d2009-10-12 04:01:02 +00001029 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Use, LLVMUseIteratorRef )
Gordon Henriksen878114b2008-03-16 04:20:44 +00001030 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef )
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001031
Gordon Henriksen878114b2008-03-16 04:20:44 +00001032 #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS
1033 #undef DEFINE_ISA_CONVERSION_FUNCTIONS
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001034 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001035
1036 /* Specialized opaque context conversions.
1037 */
1038 inline LLVMContext **unwrap(LLVMContextRef* Tys) {
1039 return reinterpret_cast<LLVMContext**>(Tys);
1040 }
1041
1042 inline LLVMContextRef *wrap(const LLVMContext **Tys) {
1043 return reinterpret_cast<LLVMContextRef*>(const_cast<LLVMContext**>(Tys));
1044 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001045
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001046 /* Specialized opaque type conversions.
1047 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001048 inline Type **unwrap(LLVMTypeRef* Tys) {
1049 return reinterpret_cast<Type**>(Tys);
1050 }
1051
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001052 inline LLVMTypeRef *wrap(const Type **Tys) {
1053 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
1054 }
1055
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001056 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001057 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001058 inline Value **unwrap(LLVMValueRef *Vals) {
1059 return reinterpret_cast<Value**>(Vals);
1060 }
1061
1062 template<typename T>
1063 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
1064 #if DEBUG
Chris Lattnerb7971152009-07-10 18:28:19 +00001065 for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I)
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001066 cast<T>(*I);
1067 #endif
1068 return reinterpret_cast<T**>(Vals);
1069 }
1070
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001071 inline LLVMValueRef *wrap(const Value **Vals) {
1072 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
1073 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001074}
1075
1076#endif /* !defined(__cplusplus) */
1077
1078#endif /* !defined(LLVM_C_CORE_H) */