blob: ed7d46932c72e98428b72c785055b12db94cbf60 [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 */
Dan Gohman518cda42011-12-17 00:04:22 +0000206 LLVMHalfTypeKind, /**< 16 bit floating point type */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000207 LLVMFloatTypeKind, /**< 32 bit floating point type */
208 LLVMDoubleTypeKind, /**< 64 bit floating point type */
209 LLVMX86_FP80TypeKind, /**< 80 bit floating point type (X87) */
210 LLVMFP128TypeKind, /**< 128 bit floating point type (112-bit mantissa)*/
211 LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */
212 LLVMLabelTypeKind, /**< Labels */
213 LLVMIntegerTypeKind, /**< Arbitrary bit width integers */
214 LLVMFunctionTypeKind, /**< Functions */
215 LLVMStructTypeKind, /**< Structures */
216 LLVMArrayTypeKind, /**< Arrays */
217 LLVMPointerTypeKind, /**< Pointers */
Chris Lattnerdac44ec2009-07-15 22:00:31 +0000218 LLVMVectorTypeKind, /**< SIMD 'packed' format, or other vector type */
Dale Johannesenbaa5d042010-09-10 20:55:01 +0000219 LLVMMetadataTypeKind, /**< Metadata */
220 LLVMX86_MMXTypeKind /**< X86 MMX */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000221} LLVMTypeKind;
222
223typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000224 LLVMExternalLinkage, /**< Externally visible function */
Chris Lattner2dba0f02009-04-13 06:25:37 +0000225 LLVMAvailableExternallyLinkage,
Duncan Sands12da8ce2009-03-07 15:45:40 +0000226 LLVMLinkOnceAnyLinkage, /**< Keep one copy of function when linking (inline)*/
227 LLVMLinkOnceODRLinkage, /**< Same, but only replaced by something
228 equivalent. */
229 LLVMWeakAnyLinkage, /**< Keep one copy of function when linking (weak) */
230 LLVMWeakODRLinkage, /**< Same, but only replaced by something
231 equivalent. */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000232 LLVMAppendingLinkage, /**< Special purpose, only applies to global arrays */
233 LLVMInternalLinkage, /**< Rename collisions when linking (static
234 functions) */
Duncan Sands12da8ce2009-03-07 15:45:40 +0000235 LLVMPrivateLinkage, /**< Like Internal, but omit from symbol table */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000236 LLVMDLLImportLinkage, /**< Function to be imported from DLL */
237 LLVMDLLExportLinkage, /**< Function to be accessible from DLL */
Duncan Sandse2881052009-03-11 08:08:06 +0000238 LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
Jeffrey Yasskin091217b2010-01-27 20:34:15 +0000239 LLVMGhostLinkage, /**< Obsolete */
Bill Wendling002b1672009-07-20 18:22:52 +0000240 LLVMCommonLinkage, /**< Tentative definitions */
Bill Wendling03bcd6e2010-07-01 21:55:59 +0000241 LLVMLinkerPrivateLinkage, /**< Like Private, but linker removes. */
Bill Wendling578ee402010-08-20 22:05:50 +0000242 LLVMLinkerPrivateWeakLinkage, /**< Like LinkerPrivate, but is weak. */
243 LLVMLinkerPrivateWeakDefAutoLinkage /**< Like LinkerPrivateWeak, but possibly
244 hidden. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000245} LLVMLinkage;
246
247typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000248 LLVMDefaultVisibility, /**< The GV is visible */
249 LLVMHiddenVisibility, /**< The GV is hidden */
250 LLVMProtectedVisibility /**< The GV is protected */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000251} LLVMVisibility;
252
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000253typedef enum {
254 LLVMCCallConv = 0,
255 LLVMFastCallConv = 8,
256 LLVMColdCallConv = 9,
257 LLVMX86StdcallCallConv = 64,
258 LLVMX86FastcallCallConv = 65
259} LLVMCallConv;
260
261typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000262 LLVMIntEQ = 32, /**< equal */
263 LLVMIntNE, /**< not equal */
264 LLVMIntUGT, /**< unsigned greater than */
265 LLVMIntUGE, /**< unsigned greater or equal */
266 LLVMIntULT, /**< unsigned less than */
267 LLVMIntULE, /**< unsigned less or equal */
268 LLVMIntSGT, /**< signed greater than */
269 LLVMIntSGE, /**< signed greater or equal */
270 LLVMIntSLT, /**< signed less than */
271 LLVMIntSLE /**< signed less or equal */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000272} LLVMIntPredicate;
273
274typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000275 LLVMRealPredicateFalse, /**< Always false (always folded) */
276 LLVMRealOEQ, /**< True if ordered and equal */
277 LLVMRealOGT, /**< True if ordered and greater than */
278 LLVMRealOGE, /**< True if ordered and greater than or equal */
279 LLVMRealOLT, /**< True if ordered and less than */
280 LLVMRealOLE, /**< True if ordered and less than or equal */
281 LLVMRealONE, /**< True if ordered and operands are unequal */
282 LLVMRealORD, /**< True if ordered (no nans) */
283 LLVMRealUNO, /**< True if unordered: isnan(X) | isnan(Y) */
284 LLVMRealUEQ, /**< True if unordered or equal */
285 LLVMRealUGT, /**< True if unordered or greater than */
286 LLVMRealUGE, /**< True if unordered, greater than, or equal */
287 LLVMRealULT, /**< True if unordered or less than */
288 LLVMRealULE, /**< True if unordered, less than, or equal */
289 LLVMRealUNE, /**< True if unordered or not equal */
290 LLVMRealPredicateTrue /**< Always true (always folded) */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000291} LLVMRealPredicate;
292
Bill Wendlingfae14752011-08-12 20:24:12 +0000293typedef enum {
294 LLVMLandingPadCatch, /**< A catch clause */
295 LLVMLandingPadFilter /**< A filter clause */
296} LLVMLandingPadClauseTy;
297
Nick Lewycky0db26542011-05-15 07:20:34 +0000298void LLVMInitializeCore(LLVMPassRegistryRef R);
299
Gordon Henriksen76a03742007-09-18 03:18:57 +0000300
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000301/*===-- Error handling ----------------------------------------------------===*/
302
303void LLVMDisposeMessage(char *Message);
304
305
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000306/*===-- Contexts ----------------------------------------------------------===*/
Gordon Henriksen76a03742007-09-18 03:18:57 +0000307
Owen Anderson6773d382009-07-01 16:58:40 +0000308/* Create and destroy contexts. */
Erick Tryzelaarf34cb0c2009-08-30 23:38:06 +0000309LLVMContextRef LLVMContextCreate(void);
310LLVMContextRef LLVMGetGlobalContext(void);
Owen Anderson6773d382009-07-01 16:58:40 +0000311void LLVMContextDispose(LLVMContextRef C);
312
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000313unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char* Name,
314 unsigned SLen);
315unsigned LLVMGetMDKindID(const char* Name, unsigned SLen);
316
317/*===-- Modules -----------------------------------------------------------===*/
318
Gordon Henriksen76a03742007-09-18 03:18:57 +0000319/* Create and destroy modules. */
Gordon Henriksena49d4352008-03-07 19:13:06 +0000320/** See llvm::Module::Module. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000321LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
Owen Anderson31d44e42009-07-02 07:17:57 +0000322LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
323 LLVMContextRef C);
Gordon Henriksena49d4352008-03-07 19:13:06 +0000324
325/** See llvm::Module::~Module. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000326void LLVMDisposeModule(LLVMModuleRef M);
327
Gordon Henriksena49d4352008-03-07 19:13:06 +0000328/** Data layout. See Module::getDataLayout. */
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000329const char *LLVMGetDataLayout(LLVMModuleRef M);
330void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple);
331
Gordon Henriksena49d4352008-03-07 19:13:06 +0000332/** Target triple. See Module::getTargetTriple. */
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000333const char *LLVMGetTarget(LLVMModuleRef M);
334void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
335
Gordon Henriksen6c6075e2008-03-14 23:58:56 +0000336/** See Module::dump. */
337void LLVMDumpModule(LLVMModuleRef M);
338
Chris Lattner26941452010-04-10 17:52:58 +0000339/** See Module::setModuleInlineAsm. */
340void LLVMSetModuleInlineAsm(LLVMModuleRef M, const char *Asm);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000341
Chris Lattnera7e04b02010-11-28 20:03:44 +0000342/** See Module::getContext. */
343LLVMContextRef LLVMGetModuleContext(LLVMModuleRef M);
344
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000345/*===-- Types -------------------------------------------------------------===*/
Gordon Henriksen76a03742007-09-18 03:18:57 +0000346
347/* LLVM types conform to the following hierarchy:
348 *
349 * types:
350 * integer type
351 * real type
352 * function type
353 * sequence types:
354 * array type
355 * pointer type
356 * vector type
357 * void type
358 * label type
359 * opaque type
360 */
361
Gordon Henriksena49d4352008-03-07 19:13:06 +0000362/** See llvm::LLVMTypeKind::getTypeID. */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000363LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
Torok Edwin1cd9ade2011-10-06 12:13:28 +0000364LLVMBool LLVMTypeIsSized(LLVMTypeRef Ty);
Gordon Henriksena49d4352008-03-07 19:13:06 +0000365
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000366/** See llvm::LLVMType::getContext. */
367LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty);
368
Gordon Henriksen76a03742007-09-18 03:18:57 +0000369/* Operations on integer types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000370LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C);
371LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C);
372LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C);
373LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C);
374LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C);
375LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits);
376
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000377LLVMTypeRef LLVMInt1Type(void);
378LLVMTypeRef LLVMInt8Type(void);
379LLVMTypeRef LLVMInt16Type(void);
380LLVMTypeRef LLVMInt32Type(void);
381LLVMTypeRef LLVMInt64Type(void);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000382LLVMTypeRef LLVMIntType(unsigned NumBits);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000383unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000384
385/* Operations on real types */
Dan Gohman518cda42011-12-17 00:04:22 +0000386LLVMTypeRef LLVMHalfTypeInContext(LLVMContextRef C);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000387LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C);
388LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C);
389LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C);
390LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C);
391LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C);
392
Dan Gohman518cda42011-12-17 00:04:22 +0000393LLVMTypeRef LLVMHalfType(void);
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000394LLVMTypeRef LLVMFloatType(void);
395LLVMTypeRef LLVMDoubleType(void);
396LLVMTypeRef LLVMX86FP80Type(void);
397LLVMTypeRef LLVMFP128Type(void);
398LLVMTypeRef LLVMPPCFP128Type(void);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000399
400/* Operations on function types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000401LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
402 LLVMTypeRef *ParamTypes, unsigned ParamCount,
Chris Lattner25963c62010-01-09 22:27:07 +0000403 LLVMBool IsVarArg);
404LLVMBool LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000405LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
406unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
407void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000408
409/* Operations on struct types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000410LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
Chris Lattner25963c62010-01-09 22:27:07 +0000411 unsigned ElementCount, LLVMBool Packed);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000412LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
Chris Lattner25963c62010-01-09 22:27:07 +0000413 LLVMBool Packed);
Chris Lattnere71ccde2011-07-14 05:53:17 +0000414LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name);
Torok Edwin0d5f6ae2011-10-06 12:12:50 +0000415const char *LLVMGetStructName(LLVMTypeRef Ty);
Chris Lattnere71ccde2011-07-14 05:53:17 +0000416void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes,
417 unsigned ElementCount, LLVMBool Packed);
418
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000419unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000420void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
Chris Lattner25963c62010-01-09 22:27:07 +0000421LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy);
Chris Lattner17cf05b2011-07-14 16:20:28 +0000422LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy);
423
424LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000425
426/* Operations on array, pointer, and vector types (sequence types) */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000427LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000428LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000429LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000430
431LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
432unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000433unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000434unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
435
436/* Operations on other types */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000437LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C);
438LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C);
Dale Johannesen95b67af2010-09-10 21:58:02 +0000439LLVMTypeRef LLVMX86MMXTypeInContext(LLVMContextRef C);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000440
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000441LLVMTypeRef LLVMVoidType(void);
442LLVMTypeRef LLVMLabelType(void);
Dale Johannesen95b67af2010-09-10 21:58:02 +0000443LLVMTypeRef LLVMX86MMXType(void);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000444
Gordon Henriksen76a03742007-09-18 03:18:57 +0000445/*===-- Values ------------------------------------------------------------===*/
446
447/* The bulk of LLVM's object model consists of values, which comprise a very
448 * rich type hierarchy.
Gordon Henriksen76a03742007-09-18 03:18:57 +0000449 */
450
Gordon Henriksen29e38942008-12-19 18:39:45 +0000451#define LLVM_FOR_EACH_VALUE_SUBCLASS(macro) \
452 macro(Argument) \
453 macro(BasicBlock) \
454 macro(InlineAsm) \
Torok Edwind09b7572011-10-14 20:37:56 +0000455 macro(MDNode) \
456 macro(MDString) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000457 macro(User) \
458 macro(Constant) \
Torok Edwind09b7572011-10-14 20:37:56 +0000459 macro(BlockAddress) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000460 macro(ConstantAggregateZero) \
461 macro(ConstantArray) \
462 macro(ConstantExpr) \
463 macro(ConstantFP) \
464 macro(ConstantInt) \
465 macro(ConstantPointerNull) \
466 macro(ConstantStruct) \
467 macro(ConstantVector) \
468 macro(GlobalValue) \
469 macro(Function) \
470 macro(GlobalAlias) \
471 macro(GlobalVariable) \
472 macro(UndefValue) \
473 macro(Instruction) \
474 macro(BinaryOperator) \
475 macro(CallInst) \
476 macro(IntrinsicInst) \
477 macro(DbgInfoIntrinsic) \
478 macro(DbgDeclareInst) \
Torok Edwind09b7572011-10-14 20:37:56 +0000479 macro(EHExceptionInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000480 macro(EHSelectorInst) \
481 macro(MemIntrinsic) \
482 macro(MemCpyInst) \
483 macro(MemMoveInst) \
484 macro(MemSetInst) \
485 macro(CmpInst) \
Torok Edwind09b7572011-10-14 20:37:56 +0000486 macro(FCmpInst) \
487 macro(ICmpInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000488 macro(ExtractElementInst) \
489 macro(GetElementPtrInst) \
490 macro(InsertElementInst) \
491 macro(InsertValueInst) \
Bill Wendlingfae14752011-08-12 20:24:12 +0000492 macro(LandingPadInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000493 macro(PHINode) \
494 macro(SelectInst) \
495 macro(ShuffleVectorInst) \
496 macro(StoreInst) \
497 macro(TerminatorInst) \
498 macro(BranchInst) \
Torok Edwind09b7572011-10-14 20:37:56 +0000499 macro(IndirectBrInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000500 macro(InvokeInst) \
501 macro(ReturnInst) \
502 macro(SwitchInst) \
503 macro(UnreachableInst) \
Bill Wendlingf891bf82011-07-31 06:30:59 +0000504 macro(ResumeInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000505 macro(UnaryInstruction) \
Victor Hernandez8acf2952009-10-23 21:09:37 +0000506 macro(AllocaInst) \
Gordon Henriksen29e38942008-12-19 18:39:45 +0000507 macro(CastInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000508 macro(BitCastInst) \
509 macro(FPExtInst) \
510 macro(FPToSIInst) \
511 macro(FPToUIInst) \
512 macro(FPTruncInst) \
513 macro(IntToPtrInst) \
514 macro(PtrToIntInst) \
515 macro(SExtInst) \
516 macro(SIToFPInst) \
517 macro(TruncInst) \
518 macro(UIToFPInst) \
519 macro(ZExtInst) \
520 macro(ExtractValueInst) \
Gordon Henriksen05a868f2008-12-19 18:51:17 +0000521 macro(LoadInst) \
522 macro(VAArgInst)
Gordon Henriksen29e38942008-12-19 18:39:45 +0000523
Gordon Henriksen76a03742007-09-18 03:18:57 +0000524/* Operations on all values */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000525LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000526const char *LLVMGetValueName(LLVMValueRef Val);
527void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000528void LLVMDumpValue(LLVMValueRef Val);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000529void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal);
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000530int LLVMHasMetadata(LLVMValueRef Val);
531LLVMValueRef LLVMGetMetadata(LLVMValueRef Val, unsigned KindID);
532void LLVMSetMetadata(LLVMValueRef Val, unsigned KindID, LLVMValueRef Node);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000533
Gordon Henriksen29e38942008-12-19 18:39:45 +0000534/* Conversion functions. Return the input value if it is an instance of the
535 specified class, otherwise NULL. See llvm::dyn_cast_or_null<>. */
536#define LLVM_DECLARE_VALUE_CAST(name) \
537 LLVMValueRef LLVMIsA##name(LLVMValueRef Val);
538LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DECLARE_VALUE_CAST)
539
Chris Lattner40cf28d2009-10-12 04:01:02 +0000540/* Operations on Uses */
Erick Tryzelaar9f9857e2010-03-02 20:32:28 +0000541LLVMUseRef LLVMGetFirstUse(LLVMValueRef Val);
542LLVMUseRef LLVMGetNextUse(LLVMUseRef U);
543LLVMValueRef LLVMGetUser(LLVMUseRef U);
544LLVMValueRef LLVMGetUsedValue(LLVMUseRef U);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000545
Chad Rosiere502a882011-11-04 17:07:11 +0000546/* Operations on Users and metadata */
Chris Lattner40cf28d2009-10-12 04:01:02 +0000547LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index);
Erick Tryzelaarb4d48702010-08-20 14:51:22 +0000548void LLVMSetOperand(LLVMValueRef User, unsigned Index, LLVMValueRef Val);
549int LLVMGetNumOperands(LLVMValueRef Val);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000550
Gordon Henriksen76a03742007-09-18 03:18:57 +0000551/* Operations on constants of any type */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000552LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
553LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000554LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Chris Lattner25963c62010-01-09 22:27:07 +0000555LLVMBool LLVMIsConstant(LLVMValueRef Val);
556LLVMBool LLVMIsNull(LLVMValueRef Val);
557LLVMBool LLVMIsUndef(LLVMValueRef Val);
Chris Lattner7f318242009-07-06 17:29:59 +0000558LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000559
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000560/* Operations on metadata */
561LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str,
562 unsigned SLen);
563LLVMValueRef LLVMMDString(const char *Str, unsigned SLen);
564LLVMValueRef LLVMMDNodeInContext(LLVMContextRef C, LLVMValueRef *Vals,
565 unsigned Count);
566LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count);
Torok Edwinfec812e2011-10-06 12:13:11 +0000567const char *LLVMGetMDString(LLVMValueRef V, unsigned* Len);
Torok Edwinfec812e2011-10-06 12:13:11 +0000568unsigned LLVMGetNamedMetadataNumOperands(LLVMModuleRef M, const char* name);
569void LLVMGetNamedMetadataOperands(LLVMModuleRef M, const char* name, LLVMValueRef *Dest);
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000570
Gordon Henriksen76a03742007-09-18 03:18:57 +0000571/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000572LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
Chris Lattner25963c62010-01-09 22:27:07 +0000573 LLVMBool SignExtend);
Chris Lattner4329e072010-11-23 02:47:22 +0000574LLVMValueRef LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy,
575 unsigned NumWords,
576 const uint64_t Words[]);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000577LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text,
578 uint8_t Radix);
579LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text,
580 unsigned SLen, uint8_t Radix);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000581LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen931e1212008-02-02 01:07:50 +0000582LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000583LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text,
584 unsigned SLen);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000585unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal);
586long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal);
Erick Tryzelaardd991352009-08-16 23:36:46 +0000587
Gordon Henriksen76a03742007-09-18 03:18:57 +0000588
589/* Operations on composite constants */
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000590LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
Chris Lattner25963c62010-01-09 22:27:07 +0000591 unsigned Length, LLVMBool DontNullTerminate);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000592LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
593 LLVMValueRef *ConstantVals,
Chris Lattner25963c62010-01-09 22:27:07 +0000594 unsigned Count, LLVMBool Packed);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000595
Gordon Henriksen1046c732007-10-06 15:11:06 +0000596LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
Chris Lattner25963c62010-01-09 22:27:07 +0000597 LLVMBool DontNullTerminate);
Gordon Henriksen2ad5aef2008-04-25 03:21:19 +0000598LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
Gordon Henriksen1046c732007-10-06 15:11:06 +0000599 LLVMValueRef *ConstantVals, unsigned Length);
600LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Chris Lattner25963c62010-01-09 22:27:07 +0000601 LLVMBool Packed);
Rafael Espindola784ad242011-07-14 19:09:08 +0000602LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy,
603 LLVMValueRef *ConstantVals,
604 unsigned Count);
Gordon Henriksen1046c732007-10-06 15:11:06 +0000605LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000606
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000607/* Constant expressions */
Chris Lattner40cf28d2009-10-12 04:01:02 +0000608LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000609LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000610LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
611LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000612LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal);
613LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000614LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000615LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
616LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000617LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000618LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000619LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000620LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000621LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
622LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000623LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000624LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000625LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
626LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000627LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000628LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
629LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000630LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000631LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
632LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
633LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
634LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
635LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
636LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
637LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
638LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
639 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
640LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
641 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
642LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
643LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
644LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
645LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
646 LLVMValueRef *ConstantIndices, unsigned NumIndices);
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000647LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
648 LLVMValueRef *ConstantIndices,
649 unsigned NumIndices);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000650LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
651LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
652LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
653LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
654LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
655LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
656LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
657LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
658LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
659LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
660LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
661LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000662LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
663 LLVMTypeRef ToType);
664LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
665 LLVMTypeRef ToType);
666LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
667 LLVMTypeRef ToType);
668LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
669 LLVMTypeRef ToType);
670LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
Chris Lattner25963c62010-01-09 22:27:07 +0000671 LLVMBool isSigned);
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000672LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000673LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
674 LLVMValueRef ConstantIfTrue,
675 LLVMValueRef ConstantIfFalse);
676LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
677 LLVMValueRef IndexConstant);
678LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
679 LLVMValueRef ElementValueConstant,
680 LLVMValueRef IndexConstant);
681LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
682 LLVMValueRef VectorBConstant,
683 LLVMValueRef MaskConstant);
Dan Gohmand5104a52008-11-03 22:55:43 +0000684LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
685 unsigned NumIdx);
686LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
687 LLVMValueRef ElementValueConstant,
688 unsigned *IdxList, unsigned NumIdx);
Chris Lattner25963c62010-01-09 22:27:07 +0000689LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
Chris Lattner3d1f5522008-12-17 21:39:50 +0000690 const char *AsmString, const char *Constraints,
Chris Lattner25963c62010-01-09 22:27:07 +0000691 LLVMBool HasSideEffects, LLVMBool IsAlignStack);
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +0000692LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB);
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000693
Gordon Henriksen76a03742007-09-18 03:18:57 +0000694/* Operations on global variables, functions, and aliases (globals) */
Gordon Henriksen265f7802008-03-19 01:11:35 +0000695LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
Chris Lattner25963c62010-01-09 22:27:07 +0000696LLVMBool LLVMIsDeclaration(LLVMValueRef Global);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000697LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
698void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
699const char *LLVMGetSection(LLVMValueRef Global);
700void LLVMSetSection(LLVMValueRef Global, const char *Section);
701LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
702void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
703unsigned LLVMGetAlignment(LLVMValueRef Global);
704void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
705
706/* Operations on global variables */
707LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Erick Tryzelaar06894b32010-02-28 09:46:13 +0000708LLVMValueRef LLVMAddGlobalInAddressSpace(LLVMModuleRef M, LLVMTypeRef Ty,
709 const char *Name,
710 unsigned AddressSpace);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000711LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000712LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
713LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
714LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
715LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000716void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000717LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
718void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
Chris Lattner25963c62010-01-09 22:27:07 +0000719LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar);
720void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal);
721LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
722void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000723
Chris Lattner3d1f5522008-12-17 21:39:50 +0000724/* Operations on aliases */
725LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
726 const char *Name);
727
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000728/* Operations on functions */
729LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
730 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000731LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000732LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
733LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
734LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
735LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000736void LLVMDeleteFunction(LLVMValueRef Fn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000737unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
738unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
739void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksend930f912008-08-17 18:44:35 +0000740const char *LLVMGetGC(LLVMValueRef Fn);
741void LLVMSetGC(LLVMValueRef Fn, const char *Name);
Duncan Sands7374a012009-05-06 12:21:17 +0000742void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000743LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn);
Duncan Sands7374a012009-05-06 12:21:17 +0000744void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000745
Gordon Henriksen265f7802008-03-19 01:11:35 +0000746/* Operations on parameters */
747unsigned LLVMCountParams(LLVMValueRef Fn);
748void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
749LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
750LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000751LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
752LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
753LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
754LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
Devang Patel4c758ea2008-09-25 21:00:45 +0000755void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
756void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000757LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000758void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000759
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000760/* Operations on basic blocks */
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000761LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
Chris Lattner25963c62010-01-09 22:27:07 +0000762LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000763LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
Gordon Henriksen07a45f42008-03-23 22:21:29 +0000764LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
Nate Begeman43c322b2011-08-23 20:27:46 +0000765LLVMValueRef LLVMGetBasicBlockTerminator(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000766unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
767void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000768LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
769LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
770LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
771LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000772LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000773
774LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
775 LLVMValueRef Fn,
776 const char *Name);
777LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
778 LLVMBasicBlockRef BB,
779 const char *Name);
780
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000781LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
782LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
783 const char *Name);
784void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
Nate Begeman43c322b2011-08-23 20:27:46 +0000785void LLVMRemoveBasicBlockFromParent(LLVMBasicBlockRef BB);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000786
Duncan Sandsb1d61aa2010-07-19 15:31:07 +0000787void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos);
788void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos);
789
Gordon Henriksen054817c2008-03-19 03:47:18 +0000790LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
791LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
Nate Begeman43c322b2011-08-23 20:27:46 +0000792
793/* Operations on instructions */
794LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000795LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
796LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
Devang Pateldbebc6f2011-10-03 20:59:18 +0000797void LLVMInstructionEraseFromParent(LLVMValueRef Inst);
Torok Edwinab6158e2011-10-14 20:37:49 +0000798LLVMOpcode LLVMGetInstructionOpcode(LLVMValueRef Inst);
Torok Edwin60c40de2011-10-06 12:13:20 +0000799LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000800
Gordon Henriksen1158c532007-12-29 20:45:00 +0000801/* Operations on call sites */
802void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
803unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
Devang Patel4c758ea2008-09-25 21:00:45 +0000804void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
805void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
806 LLVMAttribute);
Gordon Henriksen2d9cc212008-04-28 17:37:06 +0000807void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
808 unsigned align);
Gordon Henriksen1158c532007-12-29 20:45:00 +0000809
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000810/* Operations on call instructions (only) */
Chris Lattner25963c62010-01-09 22:27:07 +0000811LLVMBool LLVMIsTailCall(LLVMValueRef CallInst);
812void LLVMSetTailCall(LLVMValueRef CallInst, LLVMBool IsTailCall);
Gordon Henrikseneeb65372008-08-30 16:34:54 +0000813
Nate Begeman43c322b2011-08-23 20:27:46 +0000814/* Operations on switch instructions (only) */
815LLVMBasicBlockRef LLVMGetSwitchDefaultDest(LLVMValueRef SwitchInstr);
816
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000817/* Operations on phi nodes */
818void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
819 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
820unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
821LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
822LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000823
824/*===-- Instruction builders ----------------------------------------------===*/
825
826/* An instruction builder represents a point within a basic block, and is the
827 * exclusive means of building instructions using the C interface.
828 */
829
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000830LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C);
Gordon Henriksena735a9c2008-05-04 12:55:34 +0000831LLVMBuilderRef LLVMCreateBuilder(void);
Gordon Henriksen054817c2008-03-19 03:47:18 +0000832void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
833 LLVMValueRef Instr);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000834void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
835void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
Gordon Henriksen265f7802008-03-19 01:11:35 +0000836LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
Chris Lattner3d1f5522008-12-17 21:39:50 +0000837void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
838void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
Erick Tryzelaar9813bea2009-08-16 02:20:57 +0000839void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
840 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000841void LLVMDisposeBuilder(LLVMBuilderRef Builder);
842
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000843/* Metadata */
844void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L);
845LLVMValueRef LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder);
846void LLVMSetInstDebugLocation(LLVMBuilderRef Builder, LLVMValueRef Inst);
847
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000848/* Terminators */
849LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
850LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
Erick Tryzelaarfd529d72009-08-19 08:36:49 +0000851LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef, LLVMValueRef *RetVals,
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000852 unsigned N);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000853LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
854LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
855 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
856LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
857 LLVMBasicBlockRef Else, unsigned NumCases);
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +0000858LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
859 unsigned NumDests);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000860LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
861 LLVMValueRef *Args, unsigned NumArgs,
862 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
863 const char *Name);
Benjamin Kramer5a6568832011-08-19 01:36:54 +0000864LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,
865 LLVMValueRef PersFn, unsigned NumClauses,
866 const char *Name);
Bill Wendlingf891bf82011-07-31 06:30:59 +0000867LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000868LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
869
Gordon Henriksen097102c2008-01-01 05:50:53 +0000870/* Add a case to the switch instruction */
871void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
872 LLVMBasicBlockRef Dest);
873
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +0000874/* Add a destination to the indirectbr instruction */
875void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest);
876
Bill Wendlingfae14752011-08-12 20:24:12 +0000877/* Add a catch or filter clause to the landingpad instruction */
878void LLVMAddClause(LLVMValueRef LandingPad, LLVMValueRef ClauseVal);
879
880/* Set the 'cleanup' flag in the landingpad instruction */
881void LLVMSetCleanup(LLVMValueRef LandingPad, LLVMBool Val);
882
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000883/* Arithmetic */
884LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
885 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000886LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
887 const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000888LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
889 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000890LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
891 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000892LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
893 const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000894LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
895 const char *Name);
896LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
897 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000898LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
899 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000900LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
901 const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000902LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
903 const char *Name);
904LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
905 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000906LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
907 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000908LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
909 const char *Name);
910LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
911 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000912LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
913 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000914LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
915 const char *Name);
916LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
917 const char *Name);
918LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
919 const char *Name);
920LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
921 const char *Name);
922LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
923 const char *Name);
924LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
925 const char *Name);
926LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
927 const char *Name);
928LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
929 const char *Name);
930LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
931 const char *Name);
932LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
933 const char *Name);
Erick Tryzelaar31831792010-02-28 05:51:27 +0000934LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op,
935 LLVMValueRef LHS, LLVMValueRef RHS,
936 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000937LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000938LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
939 const char *Name);
940LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V,
941 const char *Name);
Dan Gohmanf919bd62009-09-28 21:51:41 +0000942LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000943LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
944
945/* Memory */
946LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
947LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
948 LLVMValueRef Val, const char *Name);
949LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
950LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
951 LLVMValueRef Val, const char *Name);
952LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
953LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
954 const char *Name);
955LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
956LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
957 LLVMValueRef *Indices, unsigned NumIndices,
958 const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000959LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
960 LLVMValueRef *Indices, unsigned NumIndices,
961 const char *Name);
962LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
963 unsigned Idx, const char *Name);
964LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
965 const char *Name);
966LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
967 const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000968
969/* Casts */
970LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
971 LLVMTypeRef DestTy, const char *Name);
972LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
973 LLVMTypeRef DestTy, const char *Name);
974LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
975 LLVMTypeRef DestTy, const char *Name);
976LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
977 LLVMTypeRef DestTy, const char *Name);
978LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
979 LLVMTypeRef DestTy, const char *Name);
980LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
981 LLVMTypeRef DestTy, const char *Name);
982LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
983 LLVMTypeRef DestTy, const char *Name);
984LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
985 LLVMTypeRef DestTy, const char *Name);
986LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
987 LLVMTypeRef DestTy, const char *Name);
988LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
989 LLVMTypeRef DestTy, const char *Name);
990LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
991 LLVMTypeRef DestTy, const char *Name);
992LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
993 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +0000994LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
995 LLVMTypeRef DestTy, const char *Name);
996LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
997 LLVMTypeRef DestTy, const char *Name);
998LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
999 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar31831792010-02-28 05:51:27 +00001000LLVMValueRef LLVMBuildCast(LLVMBuilderRef B, LLVMOpcode Op, LLVMValueRef Val,
1001 LLVMTypeRef DestTy, const char *Name);
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00001002LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef, LLVMValueRef Val,
1003 LLVMTypeRef DestTy, const char *Name);
Duncan Sands9d786d72009-11-23 10:49:03 +00001004LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef, LLVMValueRef Val, /*Signed cast!*/
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00001005 LLVMTypeRef DestTy, const char *Name);
1006LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef, LLVMValueRef Val,
1007 LLVMTypeRef DestTy, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001008
1009/* Comparisons */
1010LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
1011 LLVMValueRef LHS, LLVMValueRef RHS,
1012 const char *Name);
1013LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
1014 LLVMValueRef LHS, LLVMValueRef RHS,
1015 const char *Name);
1016
1017/* Miscellaneous instructions */
1018LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
1019LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
1020 LLVMValueRef *Args, unsigned NumArgs,
1021 const char *Name);
1022LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
1023 LLVMValueRef Then, LLVMValueRef Else,
1024 const char *Name);
1025LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
1026 const char *Name);
1027LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
1028 LLVMValueRef Index, const char *Name);
1029LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
1030 LLVMValueRef EltVal, LLVMValueRef Index,
1031 const char *Name);
1032LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
1033 LLVMValueRef V2, LLVMValueRef Mask,
1034 const char *Name);
Dan Gohmand5104a52008-11-03 22:55:43 +00001035LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
1036 unsigned Index, const char *Name);
1037LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
1038 LLVMValueRef EltVal, unsigned Index,
1039 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +00001040
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00001041LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val,
1042 const char *Name);
1043LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef, LLVMValueRef Val,
1044 const char *Name);
1045LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef, LLVMValueRef LHS,
1046 LLVMValueRef RHS, const char *Name);
1047
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001048
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001049/*===-- Module providers --------------------------------------------------===*/
1050
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001051/* Changes the type of M so it can be passed to FunctionPassManagers and the
1052 * JIT. They take ModuleProviders for historical reasons.
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001053 */
1054LLVMModuleProviderRef
1055LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
1056
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001057/* Destroys the module M.
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001058 */
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001059void LLVMDisposeModuleProvider(LLVMModuleProviderRef M);
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001060
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001061
1062/*===-- Memory buffers ----------------------------------------------------===*/
1063
Chris Lattner25963c62010-01-09 22:27:07 +00001064LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
1065 LLVMMemoryBufferRef *OutMemBuf,
1066 char **OutMessage);
1067LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
1068 char **OutMessage);
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001069void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
1070
Owen Anderson4698c5d2010-10-07 17:55:47 +00001071/*===-- Pass Registry -----------------------------------------------------===*/
1072
1073/** Return the global pass registry, for use with initialization functions.
1074 See llvm::PassRegistry::getPassRegistry. */
1075LLVMPassRegistryRef LLVMGetGlobalPassRegistry(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001076
1077/*===-- Pass Managers -----------------------------------------------------===*/
1078
1079/** Constructs a new whole-module pass pipeline. This type of pipeline is
1080 suitable for link-time optimization and whole-module transformations.
1081 See llvm::PassManager::PassManager. */
Gordon Henriksena735a9c2008-05-04 12:55:34 +00001082LLVMPassManagerRef LLVMCreatePassManager(void);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001083
1084/** Constructs a new function-by-function pass pipeline over the module
1085 provider. It does not take ownership of the module provider. This type of
1086 pipeline is suitable for code generation and JIT compilation tasks.
1087 See llvm::FunctionPassManager::FunctionPassManager. */
Erick Tryzelaarad0e0cb2010-03-02 23:58:54 +00001088LLVMPassManagerRef LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M);
1089
1090/** Deprecated: Use LLVMCreateFunctionPassManagerForModule instead. */
Gordon Henriksen878114b2008-03-16 04:20:44 +00001091LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
1092
1093/** Initializes, executes on the provided module, and finalizes all of the
1094 passes scheduled in the pass manager. Returns 1 if any of the passes
1095 modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
Chris Lattner25963c62010-01-09 22:27:07 +00001096LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001097
1098/** Initializes all of the function passes scheduled in the function pass
1099 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
1100 See llvm::FunctionPassManager::doInitialization. */
Chris Lattner25963c62010-01-09 22:27:07 +00001101LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001102
1103/** Executes all of the function passes scheduled in the function pass manager
1104 on the provided function. Returns 1 if any of the passes modified the
1105 function, false otherwise.
1106 See llvm::FunctionPassManager::run(Function&). */
Chris Lattner25963c62010-01-09 22:27:07 +00001107LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001108
1109/** Finalizes all of the function passes scheduled in in the function pass
1110 manager. Returns 1 if any of the passes modified the module, 0 otherwise.
1111 See llvm::FunctionPassManager::doFinalization. */
Chris Lattner25963c62010-01-09 22:27:07 +00001112LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
Gordon Henriksen878114b2008-03-16 04:20:44 +00001113
1114/** Frees the memory of a pass pipeline. For function pipelines, does not free
1115 the module provider.
1116 See llvm::PassManagerBase::~PassManagerBase. */
1117void LLVMDisposePassManager(LLVMPassManagerRef PM);
1118
1119
Gordon Henriksen76a03742007-09-18 03:18:57 +00001120#ifdef __cplusplus
1121}
Gordon Henriksen76a03742007-09-18 03:18:57 +00001122
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001123namespace llvm {
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001124 class MemoryBuffer;
Gordon Henriksen96571492008-03-16 15:55:43 +00001125 class PassManagerBase;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00001126
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001127 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1128 inline ty *unwrap(ref P) { \
1129 return reinterpret_cast<ty*>(P); \
1130 } \
1131 \
1132 inline ref wrap(const ty *P) { \
1133 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
1134 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001135
Gordon Henriksen878114b2008-03-16 04:20:44 +00001136 #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref) \
1137 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1138 \
1139 template<typename T> \
1140 inline T *unwrap(ref P) { \
1141 return cast<T>(unwrap(P)); \
1142 }
1143
1144 #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref) \
1145 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
1146 \
1147 template<typename T> \
1148 inline T *unwrap(ref P) { \
Chris Lattner7ba06612010-01-22 06:49:46 +00001149 T *Q = (T*)unwrap(P); \
Gordon Henriksen878114b2008-03-16 04:20:44 +00001150 assert(Q && "Invalid cast!"); \
1151 return Q; \
1152 }
1153
1154 DEFINE_ISA_CONVERSION_FUNCTIONS (Type, LLVMTypeRef )
1155 DEFINE_ISA_CONVERSION_FUNCTIONS (Value, LLVMValueRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001156 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
1157 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
Eric Christopher59278832008-08-08 19:39:37 +00001158 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef )
Gordon Henriksen823f9732007-12-27 18:25:59 +00001159 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Owen Anderson6773d382009-07-01 16:58:40 +00001160 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMContext, LLVMContextRef )
Erick Tryzelaar9f9857e2010-03-02 20:32:28 +00001161 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Use, LLVMUseRef )
Gordon Henriksen878114b2008-03-16 04:20:44 +00001162 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef )
Owen Anderson4698c5d2010-10-07 17:55:47 +00001163 DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassRegistry, LLVMPassRegistryRef )
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001164 /* LLVMModuleProviderRef exists for historical reasons, but now just holds a
1165 * Module.
1166 */
1167 inline Module *unwrap(LLVMModuleProviderRef MP) {
1168 return reinterpret_cast<Module*>(MP);
1169 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001170
Gordon Henriksen878114b2008-03-16 04:20:44 +00001171 #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS
1172 #undef DEFINE_ISA_CONVERSION_FUNCTIONS
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001173 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001174
1175 /* Specialized opaque context conversions.
1176 */
1177 inline LLVMContext **unwrap(LLVMContextRef* Tys) {
1178 return reinterpret_cast<LLVMContext**>(Tys);
1179 }
1180
1181 inline LLVMContextRef *wrap(const LLVMContext **Tys) {
1182 return reinterpret_cast<LLVMContextRef*>(const_cast<LLVMContext**>(Tys));
1183 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001184
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001185 /* Specialized opaque type conversions.
1186 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001187 inline Type **unwrap(LLVMTypeRef* Tys) {
1188 return reinterpret_cast<Type**>(Tys);
1189 }
1190
Chris Lattner229907c2011-07-18 04:54:35 +00001191 inline LLVMTypeRef *wrap(Type **Tys) {
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001192 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
1193 }
1194
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00001195 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001196 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001197 inline Value **unwrap(LLVMValueRef *Vals) {
1198 return reinterpret_cast<Value**>(Vals);
1199 }
1200
1201 template<typename T>
1202 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
1203 #if DEBUG
Chris Lattnerb7971152009-07-10 18:28:19 +00001204 for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I)
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001205 cast<T>(*I);
1206 #endif
Hans Wennborg8f7edbf2011-06-04 16:00:19 +00001207 (void)Length;
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001208 return reinterpret_cast<T**>(Vals);
1209 }
1210
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001211 inline LLVMValueRef *wrap(const Value **Vals) {
1212 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
1213 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +00001214}
1215
1216#endif /* !defined(__cplusplus) */
1217
1218#endif /* !defined(LLVM_C_CORE_H) */