blob: 9b11df519318b7fce3144ce9d12619be6161be70 [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
36#ifdef __cplusplus
Gordon Henriksen7330acd2007-10-05 23:59:36 +000037
38/* Need these includes to support the LLVM 'cast' template for the C++ 'wrap'
39 and 'unwrap' conversion functions. */
40#include "llvm/Module.h"
41#include "llvm/Support/LLVMBuilder.h"
42
Gordon Henriksen76a03742007-09-18 03:18:57 +000043extern "C" {
44#endif
45
46
47/* Opaque types. */
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000048
49/**
50 * The top-level container for all other LLVM Intermediate Representation (IR)
51 * objects. See the llvm::Module class.
52 */
Gordon Henriksen76a03742007-09-18 03:18:57 +000053typedef struct LLVMOpaqueModule *LLVMModuleRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000054
55/**
56 * Each value in the LLVM IR has a type, an instance of [lltype]. See the
57 * llvm::Type class.
58 */
Gordon Henriksen76a03742007-09-18 03:18:57 +000059typedef struct LLVMOpaqueType *LLVMTypeRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000060
61/**
62 * When building recursive types using [refine_type], [lltype] values may become
63 * invalid; use [lltypehandle] to resolve this problem. See the
64 * llvm::AbstractTypeHolder] class.
65 */
Gordon Henriksenffb48762007-10-07 00:13:35 +000066typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000067
Gordon Henriksen76a03742007-09-18 03:18:57 +000068typedef struct LLVMOpaqueValue *LLVMValueRef;
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000069typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
70typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000071
72/* Used to provide a module to JIT or interpreter.
73 * See the llvm::ModuleProvider class.
74 */
Gordon Henriksen0a68fe22007-12-12 01:04:30 +000075typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef;
Gordon Henriksen76a03742007-09-18 03:18:57 +000076
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000077/* Used to provide a module to JIT or interpreter.
78 * See the llvm::MemoryBuffer class.
79 */
80typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef;
81
Gordon Henriksen76a03742007-09-18 03:18:57 +000082typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +000083 LLVMVoidTypeKind, /**< type with no size */
84 LLVMFloatTypeKind, /**< 32 bit floating point type */
85 LLVMDoubleTypeKind, /**< 64 bit floating point type */
86 LLVMX86_FP80TypeKind, /**< 80 bit floating point type (X87) */
87 LLVMFP128TypeKind, /**< 128 bit floating point type (112-bit mantissa)*/
88 LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */
89 LLVMLabelTypeKind, /**< Labels */
90 LLVMIntegerTypeKind, /**< Arbitrary bit width integers */
91 LLVMFunctionTypeKind, /**< Functions */
92 LLVMStructTypeKind, /**< Structures */
93 LLVMArrayTypeKind, /**< Arrays */
94 LLVMPointerTypeKind, /**< Pointers */
95 LLVMOpaqueTypeKind, /**< Opaque: type with unknown structure */
96 LLVMVectorTypeKind /**< SIMD 'packed' format, or other vector type */
Gordon Henriksen76a03742007-09-18 03:18:57 +000097} LLVMTypeKind;
98
99typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000100 LLVMExternalLinkage, /**< Externally visible function */
101 LLVMLinkOnceLinkage, /**< Keep one copy of function when linking (inline)*/
102 LLVMWeakLinkage, /**< Keep one copy of function when linking (weak) */
103 LLVMAppendingLinkage, /**< Special purpose, only applies to global arrays */
104 LLVMInternalLinkage, /**< Rename collisions when linking (static
105 functions) */
106 LLVMDLLImportLinkage, /**< Function to be imported from DLL */
107 LLVMDLLExportLinkage, /**< Function to be accessible from DLL */
108 LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
109 LLVMGhostLinkage /**< Stand-in functions for streaming fns from
110 bitcode */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000111} LLVMLinkage;
112
113typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000114 LLVMDefaultVisibility, /**< The GV is visible */
115 LLVMHiddenVisibility, /**< The GV is hidden */
116 LLVMProtectedVisibility /**< The GV is protected */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000117} LLVMVisibility;
118
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000119typedef enum {
120 LLVMCCallConv = 0,
121 LLVMFastCallConv = 8,
122 LLVMColdCallConv = 9,
123 LLVMX86StdcallCallConv = 64,
124 LLVMX86FastcallCallConv = 65
125} LLVMCallConv;
126
127typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000128 LLVMIntEQ = 32, /**< equal */
129 LLVMIntNE, /**< not equal */
130 LLVMIntUGT, /**< unsigned greater than */
131 LLVMIntUGE, /**< unsigned greater or equal */
132 LLVMIntULT, /**< unsigned less than */
133 LLVMIntULE, /**< unsigned less or equal */
134 LLVMIntSGT, /**< signed greater than */
135 LLVMIntSGE, /**< signed greater or equal */
136 LLVMIntSLT, /**< signed less than */
137 LLVMIntSLE /**< signed less or equal */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000138} LLVMIntPredicate;
139
140typedef enum {
Gordon Henriksen4a4d7352007-12-30 17:46:33 +0000141 LLVMRealPredicateFalse, /**< Always false (always folded) */
142 LLVMRealOEQ, /**< True if ordered and equal */
143 LLVMRealOGT, /**< True if ordered and greater than */
144 LLVMRealOGE, /**< True if ordered and greater than or equal */
145 LLVMRealOLT, /**< True if ordered and less than */
146 LLVMRealOLE, /**< True if ordered and less than or equal */
147 LLVMRealONE, /**< True if ordered and operands are unequal */
148 LLVMRealORD, /**< True if ordered (no nans) */
149 LLVMRealUNO, /**< True if unordered: isnan(X) | isnan(Y) */
150 LLVMRealUEQ, /**< True if unordered or equal */
151 LLVMRealUGT, /**< True if unordered or greater than */
152 LLVMRealUGE, /**< True if unordered, greater than, or equal */
153 LLVMRealULT, /**< True if unordered or less than */
154 LLVMRealULE, /**< True if unordered, less than, or equal */
155 LLVMRealUNE, /**< True if unordered or not equal */
156 LLVMRealPredicateTrue /**< Always true (always folded) */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000157} LLVMRealPredicate;
158
Gordon Henriksen76a03742007-09-18 03:18:57 +0000159
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000160/*===-- Error handling ----------------------------------------------------===*/
161
162void LLVMDisposeMessage(char *Message);
163
164
Gordon Henriksen76a03742007-09-18 03:18:57 +0000165/*===-- Modules -----------------------------------------------------------===*/
166
167/* Create and destroy modules. */
168LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
169void LLVMDisposeModule(LLVMModuleRef M);
170
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000171/* Data layout */
172const char *LLVMGetDataLayout(LLVMModuleRef M);
173void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple);
174
175/* Target triple */
176const char *LLVMGetTarget(LLVMModuleRef M);
177void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
178
Gordon Henriksen76a03742007-09-18 03:18:57 +0000179/* Same as Module::addTypeName. */
180int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000181void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000182
183
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000184/*===-- Types -------------------------------------------------------------===*/
Gordon Henriksen76a03742007-09-18 03:18:57 +0000185
186/* LLVM types conform to the following hierarchy:
187 *
188 * types:
189 * integer type
190 * real type
191 * function type
192 * sequence types:
193 * array type
194 * pointer type
195 * vector type
196 * void type
197 * label type
198 * opaque type
199 */
200
201LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
202void LLVMRefineAbstractType(LLVMTypeRef AbstractType, LLVMTypeRef ConcreteType);
203
204/* Operations on integer types */
205LLVMTypeRef LLVMInt1Type();
206LLVMTypeRef LLVMInt8Type();
207LLVMTypeRef LLVMInt16Type();
208LLVMTypeRef LLVMInt32Type();
209LLVMTypeRef LLVMInt64Type();
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000210LLVMTypeRef LLVMIntType(unsigned NumBits);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000211unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000212
213/* Operations on real types */
214LLVMTypeRef LLVMFloatType();
215LLVMTypeRef LLVMDoubleType();
216LLVMTypeRef LLVMX86FP80Type();
217LLVMTypeRef LLVMFP128Type();
218LLVMTypeRef LLVMPPCFP128Type();
219
220/* Operations on function types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000221LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
222 LLVMTypeRef *ParamTypes, unsigned ParamCount,
223 int IsVarArg);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000224int LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000225LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
226unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
227void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000228
229/* Operations on struct types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000230LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
231 int Packed);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000232unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000233void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
234int LLVMIsPackedStruct(LLVMTypeRef StructTy);
235
236/* Operations on array, pointer, and vector types (sequence types) */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000237LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000238LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000239LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000240
241LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
242unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000243unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000244unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
245
246/* Operations on other types */
247LLVMTypeRef LLVMVoidType();
248LLVMTypeRef LLVMLabelType();
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000249LLVMTypeRef LLVMOpaqueType();
Gordon Henriksen76a03742007-09-18 03:18:57 +0000250
Gordon Henriksenffb48762007-10-07 00:13:35 +0000251/* Operations on type handles */
252LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
253void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
254LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
255void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
256
Gordon Henriksen76a03742007-09-18 03:18:57 +0000257
258/*===-- Values ------------------------------------------------------------===*/
259
260/* The bulk of LLVM's object model consists of values, which comprise a very
261 * rich type hierarchy.
262 *
263 * values:
264 * constants:
265 * scalar constants
266 * composite contants
267 * globals:
268 * global variable
269 * function
270 * alias
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000271 * basic blocks
Gordon Henriksen76a03742007-09-18 03:18:57 +0000272 */
273
274/* Operations on all values */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000275LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000276const char *LLVMGetValueName(LLVMValueRef Val);
277void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000278void LLVMDumpValue(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000279
280/* Operations on constants of any type */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000281LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
282LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000283LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000284int LLVMIsConstant(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000285int LLVMIsNull(LLVMValueRef Val);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000286int LLVMIsUndef(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000287
288/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000289LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
290 int SignExtend);
291LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen931e1212008-02-02 01:07:50 +0000292LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000293
294/* Operations on composite constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000295LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
296 int DontNullTerminate);
297LLVMValueRef LLVMConstArray(LLVMTypeRef ArrayTy,
298 LLVMValueRef *ConstantVals, unsigned Length);
299LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
300 int packed);
301LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000302
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000303/* Constant expressions */
304LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
305LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
306LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
307LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
308LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
309LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
310LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
311LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
312LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
313LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
314LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
315LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
316LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
317LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
318LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
319LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
320 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
321LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
322 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
323LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
324LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
325LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
326LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
327 LLVMValueRef *ConstantIndices, unsigned NumIndices);
328LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
329LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
330LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
331LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
332LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
333LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
334LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
335LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
336LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
337LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
338LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
339LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
340LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
341 LLVMValueRef ConstantIfTrue,
342 LLVMValueRef ConstantIfFalse);
343LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
344 LLVMValueRef IndexConstant);
345LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
346 LLVMValueRef ElementValueConstant,
347 LLVMValueRef IndexConstant);
348LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
349 LLVMValueRef VectorBConstant,
350 LLVMValueRef MaskConstant);
351
Gordon Henriksen76a03742007-09-18 03:18:57 +0000352/* Operations on global variables, functions, and aliases (globals) */
353int LLVMIsDeclaration(LLVMValueRef Global);
354LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
355void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
356const char *LLVMGetSection(LLVMValueRef Global);
357void LLVMSetSection(LLVMValueRef Global, const char *Section);
358LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
359void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
360unsigned LLVMGetAlignment(LLVMValueRef Global);
361void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
362
363/* Operations on global variables */
364LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000365LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000366void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
367int LLVMHasInitializer(LLVMValueRef GlobalVar);
368LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
369void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
370int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
371void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
Gordon Henriksen751ebf72007-10-07 17:31:42 +0000372int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
373void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000374
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000375/* Operations on functions */
376LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
377 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000378LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000379void LLVMDeleteFunction(LLVMValueRef Fn);
380unsigned LLVMCountParams(LLVMValueRef Fn);
381void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
382LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
383unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
384unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
385void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksen71183b62007-12-10 03:18:06 +0000386const char *LLVMGetCollector(LLVMValueRef Fn);
387void LLVMSetCollector(LLVMValueRef Fn, const char *Coll);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000388
389/* Operations on basic blocks */
390LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef Bb);
391int LLVMValueIsBasicBlock(LLVMValueRef Val);
392LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
393unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
394void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
395LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
396LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
397LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
398 const char *Name);
399void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
400
Gordon Henriksen1158c532007-12-29 20:45:00 +0000401/* Operations on call sites */
402void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
403unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
404
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000405/* Operations on phi nodes */
406void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
407 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
408unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
409LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
410LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000411
412/*===-- Instruction builders ----------------------------------------------===*/
413
414/* An instruction builder represents a point within a basic block, and is the
415 * exclusive means of building instructions using the C interface.
416 */
417
418LLVMBuilderRef LLVMCreateBuilder();
419void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
420void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
421void LLVMDisposeBuilder(LLVMBuilderRef Builder);
422
423/* Terminators */
424LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
425LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
426LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
427LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
428 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
429LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
430 LLVMBasicBlockRef Else, unsigned NumCases);
431LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
432 LLVMValueRef *Args, unsigned NumArgs,
433 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
434 const char *Name);
435LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
436LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
437
Gordon Henriksen097102c2008-01-01 05:50:53 +0000438/* Add a case to the switch instruction */
439void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
440 LLVMBasicBlockRef Dest);
441
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000442/* Arithmetic */
443LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
444 const char *Name);
445LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
446 const char *Name);
447LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
448 const char *Name);
449LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
450 const char *Name);
451LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
452 const char *Name);
453LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
454 const char *Name);
455LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
456 const char *Name);
457LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
458 const char *Name);
459LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
460 const char *Name);
461LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
462 const char *Name);
463LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
464 const char *Name);
465LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
466 const char *Name);
467LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
468 const char *Name);
469LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
470 const char *Name);
471LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
472 const char *Name);
473LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
474LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
475
476/* Memory */
477LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
478LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
479 LLVMValueRef Val, const char *Name);
480LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
481LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
482 LLVMValueRef Val, const char *Name);
483LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
484LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
485 const char *Name);
486LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
487LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
488 LLVMValueRef *Indices, unsigned NumIndices,
489 const char *Name);
490
491/* Casts */
492LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
493 LLVMTypeRef DestTy, const char *Name);
494LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
495 LLVMTypeRef DestTy, const char *Name);
496LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
497 LLVMTypeRef DestTy, const char *Name);
498LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
499 LLVMTypeRef DestTy, const char *Name);
500LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
501 LLVMTypeRef DestTy, const char *Name);
502LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
503 LLVMTypeRef DestTy, const char *Name);
504LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
505 LLVMTypeRef DestTy, const char *Name);
506LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
507 LLVMTypeRef DestTy, const char *Name);
508LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
509 LLVMTypeRef DestTy, const char *Name);
510LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
511 LLVMTypeRef DestTy, const char *Name);
512LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
513 LLVMTypeRef DestTy, const char *Name);
514LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
515 LLVMTypeRef DestTy, const char *Name);
516
517/* Comparisons */
518LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
519 LLVMValueRef LHS, LLVMValueRef RHS,
520 const char *Name);
521LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
522 LLVMValueRef LHS, LLVMValueRef RHS,
523 const char *Name);
524
525/* Miscellaneous instructions */
526LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
527LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
528 LLVMValueRef *Args, unsigned NumArgs,
529 const char *Name);
530LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
531 LLVMValueRef Then, LLVMValueRef Else,
532 const char *Name);
533LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
534 const char *Name);
535LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
536 LLVMValueRef Index, const char *Name);
537LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
538 LLVMValueRef EltVal, LLVMValueRef Index,
539 const char *Name);
540LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
541 LLVMValueRef V2, LLVMValueRef Mask,
542 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000543
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000544
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000545/*===-- Module providers --------------------------------------------------===*/
546
547/* Encapsulates the module M in a module provider, taking ownership of the
548 * module.
549 * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
550 */
551LLVMModuleProviderRef
552LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
553
554/* Destroys the module provider MP as well as the contained module.
555 * See the destructor llvm::ModuleProvider::~ModuleProvider.
556 */
557void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
558
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000559
560/*===-- Memory buffers ----------------------------------------------------===*/
561
562int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
563 LLVMMemoryBufferRef *OutMemBuf,
564 char **OutMessage);
565int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
566 char **OutMessage);
567void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
568
Gordon Henriksen76a03742007-09-18 03:18:57 +0000569#ifdef __cplusplus
570}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000571
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000572namespace llvm {
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000573 class ModuleProvider;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000574 class MemoryBuffer;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000575
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000576 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
577 inline ty *unwrap(ref P) { \
578 return reinterpret_cast<ty*>(P); \
579 } \
580 \
581 inline ref wrap(const ty *P) { \
582 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
583 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000584
Gordon Henriksen823f9732007-12-27 18:25:59 +0000585 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Type, LLVMTypeRef )
586 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Value, LLVMValueRef )
587 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
588 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
589 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMFoldingBuilder, LLVMBuilderRef )
590 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
591 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider, LLVMModuleProviderRef)
592 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000593
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000594 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000595
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000596 /* Specialized opaque type conversions.
597 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000598 template<typename T>
599 inline T *unwrap(LLVMTypeRef Ty) {
600 return cast<T>(unwrap(Ty));
601 }
602
603 inline Type **unwrap(LLVMTypeRef* Tys) {
604 return reinterpret_cast<Type**>(Tys);
605 }
606
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000607 inline LLVMTypeRef *wrap(const Type **Tys) {
608 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
609 }
610
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000611 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000612 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000613 template<typename T>
614 inline T *unwrap(LLVMValueRef Val) {
615 return cast<T>(unwrap(Val));
616 }
617
618 inline Value **unwrap(LLVMValueRef *Vals) {
619 return reinterpret_cast<Value**>(Vals);
620 }
621
622 template<typename T>
623 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
624 #if DEBUG
625 for (LLVMValueRef *I = Vals, E = Vals + Length; I != E; ++I)
626 cast<T>(*I);
627 #endif
628 return reinterpret_cast<T**>(Vals);
629 }
630
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000631 inline LLVMValueRef *wrap(const Value **Vals) {
632 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
633 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000634}
635
636#endif /* !defined(__cplusplus) */
637
638#endif /* !defined(LLVM_C_CORE_H) */