blob: 3ffaddd990ffbfc229588b0c799ef63138d03ffd [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
Michael J. Spencerab425d82010-11-29 18:47:54 +000036#include "llvm/Support/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"
Owen Anderson4698c5d2010-10-07 17:55:47 +000043#include "llvm/PassRegistry.h"
Duncan Sandsa07136e2008-04-13 06:22:09 +000044#include "llvm/Support/IRBuilder.h"
Gordon Henriksen7330acd2007-10-05 23:59:36 +000045
Gordon Henriksen76a03742007-09-18 03:18:57 +000046extern "C" {
47#endif
48
49
Chris Lattner25963c62010-01-09 22:27:07 +000050typedef int LLVMBool;
51
Gordon Henriksen76a03742007-09-18 03:18:57 +000052/* Opaque types. */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000053
54/**
Owen Anderson6773d382009-07-01 16:58:40 +000055 * The top-level container for all LLVM global data. See the LLVMContext class.
56 */
Erick Tryzelaar262332f2009-08-14 00:01:31 +000057typedef struct LLVMOpaqueContext *LLVMContextRef;
Owen Anderson6773d382009-07-01 16:58:40 +000058
59/**
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000060 * The top-level container for all other LLVM Intermediate Representation (IR)
61 * objects. See the llvm::Module class.
62 */
Gordon Henriksen76a03742007-09-18 03:18:57 +000063typedef struct LLVMOpaqueModule *LLVMModuleRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000064
65/**
Gordon Henriksena49d4352008-03-07 19:13:06 +000066 * Each value in the LLVM IR has a type, an LLVMTypeRef. See the llvm::Type
67 * class.
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000068 */
Gordon Henriksen76a03742007-09-18 03:18:57 +000069typedef struct LLVMOpaqueType *LLVMTypeRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000070
Gordon Henriksen76a03742007-09-18 03:18:57 +000071typedef struct LLVMOpaqueValue *LLVMValueRef;
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000072typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
73typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000074
Jeffrey Yasskin091217b2010-01-27 20:34:15 +000075/* Interface used to provide a module to JIT or interpreter. This is now just a
76 * synonym for llvm::Module, but we have to keep using the different type to
77 * keep binary compatibility.
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000078 */
Gordon Henriksen0a68fe22007-12-12 01:04:30 +000079typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef;
Gordon Henriksen76a03742007-09-18 03:18:57 +000080
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000081/* Used to provide a module to JIT or interpreter.
82 * See the llvm::MemoryBuffer class.
83 */
84typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef;
85
Gordon Henriksen878114b2008-03-16 04:20:44 +000086/** See the llvm::PassManagerBase class. */
87typedef struct LLVMOpaquePassManager *LLVMPassManagerRef;
88
Owen Anderson4698c5d2010-10-07 17:55:47 +000089/** See the llvm::PassRegistry class. */
90typedef struct LLVMOpaquePassRegistry *LLVMPassRegistryRef;
91
Erick Tryzelaar9f9857e2010-03-02 20:32:28 +000092/** Used to get the users and usees of a Value. See the llvm::Use class. */
93typedef struct LLVMOpaqueUse *LLVMUseRef;
Chris Lattner40cf28d2009-10-12 04:01:02 +000094
Gordon Henriksen76a03742007-09-18 03:18:57 +000095typedef enum {
Devang Patel4c758ea2008-09-25 21:00:45 +000096 LLVMZExtAttribute = 1<<0,
97 LLVMSExtAttribute = 1<<1,
98 LLVMNoReturnAttribute = 1<<2,
99 LLVMInRegAttribute = 1<<3,
100 LLVMStructRetAttribute = 1<<4,
101 LLVMNoUnwindAttribute = 1<<5,
102 LLVMNoAliasAttribute = 1<<6,
103 LLVMByValAttribute = 1<<7,
104 LLVMNestAttribute = 1<<8,
105 LLVMReadNoneAttribute = 1<<9,
Anton Korobeynikovc8ce7b082009-07-17 18:07:26 +0000106 LLVMReadOnlyAttribute = 1<<10,
Anton Korobeynikov9750be92009-07-17 18:57:16 +0000107 LLVMNoInlineAttribute = 1<<11,
108 LLVMAlwaysInlineAttribute = 1<<12,
109 LLVMOptimizeForSizeAttribute = 1<<13,
110 LLVMStackProtectAttribute = 1<<14,
111 LLVMStackProtectReqAttribute = 1<<15,
Erick Tryzelaar8f69fea2010-03-03 23:51:25 +0000112 LLVMAlignment = 31<<16,
Anton Korobeynikov9750be92009-07-17 18:57:16 +0000113 LLVMNoCaptureAttribute = 1<<21,
114 LLVMNoRedZoneAttribute = 1<<22,
115 LLVMNoImplicitFloatAttribute = 1<<23,
Jakob Stoklund Olesen74bb06c2010-02-06 01:16:28 +0000116 LLVMNakedAttribute = 1<<24,
Erick Tryzelaar8f69fea2010-03-03 23:51:25 +0000117 LLVMInlineHintAttribute = 1<<25,
Torok Edwin1db48c02011-10-06 12:13:32 +0000118 LLVMStackAlignment = 7<<26,
119 LLVMReturnsTwice = 1 << 29,
120 LLVMUWTable = 1 << 30,
121 LLVMNonLazyBind = 1 << 31
Devang Patel4c758ea2008-09-25 21:00:45 +0000122} LLVMAttribute;
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000123
124typedef enum {
Bill Wendlingda52cec2010-02-15 20:53:17 +0000125 /* Terminator Instructions */
Chris Lattner40cf28d2009-10-12 04:01:02 +0000126 LLVMRet = 1,
127 LLVMBr = 2,
128 LLVMSwitch = 3,
Bill Wendling07d6d762010-02-15 20:50:51 +0000129 LLVMIndirectBr = 4,
130 LLVMInvoke = 5,
Bill Wendling46ffaa92011-08-02 06:20:17 +0000131 /* removed 6 due to API changes */
Bill Wendling2641d132011-07-27 21:00:28 +0000132 LLVMUnreachable = 7,
Bill Wendling07d6d762010-02-15 20:50:51 +0000133
Bill Wendlingda52cec2010-02-15 20:53:17 +0000134 /* Standard Binary Operators */
Bill Wendling2641d132011-07-27 21:00:28 +0000135 LLVMAdd = 8,
136 LLVMFAdd = 9,
137 LLVMSub = 10,
138 LLVMFSub = 11,
139 LLVMMul = 12,
140 LLVMFMul = 13,
141 LLVMUDiv = 14,
142 LLVMSDiv = 15,
143 LLVMFDiv = 16,
144 LLVMURem = 17,
145 LLVMSRem = 18,
146 LLVMFRem = 19,
Bill Wendling07d6d762010-02-15 20:50:51 +0000147
Bill Wendlingda52cec2010-02-15 20:53:17 +0000148 /* Logical Operators */
Bill Wendling2641d132011-07-27 21:00:28 +0000149 LLVMShl = 20,
150 LLVMLShr = 21,
151 LLVMAShr = 22,
152 LLVMAnd = 23,
153 LLVMOr = 24,
154 LLVMXor = 25,
Bill Wendling07d6d762010-02-15 20:50:51 +0000155
Bill Wendlingda52cec2010-02-15 20:53:17 +0000156 /* Memory Operators */
Bill Wendling2641d132011-07-27 21:00:28 +0000157 LLVMAlloca = 26,
158 LLVMLoad = 27,
159 LLVMStore = 28,
160 LLVMGetElementPtr = 29,
Bill Wendling07d6d762010-02-15 20:50:51 +0000161
Bill Wendlingda52cec2010-02-15 20:53:17 +0000162 /* Cast Operators */
Bill Wendling2641d132011-07-27 21:00:28 +0000163 LLVMTrunc = 30,
164 LLVMZExt = 31,
165 LLVMSExt = 32,
166 LLVMFPToUI = 33,
167 LLVMFPToSI = 34,
168 LLVMUIToFP = 35,
169 LLVMSIToFP = 36,
170 LLVMFPTrunc = 37,
171 LLVMFPExt = 38,
172 LLVMPtrToInt = 39,
173 LLVMIntToPtr = 40,
174 LLVMBitCast = 41,
Bill Wendling07d6d762010-02-15 20:50:51 +0000175
Bill Wendlingda52cec2010-02-15 20:53:17 +0000176 /* Other Operators */
Bill Wendling2641d132011-07-27 21:00:28 +0000177 LLVMICmp = 42,
178 LLVMFCmp = 43,
179 LLVMPHI = 44,
180 LLVMCall = 45,
181 LLVMSelect = 46,
Torok Edwin05dc9d62011-10-06 12:39:34 +0000182 LLVMUserOp1 = 47,
183 LLVMUserOp2 = 48,
Bill Wendling2641d132011-07-27 21:00:28 +0000184 LLVMVAArg = 49,
185 LLVMExtractElement = 50,
186 LLVMInsertElement = 51,
187 LLVMShuffleVector = 52,
188 LLVMExtractValue = 53,
189 LLVMInsertValue = 54,
Eli Friedman4fc946c2011-07-27 18:59:19 +0000190
191 /* Atomic operators */
Bill Wendling2641d132011-07-27 21:00:28 +0000192 LLVMFence = 55,
Eli Friedmanc9a551e2011-07-28 21:48:00 +0000193 LLVMAtomicCmpXchg = 56,
Bill Wendlingf891bf82011-07-31 06:30:59 +0000194 LLVMAtomicRMW = 57,
195
196 /* Exception Handling Operators */
Bill Wendlingfae14752011-08-12 20:24:12 +0000197 LLVMResume = 58,
Torok Edwin05dc9d62011-10-06 12:39:34 +0000198 LLVMLandingPad = 59,
199 LLVMUnwind = 60
200
Bill Wendling2641d132011-07-27 21:00:28 +0000201
Chris Lattner40cf28d2009-10-12 04:01:02 +0000202} LLVMOpcode;
203
204typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000205 LLVMVoidTypeKind, /**< type with no size */
206 LLVMFloatTypeKind, /**< 32 bit floating point type */
207 LLVMDoubleTypeKind, /**< 64 bit floating point type */
208 LLVMX86_FP80TypeKind, /**< 80 bit floating point type (X87) */
209 LLVMFP128TypeKind, /**< 128 bit floating point type (112-bit mantissa)*/
210 LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */
211 LLVMLabelTypeKind, /**< Labels */
212 LLVMIntegerTypeKind, /**< Arbitrary bit width integers */
213 LLVMFunctionTypeKind, /**< Functions */
214 LLVMStructTypeKind, /**< Structures */
215 LLVMArrayTypeKind, /**< Arrays */
216 LLVMPointerTypeKind, /**< Pointers */
Chris Lattnerdac44ec2009-07-15 22:00:31 +0000217 LLVMVectorTypeKind, /**< SIMD 'packed' format, or other vector type */
Dale Johannesenbaa5d042010-09-10 20:55:01 +0000218 LLVMMetadataTypeKind, /**< Metadata */
219 LLVMX86_MMXTypeKind /**< X86 MMX */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000220} LLVMTypeKind;
221
222typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000223 LLVMExternalLinkage, /**< Externally visible function */
Chris Lattner2dba0f02009-04-13 06:25:37 +0000224 LLVMAvailableExternallyLinkage,
Duncan Sands12da8ce2009-03-07 15:45:40 +0000225 LLVMLinkOnceAnyLinkage, /**< Keep one copy of function when linking (inline)*/
226 LLVMLinkOnceODRLinkage, /**< Same, but only replaced by something
227 equivalent. */
228 LLVMWeakAnyLinkage, /**< Keep one copy of function when linking (weak) */
229 LLVMWeakODRLinkage, /**< Same, but only replaced by something
230 equivalent. */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000231 LLVMAppendingLinkage, /**< Special purpose, only applies to global arrays */
232 LLVMInternalLinkage, /**< Rename collisions when linking (static
233 functions) */
Duncan Sands12da8ce2009-03-07 15:45:40 +0000234 LLVMPrivateLinkage, /**< Like Internal, but omit from symbol table */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000235 LLVMDLLImportLinkage, /**< Function to be imported from DLL */
236 LLVMDLLExportLinkage, /**< Function to be accessible from DLL */
Duncan Sandse2881052009-03-11 08:08:06 +0000237 LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
Jeffrey Yasskin091217b2010-01-27 20:34:15 +0000238 LLVMGhostLinkage, /**< Obsolete */
Bill Wendling002b1672009-07-20 18:22:52 +0000239 LLVMCommonLinkage, /**< Tentative definitions */
Bill Wendling03bcd6e2010-07-01 21:55:59 +0000240 LLVMLinkerPrivateLinkage, /**< Like Private, but linker removes. */
Bill Wendling578ee402010-08-20 22:05:50 +0000241 LLVMLinkerPrivateWeakLinkage, /**< Like LinkerPrivate, but is weak. */
242 LLVMLinkerPrivateWeakDefAutoLinkage /**< Like LinkerPrivateWeak, but possibly
243 hidden. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000244} LLVMLinkage;
245
246typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000247 LLVMDefaultVisibility, /**< The GV is visible */
248 LLVMHiddenVisibility, /**< The GV is hidden */
249 LLVMProtectedVisibility /**< The GV is protected */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000250} LLVMVisibility;
251
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000252typedef enum {
253 LLVMCCallConv = 0,
254 LLVMFastCallConv = 8,
255 LLVMColdCallConv = 9,
256 LLVMX86StdcallCallConv = 64,
257 LLVMX86FastcallCallConv = 65
258} LLVMCallConv;
259
260typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000261 LLVMIntEQ = 32, /**< equal */
262 LLVMIntNE, /**< not equal */
263 LLVMIntUGT, /**< unsigned greater than */
264 LLVMIntUGE, /**< unsigned greater or equal */
265 LLVMIntULT, /**< unsigned less than */
266 LLVMIntULE, /**< unsigned less or equal */
267 LLVMIntSGT, /**< signed greater than */
268 LLVMIntSGE, /**< signed greater or equal */
269 LLVMIntSLT, /**< signed less than */
270 LLVMIntSLE /**< signed less or equal */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000271} LLVMIntPredicate;
272
273typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000274 LLVMRealPredicateFalse, /**< Always false (always folded) */
275 LLVMRealOEQ, /**< True if ordered and equal */
276 LLVMRealOGT, /**< True if ordered and greater than */
277 LLVMRealOGE, /**< True if ordered and greater than or equal */
278 LLVMRealOLT, /**< True if ordered and less than */
279 LLVMRealOLE, /**< True if ordered and less than or equal */
280 LLVMRealONE, /**< True if ordered and operands are unequal */
281 LLVMRealORD, /**< True if ordered (no nans) */
282 LLVMRealUNO, /**< True if unordered: isnan(X) | isnan(Y) */
283 LLVMRealUEQ, /**< True if unordered or equal */
284 LLVMRealUGT, /**< True if unordered or greater than */
285 LLVMRealUGE, /**< True if unordered, greater than, or equal */
286 LLVMRealULT, /**< True if unordered or less than */
287 LLVMRealULE, /**< True if unordered, less than, or equal */
288 LLVMRealUNE, /**< True if unordered or not equal */
289 LLVMRealPredicateTrue /**< Always true (always folded) */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000290} LLVMRealPredicate;
291
Bill Wendlingfae14752011-08-12 20:24:12 +0000292typedef enum {
293 LLVMLandingPadCatch, /**< A catch clause */
294 LLVMLandingPadFilter /**< A filter clause */
295} LLVMLandingPadClauseTy;
296
Nick Lewycky0db26542011-05-15 07:20:34 +0000297void LLVMInitializeCore(LLVMPassRegistryRef R);
298
Gordon Henriksen76a03742007-09-18 03:18:57 +0000299
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000300/*===-- Error handling ----------------------------------------------------===*/
301
302void LLVMDisposeMessage(char *Message);
303
304
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000305/*===-- Contexts ----------------------------------------------------------===*/
Gordon Henriksen76a03742007-09-18 03:18:57 +0000306
Owen Anderson6773d382009-07-01 16:58:40 +0000307/* Create and destroy contexts. */
Erick Tryzelaarf34cb0c2009-08-30 23:38:06 +0000308LLVMContextRef LLVMContextCreate(void);
309LLVMContextRef LLVMGetGlobalContext(void);
Owen Anderson6773d382009-07-01 16:58:40 +0000310void LLVMContextDispose(LLVMContextRef C);
311
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000312unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char* Name,
313 unsigned SLen);
314unsigned LLVMGetMDKindID(const char* Name, unsigned SLen);
315
316/*===-- Modules -----------------------------------------------------------===*/
317
Gordon Henriksen76a03742007-09-18 03:18:57 +0000318/* Create and destroy modules. */
Gordon Henriksena49d4352008-03-07 19:13:06 +0000319/** See llvm::Module::Module. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000320LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
Owen Anderson31d44e42009-07-02 07:17:57 +0000321LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
322 LLVMContextRef C);
Gordon Henriksena49d4352008-03-07 19:13:06 +0000323
324/** See llvm::Module::~Module. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000325void LLVMDisposeModule(LLVMModuleRef M);
326
Gordon Henriksena49d4352008-03-07 19:13:06 +0000327/** Data layout. See Module::getDataLayout. */
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000328const char *LLVMGetDataLayout(LLVMModuleRef M);
329void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple);
330
Gordon Henriksena49d4352008-03-07 19:13:06 +0000331/** Target triple. See Module::getTargetTriple. */
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000332const char *LLVMGetTarget(LLVMModuleRef M);
333void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
334
Gordon Henriksen6c6075e2008-03-14 23:58:56 +0000335/** See Module::dump. */
336void LLVMDumpModule(LLVMModuleRef M);
337
Chris Lattner26941452010-04-10 17:52:58 +0000338/** See Module::setModuleInlineAsm. */
339void LLVMSetModuleInlineAsm(LLVMModuleRef M, const char *Asm);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000340
Chris Lattnera7e04b02010-11-28 20:03:44 +0000341/** See Module::getContext. */
342LLVMContextRef LLVMGetModuleContext(LLVMModuleRef M);
343
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000344/*===-- Types -------------------------------------------------------------===*/
Gordon Henriksen76a03742007-09-18 03:18:57 +0000345
346/* LLVM types conform to the following hierarchy:
347 *
348 * types:
349 * integer type
350 * real type
351 * function type
352 * sequence types:
353 * array type
354 * pointer type
355 * vector type
356 * void type
357 * label type
358 * opaque type
359 */
360
Gordon Henriksena49d4352008-03-07 19:13:06 +0000361/** See llvm::LLVMTypeKind::getTypeID. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000362LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
Torok Edwin1cd9ade2011-10-06 12:13:28 +0000363LLVMBool LLVMTypeIsSized(LLVMTypeRef Ty);
Gordon Henriksena49d4352008-03-07 19:13:06 +0000364
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000365/** See llvm::LLVMType::getContext. */
366LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty);
367
Gordon Henriksen76a03742007-09-18 03:18:57 +0000368/* Operations on integer types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000369LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C);
370LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C);
371LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C);
372LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C);
373LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C);
374LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits);
375
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000376LLVMTypeRef LLVMInt1Type(void);
377LLVMTypeRef LLVMInt8Type(void);
378LLVMTypeRef LLVMInt16Type(void);
379LLVMTypeRef LLVMInt32Type(void);
380LLVMTypeRef LLVMInt64Type(void);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000381LLVMTypeRef LLVMIntType(unsigned NumBits);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000382unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000383
384/* Operations on real types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000385LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C);
386LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C);
387LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C);
388LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C);
389LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C);
390
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000391LLVMTypeRef LLVMFloatType(void);
392LLVMTypeRef LLVMDoubleType(void);
393LLVMTypeRef LLVMX86FP80Type(void);
394LLVMTypeRef LLVMFP128Type(void);
395LLVMTypeRef LLVMPPCFP128Type(void);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000396
397/* Operations on function types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000398LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
399 LLVMTypeRef *ParamTypes, unsigned ParamCount,
Chris Lattner25963c62010-01-09 22:27:07 +0000400 LLVMBool IsVarArg);
401LLVMBool LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000402LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
403unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
404void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000405
406/* Operations on struct types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000407LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
Chris Lattner25963c62010-01-09 22:27:07 +0000408 unsigned ElementCount, LLVMBool Packed);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000409LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
Chris Lattner25963c62010-01-09 22:27:07 +0000410 LLVMBool Packed);
Chris Lattnere71ccde2011-07-14 05:53:17 +0000411LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name);
Torok Edwin0d5f6ae2011-10-06 12:12:50 +0000412const char *LLVMGetStructName(LLVMTypeRef Ty);
Chris Lattnere71ccde2011-07-14 05:53:17 +0000413void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes,
414 unsigned ElementCount, LLVMBool Packed);
415
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000416unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000417void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
Chris Lattner25963c62010-01-09 22:27:07 +0000418LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy);
Chris Lattner17cf05b2011-07-14 16:20:28 +0000419LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy);
420
421LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000422
423/* Operations on array, pointer, and vector types (sequence types) */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000424LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000425LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000426LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000427
428LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
429unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000430unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000431unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
432
433/* Operations on other types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000434LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C);
435LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C);
Dale Johannesen95b67af2010-09-10 21:58:02 +0000436LLVMTypeRef LLVMX86MMXTypeInContext(LLVMContextRef C);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000437
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000438LLVMTypeRef LLVMVoidType(void);
439LLVMTypeRef LLVMLabelType(void);
Dale Johannesen95b67af2010-09-10 21:58:02 +0000440LLVMTypeRef LLVMX86MMXType(void);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000441
Gordon Henriksen76a03742007-09-18 03:18:57 +0000442/*===-- Values ------------------------------------------------------------===*/
443
444/* The bulk of LLVM's object model consists of values, which comprise a very
445 * rich type hierarchy.
Gordon Henriksen76a03742007-09-18 03:18:57 +0000446 */
447
Gordon Henriksen29e38942008-12-19 18:39:45 +0000448#define LLVM_FOR_EACH_VALUE_SUBCLASS(macro) \
449 macro(Argument) \
450 macro(BasicBlock) \
451 macro(InlineAsm) \
Torok Edwind09b7572011-10-14 20:37:56 +0000452 macro(MDNode) \
453 macro(MDString) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000454 macro(User) \
455 macro(Constant) \
Torok Edwind09b7572011-10-14 20:37:56 +0000456 macro(BlockAddress) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000457 macro(ConstantAggregateZero) \
458 macro(ConstantArray) \
459 macro(ConstantExpr) \
460 macro(ConstantFP) \
461 macro(ConstantInt) \
462 macro(ConstantPointerNull) \
463 macro(ConstantStruct) \
464 macro(ConstantVector) \
465 macro(GlobalValue) \
466 macro(Function) \
467 macro(GlobalAlias) \
468 macro(GlobalVariable) \
469 macro(UndefValue) \
470 macro(Instruction) \
471 macro(BinaryOperator) \
472 macro(CallInst) \
473 macro(IntrinsicInst) \
474 macro(DbgInfoIntrinsic) \
475 macro(DbgDeclareInst) \
Torok Edwind09b7572011-10-14 20:37:56 +0000476 macro(EHExceptionInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000477 macro(EHSelectorInst) \
478 macro(MemIntrinsic) \
479 macro(MemCpyInst) \
480 macro(MemMoveInst) \
481 macro(MemSetInst) \
482 macro(CmpInst) \
Torok Edwind09b7572011-10-14 20:37:56 +0000483 macro(FCmpInst) \
484 macro(ICmpInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000485 macro(ExtractElementInst) \
486 macro(GetElementPtrInst) \
487 macro(InsertElementInst) \
488 macro(InsertValueInst) \
Bill Wendlingfae14752011-08-12 20:24:12 +0000489 macro(LandingPadInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000490 macro(PHINode) \
491 macro(SelectInst) \
492 macro(ShuffleVectorInst) \
493 macro(StoreInst) \
494 macro(TerminatorInst) \
495 macro(BranchInst) \
Torok Edwind09b7572011-10-14 20:37:56 +0000496 macro(IndirectBrInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000497 macro(InvokeInst) \
498 macro(ReturnInst) \
499 macro(SwitchInst) \
500 macro(UnreachableInst) \
Bill Wendlingf891bf82011-07-31 06:30:59 +0000501 macro(ResumeInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000502 macro(UnaryInstruction) \
Victor Hernandez8acf2952009-10-23 21:09:37 +0000503 macro(AllocaInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000504 macro(CastInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000505 macro(BitCastInst) \
506 macro(FPExtInst) \
507 macro(FPToSIInst) \
508 macro(FPToUIInst) \
509 macro(FPTruncInst) \
510 macro(IntToPtrInst) \
511 macro(PtrToIntInst) \
512 macro(SExtInst) \
513 macro(SIToFPInst) \
514 macro(TruncInst) \
515 macro(UIToFPInst) \
516 macro(ZExtInst) \
517 macro(ExtractValueInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000518 macro(LoadInst) \
519 macro(VAArgInst)
Gordon Henriksen29e38942008-12-19 18:39:45 +0000520
Gordon Henriksen76a03742007-09-18 03:18:57 +0000521/* Operations on all values */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000522LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000523const char *LLVMGetValueName(LLVMValueRef Val);
524void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000525void LLVMDumpValue(LLVMValueRef Val);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000526void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal);
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000527int LLVMHasMetadata(LLVMValueRef Val);
528LLVMValueRef LLVMGetMetadata(LLVMValueRef Val, unsigned KindID);
529void LLVMSetMetadata(LLVMValueRef Val, unsigned KindID, LLVMValueRef Node);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000530
Gordon Henriksen29e38942008-12-19 18:39:45 +0000531/* Conversion functions. Return the input value if it is an instance of the
532 specified class, otherwise NULL. See llvm::dyn_cast_or_null<>. */
533#define LLVM_DECLARE_VALUE_CAST(name) \
534 LLVMValueRef LLVMIsA##name(LLVMValueRef Val);
535LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DECLARE_VALUE_CAST)
536
Chris Lattner40cf28d2009-10-12 04:01:02 +0000537/* Operations on Uses */
Erick Tryzelaar9f9857e2010-03-02 20:32:28 +0000538LLVMUseRef LLVMGetFirstUse(LLVMValueRef Val);
539LLVMUseRef LLVMGetNextUse(LLVMUseRef U);
540LLVMValueRef LLVMGetUser(LLVMUseRef U);
541LLVMValueRef LLVMGetUsedValue(LLVMUseRef U);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000542
Chad Rosiere502a882011-11-04 17:07:11 +0000543/* Operations on Users and metadata */
Chris Lattner40cf28d2009-10-12 04:01:02 +0000544LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index);
Erick Tryzelaarb4d48702010-08-20 14:51:22 +0000545void LLVMSetOperand(LLVMValueRef User, unsigned Index, LLVMValueRef Val);
546int LLVMGetNumOperands(LLVMValueRef Val);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000547
Gordon Henriksen76a03742007-09-18 03:18:57 +0000548/* Operations on constants of any type */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000549LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
550LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000551LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Chris Lattner25963c62010-01-09 22:27:07 +0000552LLVMBool LLVMIsConstant(LLVMValueRef Val);
553LLVMBool LLVMIsNull(LLVMValueRef Val);
554LLVMBool LLVMIsUndef(LLVMValueRef Val);
Chris Lattner7f318242009-07-06 17:29:59 +0000555LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000556
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000557/* Operations on metadata */
558LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str,
559 unsigned SLen);
560LLVMValueRef LLVMMDString(const char *Str, unsigned SLen);
561LLVMValueRef LLVMMDNodeInContext(LLVMContextRef C, LLVMValueRef *Vals,
562 unsigned Count);
563LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count);
Torok Edwinfec812e2011-10-06 12:13:11 +0000564const char *LLVMGetMDString(LLVMValueRef V, unsigned* Len);
Torok Edwinfec812e2011-10-06 12:13:11 +0000565unsigned LLVMGetNamedMetadataNumOperands(LLVMModuleRef M, const char* name);
566void LLVMGetNamedMetadataOperands(LLVMModuleRef M, const char* name, LLVMValueRef *Dest);
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000567
Gordon Henriksen76a03742007-09-18 03:18:57 +0000568/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000569LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
Chris Lattner25963c62010-01-09 22:27:07 +0000570 LLVMBool SignExtend);
Chris Lattner4329e072010-11-23 02:47:22 +0000571LLVMValueRef LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy,
572 unsigned NumWords,
573 const uint64_t Words[]);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000574LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text,
575 uint8_t Radix);
576LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text,
577 unsigned SLen, uint8_t Radix);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000578LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen931e1212008-02-02 01:07:50 +0000579LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000580LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text,
581 unsigned SLen);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000582unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal);
583long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000584
Gordon Henriksen76a03742007-09-18 03:18:57 +0000585
586/* Operations on composite constants */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000587LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
Chris Lattner25963c62010-01-09 22:27:07 +0000588 unsigned Length, LLVMBool DontNullTerminate);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000589LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
590 LLVMValueRef *ConstantVals,
Chris Lattner25963c62010-01-09 22:27:07 +0000591 unsigned Count, LLVMBool Packed);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000592
Gordon Henriksen1046c732007-10-06 15:11:06 +0000593LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
Chris Lattner25963c62010-01-09 22:27:07 +0000594 LLVMBool DontNullTerminate);
Gordon Henriksen2ad5aef2008-04-25 03:21:19 +0000595LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
Gordon Henriksen1046c732007-10-06 15:11:06 +0000596 LLVMValueRef *ConstantVals, unsigned Length);
597LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Chris Lattner25963c62010-01-09 22:27:07 +0000598 LLVMBool Packed);
Rafael Espindola784ad242011-07-14 19:09:08 +0000599LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy,
600 LLVMValueRef *ConstantVals,
601 unsigned Count);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000602LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000603
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000604/* Constant expressions */
Chris Lattner40cf28d2009-10-12 04:01:02 +0000605LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000606LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000607LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
608LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000609LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal);
610LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000611LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000612LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
613LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000614LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000615LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000616LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000617LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000618LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
619LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000620LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000621LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000622LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
623LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000624LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000625LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
626LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000627LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000628LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
629LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
630LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
631LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
632LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
633LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
634LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
635LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
636 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
637LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
638 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
639LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
640LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
641LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
642LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
643 LLVMValueRef *ConstantIndices, unsigned NumIndices);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000644LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
645 LLVMValueRef *ConstantIndices,
646 unsigned NumIndices);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000647LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
648LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
649LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
650LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
651LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
652LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
653LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
654LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
655LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
656LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
657LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
658LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000659LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
660 LLVMTypeRef ToType);
661LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
662 LLVMTypeRef ToType);
663LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
664 LLVMTypeRef ToType);
665LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
666 LLVMTypeRef ToType);
667LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
Chris Lattner25963c62010-01-09 22:27:07 +0000668 LLVMBool isSigned);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000669LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000670LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
671 LLVMValueRef ConstantIfTrue,
672 LLVMValueRef ConstantIfFalse);
673LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
674 LLVMValueRef IndexConstant);
675LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
676 LLVMValueRef ElementValueConstant,
677 LLVMValueRef IndexConstant);
678LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
679 LLVMValueRef VectorBConstant,
680 LLVMValueRef MaskConstant);
Dan Gohmand5104a52008-11-03 22:55:43 +0000681LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
682 unsigned NumIdx);
683LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
684 LLVMValueRef ElementValueConstant,
685 unsigned *IdxList, unsigned NumIdx);
Chris Lattner25963c62010-01-09 22:27:07 +0000686LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
Chris Lattner3d1f5522008-12-17 21:39:50 +0000687 const char *AsmString, const char *Constraints,
Chris Lattner25963c62010-01-09 22:27:07 +0000688 LLVMBool HasSideEffects, LLVMBool IsAlignStack);
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +0000689LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000690
Gordon Henriksen76a03742007-09-18 03:18:57 +0000691/* Operations on global variables, functions, and aliases (globals) */
Gordon Henriksen265f7802008-03-19 01:11:35 +0000692LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
Chris Lattner25963c62010-01-09 22:27:07 +0000693LLVMBool LLVMIsDeclaration(LLVMValueRef Global);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000694LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
695void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
696const char *LLVMGetSection(LLVMValueRef Global);
697void LLVMSetSection(LLVMValueRef Global, const char *Section);
698LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
699void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
700unsigned LLVMGetAlignment(LLVMValueRef Global);
701void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
702
703/* Operations on global variables */
704LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Erick Tryzelaar06894b32010-02-28 09:46:13 +0000705LLVMValueRef LLVMAddGlobalInAddressSpace(LLVMModuleRef M, LLVMTypeRef Ty,
706 const char *Name,
707 unsigned AddressSpace);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000708LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000709LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
710LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
711LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
712LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000713void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000714LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
715void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
Chris Lattner25963c62010-01-09 22:27:07 +0000716LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar);
717void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal);
718LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
719void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000720
Chris Lattner3d1f5522008-12-17 21:39:50 +0000721/* Operations on aliases */
722LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
723 const char *Name);
724
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000725/* Operations on functions */
726LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
727 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000728LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000729LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
730LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
731LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
732LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000733void LLVMDeleteFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000734unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
735unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
736void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksend930f912008-08-17 18:44:35 +0000737const char *LLVMGetGC(LLVMValueRef Fn);
738void LLVMSetGC(LLVMValueRef Fn, const char *Name);
Duncan Sands7374a012009-05-06 12:21:17 +0000739void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000740LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn);
Duncan Sands7374a012009-05-06 12:21:17 +0000741void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000742
Gordon Henriksen265f7802008-03-19 01:11:35 +0000743/* Operations on parameters */
744unsigned LLVMCountParams(LLVMValueRef Fn);
745void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
746LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
747LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000748LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
749LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
750LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
751LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
Devang Patel4c758ea2008-09-25 21:00:45 +0000752void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
753void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000754LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000755void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000756
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000757/* Operations on basic blocks */
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000758LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
Chris Lattner25963c62010-01-09 22:27:07 +0000759LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000760LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000761LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
Nate Begeman43c322b2011-08-23 20:27:46 +0000762LLVMValueRef LLVMGetBasicBlockTerminator(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000763unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
764void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000765LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
766LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
767LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
768LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000769LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000770
771LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
772 LLVMValueRef Fn,
773 const char *Name);
774LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
775 LLVMBasicBlockRef BB,
776 const char *Name);
777
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000778LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
779LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
780 const char *Name);
781void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
Nate Begeman43c322b2011-08-23 20:27:46 +0000782void LLVMRemoveBasicBlockFromParent(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000783
Duncan Sandsb1d61aa2010-07-19 15:31:07 +0000784void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos);
785void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos);
786
Gordon Henriksen054817c2008-03-19 03:47:18 +0000787LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
788LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
Nate Begeman43c322b2011-08-23 20:27:46 +0000789
790/* Operations on instructions */
791LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000792LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
793LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
Devang Pateldbebc6f2011-10-03 20:59:18 +0000794void LLVMInstructionEraseFromParent(LLVMValueRef Inst);
Torok Edwinab6158e2011-10-14 20:37:49 +0000795LLVMOpcode LLVMGetInstructionOpcode(LLVMValueRef Inst);
Torok Edwin60c40de2011-10-06 12:13:20 +0000796LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000797
Gordon Henriksen1158c532007-12-29 20:45:00 +0000798/* Operations on call sites */
799void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
800unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
Devang Patel4c758ea2008-09-25 21:00:45 +0000801void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
802void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
803 LLVMAttribute);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000804void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
805 unsigned align);
Gordon Henriksen1158c532007-12-29 20:45:00 +0000806
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000807/* Operations on call instructions (only) */
Chris Lattner25963c62010-01-09 22:27:07 +0000808LLVMBool LLVMIsTailCall(LLVMValueRef CallInst);
809void LLVMSetTailCall(LLVMValueRef CallInst, LLVMBool IsTailCall);
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000810
Nate Begeman43c322b2011-08-23 20:27:46 +0000811/* Operations on switch instructions (only) */
812LLVMBasicBlockRef LLVMGetSwitchDefaultDest(LLVMValueRef SwitchInstr);
813
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000814/* Operations on phi nodes */
815void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
816 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
817unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
818LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
819LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000820
821/*===-- Instruction builders ----------------------------------------------===*/
822
823/* An instruction builder represents a point within a basic block, and is the
824 * exclusive means of building instructions using the C interface.
825 */
826
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000827LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C);
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000828LLVMBuilderRef LLVMCreateBuilder(void);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000829void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
830 LLVMValueRef Instr);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000831void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
832void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000833LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000834void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
835void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
Erick Tryzelaar9813bea2009-08-16 02:20:57 +0000836void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
837 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000838void LLVMDisposeBuilder(LLVMBuilderRef Builder);
839
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000840/* Metadata */
841void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L);
842LLVMValueRef LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder);
843void LLVMSetInstDebugLocation(LLVMBuilderRef Builder, LLVMValueRef Inst);
844
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000845/* Terminators */
846LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
847LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000848LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef, LLVMValueRef *RetVals,
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000849 unsigned N);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000850LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
851LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
852 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
853LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
854 LLVMBasicBlockRef Else, unsigned NumCases);
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +0000855LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
856 unsigned NumDests);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000857LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
858 LLVMValueRef *Args, unsigned NumArgs,
859 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
860 const char *Name);
Benjamin Kramer5a6568832011-08-19 01:36:54 +0000861LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,
862 LLVMValueRef PersFn, unsigned NumClauses,
863 const char *Name);
Bill Wendlingf891bf82011-07-31 06:30:59 +0000864LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000865LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
866
Gordon Henriksen097102c2008-01-01 05:50:53 +0000867/* Add a case to the switch instruction */
868void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
869 LLVMBasicBlockRef Dest);
870
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +0000871/* Add a destination to the indirectbr instruction */
872void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest);
873
Bill Wendlingfae14752011-08-12 20:24:12 +0000874/* Add a catch or filter clause to the landingpad instruction */
875void LLVMAddClause(LLVMValueRef LandingPad, LLVMValueRef ClauseVal);
876
877/* Set the 'cleanup' flag in the landingpad instruction */
878void LLVMSetCleanup(LLVMValueRef LandingPad, LLVMBool Val);
879
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000880/* Arithmetic */
881LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
882 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000883LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
884 const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000885LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
886 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000887LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
888 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000889LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
890 const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000891LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
892 const char *Name);
893LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
894 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000895LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
896 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000897LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
898 const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000899LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
900 const char *Name);
901LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
902 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000903LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
904 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000905LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
906 const char *Name);
907LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
908 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000909LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
910 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000911LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
912 const char *Name);
913LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
914 const char *Name);
915LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
916 const char *Name);
917LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
918 const char *Name);
919LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
920 const char *Name);
921LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
922 const char *Name);
923LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
924 const char *Name);
925LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
926 const char *Name);
927LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
928 const char *Name);
929LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
930 const char *Name);
Erick Tryzelaar31831792010-02-28 05:51:27 +0000931LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op,
932 LLVMValueRef LHS, LLVMValueRef RHS,
933 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000934LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000935LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
936 const char *Name);
937LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V,
938 const char *Name);
Dan Gohmanf919bd62009-09-28 21:51:41 +0000939LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000940LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
941
942/* Memory */
943LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
944LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
945 LLVMValueRef Val, const char *Name);
946LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
947LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
948 LLVMValueRef Val, const char *Name);
949LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
950LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
951 const char *Name);
952LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
953LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
954 LLVMValueRef *Indices, unsigned NumIndices,
955 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000956LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
957 LLVMValueRef *Indices, unsigned NumIndices,
958 const char *Name);
959LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
960 unsigned Idx, const char *Name);
961LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
962 const char *Name);
963LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
964 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000965
966/* Casts */
967LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
968 LLVMTypeRef DestTy, const char *Name);
969LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
970 LLVMTypeRef DestTy, const char *Name);
971LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
972 LLVMTypeRef DestTy, const char *Name);
973LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
974 LLVMTypeRef DestTy, const char *Name);
975LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
976 LLVMTypeRef DestTy, const char *Name);
977LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
978 LLVMTypeRef DestTy, const char *Name);
979LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
980 LLVMTypeRef DestTy, const char *Name);
981LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
982 LLVMTypeRef DestTy, const char *Name);
983LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
984 LLVMTypeRef DestTy, const char *Name);
985LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
986 LLVMTypeRef DestTy, const char *Name);
987LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
988 LLVMTypeRef DestTy, const char *Name);
989LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
990 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000991LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
992 LLVMTypeRef DestTy, const char *Name);
993LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
994 LLVMTypeRef DestTy, const char *Name);
995LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
996 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar31831792010-02-28 05:51:27 +0000997LLVMValueRef LLVMBuildCast(LLVMBuilderRef B, LLVMOpcode Op, LLVMValueRef Val,
998 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000999LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef, LLVMValueRef Val,
1000 LLVMTypeRef DestTy, const char *Name);
Duncan Sands9d786d72009-11-23 10:49:03 +00001001LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef, LLVMValueRef Val, /*Signed cast!*/
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00001002 LLVMTypeRef DestTy, const char *Name);
1003LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef, LLVMValueRef Val,
1004 LLVMTypeRef DestTy, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001005
1006/* Comparisons */
1007LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
1008 LLVMValueRef LHS, LLVMValueRef RHS,
1009 const char *Name);
1010LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
1011 LLVMValueRef LHS, LLVMValueRef RHS,
1012 const char *Name);
1013
1014/* Miscellaneous instructions */
1015LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
1016LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
1017 LLVMValueRef *Args, unsigned NumArgs,
1018 const char *Name);
1019LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
1020 LLVMValueRef Then, LLVMValueRef Else,
1021 const char *Name);
1022LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
1023 const char *Name);
1024LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
1025 LLVMValueRef Index, const char *Name);
1026LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
1027 LLVMValueRef EltVal, LLVMValueRef Index,
1028 const char *Name);
1029LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
1030 LLVMValueRef V2, LLVMValueRef Mask,
1031 const char *Name);
Dan Gohmand5104a52008-11-03 22:55:43 +00001032LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
1033 unsigned Index, const char *Name);
1034LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
1035 LLVMValueRef EltVal, unsigned Index,
1036 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +00001037
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00001038LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val,
1039 const char *Name);
1040LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef, LLVMValueRef Val,
1041 const char *Name);
1042LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef, LLVMValueRef LHS,
1043 LLVMValueRef RHS, const char *Name);
1044
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001045
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001046/*===-- Module providers --------------------------------------------------===*/
1047
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001048/* Changes the type of M so it can be passed to FunctionPassManagers and the
1049 * JIT. They take ModuleProviders for historical reasons.
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001050 */
1051LLVMModuleProviderRef
1052LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
1053
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001054/* Destroys the module M.
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001055 */
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001056void LLVMDisposeModuleProvider(LLVMModuleProviderRef M);
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001057
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001058
1059/*===-- Memory buffers ----------------------------------------------------===*/
1060
Chris Lattner25963c62010-01-09 22:27:07 +00001061LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
1062 LLVMMemoryBufferRef *OutMemBuf,
1063 char **OutMessage);
1064LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
1065 char **OutMessage);
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001066void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
1067
Owen Anderson4698c5d2010-10-07 17:55:47 +00001068/*===-- Pass Registry -----------------------------------------------------===*/
1069
1070/** Return the global pass registry, for use with initialization functions.
1071 See llvm::PassRegistry::getPassRegistry. */
1072LLVMPassRegistryRef LLVMGetGlobalPassRegistry(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001073
1074/*===-- Pass Managers -----------------------------------------------------===*/
1075
1076/** Constructs a new whole-module pass pipeline. This type of pipeline is
1077 suitable for link-time optimization and whole-module transformations.
1078 See llvm::PassManager::PassManager. */
Gordon Henriksena735a9c2008-05-04 12:55:34 +00001079LLVMPassManagerRef LLVMCreatePassManager(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001080
1081/** Constructs a new function-by-function pass pipeline over the module
1082 provider. It does not take ownership of the module provider. This type of
1083 pipeline is suitable for code generation and JIT compilation tasks.
1084 See llvm::FunctionPassManager::FunctionPassManager. */
Erick Tryzelaarad0e0cb2010-03-02 23:58:54 +00001085LLVMPassManagerRef LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M);
1086
1087/** Deprecated: Use LLVMCreateFunctionPassManagerForModule instead. */
Gordon Henriksen878114b2008-03-16 04:20:44 +00001088LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
1089
1090/** Initializes, executes on the provided module, and finalizes all of the
1091 passes scheduled in the pass manager. Returns 1 if any of the passes
1092 modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
Chris Lattner25963c62010-01-09 22:27:07 +00001093LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001094
1095/** Initializes all of the function passes scheduled in the function pass
1096 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
1097 See llvm::FunctionPassManager::doInitialization. */
Chris Lattner25963c62010-01-09 22:27:07 +00001098LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001099
1100/** Executes all of the function passes scheduled in the function pass manager
1101 on the provided function. Returns 1 if any of the passes modified the
1102 function, false otherwise.
1103 See llvm::FunctionPassManager::run(Function&). */
Chris Lattner25963c62010-01-09 22:27:07 +00001104LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001105
1106/** Finalizes all of the function passes scheduled in in the function pass
1107 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
1108 See llvm::FunctionPassManager::doFinalization. */
Chris Lattner25963c62010-01-09 22:27:07 +00001109LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001110
1111/** Frees the memory of a pass pipeline. For function pipelines, does not free
1112 the module provider.
1113 See llvm::PassManagerBase::~PassManagerBase. */
1114void LLVMDisposePassManager(LLVMPassManagerRef PM);
1115
1116
Gordon Henriksen76a03742007-09-18 03:18:57 +00001117#ifdef __cplusplus
1118}
Gordon Henriksen76a03742007-09-18 03:18:57 +00001119
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001120namespace llvm {
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001121 class MemoryBuffer;
Gordon Henriksen96571492008-03-16 15:55:43 +00001122 class PassManagerBase;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001123
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001124 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1125 inline ty *unwrap(ref P) { \
1126 return reinterpret_cast<ty*>(P); \
1127 } \
1128 \
1129 inline ref wrap(const ty *P) { \
1130 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
1131 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001132
Gordon Henriksen878114b2008-03-16 04:20:44 +00001133 #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref) \
1134 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1135 \
1136 template<typename T> \
1137 inline T *unwrap(ref P) { \
1138 return cast<T>(unwrap(P)); \
1139 }
1140
1141 #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref) \
1142 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1143 \
1144 template<typename T> \
1145 inline T *unwrap(ref P) { \
Chris Lattner7ba06612010-01-22 06:49:46 +00001146 T *Q = (T*)unwrap(P); \
Gordon Henriksen878114b2008-03-16 04:20:44 +00001147 assert(Q && "Invalid cast!"); \
1148 return Q; \
1149 }
1150
1151 DEFINE_ISA_CONVERSION_FUNCTIONS (Type, LLVMTypeRef )
1152 DEFINE_ISA_CONVERSION_FUNCTIONS (Value, LLVMValueRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001153 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
1154 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
Eric Christopher59278832008-08-08 19:39:37 +00001155 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001156 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Owen Anderson6773d382009-07-01 16:58:40 +00001157 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMContext, LLVMContextRef )
Erick Tryzelaar9f9857e2010-03-02 20:32:28 +00001158 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Use, LLVMUseRef )
Gordon Henriksen878114b2008-03-16 04:20:44 +00001159 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef )
Owen Anderson4698c5d2010-10-07 17:55:47 +00001160 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassRegistry, LLVMPassRegistryRef )
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001161 /* LLVMModuleProviderRef exists for historical reasons, but now just holds a
1162 * Module.
1163 */
1164 inline Module *unwrap(LLVMModuleProviderRef MP) {
1165 return reinterpret_cast<Module*>(MP);
1166 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001167
Gordon Henriksen878114b2008-03-16 04:20:44 +00001168 #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS
1169 #undef DEFINE_ISA_CONVERSION_FUNCTIONS
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001170 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001171
1172 /* Specialized opaque context conversions.
1173 */
1174 inline LLVMContext **unwrap(LLVMContextRef* Tys) {
1175 return reinterpret_cast<LLVMContext**>(Tys);
1176 }
1177
1178 inline LLVMContextRef *wrap(const LLVMContext **Tys) {
1179 return reinterpret_cast<LLVMContextRef*>(const_cast<LLVMContext**>(Tys));
1180 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001181
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001182 /* Specialized opaque type conversions.
1183 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001184 inline Type **unwrap(LLVMTypeRef* Tys) {
1185 return reinterpret_cast<Type**>(Tys);
1186 }
1187
Chris Lattner229907c2011-07-18 04:54:35 +00001188 inline LLVMTypeRef *wrap(Type **Tys) {
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001189 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
1190 }
1191
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001192 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001193 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001194 inline Value **unwrap(LLVMValueRef *Vals) {
1195 return reinterpret_cast<Value**>(Vals);
1196 }
1197
1198 template<typename T>
1199 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
1200 #if DEBUG
Chris Lattnerb7971152009-07-10 18:28:19 +00001201 for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I)
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001202 cast<T>(*I);
1203 #endif
Hans Wennborg8f7edbf2011-06-04 16:00:19 +00001204 (void)Length;
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001205 return reinterpret_cast<T**>(Vals);
1206 }
1207
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001208 inline LLVMValueRef *wrap(const Value **Vals) {
1209 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
1210 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001211}
1212
1213#endif /* !defined(__cplusplus) */
1214
1215#endif /* !defined(LLVM_C_CORE_H) */