blob: d57c250fcb2ea64f6045c4595db1cebf7ed619e2 [file] [log] [blame]
Gordon Henriksen76a03742007-09-18 03:18:57 +00001/*===-- llvm-c/Core.h - Core Library C Interface ------------------*- C -*-===*\
2|* *|
3|* The LLVM Compiler Infrastructure *|
4|* *|
Chris Lattnere9cc7422007-12-29 19:59:42 +00005|* This file is distributed under the University of Illinois Open Source *|
6|* License. See LICENSE.TXT for details. *|
Gordon Henriksen76a03742007-09-18 03:18:57 +00007|* *|
8|*===----------------------------------------------------------------------===*|
9|* *|
10|* This header declares the C interface to libLLVMCore.a, which implements *|
11|* the LLVM intermediate representation. *|
12|* *|
13|* LLVM uses a polymorphic type hierarchy which C cannot represent, therefore *|
14|* parameters must be passed as base types. Despite the declared types, most *|
15|* of the functions provided operate only on branches of the type hierarchy. *|
16|* The declared parameter names are descriptive and specify which type is *|
17|* required. Additionally, each type hierarchy is documented along with the *|
18|* functions that operate upon it. For more detail, refer to LLVM's C++ code. *|
19|* If in doubt, refer to Core.cpp, which performs paramter downcasts in the *|
20|* form unwrap<RequiredType>(Param). *|
21|* *|
22|* Many exotic languages can interoperate with C code but have a harder time *|
23|* with C++ due to name mangling. So in addition to C, this interface enables *|
24|* tools written in such languages. *|
25|* *|
Gordon Henriksen7330acd2007-10-05 23:59:36 +000026|* When included into a C++ source file, also declares 'wrap' and 'unwrap' *|
27|* helpers to perform opaque reference<-->pointer conversions. These helpers *|
28|* are shorter and more tightly typed than writing the casts by hand when *|
29|* authoring bindings. In assert builds, they will do runtime type checking. *|
30|* *|
Gordon Henriksen76a03742007-09-18 03:18:57 +000031\*===----------------------------------------------------------------------===*/
32
33#ifndef LLVM_C_CORE_H
34#define LLVM_C_CORE_H
35
Chandler Carruth56869f22009-10-26 01:35:46 +000036#include "llvm/System/DataTypes.h"
Erick Tryzelaardd991352009-08-16 23:36:46 +000037
Gordon Henriksen76a03742007-09-18 03:18:57 +000038#ifdef __cplusplus
Gordon Henriksen7330acd2007-10-05 23:59:36 +000039
40/* Need these includes to support the LLVM 'cast' template for the C++ 'wrap'
41 and 'unwrap' conversion functions. */
42#include "llvm/Module.h"
Duncan Sandsa07136e2008-04-13 06:22:09 +000043#include "llvm/Support/IRBuilder.h"
Gordon Henriksen7330acd2007-10-05 23:59:36 +000044
Gordon Henriksen76a03742007-09-18 03:18:57 +000045extern "C" {
46#endif
47
48
Chris Lattner25963c62010-01-09 22:27:07 +000049typedef int LLVMBool;
50
Gordon Henriksen76a03742007-09-18 03:18:57 +000051/* Opaque types. */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000052
53/**
Owen Anderson6773d382009-07-01 16:58:40 +000054 * The top-level container for all LLVM global data. See the LLVMContext class.
55 */
Erick Tryzelaar262332f2009-08-14 00:01:31 +000056typedef struct LLVMOpaqueContext *LLVMContextRef;
Owen Anderson6773d382009-07-01 16:58:40 +000057
58/**
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000059 * The top-level container for all other LLVM Intermediate Representation (IR)
60 * objects. See the llvm::Module class.
61 */
Gordon Henriksen76a03742007-09-18 03:18:57 +000062typedef struct LLVMOpaqueModule *LLVMModuleRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000063
64/**
Gordon Henriksena49d4352008-03-07 19:13:06 +000065 * Each value in the LLVM IR has a type, an LLVMTypeRef. See the llvm::Type
66 * class.
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000067 */
Gordon Henriksen76a03742007-09-18 03:18:57 +000068typedef struct LLVMOpaqueType *LLVMTypeRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000069
70/**
Gordon Henriksena49d4352008-03-07 19:13:06 +000071 * When building recursive types using LLVMRefineType, LLVMTypeRef values may
72 * become invalid; use LLVMTypeHandleRef to resolve this problem. See the
73 * llvm::AbstractTypeHolder class.
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000074 */
Gordon Henriksenffb48762007-10-07 00:13:35 +000075typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000076
Gordon Henriksen76a03742007-09-18 03:18:57 +000077typedef struct LLVMOpaqueValue *LLVMValueRef;
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000078typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
79typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000080
81/* Used to provide a module to JIT or interpreter.
82 * See the llvm::ModuleProvider class.
83 */
Gordon Henriksen0a68fe22007-12-12 01:04:30 +000084typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef;
Gordon Henriksen76a03742007-09-18 03:18:57 +000085
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000086/* Used to provide a module to JIT or interpreter.
87 * See the llvm::MemoryBuffer class.
88 */
89typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef;
90
Gordon Henriksen878114b2008-03-16 04:20:44 +000091/** See the llvm::PassManagerBase class. */
92typedef struct LLVMOpaquePassManager *LLVMPassManagerRef;
93
Chris Lattner40cf28d2009-10-12 04:01:02 +000094/**
95 * Used to iterate through the uses of a Value, allowing access to all Values
96 * that use this Value. See the llvm::Use and llvm::value_use_iterator classes.
97 */
98typedef struct LLVMOpaqueUseIterator *LLVMUseIteratorRef;
99
Gordon Henriksen76a03742007-09-18 03:18:57 +0000100typedef enum {
Devang Patel4c758ea2008-09-25 21:00:45 +0000101 LLVMZExtAttribute = 1<<0,
102 LLVMSExtAttribute = 1<<1,
103 LLVMNoReturnAttribute = 1<<2,
104 LLVMInRegAttribute = 1<<3,
105 LLVMStructRetAttribute = 1<<4,
106 LLVMNoUnwindAttribute = 1<<5,
107 LLVMNoAliasAttribute = 1<<6,
108 LLVMByValAttribute = 1<<7,
109 LLVMNestAttribute = 1<<8,
110 LLVMReadNoneAttribute = 1<<9,
Anton Korobeynikovc8ce7b082009-07-17 18:07:26 +0000111 LLVMReadOnlyAttribute = 1<<10,
Anton Korobeynikov9750be92009-07-17 18:57:16 +0000112 LLVMNoInlineAttribute = 1<<11,
113 LLVMAlwaysInlineAttribute = 1<<12,
114 LLVMOptimizeForSizeAttribute = 1<<13,
115 LLVMStackProtectAttribute = 1<<14,
116 LLVMStackProtectReqAttribute = 1<<15,
117 LLVMNoCaptureAttribute = 1<<21,
118 LLVMNoRedZoneAttribute = 1<<22,
119 LLVMNoImplicitFloatAttribute = 1<<23,
Eric Christopher8444d752010-01-15 21:36:30 +0000120 LLVMNakedAttribute = 1<<24
Devang Patel4c758ea2008-09-25 21:00:45 +0000121} LLVMAttribute;
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000122
123typedef enum {
Chris Lattner40cf28d2009-10-12 04:01:02 +0000124 LLVMRet = 1,
125 LLVMBr = 2,
126 LLVMSwitch = 3,
127 LLVMInvoke = 4,
128 LLVMUnwind = 5,
129 LLVMUnreachable = 6,
130 LLVMAdd = 7,
131 LLVMFAdd = 8,
132 LLVMSub = 9,
133 LLVMFSub = 10,
134 LLVMMul = 11,
135 LLVMFMul = 12,
136 LLVMUDiv = 13,
137 LLVMSDiv = 14,
138 LLVMFDiv = 15,
139 LLVMURem = 16,
140 LLVMSRem = 17,
141 LLVMFRem = 18,
142 LLVMShl = 19,
143 LLVMLShr = 20,
144 LLVMAShr = 21,
145 LLVMAnd = 22,
146 LLVMOr = 23,
147 LLVMXor = 24,
148 LLVMMalloc = 25,
149 LLVMFree = 26,
150 LLVMAlloca = 27,
151 LLVMLoad = 28,
152 LLVMStore = 29,
153 LLVMGetElementPtr = 30,
154 LLVMTrunk = 31,
155 LLVMZExt = 32,
156 LLVMSExt = 33,
157 LLVMFPToUI = 34,
158 LLVMFPToSI = 35,
159 LLVMUIToFP = 36,
160 LLVMSIToFP = 37,
161 LLVMFPTrunc = 38,
162 LLVMFPExt = 39,
163 LLVMPtrToInt = 40,
164 LLVMIntToPtr = 41,
165 LLVMBitCast = 42,
166 LLVMICmp = 43,
167 LLVMFCmp = 44,
168 LLVMPHI = 45,
169 LLVMCall = 46,
170 LLVMSelect = 47,
171 LLVMVAArg = 50,
172 LLVMExtractElement = 51,
173 LLVMInsertElement = 52,
174 LLVMShuffleVector = 53,
175 LLVMExtractValue = 54,
176 LLVMInsertValue = 55
177} LLVMOpcode;
178
179typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000180 LLVMVoidTypeKind, /**< type with no size */
181 LLVMFloatTypeKind, /**< 32 bit floating point type */
182 LLVMDoubleTypeKind, /**< 64 bit floating point type */
183 LLVMX86_FP80TypeKind, /**< 80 bit floating point type (X87) */
184 LLVMFP128TypeKind, /**< 128 bit floating point type (112-bit mantissa)*/
185 LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */
186 LLVMLabelTypeKind, /**< Labels */
187 LLVMIntegerTypeKind, /**< Arbitrary bit width integers */
188 LLVMFunctionTypeKind, /**< Functions */
189 LLVMStructTypeKind, /**< Structures */
190 LLVMArrayTypeKind, /**< Arrays */
191 LLVMPointerTypeKind, /**< Pointers */
192 LLVMOpaqueTypeKind, /**< Opaque: type with unknown structure */
Chris Lattnerdac44ec2009-07-15 22:00:31 +0000193 LLVMVectorTypeKind, /**< SIMD 'packed' format, or other vector type */
194 LLVMMetadataTypeKind /**< Metadata */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000195} LLVMTypeKind;
196
197typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000198 LLVMExternalLinkage, /**< Externally visible function */
Chris Lattner2dba0f02009-04-13 06:25:37 +0000199 LLVMAvailableExternallyLinkage,
Duncan Sands12da8ce2009-03-07 15:45:40 +0000200 LLVMLinkOnceAnyLinkage, /**< Keep one copy of function when linking (inline)*/
201 LLVMLinkOnceODRLinkage, /**< Same, but only replaced by something
202 equivalent. */
203 LLVMWeakAnyLinkage, /**< Keep one copy of function when linking (weak) */
204 LLVMWeakODRLinkage, /**< Same, but only replaced by something
205 equivalent. */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000206 LLVMAppendingLinkage, /**< Special purpose, only applies to global arrays */
207 LLVMInternalLinkage, /**< Rename collisions when linking (static
208 functions) */
Duncan Sands12da8ce2009-03-07 15:45:40 +0000209 LLVMPrivateLinkage, /**< Like Internal, but omit from symbol table */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000210 LLVMDLLImportLinkage, /**< Function to be imported from DLL */
211 LLVMDLLExportLinkage, /**< Function to be accessible from DLL */
Duncan Sandse2881052009-03-11 08:08:06 +0000212 LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
Duncan Sands12da8ce2009-03-07 15:45:40 +0000213 LLVMGhostLinkage, /**< Stand-in functions for streaming fns from
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000214 bitcode */
Bill Wendling002b1672009-07-20 18:22:52 +0000215 LLVMCommonLinkage, /**< Tentative definitions */
216 LLVMLinkerPrivateLinkage /**< Like Private, but linker removes. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000217} LLVMLinkage;
218
219typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000220 LLVMDefaultVisibility, /**< The GV is visible */
221 LLVMHiddenVisibility, /**< The GV is hidden */
222 LLVMProtectedVisibility /**< The GV is protected */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000223} LLVMVisibility;
224
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000225typedef enum {
226 LLVMCCallConv = 0,
227 LLVMFastCallConv = 8,
228 LLVMColdCallConv = 9,
229 LLVMX86StdcallCallConv = 64,
230 LLVMX86FastcallCallConv = 65
231} LLVMCallConv;
232
233typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000234 LLVMIntEQ = 32, /**< equal */
235 LLVMIntNE, /**< not equal */
236 LLVMIntUGT, /**< unsigned greater than */
237 LLVMIntUGE, /**< unsigned greater or equal */
238 LLVMIntULT, /**< unsigned less than */
239 LLVMIntULE, /**< unsigned less or equal */
240 LLVMIntSGT, /**< signed greater than */
241 LLVMIntSGE, /**< signed greater or equal */
242 LLVMIntSLT, /**< signed less than */
243 LLVMIntSLE /**< signed less or equal */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000244} LLVMIntPredicate;
245
246typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000247 LLVMRealPredicateFalse, /**< Always false (always folded) */
248 LLVMRealOEQ, /**< True if ordered and equal */
249 LLVMRealOGT, /**< True if ordered and greater than */
250 LLVMRealOGE, /**< True if ordered and greater than or equal */
251 LLVMRealOLT, /**< True if ordered and less than */
252 LLVMRealOLE, /**< True if ordered and less than or equal */
253 LLVMRealONE, /**< True if ordered and operands are unequal */
254 LLVMRealORD, /**< True if ordered (no nans) */
255 LLVMRealUNO, /**< True if unordered: isnan(X) | isnan(Y) */
256 LLVMRealUEQ, /**< True if unordered or equal */
257 LLVMRealUGT, /**< True if unordered or greater than */
258 LLVMRealUGE, /**< True if unordered, greater than, or equal */
259 LLVMRealULT, /**< True if unordered or less than */
260 LLVMRealULE, /**< True if unordered, less than, or equal */
261 LLVMRealUNE, /**< True if unordered or not equal */
262 LLVMRealPredicateTrue /**< Always true (always folded) */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000263} LLVMRealPredicate;
264
Gordon Henriksen76a03742007-09-18 03:18:57 +0000265
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000266/*===-- Error handling ----------------------------------------------------===*/
267
268void LLVMDisposeMessage(char *Message);
269
270
Gordon Henriksen76a03742007-09-18 03:18:57 +0000271/*===-- Modules -----------------------------------------------------------===*/
272
Owen Anderson6773d382009-07-01 16:58:40 +0000273/* Create and destroy contexts. */
Erick Tryzelaarf34cb0c2009-08-30 23:38:06 +0000274LLVMContextRef LLVMContextCreate(void);
275LLVMContextRef LLVMGetGlobalContext(void);
Owen Anderson6773d382009-07-01 16:58:40 +0000276void LLVMContextDispose(LLVMContextRef C);
277
Gordon Henriksen76a03742007-09-18 03:18:57 +0000278/* Create and destroy modules. */
Gordon Henriksena49d4352008-03-07 19:13:06 +0000279/** See llvm::Module::Module. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000280LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
Owen Anderson31d44e42009-07-02 07:17:57 +0000281LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
282 LLVMContextRef C);
Gordon Henriksena49d4352008-03-07 19:13:06 +0000283
284/** See llvm::Module::~Module. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000285void LLVMDisposeModule(LLVMModuleRef M);
286
Gordon Henriksena49d4352008-03-07 19:13:06 +0000287/** Data layout. See Module::getDataLayout. */
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000288const char *LLVMGetDataLayout(LLVMModuleRef M);
289void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple);
290
Gordon Henriksena49d4352008-03-07 19:13:06 +0000291/** Target triple. See Module::getTargetTriple. */
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000292const char *LLVMGetTarget(LLVMModuleRef M);
293void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
294
Gordon Henriksena49d4352008-03-07 19:13:06 +0000295/** See Module::addTypeName. */
Chris Lattner25963c62010-01-09 22:27:07 +0000296LLVMBool LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000297void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
Chris Lattner7f318242009-07-06 17:29:59 +0000298LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000299
Gordon Henriksen6c6075e2008-03-14 23:58:56 +0000300/** See Module::dump. */
301void LLVMDumpModule(LLVMModuleRef M);
302
Gordon Henriksen76a03742007-09-18 03:18:57 +0000303
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000304/*===-- Types -------------------------------------------------------------===*/
Gordon Henriksen76a03742007-09-18 03:18:57 +0000305
306/* LLVM types conform to the following hierarchy:
307 *
308 * types:
309 * integer type
310 * real type
311 * function type
312 * sequence types:
313 * array type
314 * pointer type
315 * vector type
316 * void type
317 * label type
318 * opaque type
319 */
320
Gordon Henriksena49d4352008-03-07 19:13:06 +0000321/** See llvm::LLVMTypeKind::getTypeID. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000322LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
Gordon Henriksena49d4352008-03-07 19:13:06 +0000323
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000324/** See llvm::LLVMType::getContext. */
325LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty);
326
Gordon Henriksen76a03742007-09-18 03:18:57 +0000327/* Operations on integer types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000328LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C);
329LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C);
330LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C);
331LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C);
332LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C);
333LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits);
334
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000335LLVMTypeRef LLVMInt1Type(void);
336LLVMTypeRef LLVMInt8Type(void);
337LLVMTypeRef LLVMInt16Type(void);
338LLVMTypeRef LLVMInt32Type(void);
339LLVMTypeRef LLVMInt64Type(void);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000340LLVMTypeRef LLVMIntType(unsigned NumBits);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000341unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000342
343/* Operations on real types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000344LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C);
345LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C);
346LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C);
347LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C);
348LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C);
349
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000350LLVMTypeRef LLVMFloatType(void);
351LLVMTypeRef LLVMDoubleType(void);
352LLVMTypeRef LLVMX86FP80Type(void);
353LLVMTypeRef LLVMFP128Type(void);
354LLVMTypeRef LLVMPPCFP128Type(void);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000355
356/* Operations on function types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000357LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
358 LLVMTypeRef *ParamTypes, unsigned ParamCount,
Chris Lattner25963c62010-01-09 22:27:07 +0000359 LLVMBool IsVarArg);
360LLVMBool LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000361LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
362unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
363void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000364
365/* Operations on struct types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000366LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
Chris Lattner25963c62010-01-09 22:27:07 +0000367 unsigned ElementCount, LLVMBool Packed);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000368LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
Chris Lattner25963c62010-01-09 22:27:07 +0000369 LLVMBool Packed);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000370unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000371void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
Chris Lattner25963c62010-01-09 22:27:07 +0000372LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000373
374/* Operations on array, pointer, and vector types (sequence types) */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000375LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000376LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000377LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000378
379LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
380unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000381unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000382unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
383
384/* Operations on other types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000385LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C);
386LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C);
387LLVMTypeRef LLVMOpaqueTypeInContext(LLVMContextRef C);
388
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000389LLVMTypeRef LLVMVoidType(void);
390LLVMTypeRef LLVMLabelType(void);
391LLVMTypeRef LLVMOpaqueType(void);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000392
Gordon Henriksenffb48762007-10-07 00:13:35 +0000393/* Operations on type handles */
394LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
395void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
396LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
397void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
398
Gordon Henriksen76a03742007-09-18 03:18:57 +0000399
400/*===-- Values ------------------------------------------------------------===*/
401
402/* The bulk of LLVM's object model consists of values, which comprise a very
403 * rich type hierarchy.
Gordon Henriksen76a03742007-09-18 03:18:57 +0000404 */
405
Gordon Henriksen29e38942008-12-19 18:39:45 +0000406#define LLVM_FOR_EACH_VALUE_SUBCLASS(macro) \
407 macro(Argument) \
408 macro(BasicBlock) \
409 macro(InlineAsm) \
410 macro(User) \
411 macro(Constant) \
412 macro(ConstantAggregateZero) \
413 macro(ConstantArray) \
414 macro(ConstantExpr) \
415 macro(ConstantFP) \
416 macro(ConstantInt) \
417 macro(ConstantPointerNull) \
418 macro(ConstantStruct) \
419 macro(ConstantVector) \
420 macro(GlobalValue) \
421 macro(Function) \
422 macro(GlobalAlias) \
423 macro(GlobalVariable) \
424 macro(UndefValue) \
425 macro(Instruction) \
426 macro(BinaryOperator) \
427 macro(CallInst) \
428 macro(IntrinsicInst) \
429 macro(DbgInfoIntrinsic) \
430 macro(DbgDeclareInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000431 macro(EHSelectorInst) \
432 macro(MemIntrinsic) \
433 macro(MemCpyInst) \
434 macro(MemMoveInst) \
435 macro(MemSetInst) \
436 macro(CmpInst) \
437 macro(FCmpInst) \
438 macro(ICmpInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000439 macro(ExtractElementInst) \
440 macro(GetElementPtrInst) \
441 macro(InsertElementInst) \
442 macro(InsertValueInst) \
443 macro(PHINode) \
444 macro(SelectInst) \
445 macro(ShuffleVectorInst) \
446 macro(StoreInst) \
447 macro(TerminatorInst) \
448 macro(BranchInst) \
449 macro(InvokeInst) \
450 macro(ReturnInst) \
451 macro(SwitchInst) \
452 macro(UnreachableInst) \
453 macro(UnwindInst) \
454 macro(UnaryInstruction) \
Victor Hernandez8acf2952009-10-23 21:09:37 +0000455 macro(AllocaInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000456 macro(CastInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000457 macro(BitCastInst) \
458 macro(FPExtInst) \
459 macro(FPToSIInst) \
460 macro(FPToUIInst) \
461 macro(FPTruncInst) \
462 macro(IntToPtrInst) \
463 macro(PtrToIntInst) \
464 macro(SExtInst) \
465 macro(SIToFPInst) \
466 macro(TruncInst) \
467 macro(UIToFPInst) \
468 macro(ZExtInst) \
469 macro(ExtractValueInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000470 macro(LoadInst) \
471 macro(VAArgInst)
Gordon Henriksen29e38942008-12-19 18:39:45 +0000472
Gordon Henriksen76a03742007-09-18 03:18:57 +0000473/* Operations on all values */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000474LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000475const char *LLVMGetValueName(LLVMValueRef Val);
476void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000477void LLVMDumpValue(LLVMValueRef Val);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000478void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000479
Gordon Henriksen29e38942008-12-19 18:39:45 +0000480/* Conversion functions. Return the input value if it is an instance of the
481 specified class, otherwise NULL. See llvm::dyn_cast_or_null<>. */
482#define LLVM_DECLARE_VALUE_CAST(name) \
483 LLVMValueRef LLVMIsA##name(LLVMValueRef Val);
484LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DECLARE_VALUE_CAST)
485
Chris Lattner40cf28d2009-10-12 04:01:02 +0000486/* Operations on Uses */
487LLVMUseIteratorRef LLVMGetFirstUse(LLVMValueRef Val);
488LLVMUseIteratorRef LLVMGetNextUse(LLVMUseIteratorRef U);
489LLVMValueRef LLVMGetUser(LLVMUseIteratorRef U);
490LLVMValueRef LLVMGetUsedValue(LLVMUseIteratorRef U);
491
492/* Operations on Users */
493LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index);
494
Gordon Henriksen76a03742007-09-18 03:18:57 +0000495/* Operations on constants of any type */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000496LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
497LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000498LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Chris Lattner25963c62010-01-09 22:27:07 +0000499LLVMBool LLVMIsConstant(LLVMValueRef Val);
500LLVMBool LLVMIsNull(LLVMValueRef Val);
501LLVMBool LLVMIsUndef(LLVMValueRef Val);
Chris Lattner7f318242009-07-06 17:29:59 +0000502LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000503
504/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000505LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
Chris Lattner25963c62010-01-09 22:27:07 +0000506 LLVMBool SignExtend);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000507LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text,
508 uint8_t Radix);
509LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text,
510 unsigned SLen, uint8_t Radix);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000511LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen931e1212008-02-02 01:07:50 +0000512LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000513LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text,
514 unsigned SLen);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000515unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal);
516long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000517
Gordon Henriksen76a03742007-09-18 03:18:57 +0000518
519/* Operations on composite constants */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000520LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
Chris Lattner25963c62010-01-09 22:27:07 +0000521 unsigned Length, LLVMBool DontNullTerminate);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000522LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
523 LLVMValueRef *ConstantVals,
Chris Lattner25963c62010-01-09 22:27:07 +0000524 unsigned Count, LLVMBool Packed);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000525
Gordon Henriksen1046c732007-10-06 15:11:06 +0000526LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
Chris Lattner25963c62010-01-09 22:27:07 +0000527 LLVMBool DontNullTerminate);
Gordon Henriksen2ad5aef2008-04-25 03:21:19 +0000528LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
Gordon Henriksen1046c732007-10-06 15:11:06 +0000529 LLVMValueRef *ConstantVals, unsigned Length);
530LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Chris Lattner25963c62010-01-09 22:27:07 +0000531 LLVMBool Packed);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000532LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000533
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000534/* Constant expressions */
Chris Lattner40cf28d2009-10-12 04:01:02 +0000535LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000536LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000537LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
538LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000539LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000540LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
541LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000542LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000543LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000544LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000545LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000546LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000547LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000548LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
549LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000550LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000551LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
552LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
553LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
554LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
555LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
556LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
557LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
558LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
559 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
560LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
561 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
562LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
563LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
564LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
565LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
566 LLVMValueRef *ConstantIndices, unsigned NumIndices);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000567LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
568 LLVMValueRef *ConstantIndices,
569 unsigned NumIndices);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000570LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
571LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
572LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
573LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
574LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
575LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
576LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
577LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
578LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
579LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
580LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
581LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000582LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
583 LLVMTypeRef ToType);
584LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
585 LLVMTypeRef ToType);
586LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
587 LLVMTypeRef ToType);
588LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
589 LLVMTypeRef ToType);
590LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
Chris Lattner25963c62010-01-09 22:27:07 +0000591 LLVMBool isSigned);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000592LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000593LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
594 LLVMValueRef ConstantIfTrue,
595 LLVMValueRef ConstantIfFalse);
596LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
597 LLVMValueRef IndexConstant);
598LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
599 LLVMValueRef ElementValueConstant,
600 LLVMValueRef IndexConstant);
601LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
602 LLVMValueRef VectorBConstant,
603 LLVMValueRef MaskConstant);
Dan Gohmand5104a52008-11-03 22:55:43 +0000604LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
605 unsigned NumIdx);
606LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
607 LLVMValueRef ElementValueConstant,
608 unsigned *IdxList, unsigned NumIdx);
Chris Lattner25963c62010-01-09 22:27:07 +0000609LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
Chris Lattner3d1f5522008-12-17 21:39:50 +0000610 const char *AsmString, const char *Constraints,
Chris Lattner25963c62010-01-09 22:27:07 +0000611 LLVMBool HasSideEffects, LLVMBool IsAlignStack);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000612
Gordon Henriksen76a03742007-09-18 03:18:57 +0000613/* Operations on global variables, functions, and aliases (globals) */
Gordon Henriksen265f7802008-03-19 01:11:35 +0000614LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
Chris Lattner25963c62010-01-09 22:27:07 +0000615LLVMBool LLVMIsDeclaration(LLVMValueRef Global);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000616LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
617void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
618const char *LLVMGetSection(LLVMValueRef Global);
619void LLVMSetSection(LLVMValueRef Global, const char *Section);
620LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
621void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
622unsigned LLVMGetAlignment(LLVMValueRef Global);
623void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
624
625/* Operations on global variables */
626LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000627LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000628LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
629LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
630LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
631LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000632void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000633LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
634void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
Chris Lattner25963c62010-01-09 22:27:07 +0000635LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar);
636void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal);
637LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
638void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000639
Chris Lattner3d1f5522008-12-17 21:39:50 +0000640/* Operations on aliases */
641LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
642 const char *Name);
643
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000644/* Operations on functions */
645LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
646 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000647LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000648LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
649LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
650LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
651LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000652void LLVMDeleteFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000653unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
654unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
655void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksend930f912008-08-17 18:44:35 +0000656const char *LLVMGetGC(LLVMValueRef Fn);
657void LLVMSetGC(LLVMValueRef Fn, const char *Name);
Duncan Sands7374a012009-05-06 12:21:17 +0000658void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000659LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn);
Duncan Sands7374a012009-05-06 12:21:17 +0000660void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000661
Gordon Henriksen265f7802008-03-19 01:11:35 +0000662/* Operations on parameters */
663unsigned LLVMCountParams(LLVMValueRef Fn);
664void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
665LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
666LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000667LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
668LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
669LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
670LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
Devang Patel4c758ea2008-09-25 21:00:45 +0000671void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
672void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000673LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000674void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000675
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000676/* Operations on basic blocks */
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000677LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
Chris Lattner25963c62010-01-09 22:27:07 +0000678LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000679LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000680LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000681unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
682void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000683LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
684LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
685LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
686LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000687LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000688
689LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
690 LLVMValueRef Fn,
691 const char *Name);
692LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
693 LLVMBasicBlockRef BB,
694 const char *Name);
695
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000696LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
697LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
698 const char *Name);
699void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
700
Gordon Henriksen265f7802008-03-19 01:11:35 +0000701/* Operations on instructions */
702LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000703LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
704LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
705LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
706LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000707
Gordon Henriksen1158c532007-12-29 20:45:00 +0000708/* Operations on call sites */
709void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
710unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
Devang Patel4c758ea2008-09-25 21:00:45 +0000711void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
712void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
713 LLVMAttribute);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000714void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
715 unsigned align);
Gordon Henriksen1158c532007-12-29 20:45:00 +0000716
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000717/* Operations on call instructions (only) */
Chris Lattner25963c62010-01-09 22:27:07 +0000718LLVMBool LLVMIsTailCall(LLVMValueRef CallInst);
719void LLVMSetTailCall(LLVMValueRef CallInst, LLVMBool IsTailCall);
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000720
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000721/* Operations on phi nodes */
722void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
723 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
724unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
725LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
726LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000727
728/*===-- Instruction builders ----------------------------------------------===*/
729
730/* An instruction builder represents a point within a basic block, and is the
731 * exclusive means of building instructions using the C interface.
732 */
733
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000734LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C);
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000735LLVMBuilderRef LLVMCreateBuilder(void);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000736void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
737 LLVMValueRef Instr);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000738void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
739void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000740LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000741void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
742void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
Erick Tryzelaar9813bea2009-08-16 02:20:57 +0000743void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
744 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000745void LLVMDisposeBuilder(LLVMBuilderRef Builder);
746
747/* Terminators */
748LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
749LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000750LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef, LLVMValueRef *RetVals,
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000751 unsigned N);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000752LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
753LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
754 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
755LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
756 LLVMBasicBlockRef Else, unsigned NumCases);
757LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
758 LLVMValueRef *Args, unsigned NumArgs,
759 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
760 const char *Name);
761LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
762LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
763
Gordon Henriksen097102c2008-01-01 05:50:53 +0000764/* Add a case to the switch instruction */
765void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
766 LLVMBasicBlockRef Dest);
767
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000768/* Arithmetic */
769LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
770 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000771LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
772 const char *Name);
773LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
774 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000775LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
776 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000777LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
778 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000779LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
780 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000781LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
782 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000783LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
784 const char *Name);
785LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
786 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000787LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
788 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000789LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
790 const char *Name);
791LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
792 const char *Name);
793LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
794 const char *Name);
795LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
796 const char *Name);
797LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
798 const char *Name);
799LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
800 const char *Name);
801LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
802 const char *Name);
803LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
804 const char *Name);
805LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
806 const char *Name);
807LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
808 const char *Name);
809LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Dan Gohmanf919bd62009-09-28 21:51:41 +0000810LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000811LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
812
813/* Memory */
814LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
815LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
816 LLVMValueRef Val, const char *Name);
817LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
818LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
819 LLVMValueRef Val, const char *Name);
820LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
821LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
822 const char *Name);
823LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
824LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
825 LLVMValueRef *Indices, unsigned NumIndices,
826 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000827LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
828 LLVMValueRef *Indices, unsigned NumIndices,
829 const char *Name);
830LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
831 unsigned Idx, const char *Name);
832LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
833 const char *Name);
834LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
835 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000836
837/* Casts */
838LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
839 LLVMTypeRef DestTy, const char *Name);
840LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
841 LLVMTypeRef DestTy, const char *Name);
842LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
843 LLVMTypeRef DestTy, const char *Name);
844LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
845 LLVMTypeRef DestTy, const char *Name);
846LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
847 LLVMTypeRef DestTy, const char *Name);
848LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
849 LLVMTypeRef DestTy, const char *Name);
850LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
851 LLVMTypeRef DestTy, const char *Name);
852LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
853 LLVMTypeRef DestTy, const char *Name);
854LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
855 LLVMTypeRef DestTy, const char *Name);
856LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
857 LLVMTypeRef DestTy, const char *Name);
858LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
859 LLVMTypeRef DestTy, const char *Name);
860LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
861 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000862LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
863 LLVMTypeRef DestTy, const char *Name);
864LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
865 LLVMTypeRef DestTy, const char *Name);
866LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
867 LLVMTypeRef DestTy, const char *Name);
868LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef, LLVMValueRef Val,
869 LLVMTypeRef DestTy, const char *Name);
Duncan Sands9d786d72009-11-23 10:49:03 +0000870LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef, LLVMValueRef Val, /*Signed cast!*/
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000871 LLVMTypeRef DestTy, const char *Name);
872LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef, LLVMValueRef Val,
873 LLVMTypeRef DestTy, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000874
875/* Comparisons */
876LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
877 LLVMValueRef LHS, LLVMValueRef RHS,
878 const char *Name);
879LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
880 LLVMValueRef LHS, LLVMValueRef RHS,
881 const char *Name);
882
883/* Miscellaneous instructions */
884LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
885LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
886 LLVMValueRef *Args, unsigned NumArgs,
887 const char *Name);
888LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
889 LLVMValueRef Then, LLVMValueRef Else,
890 const char *Name);
891LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
892 const char *Name);
893LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
894 LLVMValueRef Index, const char *Name);
895LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
896 LLVMValueRef EltVal, LLVMValueRef Index,
897 const char *Name);
898LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
899 LLVMValueRef V2, LLVMValueRef Mask,
900 const char *Name);
Dan Gohmand5104a52008-11-03 22:55:43 +0000901LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
902 unsigned Index, const char *Name);
903LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
904 LLVMValueRef EltVal, unsigned Index,
905 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000906
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000907LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val,
908 const char *Name);
909LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef, LLVMValueRef Val,
910 const char *Name);
911LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef, LLVMValueRef LHS,
912 LLVMValueRef RHS, const char *Name);
913
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000914
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000915/*===-- Module providers --------------------------------------------------===*/
916
917/* Encapsulates the module M in a module provider, taking ownership of the
918 * module.
919 * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
920 */
921LLVMModuleProviderRef
922LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
923
924/* Destroys the module provider MP as well as the contained module.
925 * See the destructor llvm::ModuleProvider::~ModuleProvider.
926 */
927void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
928
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000929
930/*===-- Memory buffers ----------------------------------------------------===*/
931
Chris Lattner25963c62010-01-09 22:27:07 +0000932LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
933 LLVMMemoryBufferRef *OutMemBuf,
934 char **OutMessage);
935LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
936 char **OutMessage);
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000937void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
938
Gordon Henriksen878114b2008-03-16 04:20:44 +0000939
940/*===-- Pass Managers -----------------------------------------------------===*/
941
942/** Constructs a new whole-module pass pipeline. This type of pipeline is
943 suitable for link-time optimization and whole-module transformations.
944 See llvm::PassManager::PassManager. */
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000945LLVMPassManagerRef LLVMCreatePassManager(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +0000946
947/** Constructs a new function-by-function pass pipeline over the module
948 provider. It does not take ownership of the module provider. This type of
949 pipeline is suitable for code generation and JIT compilation tasks.
950 See llvm::FunctionPassManager::FunctionPassManager. */
951LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
952
953/** Initializes, executes on the provided module, and finalizes all of the
954 passes scheduled in the pass manager. Returns 1 if any of the passes
955 modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
Chris Lattner25963c62010-01-09 22:27:07 +0000956LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
Gordon Henriksen878114b2008-03-16 04:20:44 +0000957
958/** Initializes all of the function passes scheduled in the function pass
959 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
960 See llvm::FunctionPassManager::doInitialization. */
Chris Lattner25963c62010-01-09 22:27:07 +0000961LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
Gordon Henriksen878114b2008-03-16 04:20:44 +0000962
963/** Executes all of the function passes scheduled in the function pass manager
964 on the provided function. Returns 1 if any of the passes modified the
965 function, false otherwise.
966 See llvm::FunctionPassManager::run(Function&). */
Chris Lattner25963c62010-01-09 22:27:07 +0000967LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
Gordon Henriksen878114b2008-03-16 04:20:44 +0000968
969/** Finalizes all of the function passes scheduled in in the function pass
970 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
971 See llvm::FunctionPassManager::doFinalization. */
Chris Lattner25963c62010-01-09 22:27:07 +0000972LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
Gordon Henriksen878114b2008-03-16 04:20:44 +0000973
974/** Frees the memory of a pass pipeline. For function pipelines, does not free
975 the module provider.
976 See llvm::PassManagerBase::~PassManagerBase. */
977void LLVMDisposePassManager(LLVMPassManagerRef PM);
978
979
Gordon Henriksen76a03742007-09-18 03:18:57 +0000980#ifdef __cplusplus
981}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000982
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000983namespace llvm {
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000984 class ModuleProvider;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000985 class MemoryBuffer;
Gordon Henriksen96571492008-03-16 15:55:43 +0000986 class PassManagerBase;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000987
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000988 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
989 inline ty *unwrap(ref P) { \
990 return reinterpret_cast<ty*>(P); \
991 } \
992 \
993 inline ref wrap(const ty *P) { \
994 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
995 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000996
Gordon Henriksen878114b2008-03-16 04:20:44 +0000997 #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref) \
998 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
999 \
1000 template<typename T> \
1001 inline T *unwrap(ref P) { \
1002 return cast<T>(unwrap(P)); \
1003 }
1004
1005 #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref) \
1006 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1007 \
1008 template<typename T> \
1009 inline T *unwrap(ref P) { \
Chris Lattner7ba06612010-01-22 06:49:46 +00001010 T *Q = (T*)unwrap(P); \
Gordon Henriksen878114b2008-03-16 04:20:44 +00001011 assert(Q && "Invalid cast!"); \
1012 return Q; \
1013 }
1014
1015 DEFINE_ISA_CONVERSION_FUNCTIONS (Type, LLVMTypeRef )
1016 DEFINE_ISA_CONVERSION_FUNCTIONS (Value, LLVMValueRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001017 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
1018 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
Eric Christopher59278832008-08-08 19:39:37 +00001019 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001020 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
1021 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider, LLVMModuleProviderRef)
1022 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Owen Anderson6773d382009-07-01 16:58:40 +00001023 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMContext, LLVMContextRef )
Chris Lattner40cf28d2009-10-12 04:01:02 +00001024 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Use, LLVMUseIteratorRef )
Gordon Henriksen878114b2008-03-16 04:20:44 +00001025 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef )
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001026
Gordon Henriksen878114b2008-03-16 04:20:44 +00001027 #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS
1028 #undef DEFINE_ISA_CONVERSION_FUNCTIONS
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001029 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001030
1031 /* Specialized opaque context conversions.
1032 */
1033 inline LLVMContext **unwrap(LLVMContextRef* Tys) {
1034 return reinterpret_cast<LLVMContext**>(Tys);
1035 }
1036
1037 inline LLVMContextRef *wrap(const LLVMContext **Tys) {
1038 return reinterpret_cast<LLVMContextRef*>(const_cast<LLVMContext**>(Tys));
1039 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001040
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001041 /* Specialized opaque type conversions.
1042 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001043 inline Type **unwrap(LLVMTypeRef* Tys) {
1044 return reinterpret_cast<Type**>(Tys);
1045 }
1046
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001047 inline LLVMTypeRef *wrap(const Type **Tys) {
1048 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
1049 }
1050
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001051 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001052 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001053 inline Value **unwrap(LLVMValueRef *Vals) {
1054 return reinterpret_cast<Value**>(Vals);
1055 }
1056
1057 template<typename T>
1058 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
1059 #if DEBUG
Chris Lattnerb7971152009-07-10 18:28:19 +00001060 for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I)
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001061 cast<T>(*I);
1062 #endif
1063 return reinterpret_cast<T**>(Vals);
1064 }
1065
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001066 inline LLVMValueRef *wrap(const Value **Vals) {
1067 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
1068 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001069}
1070
1071#endif /* !defined(__cplusplus) */
1072
1073#endif /* !defined(LLVM_C_CORE_H) */