blob: 98358fe3807258add6c7b29516652b06091028d0 [file] [log] [blame]
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001/*===-- llvm-c/Core.h - Core Library C Interface ------------------*- C -*-===*\
2|* *|
3|* The LLVM Compiler Infrastructure *|
4|* *|
Chris Lattner7ed47a12007-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 Henriksen8b94a142007-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 Henriksenacd96192007-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 Henriksen8b94a142007-09-18 03:18:57 +000031\*===----------------------------------------------------------------------===*/
32
33#ifndef LLVM_C_CORE_H
34#define LLVM_C_CORE_H
35
Chandler Carruth8b67f772009-10-26 01:35:46 +000036#include "llvm/System/DataTypes.h"
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +000037
Gordon Henriksen8b94a142007-09-18 03:18:57 +000038#ifdef __cplusplus
Gordon Henriksenacd96192007-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 Sands89f6d882008-04-13 06:22:09 +000043#include "llvm/Support/IRBuilder.h"
Gordon Henriksenacd96192007-10-05 23:59:36 +000044
Gordon Henriksen8b94a142007-09-18 03:18:57 +000045extern "C" {
46#endif
47
48
Chris Lattnerd686c8e2010-01-09 22:27:07 +000049typedef int LLVMBool;
50
Gordon Henriksen8b94a142007-09-18 03:18:57 +000051/* Opaque types. */
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000052
53/**
Owen Anderson8b477ed2009-07-01 16:58:40 +000054 * The top-level container for all LLVM global data. See the LLVMContext class.
55 */
Erick Tryzelaar22c3f182009-08-14 00:01:31 +000056typedef struct LLVMOpaqueContext *LLVMContextRef;
Owen Anderson8b477ed2009-07-01 16:58:40 +000057
58/**
Gordon Henriksendc2c07a2007-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 Henriksen8b94a142007-09-18 03:18:57 +000062typedef struct LLVMOpaqueModule *LLVMModuleRef;
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000063
64/**
Gordon Henriksenbbf1c512008-03-07 19:13:06 +000065 * Each value in the LLVM IR has a type, an LLVMTypeRef. See the llvm::Type
66 * class.
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000067 */
Gordon Henriksen8b94a142007-09-18 03:18:57 +000068typedef struct LLVMOpaqueType *LLVMTypeRef;
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000069
70/**
Gordon Henriksenbbf1c512008-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 Henriksendc2c07a2007-12-30 17:46:33 +000074 */
Gordon Henriksen1cf08fd2007-10-07 00:13:35 +000075typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000076
Gordon Henriksen8b94a142007-09-18 03:18:57 +000077typedef struct LLVMOpaqueValue *LLVMValueRef;
Gordon Henriksen46abf912007-09-26 20:56:12 +000078typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
79typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
Gordon Henriksenda1435f2007-12-19 22:30:40 +000080
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +000081/* Interface used to provide a module to JIT or interpreter. This is now just a
82 * synonym for llvm::Module, but we have to keep using the different type to
83 * keep binary compatibility.
Gordon Henriksenda1435f2007-12-19 22:30:40 +000084 */
Gordon Henriksen1ae61352007-12-12 01:04:30 +000085typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef;
Gordon Henriksen8b94a142007-09-18 03:18:57 +000086
Gordon Henriksenda1435f2007-12-19 22:30:40 +000087/* Used to provide a module to JIT or interpreter.
88 * See the llvm::MemoryBuffer class.
89 */
90typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef;
91
Gordon Henriksend78c0f52008-03-16 04:20:44 +000092/** See the llvm::PassManagerBase class. */
93typedef struct LLVMOpaquePassManager *LLVMPassManagerRef;
94
Chris Lattner885dffc2009-10-12 04:01:02 +000095/**
96 * Used to iterate through the uses of a Value, allowing access to all Values
97 * that use this Value. See the llvm::Use and llvm::value_use_iterator classes.
98 */
99typedef struct LLVMOpaqueUseIterator *LLVMUseIteratorRef;
100
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000101typedef enum {
Devang Patel05988662008-09-25 21:00:45 +0000102 LLVMZExtAttribute = 1<<0,
103 LLVMSExtAttribute = 1<<1,
104 LLVMNoReturnAttribute = 1<<2,
105 LLVMInRegAttribute = 1<<3,
106 LLVMStructRetAttribute = 1<<4,
107 LLVMNoUnwindAttribute = 1<<5,
108 LLVMNoAliasAttribute = 1<<6,
109 LLVMByValAttribute = 1<<7,
110 LLVMNestAttribute = 1<<8,
111 LLVMReadNoneAttribute = 1<<9,
Anton Korobeynikovc5ec8a72009-07-17 18:07:26 +0000112 LLVMReadOnlyAttribute = 1<<10,
Anton Korobeynikov46a47f52009-07-17 18:57:16 +0000113 LLVMNoInlineAttribute = 1<<11,
114 LLVMAlwaysInlineAttribute = 1<<12,
115 LLVMOptimizeForSizeAttribute = 1<<13,
116 LLVMStackProtectAttribute = 1<<14,
117 LLVMStackProtectReqAttribute = 1<<15,
118 LLVMNoCaptureAttribute = 1<<21,
119 LLVMNoRedZoneAttribute = 1<<22,
120 LLVMNoImplicitFloatAttribute = 1<<23,
Jakob Stoklund Olesen570a4a52010-02-06 01:16:28 +0000121 LLVMNakedAttribute = 1<<24,
122 LLVMInlineHintAttribute = 1<<25
Devang Patel05988662008-09-25 21:00:45 +0000123} LLVMAttribute;
Gordon Henriksene2435da2008-04-28 17:37:06 +0000124
125typedef enum {
Chris Lattner885dffc2009-10-12 04:01:02 +0000126 LLVMRet = 1,
127 LLVMBr = 2,
128 LLVMSwitch = 3,
129 LLVMInvoke = 4,
130 LLVMUnwind = 5,
131 LLVMUnreachable = 6,
132 LLVMAdd = 7,
133 LLVMFAdd = 8,
134 LLVMSub = 9,
135 LLVMFSub = 10,
136 LLVMMul = 11,
137 LLVMFMul = 12,
138 LLVMUDiv = 13,
139 LLVMSDiv = 14,
140 LLVMFDiv = 15,
141 LLVMURem = 16,
142 LLVMSRem = 17,
143 LLVMFRem = 18,
144 LLVMShl = 19,
145 LLVMLShr = 20,
146 LLVMAShr = 21,
147 LLVMAnd = 22,
148 LLVMOr = 23,
149 LLVMXor = 24,
150 LLVMMalloc = 25,
151 LLVMFree = 26,
152 LLVMAlloca = 27,
153 LLVMLoad = 28,
154 LLVMStore = 29,
155 LLVMGetElementPtr = 30,
156 LLVMTrunk = 31,
157 LLVMZExt = 32,
158 LLVMSExt = 33,
159 LLVMFPToUI = 34,
160 LLVMFPToSI = 35,
161 LLVMUIToFP = 36,
162 LLVMSIToFP = 37,
163 LLVMFPTrunc = 38,
164 LLVMFPExt = 39,
165 LLVMPtrToInt = 40,
166 LLVMIntToPtr = 41,
167 LLVMBitCast = 42,
168 LLVMICmp = 43,
169 LLVMFCmp = 44,
170 LLVMPHI = 45,
171 LLVMCall = 46,
172 LLVMSelect = 47,
173 LLVMVAArg = 50,
174 LLVMExtractElement = 51,
175 LLVMInsertElement = 52,
176 LLVMShuffleVector = 53,
177 LLVMExtractValue = 54,
178 LLVMInsertValue = 55
179} LLVMOpcode;
180
181typedef enum {
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000182 LLVMVoidTypeKind, /**< type with no size */
183 LLVMFloatTypeKind, /**< 32 bit floating point type */
184 LLVMDoubleTypeKind, /**< 64 bit floating point type */
185 LLVMX86_FP80TypeKind, /**< 80 bit floating point type (X87) */
186 LLVMFP128TypeKind, /**< 128 bit floating point type (112-bit mantissa)*/
187 LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */
188 LLVMLabelTypeKind, /**< Labels */
189 LLVMIntegerTypeKind, /**< Arbitrary bit width integers */
190 LLVMFunctionTypeKind, /**< Functions */
191 LLVMStructTypeKind, /**< Structures */
192 LLVMArrayTypeKind, /**< Arrays */
193 LLVMPointerTypeKind, /**< Pointers */
194 LLVMOpaqueTypeKind, /**< Opaque: type with unknown structure */
Chris Lattner0df5c8e2009-07-15 22:00:31 +0000195 LLVMVectorTypeKind, /**< SIMD 'packed' format, or other vector type */
196 LLVMMetadataTypeKind /**< Metadata */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000197} LLVMTypeKind;
198
199typedef enum {
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000200 LLVMExternalLinkage, /**< Externally visible function */
Chris Lattnerdb1afd42009-04-13 06:25:37 +0000201 LLVMAvailableExternallyLinkage,
Duncan Sands667d4b82009-03-07 15:45:40 +0000202 LLVMLinkOnceAnyLinkage, /**< Keep one copy of function when linking (inline)*/
203 LLVMLinkOnceODRLinkage, /**< Same, but only replaced by something
204 equivalent. */
205 LLVMWeakAnyLinkage, /**< Keep one copy of function when linking (weak) */
206 LLVMWeakODRLinkage, /**< Same, but only replaced by something
207 equivalent. */
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000208 LLVMAppendingLinkage, /**< Special purpose, only applies to global arrays */
209 LLVMInternalLinkage, /**< Rename collisions when linking (static
210 functions) */
Duncan Sands667d4b82009-03-07 15:45:40 +0000211 LLVMPrivateLinkage, /**< Like Internal, but omit from symbol table */
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000212 LLVMDLLImportLinkage, /**< Function to be imported from DLL */
213 LLVMDLLExportLinkage, /**< Function to be accessible from DLL */
Duncan Sands5f4ee1f2009-03-11 08:08:06 +0000214 LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +0000215 LLVMGhostLinkage, /**< Obsolete */
Bill Wendling39a499b2009-07-20 18:22:52 +0000216 LLVMCommonLinkage, /**< Tentative definitions */
217 LLVMLinkerPrivateLinkage /**< Like Private, but linker removes. */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000218} LLVMLinkage;
219
220typedef enum {
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000221 LLVMDefaultVisibility, /**< The GV is visible */
222 LLVMHiddenVisibility, /**< The GV is hidden */
223 LLVMProtectedVisibility /**< The GV is protected */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000224} LLVMVisibility;
225
Gordon Henriksen46abf912007-09-26 20:56:12 +0000226typedef enum {
227 LLVMCCallConv = 0,
228 LLVMFastCallConv = 8,
229 LLVMColdCallConv = 9,
230 LLVMX86StdcallCallConv = 64,
231 LLVMX86FastcallCallConv = 65
232} LLVMCallConv;
233
234typedef enum {
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000235 LLVMIntEQ = 32, /**< equal */
236 LLVMIntNE, /**< not equal */
237 LLVMIntUGT, /**< unsigned greater than */
238 LLVMIntUGE, /**< unsigned greater or equal */
239 LLVMIntULT, /**< unsigned less than */
240 LLVMIntULE, /**< unsigned less or equal */
241 LLVMIntSGT, /**< signed greater than */
242 LLVMIntSGE, /**< signed greater or equal */
243 LLVMIntSLT, /**< signed less than */
244 LLVMIntSLE /**< signed less or equal */
Gordon Henriksen46abf912007-09-26 20:56:12 +0000245} LLVMIntPredicate;
246
247typedef enum {
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000248 LLVMRealPredicateFalse, /**< Always false (always folded) */
249 LLVMRealOEQ, /**< True if ordered and equal */
250 LLVMRealOGT, /**< True if ordered and greater than */
251 LLVMRealOGE, /**< True if ordered and greater than or equal */
252 LLVMRealOLT, /**< True if ordered and less than */
253 LLVMRealOLE, /**< True if ordered and less than or equal */
254 LLVMRealONE, /**< True if ordered and operands are unequal */
255 LLVMRealORD, /**< True if ordered (no nans) */
256 LLVMRealUNO, /**< True if unordered: isnan(X) | isnan(Y) */
257 LLVMRealUEQ, /**< True if unordered or equal */
258 LLVMRealUGT, /**< True if unordered or greater than */
259 LLVMRealUGE, /**< True if unordered, greater than, or equal */
260 LLVMRealULT, /**< True if unordered or less than */
261 LLVMRealULE, /**< True if unordered, less than, or equal */
262 LLVMRealUNE, /**< True if unordered or not equal */
263 LLVMRealPredicateTrue /**< Always true (always folded) */
Gordon Henriksen46abf912007-09-26 20:56:12 +0000264} LLVMRealPredicate;
265
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000266
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000267/*===-- Error handling ----------------------------------------------------===*/
268
269void LLVMDisposeMessage(char *Message);
270
271
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000272/*===-- Modules -----------------------------------------------------------===*/
273
Owen Anderson8b477ed2009-07-01 16:58:40 +0000274/* Create and destroy contexts. */
Erick Tryzelaarbf4a68e2009-08-30 23:38:06 +0000275LLVMContextRef LLVMContextCreate(void);
276LLVMContextRef LLVMGetGlobalContext(void);
Owen Anderson8b477ed2009-07-01 16:58:40 +0000277void LLVMContextDispose(LLVMContextRef C);
278
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000279/* Create and destroy modules. */
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000280/** See llvm::Module::Module. */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000281LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
Owen Andersonc8897d92009-07-02 07:17:57 +0000282LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
283 LLVMContextRef C);
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000284
285/** See llvm::Module::~Module. */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000286void LLVMDisposeModule(LLVMModuleRef M);
287
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000288/** Data layout. See Module::getDataLayout. */
Gordon Henriksena353ffa2007-12-27 20:13:47 +0000289const char *LLVMGetDataLayout(LLVMModuleRef M);
290void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple);
291
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000292/** Target triple. See Module::getTargetTriple. */
Gordon Henriksena353ffa2007-12-27 20:13:47 +0000293const char *LLVMGetTarget(LLVMModuleRef M);
294void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
295
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000296/** See Module::addTypeName. */
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000297LLVMBool LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000298void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
Chris Lattnere4840bc2009-07-06 17:29:59 +0000299LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000300
Gordon Henriksenaf59b102008-03-14 23:58:56 +0000301/** See Module::dump. */
302void LLVMDumpModule(LLVMModuleRef M);
303
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000304
Gordon Henriksen46abf912007-09-26 20:56:12 +0000305/*===-- Types -------------------------------------------------------------===*/
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000306
307/* LLVM types conform to the following hierarchy:
308 *
309 * types:
310 * integer type
311 * real type
312 * function type
313 * sequence types:
314 * array type
315 * pointer type
316 * vector type
317 * void type
318 * label type
319 * opaque type
320 */
321
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000322/** See llvm::LLVMTypeKind::getTypeID. */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000323LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000324
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000325/** See llvm::LLVMType::getContext. */
326LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty);
327
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000328/* Operations on integer types */
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000329LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C);
330LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C);
331LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C);
332LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C);
333LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C);
334LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits);
335
Gordon Henriksen16c1f442008-05-04 12:55:34 +0000336LLVMTypeRef LLVMInt1Type(void);
337LLVMTypeRef LLVMInt8Type(void);
338LLVMTypeRef LLVMInt16Type(void);
339LLVMTypeRef LLVMInt32Type(void);
340LLVMTypeRef LLVMInt64Type(void);
Gordon Henriksen81a78812007-10-06 16:05:20 +0000341LLVMTypeRef LLVMIntType(unsigned NumBits);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000342unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000343
344/* Operations on real types */
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000345LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C);
346LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C);
347LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C);
348LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C);
349LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C);
350
Gordon Henriksen16c1f442008-05-04 12:55:34 +0000351LLVMTypeRef LLVMFloatType(void);
352LLVMTypeRef LLVMDoubleType(void);
353LLVMTypeRef LLVMX86FP80Type(void);
354LLVMTypeRef LLVMFP128Type(void);
355LLVMTypeRef LLVMPPCFP128Type(void);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000356
357/* Operations on function types */
Gordon Henriksen81a78812007-10-06 16:05:20 +0000358LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
359 LLVMTypeRef *ParamTypes, unsigned ParamCount,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000360 LLVMBool IsVarArg);
361LLVMBool LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000362LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
363unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
364void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000365
366/* Operations on struct types */
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000367LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000368 unsigned ElementCount, LLVMBool Packed);
Gordon Henriksen81a78812007-10-06 16:05:20 +0000369LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000370 LLVMBool Packed);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000371unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000372void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000373LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000374
375/* Operations on array, pointer, and vector types (sequence types) */
Gordon Henriksen81a78812007-10-06 16:05:20 +0000376LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000377LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
Gordon Henriksen81a78812007-10-06 16:05:20 +0000378LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000379
380LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
381unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000382unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000383unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
384
385/* Operations on other types */
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000386LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C);
387LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C);
388LLVMTypeRef LLVMOpaqueTypeInContext(LLVMContextRef C);
389
Gordon Henriksen16c1f442008-05-04 12:55:34 +0000390LLVMTypeRef LLVMVoidType(void);
391LLVMTypeRef LLVMLabelType(void);
392LLVMTypeRef LLVMOpaqueType(void);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000393
Gordon Henriksen1cf08fd2007-10-07 00:13:35 +0000394/* Operations on type handles */
395LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
396void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
397LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
398void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
399
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000400
401/*===-- Values ------------------------------------------------------------===*/
402
403/* The bulk of LLVM's object model consists of values, which comprise a very
404 * rich type hierarchy.
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000405 */
406
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000407#define LLVM_FOR_EACH_VALUE_SUBCLASS(macro) \
408 macro(Argument) \
409 macro(BasicBlock) \
410 macro(InlineAsm) \
411 macro(User) \
412 macro(Constant) \
413 macro(ConstantAggregateZero) \
414 macro(ConstantArray) \
415 macro(ConstantExpr) \
416 macro(ConstantFP) \
417 macro(ConstantInt) \
418 macro(ConstantPointerNull) \
419 macro(ConstantStruct) \
420 macro(ConstantVector) \
421 macro(GlobalValue) \
422 macro(Function) \
423 macro(GlobalAlias) \
424 macro(GlobalVariable) \
425 macro(UndefValue) \
426 macro(Instruction) \
427 macro(BinaryOperator) \
428 macro(CallInst) \
429 macro(IntrinsicInst) \
430 macro(DbgInfoIntrinsic) \
431 macro(DbgDeclareInst) \
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000432 macro(EHSelectorInst) \
433 macro(MemIntrinsic) \
434 macro(MemCpyInst) \
435 macro(MemMoveInst) \
436 macro(MemSetInst) \
437 macro(CmpInst) \
438 macro(FCmpInst) \
439 macro(ICmpInst) \
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000440 macro(ExtractElementInst) \
441 macro(GetElementPtrInst) \
442 macro(InsertElementInst) \
443 macro(InsertValueInst) \
444 macro(PHINode) \
445 macro(SelectInst) \
446 macro(ShuffleVectorInst) \
447 macro(StoreInst) \
448 macro(TerminatorInst) \
449 macro(BranchInst) \
450 macro(InvokeInst) \
451 macro(ReturnInst) \
452 macro(SwitchInst) \
453 macro(UnreachableInst) \
454 macro(UnwindInst) \
455 macro(UnaryInstruction) \
Victor Hernandez7b929da2009-10-23 21:09:37 +0000456 macro(AllocaInst) \
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000457 macro(CastInst) \
Gordon Henriksen95ca7312008-12-19 18:51:17 +0000458 macro(BitCastInst) \
459 macro(FPExtInst) \
460 macro(FPToSIInst) \
461 macro(FPToUIInst) \
462 macro(FPTruncInst) \
463 macro(IntToPtrInst) \
464 macro(PtrToIntInst) \
465 macro(SExtInst) \
466 macro(SIToFPInst) \
467 macro(TruncInst) \
468 macro(UIToFPInst) \
469 macro(ZExtInst) \
470 macro(ExtractValueInst) \
Gordon Henriksen95ca7312008-12-19 18:51:17 +0000471 macro(LoadInst) \
472 macro(VAArgInst)
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000473
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000474/* Operations on all values */
Gordon Henriksen46abf912007-09-26 20:56:12 +0000475LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000476const char *LLVMGetValueName(LLVMValueRef Val);
477void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen88cc6992007-10-06 00:08:49 +0000478void LLVMDumpValue(LLVMValueRef Val);
Chris Lattner885dffc2009-10-12 04:01:02 +0000479void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000480
Gordon Henriksen2a9c6712008-12-19 18:39:45 +0000481/* Conversion functions. Return the input value if it is an instance of the
482 specified class, otherwise NULL. See llvm::dyn_cast_or_null<>. */
483#define LLVM_DECLARE_VALUE_CAST(name) \
484 LLVMValueRef LLVMIsA##name(LLVMValueRef Val);
485LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DECLARE_VALUE_CAST)
486
Chris Lattner885dffc2009-10-12 04:01:02 +0000487/* Operations on Uses */
488LLVMUseIteratorRef LLVMGetFirstUse(LLVMValueRef Val);
489LLVMUseIteratorRef LLVMGetNextUse(LLVMUseIteratorRef U);
490LLVMValueRef LLVMGetUser(LLVMUseIteratorRef U);
491LLVMValueRef LLVMGetUsedValue(LLVMUseIteratorRef U);
492
493/* Operations on Users */
494LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index);
495
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000496/* Operations on constants of any type */
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000497LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
498LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000499LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000500LLVMBool LLVMIsConstant(LLVMValueRef Val);
501LLVMBool LLVMIsNull(LLVMValueRef Val);
502LLVMBool LLVMIsUndef(LLVMValueRef Val);
Chris Lattnere4840bc2009-07-06 17:29:59 +0000503LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000504
505/* Operations on scalar constants */
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000506LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000507 LLVMBool SignExtend);
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000508LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text,
509 uint8_t Radix);
510LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text,
511 unsigned SLen, uint8_t Radix);
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000512LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksene62a8a32008-02-02 01:07:50 +0000513LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000514LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text,
515 unsigned SLen);
Chris Lattner885dffc2009-10-12 04:01:02 +0000516unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal);
517long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal);
Erick Tryzelaare0a1bf62009-08-16 23:36:46 +0000518
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000519
520/* Operations on composite constants */
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000521LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000522 unsigned Length, LLVMBool DontNullTerminate);
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000523LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
524 LLVMValueRef *ConstantVals,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000525 unsigned Count, LLVMBool Packed);
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000526
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000527LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000528 LLVMBool DontNullTerminate);
Gordon Henriksen877ee972008-04-25 03:21:19 +0000529LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000530 LLVMValueRef *ConstantVals, unsigned Length);
531LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000532 LLVMBool Packed);
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000533LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000534
Gordon Henriksen46475692007-10-06 14:29:36 +0000535/* Constant expressions */
Chris Lattner885dffc2009-10-12 04:01:02 +0000536LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
Erick Tryzelaar44a708f2009-08-19 08:36:49 +0000537LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
Gordon Henriksen46475692007-10-06 14:29:36 +0000538LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
539LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000540LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
Gordon Henriksen46475692007-10-06 14:29:36 +0000541LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
542LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohman6e7ad952009-09-03 23:34:49 +0000543LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000544LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen46475692007-10-06 14:29:36 +0000545LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000546LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen46475692007-10-06 14:29:36 +0000547LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000548LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen46475692007-10-06 14:29:36 +0000549LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
550LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohman6e7ad952009-09-03 23:34:49 +0000551LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen46475692007-10-06 14:29:36 +0000552LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
553LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
554LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
555LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
556LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
557LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
558LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
559LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
560 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
561LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
562 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
563LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
564LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
565LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
566LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
567 LLVMValueRef *ConstantIndices, unsigned NumIndices);
Dan Gohman6e7ad952009-09-03 23:34:49 +0000568LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
569 LLVMValueRef *ConstantIndices,
570 unsigned NumIndices);
Gordon Henriksen46475692007-10-06 14:29:36 +0000571LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
572LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
573LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
574LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
575LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
576LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
577LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
578LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
579LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
580LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
581LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
582LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000583LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
584 LLVMTypeRef ToType);
585LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
586 LLVMTypeRef ToType);
587LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
588 LLVMTypeRef ToType);
589LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
590 LLVMTypeRef ToType);
591LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000592 LLVMBool isSigned);
Erick Tryzelaar56b22692009-08-16 02:20:12 +0000593LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Gordon Henriksen46475692007-10-06 14:29:36 +0000594LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
595 LLVMValueRef ConstantIfTrue,
596 LLVMValueRef ConstantIfFalse);
597LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
598 LLVMValueRef IndexConstant);
599LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
600 LLVMValueRef ElementValueConstant,
601 LLVMValueRef IndexConstant);
602LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
603 LLVMValueRef VectorBConstant,
604 LLVMValueRef MaskConstant);
Dan Gohmanb5931172008-11-03 22:55:43 +0000605LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
606 unsigned NumIdx);
607LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
608 LLVMValueRef ElementValueConstant,
609 unsigned *IdxList, unsigned NumIdx);
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000610LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
Chris Lattner851ba392008-12-17 21:39:50 +0000611 const char *AsmString, const char *Constraints,
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000612 LLVMBool HasSideEffects, LLVMBool IsAlignStack);
Gordon Henriksen46475692007-10-06 14:29:36 +0000613
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000614/* Operations on global variables, functions, and aliases (globals) */
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +0000615LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000616LLVMBool LLVMIsDeclaration(LLVMValueRef Global);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000617LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
618void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
619const char *LLVMGetSection(LLVMValueRef Global);
620void LLVMSetSection(LLVMValueRef Global, const char *Section);
621LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
622void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
623unsigned LLVMGetAlignment(LLVMValueRef Global);
624void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
625
626/* Operations on global variables */
627LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen6d6203d2007-10-08 03:45:09 +0000628LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen4733be32008-03-23 22:21:29 +0000629LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
630LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
631LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
632LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000633void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000634LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
635void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000636LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar);
637void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal);
638LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
639void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000640
Chris Lattner851ba392008-12-17 21:39:50 +0000641/* Operations on aliases */
642LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
643 const char *Name);
644
Gordon Henriksen46abf912007-09-26 20:56:12 +0000645/* Operations on functions */
646LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
647 LLVMTypeRef FunctionTy);
Gordon Henriksen6d6203d2007-10-08 03:45:09 +0000648LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen34000972008-03-19 03:47:18 +0000649LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
650LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
651LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
652LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000653void LLVMDeleteFunction(LLVMValueRef Fn);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000654unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
655unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
656void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksen5eca0752008-08-17 18:44:35 +0000657const char *LLVMGetGC(LLVMValueRef Fn);
658void LLVMSetGC(LLVMValueRef Fn, const char *Name);
Duncan Sandse149e992009-05-06 12:21:17 +0000659void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Chris Lattner885dffc2009-10-12 04:01:02 +0000660LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn);
Duncan Sandse149e992009-05-06 12:21:17 +0000661void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000662
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +0000663/* Operations on parameters */
664unsigned LLVMCountParams(LLVMValueRef Fn);
665void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
666LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
667LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
Gordon Henriksen4733be32008-03-23 22:21:29 +0000668LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
669LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
670LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
671LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
Devang Patel05988662008-09-25 21:00:45 +0000672void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
673void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
Chris Lattner885dffc2009-10-12 04:01:02 +0000674LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg);
Gordon Henriksene2435da2008-04-28 17:37:06 +0000675void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +0000676
Gordon Henriksen46abf912007-09-26 20:56:12 +0000677/* Operations on basic blocks */
Gordon Henriksen4733be32008-03-23 22:21:29 +0000678LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000679LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000680LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
Gordon Henriksen4733be32008-03-23 22:21:29 +0000681LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000682unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
683void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
Gordon Henriksen34000972008-03-19 03:47:18 +0000684LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
685LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
686LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
687LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000688LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000689
690LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
691 LLVMValueRef Fn,
692 const char *Name);
693LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
694 LLVMBasicBlockRef BB,
695 const char *Name);
696
Gordon Henriksen46abf912007-09-26 20:56:12 +0000697LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
698LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
699 const char *Name);
700void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
701
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +0000702/* Operations on instructions */
703LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
Gordon Henriksen34000972008-03-19 03:47:18 +0000704LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
705LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
706LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
707LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +0000708
Gordon Henriksencc0928f2007-12-29 20:45:00 +0000709/* Operations on call sites */
710void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
711unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
Devang Patel05988662008-09-25 21:00:45 +0000712void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
713void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
714 LLVMAttribute);
Gordon Henriksene2435da2008-04-28 17:37:06 +0000715void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
716 unsigned align);
Gordon Henriksencc0928f2007-12-29 20:45:00 +0000717
Gordon Henriksen07cabf62008-08-30 16:34:54 +0000718/* Operations on call instructions (only) */
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000719LLVMBool LLVMIsTailCall(LLVMValueRef CallInst);
720void LLVMSetTailCall(LLVMValueRef CallInst, LLVMBool IsTailCall);
Gordon Henriksen07cabf62008-08-30 16:34:54 +0000721
Gordon Henriksen2618a6c2007-10-08 18:14:39 +0000722/* Operations on phi nodes */
723void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
724 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
725unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
726LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
727LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000728
729/*===-- Instruction builders ----------------------------------------------===*/
730
731/* An instruction builder represents a point within a basic block, and is the
732 * exclusive means of building instructions using the C interface.
733 */
734
Erick Tryzelaar22c3f182009-08-14 00:01:31 +0000735LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C);
Gordon Henriksen16c1f442008-05-04 12:55:34 +0000736LLVMBuilderRef LLVMCreateBuilder(void);
Gordon Henriksen34000972008-03-19 03:47:18 +0000737void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
738 LLVMValueRef Instr);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000739void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
740void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
Gordon Henriksendc1ce7b2008-03-19 01:11:35 +0000741LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
Chris Lattner851ba392008-12-17 21:39:50 +0000742void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
743void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
Erick Tryzelaar5c1c2082009-08-16 02:20:57 +0000744void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
745 const char *Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000746void LLVMDisposeBuilder(LLVMBuilderRef Builder);
747
748/* Terminators */
749LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
750LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
Erick Tryzelaar44a708f2009-08-19 08:36:49 +0000751LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef, LLVMValueRef *RetVals,
Erick Tryzelaarf72596c2009-08-16 02:19:59 +0000752 unsigned N);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000753LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
754LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
755 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
756LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
757 LLVMBasicBlockRef Else, unsigned NumCases);
758LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
759 LLVMValueRef *Args, unsigned NumArgs,
760 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
761 const char *Name);
762LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
763LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
764
Gordon Henriksenab477cc2008-01-01 05:50:53 +0000765/* Add a case to the switch instruction */
766void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
767 LLVMBasicBlockRef Dest);
768
Gordon Henriksen46abf912007-09-26 20:56:12 +0000769/* Arithmetic */
770LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
771 const char *Name);
Erick Tryzelaarf72596c2009-08-16 02:19:59 +0000772LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
773 const char *Name);
774LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
775 const char *Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000776LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
777 const char *Name);
Erick Tryzelaarf72596c2009-08-16 02:19:59 +0000778LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
779 const char *Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000780LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
781 const char *Name);
Erick Tryzelaarf72596c2009-08-16 02:19:59 +0000782LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
783 const char *Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000784LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
785 const char *Name);
786LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
787 const char *Name);
Erick Tryzelaarf72596c2009-08-16 02:19:59 +0000788LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
789 const char *Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000790LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
791 const char *Name);
792LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
793 const char *Name);
794LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
795 const char *Name);
796LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
797 const char *Name);
798LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
799 const char *Name);
800LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
801 const char *Name);
802LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
803 const char *Name);
804LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
805 const char *Name);
806LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
807 const char *Name);
808LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
809 const char *Name);
810LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Dan Gohmand0c5a292009-09-28 21:51:41 +0000811LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000812LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
813
814/* Memory */
815LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
816LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
817 LLVMValueRef Val, const char *Name);
818LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
819LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
820 LLVMValueRef Val, const char *Name);
821LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
822LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
823 const char *Name);
824LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
825LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
826 LLVMValueRef *Indices, unsigned NumIndices,
827 const char *Name);
Erick Tryzelaarf72596c2009-08-16 02:19:59 +0000828LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
829 LLVMValueRef *Indices, unsigned NumIndices,
830 const char *Name);
831LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
832 unsigned Idx, const char *Name);
833LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
834 const char *Name);
835LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
836 const char *Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000837
838/* Casts */
839LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
840 LLVMTypeRef DestTy, const char *Name);
841LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
842 LLVMTypeRef DestTy, const char *Name);
843LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
844 LLVMTypeRef DestTy, const char *Name);
845LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
846 LLVMTypeRef DestTy, const char *Name);
847LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
848 LLVMTypeRef DestTy, const char *Name);
849LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
850 LLVMTypeRef DestTy, const char *Name);
851LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
852 LLVMTypeRef DestTy, const char *Name);
853LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
854 LLVMTypeRef DestTy, const char *Name);
855LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
856 LLVMTypeRef DestTy, const char *Name);
857LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
858 LLVMTypeRef DestTy, const char *Name);
859LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
860 LLVMTypeRef DestTy, const char *Name);
861LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
862 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaarf72596c2009-08-16 02:19:59 +0000863LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
864 LLVMTypeRef DestTy, const char *Name);
865LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
866 LLVMTypeRef DestTy, const char *Name);
867LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
868 LLVMTypeRef DestTy, const char *Name);
869LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef, LLVMValueRef Val,
870 LLVMTypeRef DestTy, const char *Name);
Duncan Sandse8e01b62009-11-23 10:49:03 +0000871LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef, LLVMValueRef Val, /*Signed cast!*/
Erick Tryzelaarf72596c2009-08-16 02:19:59 +0000872 LLVMTypeRef DestTy, const char *Name);
873LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef, LLVMValueRef Val,
874 LLVMTypeRef DestTy, const char *Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000875
876/* Comparisons */
877LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
878 LLVMValueRef LHS, LLVMValueRef RHS,
879 const char *Name);
880LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
881 LLVMValueRef LHS, LLVMValueRef RHS,
882 const char *Name);
883
884/* Miscellaneous instructions */
885LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
886LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
887 LLVMValueRef *Args, unsigned NumArgs,
888 const char *Name);
889LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
890 LLVMValueRef Then, LLVMValueRef Else,
891 const char *Name);
892LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
893 const char *Name);
894LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
895 LLVMValueRef Index, const char *Name);
896LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
897 LLVMValueRef EltVal, LLVMValueRef Index,
898 const char *Name);
899LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
900 LLVMValueRef V2, LLVMValueRef Mask,
901 const char *Name);
Dan Gohmanb5931172008-11-03 22:55:43 +0000902LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
903 unsigned Index, const char *Name);
904LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
905 LLVMValueRef EltVal, unsigned Index,
906 const char *Name);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000907
Erick Tryzelaarf72596c2009-08-16 02:19:59 +0000908LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val,
909 const char *Name);
910LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef, LLVMValueRef Val,
911 const char *Name);
912LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef, LLVMValueRef LHS,
913 LLVMValueRef RHS, const char *Name);
914
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000915
Gordon Henriksen1ae61352007-12-12 01:04:30 +0000916/*===-- Module providers --------------------------------------------------===*/
917
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +0000918/* Changes the type of M so it can be passed to FunctionPassManagers and the
919 * JIT. They take ModuleProviders for historical reasons.
Gordon Henriksen1ae61352007-12-12 01:04:30 +0000920 */
921LLVMModuleProviderRef
922LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
923
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +0000924/* Destroys the module M.
Gordon Henriksen1ae61352007-12-12 01:04:30 +0000925 */
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +0000926void LLVMDisposeModuleProvider(LLVMModuleProviderRef M);
Gordon Henriksen1ae61352007-12-12 01:04:30 +0000927
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000928
929/*===-- Memory buffers ----------------------------------------------------===*/
930
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000931LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
932 LLVMMemoryBufferRef *OutMemBuf,
933 char **OutMessage);
934LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
935 char **OutMessage);
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000936void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
937
Gordon Henriksend78c0f52008-03-16 04:20:44 +0000938
939/*===-- Pass Managers -----------------------------------------------------===*/
940
941/** Constructs a new whole-module pass pipeline. This type of pipeline is
942 suitable for link-time optimization and whole-module transformations.
943 See llvm::PassManager::PassManager. */
Gordon Henriksen16c1f442008-05-04 12:55:34 +0000944LLVMPassManagerRef LLVMCreatePassManager(void);
Gordon Henriksend78c0f52008-03-16 04:20:44 +0000945
946/** Constructs a new function-by-function pass pipeline over the module
947 provider. It does not take ownership of the module provider. This type of
948 pipeline is suitable for code generation and JIT compilation tasks.
949 See llvm::FunctionPassManager::FunctionPassManager. */
950LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
951
952/** Initializes, executes on the provided module, and finalizes all of the
953 passes scheduled in the pass manager. Returns 1 if any of the passes
954 modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000955LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
Gordon Henriksend78c0f52008-03-16 04:20:44 +0000956
957/** Initializes all of the function passes scheduled in the function pass
958 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
959 See llvm::FunctionPassManager::doInitialization. */
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000960LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
Gordon Henriksend78c0f52008-03-16 04:20:44 +0000961
962/** Executes all of the function passes scheduled in the function pass manager
963 on the provided function. Returns 1 if any of the passes modified the
964 function, false otherwise.
965 See llvm::FunctionPassManager::run(Function&). */
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000966LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
Gordon Henriksend78c0f52008-03-16 04:20:44 +0000967
968/** Finalizes all of the function passes scheduled in in the function pass
969 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
970 See llvm::FunctionPassManager::doFinalization. */
Chris Lattnerd686c8e2010-01-09 22:27:07 +0000971LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
Gordon Henriksend78c0f52008-03-16 04:20:44 +0000972
973/** Frees the memory of a pass pipeline. For function pipelines, does not free
974 the module provider.
975 See llvm::PassManagerBase::~PassManagerBase. */
976void LLVMDisposePassManager(LLVMPassManagerRef PM);
977
978
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000979#ifdef __cplusplus
980}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000981
Gordon Henriksenacd96192007-10-05 23:59:36 +0000982namespace llvm {
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000983 class MemoryBuffer;
Gordon Henriksen395b4142008-03-16 15:55:43 +0000984 class PassManagerBase;
Gordon Henriksen1ae61352007-12-12 01:04:30 +0000985
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000986 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
987 inline ty *unwrap(ref P) { \
988 return reinterpret_cast<ty*>(P); \
989 } \
990 \
991 inline ref wrap(const ty *P) { \
992 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
993 }
Gordon Henriksenacd96192007-10-05 23:59:36 +0000994
Gordon Henriksend78c0f52008-03-16 04:20:44 +0000995 #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref) \
996 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
997 \
998 template<typename T> \
999 inline T *unwrap(ref P) { \
1000 return cast<T>(unwrap(P)); \
1001 }
1002
1003 #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref) \
1004 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1005 \
1006 template<typename T> \
1007 inline T *unwrap(ref P) { \
Chris Lattnere73a31f2010-01-22 06:49:46 +00001008 T *Q = (T*)unwrap(P); \
Gordon Henriksend78c0f52008-03-16 04:20:44 +00001009 assert(Q && "Invalid cast!"); \
1010 return Q; \
1011 }
1012
1013 DEFINE_ISA_CONVERSION_FUNCTIONS (Type, LLVMTypeRef )
1014 DEFINE_ISA_CONVERSION_FUNCTIONS (Value, LLVMValueRef )
Gordon Henriksen1d2e49c2007-12-27 18:25:59 +00001015 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
1016 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
Eric Christopher7a61d702008-08-08 19:39:37 +00001017 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
Gordon Henriksen1d2e49c2007-12-27 18:25:59 +00001018 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
Gordon Henriksen1d2e49c2007-12-27 18:25:59 +00001019 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Owen Anderson8b477ed2009-07-01 16:58:40 +00001020 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMContext, LLVMContextRef )
Chris Lattner885dffc2009-10-12 04:01:02 +00001021 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Use, LLVMUseIteratorRef )
Gordon Henriksend78c0f52008-03-16 04:20:44 +00001022 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef )
Jeffrey Yasskinf0356fe2010-01-27 20:34:15 +00001023 /* LLVMModuleProviderRef exists for historical reasons, but now just holds a
1024 * Module.
1025 */
1026 inline Module *unwrap(LLVMModuleProviderRef MP) {
1027 return reinterpret_cast<Module*>(MP);
1028 }
Gordon Henriksenacd96192007-10-05 23:59:36 +00001029
Gordon Henriksend78c0f52008-03-16 04:20:44 +00001030 #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS
1031 #undef DEFINE_ISA_CONVERSION_FUNCTIONS
Gordon Henriksenda1435f2007-12-19 22:30:40 +00001032 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Erick Tryzelaar22c3f182009-08-14 00:01:31 +00001033
1034 /* Specialized opaque context conversions.
1035 */
1036 inline LLVMContext **unwrap(LLVMContextRef* Tys) {
1037 return reinterpret_cast<LLVMContext**>(Tys);
1038 }
1039
1040 inline LLVMContextRef *wrap(const LLVMContext **Tys) {
1041 return reinterpret_cast<LLVMContextRef*>(const_cast<LLVMContext**>(Tys));
1042 }
Gordon Henriksenacd96192007-10-05 23:59:36 +00001043
Gordon Henriksenda1435f2007-12-19 22:30:40 +00001044 /* Specialized opaque type conversions.
1045 */
Gordon Henriksenacd96192007-10-05 23:59:36 +00001046 inline Type **unwrap(LLVMTypeRef* Tys) {
1047 return reinterpret_cast<Type**>(Tys);
1048 }
1049
Gordon Henriksenacd96192007-10-05 23:59:36 +00001050 inline LLVMTypeRef *wrap(const Type **Tys) {
1051 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
1052 }
1053
Gordon Henriksenda1435f2007-12-19 22:30:40 +00001054 /* Specialized opaque value conversions.
Gordon Henriksenacd96192007-10-05 23:59:36 +00001055 */
Gordon Henriksenacd96192007-10-05 23:59:36 +00001056 inline Value **unwrap(LLVMValueRef *Vals) {
1057 return reinterpret_cast<Value**>(Vals);
1058 }
1059
1060 template<typename T>
1061 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
1062 #if DEBUG
Chris Lattner8b16f702009-07-10 18:28:19 +00001063 for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I)
Gordon Henriksenacd96192007-10-05 23:59:36 +00001064 cast<T>(*I);
1065 #endif
1066 return reinterpret_cast<T**>(Vals);
1067 }
1068
Gordon Henriksenacd96192007-10-05 23:59:36 +00001069 inline LLVMValueRef *wrap(const Value **Vals) {
1070 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
1071 }
Gordon Henriksenacd96192007-10-05 23:59:36 +00001072}
1073
1074#endif /* !defined(__cplusplus) */
1075
1076#endif /* !defined(LLVM_C_CORE_H) */