blob: d23b91c4e0dec5b9791e0c3a618c1c9260c74242 [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
543/* Operations on Users */
544LLVMValueRef 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);
565int LLVMGetMDNodeNumOperands(LLVMValueRef V);
566LLVMValueRef *LLVMGetMDNodeOperand(LLVMValueRef V, unsigned i);
567unsigned LLVMGetNamedMetadataNumOperands(LLVMModuleRef M, const char* name);
568void LLVMGetNamedMetadataOperands(LLVMModuleRef M, const char* name, LLVMValueRef *Dest);
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000569
Gordon Henriksen76a03742007-09-18 03:18:57 +0000570/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000571LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
Chris Lattner25963c62010-01-09 22:27:07 +0000572 LLVMBool SignExtend);
Chris Lattner4329e072010-11-23 02:47:22 +0000573LLVMValueRef LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy,
574 unsigned NumWords,
575 const uint64_t Words[]);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000576LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text,
577 uint8_t Radix);
578LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text,
579 unsigned SLen, uint8_t Radix);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000580LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen931e1212008-02-02 01:07:50 +0000581LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000582LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text,
583 unsigned SLen);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000584unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal);
585long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000586
Gordon Henriksen76a03742007-09-18 03:18:57 +0000587
588/* Operations on composite constants */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000589LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
Chris Lattner25963c62010-01-09 22:27:07 +0000590 unsigned Length, LLVMBool DontNullTerminate);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000591LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
592 LLVMValueRef *ConstantVals,
Chris Lattner25963c62010-01-09 22:27:07 +0000593 unsigned Count, LLVMBool Packed);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000594
Gordon Henriksen1046c732007-10-06 15:11:06 +0000595LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
Chris Lattner25963c62010-01-09 22:27:07 +0000596 LLVMBool DontNullTerminate);
Gordon Henriksen2ad5aef2008-04-25 03:21:19 +0000597LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
Gordon Henriksen1046c732007-10-06 15:11:06 +0000598 LLVMValueRef *ConstantVals, unsigned Length);
599LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Chris Lattner25963c62010-01-09 22:27:07 +0000600 LLVMBool Packed);
Rafael Espindola784ad242011-07-14 19:09:08 +0000601LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy,
602 LLVMValueRef *ConstantVals,
603 unsigned Count);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000604LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000605
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000606/* Constant expressions */
Chris Lattner40cf28d2009-10-12 04:01:02 +0000607LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000608LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000609LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
610LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000611LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal);
612LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000613LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000614LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
615LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000616LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000617LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000618LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000619LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000620LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
621LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000622LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000623LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000624LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
625LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000626LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000627LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
628LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000629LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000630LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
631LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
632LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
633LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
634LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
635LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
636LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
637LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
638 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
639LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
640 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
641LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
642LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
643LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
644LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
645 LLVMValueRef *ConstantIndices, unsigned NumIndices);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000646LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
647 LLVMValueRef *ConstantIndices,
648 unsigned NumIndices);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000649LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
650LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
651LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
652LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
653LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
654LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
655LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
656LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
657LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
658LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
659LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
660LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000661LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
662 LLVMTypeRef ToType);
663LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
664 LLVMTypeRef ToType);
665LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
666 LLVMTypeRef ToType);
667LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
668 LLVMTypeRef ToType);
669LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
Chris Lattner25963c62010-01-09 22:27:07 +0000670 LLVMBool isSigned);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000671LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000672LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
673 LLVMValueRef ConstantIfTrue,
674 LLVMValueRef ConstantIfFalse);
675LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
676 LLVMValueRef IndexConstant);
677LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
678 LLVMValueRef ElementValueConstant,
679 LLVMValueRef IndexConstant);
680LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
681 LLVMValueRef VectorBConstant,
682 LLVMValueRef MaskConstant);
Dan Gohmand5104a52008-11-03 22:55:43 +0000683LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
684 unsigned NumIdx);
685LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
686 LLVMValueRef ElementValueConstant,
687 unsigned *IdxList, unsigned NumIdx);
Chris Lattner25963c62010-01-09 22:27:07 +0000688LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
Chris Lattner3d1f5522008-12-17 21:39:50 +0000689 const char *AsmString, const char *Constraints,
Chris Lattner25963c62010-01-09 22:27:07 +0000690 LLVMBool HasSideEffects, LLVMBool IsAlignStack);
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +0000691LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000692
Gordon Henriksen76a03742007-09-18 03:18:57 +0000693/* Operations on global variables, functions, and aliases (globals) */
Gordon Henriksen265f7802008-03-19 01:11:35 +0000694LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
Chris Lattner25963c62010-01-09 22:27:07 +0000695LLVMBool LLVMIsDeclaration(LLVMValueRef Global);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000696LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
697void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
698const char *LLVMGetSection(LLVMValueRef Global);
699void LLVMSetSection(LLVMValueRef Global, const char *Section);
700LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
701void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
702unsigned LLVMGetAlignment(LLVMValueRef Global);
703void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
704
705/* Operations on global variables */
706LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Erick Tryzelaar06894b32010-02-28 09:46:13 +0000707LLVMValueRef LLVMAddGlobalInAddressSpace(LLVMModuleRef M, LLVMTypeRef Ty,
708 const char *Name,
709 unsigned AddressSpace);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000710LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000711LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
712LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
713LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
714LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000715void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000716LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
717void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
Chris Lattner25963c62010-01-09 22:27:07 +0000718LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar);
719void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal);
720LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
721void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000722
Chris Lattner3d1f5522008-12-17 21:39:50 +0000723/* Operations on aliases */
724LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
725 const char *Name);
726
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000727/* Operations on functions */
728LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
729 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000730LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000731LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
732LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
733LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
734LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000735void LLVMDeleteFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000736unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
737unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
738void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksend930f912008-08-17 18:44:35 +0000739const char *LLVMGetGC(LLVMValueRef Fn);
740void LLVMSetGC(LLVMValueRef Fn, const char *Name);
Duncan Sands7374a012009-05-06 12:21:17 +0000741void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000742LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn);
Duncan Sands7374a012009-05-06 12:21:17 +0000743void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000744
Gordon Henriksen265f7802008-03-19 01:11:35 +0000745/* Operations on parameters */
746unsigned LLVMCountParams(LLVMValueRef Fn);
747void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
748LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
749LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000750LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
751LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
752LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
753LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
Devang Patel4c758ea2008-09-25 21:00:45 +0000754void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
755void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000756LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000757void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000758
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000759/* Operations on basic blocks */
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000760LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
Chris Lattner25963c62010-01-09 22:27:07 +0000761LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000762LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000763LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
Nate Begeman43c322b2011-08-23 20:27:46 +0000764LLVMValueRef LLVMGetBasicBlockTerminator(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000765unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
766void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000767LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
768LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
769LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
770LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000771LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000772
773LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
774 LLVMValueRef Fn,
775 const char *Name);
776LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
777 LLVMBasicBlockRef BB,
778 const char *Name);
779
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000780LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
781LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
782 const char *Name);
783void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
Nate Begeman43c322b2011-08-23 20:27:46 +0000784void LLVMRemoveBasicBlockFromParent(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000785
Duncan Sandsb1d61aa2010-07-19 15:31:07 +0000786void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos);
787void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos);
788
Gordon Henriksen054817c2008-03-19 03:47:18 +0000789LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
790LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
Nate Begeman43c322b2011-08-23 20:27:46 +0000791
792/* Operations on instructions */
793LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000794LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
795LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
Devang Pateldbebc6f2011-10-03 20:59:18 +0000796void LLVMInstructionEraseFromParent(LLVMValueRef Inst);
Torok Edwinab6158e2011-10-14 20:37:49 +0000797LLVMOpcode LLVMGetInstructionOpcode(LLVMValueRef Inst);
Torok Edwin60c40de2011-10-06 12:13:20 +0000798LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000799
Gordon Henriksen1158c532007-12-29 20:45:00 +0000800/* Operations on call sites */
801void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
802unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
Devang Patel4c758ea2008-09-25 21:00:45 +0000803void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
804void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
805 LLVMAttribute);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000806void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
807 unsigned align);
Gordon Henriksen1158c532007-12-29 20:45:00 +0000808
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000809/* Operations on call instructions (only) */
Chris Lattner25963c62010-01-09 22:27:07 +0000810LLVMBool LLVMIsTailCall(LLVMValueRef CallInst);
811void LLVMSetTailCall(LLVMValueRef CallInst, LLVMBool IsTailCall);
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000812
Nate Begeman43c322b2011-08-23 20:27:46 +0000813/* Operations on switch instructions (only) */
814LLVMBasicBlockRef LLVMGetSwitchDefaultDest(LLVMValueRef SwitchInstr);
815
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000816/* Operations on phi nodes */
817void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
818 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
819unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
820LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
821LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000822
823/*===-- Instruction builders ----------------------------------------------===*/
824
825/* An instruction builder represents a point within a basic block, and is the
826 * exclusive means of building instructions using the C interface.
827 */
828
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000829LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C);
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000830LLVMBuilderRef LLVMCreateBuilder(void);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000831void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
832 LLVMValueRef Instr);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000833void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
834void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000835LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000836void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
837void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
Erick Tryzelaar9813bea2009-08-16 02:20:57 +0000838void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
839 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000840void LLVMDisposeBuilder(LLVMBuilderRef Builder);
841
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000842/* Metadata */
843void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L);
844LLVMValueRef LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder);
845void LLVMSetInstDebugLocation(LLVMBuilderRef Builder, LLVMValueRef Inst);
846
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000847/* Terminators */
848LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
849LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000850LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef, LLVMValueRef *RetVals,
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000851 unsigned N);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000852LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
853LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
854 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
855LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
856 LLVMBasicBlockRef Else, unsigned NumCases);
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +0000857LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
858 unsigned NumDests);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000859LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
860 LLVMValueRef *Args, unsigned NumArgs,
861 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
862 const char *Name);
Benjamin Kramer5a6568832011-08-19 01:36:54 +0000863LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,
864 LLVMValueRef PersFn, unsigned NumClauses,
865 const char *Name);
Bill Wendlingf891bf82011-07-31 06:30:59 +0000866LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000867LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
868
Gordon Henriksen097102c2008-01-01 05:50:53 +0000869/* Add a case to the switch instruction */
870void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
871 LLVMBasicBlockRef Dest);
872
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +0000873/* Add a destination to the indirectbr instruction */
874void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest);
875
Bill Wendlingfae14752011-08-12 20:24:12 +0000876/* Add a catch or filter clause to the landingpad instruction */
877void LLVMAddClause(LLVMValueRef LandingPad, LLVMValueRef ClauseVal);
878
879/* Set the 'cleanup' flag in the landingpad instruction */
880void LLVMSetCleanup(LLVMValueRef LandingPad, LLVMBool Val);
881
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000882/* Arithmetic */
883LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
884 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000885LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
886 const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000887LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
888 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000889LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
890 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000891LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
892 const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000893LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
894 const char *Name);
895LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
896 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000897LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
898 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000899LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
900 const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000901LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
902 const char *Name);
903LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
904 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000905LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
906 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000907LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
908 const char *Name);
909LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
910 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000911LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
912 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000913LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
914 const char *Name);
915LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
916 const char *Name);
917LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
918 const char *Name);
919LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
920 const char *Name);
921LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
922 const char *Name);
923LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
924 const char *Name);
925LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
926 const char *Name);
927LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
928 const char *Name);
929LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
930 const char *Name);
931LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
932 const char *Name);
Erick Tryzelaar31831792010-02-28 05:51:27 +0000933LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op,
934 LLVMValueRef LHS, LLVMValueRef RHS,
935 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000936LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000937LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
938 const char *Name);
939LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V,
940 const char *Name);
Dan Gohmanf919bd62009-09-28 21:51:41 +0000941LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000942LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
943
944/* Memory */
945LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
946LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
947 LLVMValueRef Val, const char *Name);
948LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
949LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
950 LLVMValueRef Val, const char *Name);
951LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
952LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
953 const char *Name);
954LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
955LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
956 LLVMValueRef *Indices, unsigned NumIndices,
957 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000958LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
959 LLVMValueRef *Indices, unsigned NumIndices,
960 const char *Name);
961LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
962 unsigned Idx, const char *Name);
963LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
964 const char *Name);
965LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
966 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000967
968/* Casts */
969LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
970 LLVMTypeRef DestTy, const char *Name);
971LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
972 LLVMTypeRef DestTy, const char *Name);
973LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
974 LLVMTypeRef DestTy, const char *Name);
975LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
976 LLVMTypeRef DestTy, const char *Name);
977LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
978 LLVMTypeRef DestTy, const char *Name);
979LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
980 LLVMTypeRef DestTy, const char *Name);
981LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
982 LLVMTypeRef DestTy, const char *Name);
983LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
984 LLVMTypeRef DestTy, const char *Name);
985LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
986 LLVMTypeRef DestTy, const char *Name);
987LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
988 LLVMTypeRef DestTy, const char *Name);
989LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
990 LLVMTypeRef DestTy, const char *Name);
991LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
992 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000993LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
994 LLVMTypeRef DestTy, const char *Name);
995LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
996 LLVMTypeRef DestTy, const char *Name);
997LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
998 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar31831792010-02-28 05:51:27 +0000999LLVMValueRef LLVMBuildCast(LLVMBuilderRef B, LLVMOpcode Op, LLVMValueRef Val,
1000 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00001001LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef, LLVMValueRef Val,
1002 LLVMTypeRef DestTy, const char *Name);
Duncan Sands9d786d72009-11-23 10:49:03 +00001003LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef, LLVMValueRef Val, /*Signed cast!*/
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00001004 LLVMTypeRef DestTy, const char *Name);
1005LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef, LLVMValueRef Val,
1006 LLVMTypeRef DestTy, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001007
1008/* Comparisons */
1009LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
1010 LLVMValueRef LHS, LLVMValueRef RHS,
1011 const char *Name);
1012LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
1013 LLVMValueRef LHS, LLVMValueRef RHS,
1014 const char *Name);
1015
1016/* Miscellaneous instructions */
1017LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
1018LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
1019 LLVMValueRef *Args, unsigned NumArgs,
1020 const char *Name);
1021LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
1022 LLVMValueRef Then, LLVMValueRef Else,
1023 const char *Name);
1024LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
1025 const char *Name);
1026LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
1027 LLVMValueRef Index, const char *Name);
1028LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
1029 LLVMValueRef EltVal, LLVMValueRef Index,
1030 const char *Name);
1031LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
1032 LLVMValueRef V2, LLVMValueRef Mask,
1033 const char *Name);
Dan Gohmand5104a52008-11-03 22:55:43 +00001034LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
1035 unsigned Index, const char *Name);
1036LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
1037 LLVMValueRef EltVal, unsigned Index,
1038 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +00001039
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00001040LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val,
1041 const char *Name);
1042LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef, LLVMValueRef Val,
1043 const char *Name);
1044LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef, LLVMValueRef LHS,
1045 LLVMValueRef RHS, const char *Name);
1046
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001047
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001048/*===-- Module providers --------------------------------------------------===*/
1049
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001050/* Changes the type of M so it can be passed to FunctionPassManagers and the
1051 * JIT. They take ModuleProviders for historical reasons.
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001052 */
1053LLVMModuleProviderRef
1054LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
1055
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001056/* Destroys the module M.
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001057 */
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001058void LLVMDisposeModuleProvider(LLVMModuleProviderRef M);
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001059
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001060
1061/*===-- Memory buffers ----------------------------------------------------===*/
1062
Chris Lattner25963c62010-01-09 22:27:07 +00001063LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
1064 LLVMMemoryBufferRef *OutMemBuf,
1065 char **OutMessage);
1066LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
1067 char **OutMessage);
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001068void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
1069
Owen Anderson4698c5d2010-10-07 17:55:47 +00001070/*===-- Pass Registry -----------------------------------------------------===*/
1071
1072/** Return the global pass registry, for use with initialization functions.
1073 See llvm::PassRegistry::getPassRegistry. */
1074LLVMPassRegistryRef LLVMGetGlobalPassRegistry(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001075
1076/*===-- Pass Managers -----------------------------------------------------===*/
1077
1078/** Constructs a new whole-module pass pipeline. This type of pipeline is
1079 suitable for link-time optimization and whole-module transformations.
1080 See llvm::PassManager::PassManager. */
Gordon Henriksena735a9c2008-05-04 12:55:34 +00001081LLVMPassManagerRef LLVMCreatePassManager(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001082
1083/** Constructs a new function-by-function pass pipeline over the module
1084 provider. It does not take ownership of the module provider. This type of
1085 pipeline is suitable for code generation and JIT compilation tasks.
1086 See llvm::FunctionPassManager::FunctionPassManager. */
Erick Tryzelaarad0e0cb2010-03-02 23:58:54 +00001087LLVMPassManagerRef LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M);
1088
1089/** Deprecated: Use LLVMCreateFunctionPassManagerForModule instead. */
Gordon Henriksen878114b2008-03-16 04:20:44 +00001090LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
1091
1092/** Initializes, executes on the provided module, and finalizes all of the
1093 passes scheduled in the pass manager. Returns 1 if any of the passes
1094 modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
Chris Lattner25963c62010-01-09 22:27:07 +00001095LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001096
1097/** Initializes all of the function passes scheduled in the function pass
1098 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
1099 See llvm::FunctionPassManager::doInitialization. */
Chris Lattner25963c62010-01-09 22:27:07 +00001100LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001101
1102/** Executes all of the function passes scheduled in the function pass manager
1103 on the provided function. Returns 1 if any of the passes modified the
1104 function, false otherwise.
1105 See llvm::FunctionPassManager::run(Function&). */
Chris Lattner25963c62010-01-09 22:27:07 +00001106LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001107
1108/** Finalizes all of the function passes scheduled in in the function pass
1109 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
1110 See llvm::FunctionPassManager::doFinalization. */
Chris Lattner25963c62010-01-09 22:27:07 +00001111LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001112
1113/** Frees the memory of a pass pipeline. For function pipelines, does not free
1114 the module provider.
1115 See llvm::PassManagerBase::~PassManagerBase. */
1116void LLVMDisposePassManager(LLVMPassManagerRef PM);
1117
1118
Gordon Henriksen76a03742007-09-18 03:18:57 +00001119#ifdef __cplusplus
1120}
Gordon Henriksen76a03742007-09-18 03:18:57 +00001121
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001122namespace llvm {
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001123 class MemoryBuffer;
Gordon Henriksen96571492008-03-16 15:55:43 +00001124 class PassManagerBase;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001125
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001126 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1127 inline ty *unwrap(ref P) { \
1128 return reinterpret_cast<ty*>(P); \
1129 } \
1130 \
1131 inline ref wrap(const ty *P) { \
1132 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
1133 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001134
Gordon Henriksen878114b2008-03-16 04:20:44 +00001135 #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref) \
1136 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1137 \
1138 template<typename T> \
1139 inline T *unwrap(ref P) { \
1140 return cast<T>(unwrap(P)); \
1141 }
1142
1143 #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref) \
1144 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1145 \
1146 template<typename T> \
1147 inline T *unwrap(ref P) { \
Chris Lattner7ba06612010-01-22 06:49:46 +00001148 T *Q = (T*)unwrap(P); \
Gordon Henriksen878114b2008-03-16 04:20:44 +00001149 assert(Q && "Invalid cast!"); \
1150 return Q; \
1151 }
1152
1153 DEFINE_ISA_CONVERSION_FUNCTIONS (Type, LLVMTypeRef )
1154 DEFINE_ISA_CONVERSION_FUNCTIONS (Value, LLVMValueRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001155 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
1156 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
Eric Christopher59278832008-08-08 19:39:37 +00001157 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001158 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Owen Anderson6773d382009-07-01 16:58:40 +00001159 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMContext, LLVMContextRef )
Erick Tryzelaar9f9857e2010-03-02 20:32:28 +00001160 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Use, LLVMUseRef )
Gordon Henriksen878114b2008-03-16 04:20:44 +00001161 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef )
Owen Anderson4698c5d2010-10-07 17:55:47 +00001162 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassRegistry, LLVMPassRegistryRef )
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001163 /* LLVMModuleProviderRef exists for historical reasons, but now just holds a
1164 * Module.
1165 */
1166 inline Module *unwrap(LLVMModuleProviderRef MP) {
1167 return reinterpret_cast<Module*>(MP);
1168 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001169
Gordon Henriksen878114b2008-03-16 04:20:44 +00001170 #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS
1171 #undef DEFINE_ISA_CONVERSION_FUNCTIONS
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001172 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001173
1174 /* Specialized opaque context conversions.
1175 */
1176 inline LLVMContext **unwrap(LLVMContextRef* Tys) {
1177 return reinterpret_cast<LLVMContext**>(Tys);
1178 }
1179
1180 inline LLVMContextRef *wrap(const LLVMContext **Tys) {
1181 return reinterpret_cast<LLVMContextRef*>(const_cast<LLVMContext**>(Tys));
1182 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001183
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001184 /* Specialized opaque type conversions.
1185 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001186 inline Type **unwrap(LLVMTypeRef* Tys) {
1187 return reinterpret_cast<Type**>(Tys);
1188 }
1189
Chris Lattner229907c2011-07-18 04:54:35 +00001190 inline LLVMTypeRef *wrap(Type **Tys) {
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001191 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
1192 }
1193
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001194 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001195 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001196 inline Value **unwrap(LLVMValueRef *Vals) {
1197 return reinterpret_cast<Value**>(Vals);
1198 }
1199
1200 template<typename T>
1201 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
1202 #if DEBUG
Chris Lattnerb7971152009-07-10 18:28:19 +00001203 for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I)
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001204 cast<T>(*I);
1205 #endif
Hans Wennborg8f7edbf2011-06-04 16:00:19 +00001206 (void)Length;
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001207 return reinterpret_cast<T**>(Vals);
1208 }
1209
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001210 inline LLVMValueRef *wrap(const Value **Vals) {
1211 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
1212 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001213}
1214
1215#endif /* !defined(__cplusplus) */
1216
1217#endif /* !defined(LLVM_C_CORE_H) */