600bda6fa572a23237a864479b2fb95f22e04121
[oota-llvm.git] / lib / VMCore / Core.cpp
1 //===-- Core.cpp ----------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the C bindings for libLLVMCore.a, which implements
11 // the LLVM intermediate representation.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm-c/Core.h"
16 #include "llvm/Bitcode/ReaderWriter.h"
17 #include "llvm/Constants.h"
18 #include "llvm/DerivedTypes.h"
19 #include "llvm/GlobalVariable.h"
20 #include "llvm/GlobalAlias.h"
21 #include "llvm/LLVMContext.h"
22 #include "llvm/TypeSymbolTable.h"
23 #include "llvm/ModuleProvider.h"
24 #include "llvm/InlineAsm.h"
25 #include "llvm/IntrinsicInst.h"
26 #include "llvm/Support/MemoryBuffer.h"
27 #include "llvm/Support/CallSite.h"
28 #include "llvm/Support/ErrorHandling.h"
29 #include <cassert>
30 #include <cstdlib>
31 #include <cstring>
32
33 using namespace llvm;
34
35
36 /*===-- Error handling ----------------------------------------------------===*/
37
38 void LLVMDisposeMessage(char *Message) {
39   free(Message);
40 }
41
42
43 /*===-- Operations on contexts --------------------------------------------===*/
44
45 LLVMContextRef LLVMContextCreate() {
46   return wrap(new LLVMContext());
47 }
48
49 LLVMContextRef LLVMGetGlobalContext() {
50   return wrap(&getGlobalContext());
51 }
52
53 void LLVMContextDispose(LLVMContextRef C) {
54   delete unwrap(C);
55 }
56
57
58 /*===-- Operations on modules ---------------------------------------------===*/
59
60 LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) {
61   return wrap(new Module(ModuleID, getGlobalContext()));
62 }
63
64 LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID, 
65                                                 LLVMContextRef C) {
66   return wrap(new Module(ModuleID, *unwrap(C)));
67 }
68
69 void LLVMDisposeModule(LLVMModuleRef M) {
70   delete unwrap(M);
71 }
72
73 /*--.. Data layout .........................................................--*/
74 const char * LLVMGetDataLayout(LLVMModuleRef M) {
75   return unwrap(M)->getDataLayout().c_str();
76 }
77
78 void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple) {
79   unwrap(M)->setDataLayout(Triple);
80 }
81
82 /*--.. Target triple .......................................................--*/
83 const char * LLVMGetTarget(LLVMModuleRef M) {
84   return unwrap(M)->getTargetTriple().c_str();
85 }
86
87 void LLVMSetTarget(LLVMModuleRef M, const char *Triple) {
88   unwrap(M)->setTargetTriple(Triple);
89 }
90
91 /*--.. Type names ..........................................................--*/
92 int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty) {
93   return unwrap(M)->addTypeName(Name, unwrap(Ty));
94 }
95
96 void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name) {
97   std::string N(Name);
98   
99   TypeSymbolTable &TST = unwrap(M)->getTypeSymbolTable();
100   for (TypeSymbolTable::iterator I = TST.begin(), E = TST.end(); I != E; ++I)
101     if (I->first == N)
102       TST.remove(I);
103 }
104
105 LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) {
106   std::string N(Name);
107   return wrap(unwrap(M)->getTypeByName(N));
108 }
109
110 void LLVMDumpModule(LLVMModuleRef M) {
111   unwrap(M)->dump();
112 }
113
114
115 /*===-- Operations on types -----------------------------------------------===*/
116
117 /*--.. Operations on all types (mostly) ....................................--*/
118
119 LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty) {
120   switch (unwrap(Ty)->getTypeID()) {
121   case Type::VoidTyID:
122     return LLVMVoidTypeKind;
123   case Type::FloatTyID:
124     return LLVMFloatTypeKind;
125   case Type::DoubleTyID:
126     return LLVMDoubleTypeKind;
127   case Type::X86_FP80TyID:
128     return LLVMX86_FP80TypeKind;
129   case Type::FP128TyID:
130     return LLVMFP128TypeKind;
131   case Type::PPC_FP128TyID:
132     return LLVMPPC_FP128TypeKind;
133   case Type::LabelTyID:
134     return LLVMLabelTypeKind;
135   case Type::MetadataTyID:
136     return LLVMMetadataTypeKind;
137   case Type::IntegerTyID:
138     return LLVMIntegerTypeKind;
139   case Type::FunctionTyID:
140     return LLVMFunctionTypeKind;
141   case Type::StructTyID:
142     return LLVMStructTypeKind;
143   case Type::ArrayTyID:
144     return LLVMArrayTypeKind;
145   case Type::PointerTyID:
146     return LLVMPointerTypeKind;
147   case Type::OpaqueTyID:
148     return LLVMOpaqueTypeKind;
149   case Type::VectorTyID:
150     return LLVMVectorTypeKind;
151   default:
152     assert (false && "Unhandled TypeID.");
153   }
154 }
155
156 /*--.. Operations on integer types .........................................--*/
157
158 LLVMTypeRef LLVMInt1Type(void)  { return (LLVMTypeRef) Type::Int1Ty;  }
159 LLVMTypeRef LLVMInt8Type(void)  { return (LLVMTypeRef) Type::Int8Ty;  }
160 LLVMTypeRef LLVMInt16Type(void) { return (LLVMTypeRef) Type::Int16Ty; }
161 LLVMTypeRef LLVMInt32Type(void) { return (LLVMTypeRef) Type::Int32Ty; }
162 LLVMTypeRef LLVMInt64Type(void) { return (LLVMTypeRef) Type::Int64Ty; }
163
164 LLVMTypeRef LLVMIntType(unsigned NumBits) {
165   return wrap(getGlobalContext().getIntegerType(NumBits));
166 }
167
168 unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy) {
169   return unwrap<IntegerType>(IntegerTy)->getBitWidth();
170 }
171
172 /*--.. Operations on real types ............................................--*/
173
174 LLVMTypeRef LLVMFloatType(void)    { return (LLVMTypeRef) Type::FloatTy;     }
175 LLVMTypeRef LLVMDoubleType(void)   { return (LLVMTypeRef) Type::DoubleTy;    }
176 LLVMTypeRef LLVMX86FP80Type(void)  { return (LLVMTypeRef) Type::X86_FP80Ty;  }
177 LLVMTypeRef LLVMFP128Type(void)    { return (LLVMTypeRef) Type::FP128Ty;     }
178 LLVMTypeRef LLVMPPCFP128Type(void) { return (LLVMTypeRef) Type::PPC_FP128Ty; }
179
180 /*--.. Operations on function types ........................................--*/
181
182 LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
183                              LLVMTypeRef *ParamTypes, unsigned ParamCount,
184                              int IsVarArg) {
185   std::vector<const Type*> Tys;
186   for (LLVMTypeRef *I = ParamTypes, *E = ParamTypes + ParamCount; I != E; ++I)
187     Tys.push_back(unwrap(*I));
188   
189   return wrap(getGlobalContext().getFunctionType(unwrap(ReturnType), Tys,
190                                                  IsVarArg != 0));
191 }
192
193 int LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy) {
194   return unwrap<FunctionType>(FunctionTy)->isVarArg();
195 }
196
197 LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy) {
198   return wrap(unwrap<FunctionType>(FunctionTy)->getReturnType());
199 }
200
201 unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy) {
202   return unwrap<FunctionType>(FunctionTy)->getNumParams();
203 }
204
205 void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest) {
206   FunctionType *Ty = unwrap<FunctionType>(FunctionTy);
207   for (FunctionType::param_iterator I = Ty->param_begin(),
208                                     E = Ty->param_end(); I != E; ++I)
209     *Dest++ = wrap(*I);
210 }
211
212 /*--.. Operations on struct types ..........................................--*/
213
214 LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes,
215                            unsigned ElementCount, int Packed) {
216   std::vector<const Type*> Tys;
217   for (LLVMTypeRef *I = ElementTypes,
218                    *E = ElementTypes + ElementCount; I != E; ++I)
219     Tys.push_back(unwrap(*I));
220   
221   return wrap(getGlobalContext().getStructType(Tys, Packed != 0));
222 }
223
224 unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy) {
225   return unwrap<StructType>(StructTy)->getNumElements();
226 }
227
228 void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest) {
229   StructType *Ty = unwrap<StructType>(StructTy);
230   for (FunctionType::param_iterator I = Ty->element_begin(),
231                                     E = Ty->element_end(); I != E; ++I)
232     *Dest++ = wrap(*I);
233 }
234
235 int LLVMIsPackedStruct(LLVMTypeRef StructTy) {
236   return unwrap<StructType>(StructTy)->isPacked();
237 }
238
239 /*--.. Operations on array, pointer, and vector types (sequence types) .....--*/
240
241 LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) {
242   return wrap(getGlobalContext().getArrayType(unwrap(ElementType), 
243                                                ElementCount));
244 }
245
246 LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace) {
247   return wrap(getGlobalContext().getPointerType(unwrap(ElementType), 
248                                                  AddressSpace));
249 }
250
251 LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) {
252   return wrap(getGlobalContext().getVectorType(unwrap(ElementType), 
253                                                 ElementCount));
254 }
255
256 LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty) {
257   return wrap(unwrap<SequentialType>(Ty)->getElementType());
258 }
259
260 unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) {
261   return unwrap<ArrayType>(ArrayTy)->getNumElements();
262 }
263
264 unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy) {
265   return unwrap<PointerType>(PointerTy)->getAddressSpace();
266 }
267
268 unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy) {
269   return unwrap<VectorType>(VectorTy)->getNumElements();
270 }
271
272 /*--.. Operations on other types ...........................................--*/
273
274 LLVMTypeRef LLVMVoidType(void)  { return (LLVMTypeRef) Type::VoidTy;  }
275 LLVMTypeRef LLVMLabelType(void) { return (LLVMTypeRef) Type::LabelTy; }
276
277 LLVMTypeRef LLVMOpaqueType(void) {
278   return wrap(getGlobalContext().getOpaqueType());
279 }
280
281 /*--.. Operations on type handles ..........................................--*/
282
283 LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy) {
284   return wrap(new PATypeHolder(unwrap(PotentiallyAbstractTy)));
285 }
286
287 void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle) {
288   delete unwrap(TypeHandle);
289 }
290
291 LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle) {
292   return wrap(unwrap(TypeHandle)->get());
293 }
294
295 void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy) {
296   unwrap<DerivedType>(AbstractTy)->refineAbstractTypeTo(unwrap(ConcreteTy));
297 }
298
299
300 /*===-- Operations on values ----------------------------------------------===*/
301
302 /*--.. Operations on all values ............................................--*/
303
304 LLVMTypeRef LLVMTypeOf(LLVMValueRef Val) {
305   return wrap(unwrap(Val)->getType());
306 }
307
308 const char *LLVMGetValueName(LLVMValueRef Val) {
309   return unwrap(Val)->getNameStart();
310 }
311
312 void LLVMSetValueName(LLVMValueRef Val, const char *Name) {
313   unwrap(Val)->setName(Name);
314 }
315
316 void LLVMDumpValue(LLVMValueRef Val) {
317   unwrap(Val)->dump();
318 }
319
320
321 /*--.. Conversion functions ................................................--*/
322
323 #define LLVM_DEFINE_VALUE_CAST(name)                                       \
324   LLVMValueRef LLVMIsA##name(LLVMValueRef Val) {                           \
325     return wrap(static_cast<Value*>(dyn_cast_or_null<name>(unwrap(Val)))); \
326   }
327
328 LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST)
329
330
331 /*--.. Operations on constants of any type .................................--*/
332
333 LLVMValueRef LLVMConstNull(LLVMTypeRef Ty) {
334   return wrap(getGlobalContext().getNullValue(unwrap(Ty)));
335 }
336
337 LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty) {
338   return wrap(getGlobalContext().getAllOnesValue(unwrap(Ty)));
339 }
340
341 LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty) {
342   return wrap(getGlobalContext().getUndef(unwrap(Ty)));
343 }
344
345 int LLVMIsConstant(LLVMValueRef Ty) {
346   return isa<Constant>(unwrap(Ty));
347 }
348
349 int LLVMIsNull(LLVMValueRef Val) {
350   if (Constant *C = dyn_cast<Constant>(unwrap(Val)))
351     return C->isNullValue();
352   return false;
353 }
354
355 int LLVMIsUndef(LLVMValueRef Val) {
356   return isa<UndefValue>(unwrap(Val));
357 }
358
359 LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty) {
360   return
361       wrap(getGlobalContext().getConstantPointerNull(unwrap<PointerType>(Ty)));
362 }
363
364 /*--.. Operations on scalar constants ......................................--*/
365
366 LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
367                           int SignExtend) {
368   return wrap(getGlobalContext().getConstantInt(unwrap<IntegerType>(IntTy), N,
369                                                  SignExtend != 0));
370 }
371
372 static const fltSemantics &SemanticsForType(Type *Ty) {
373   assert(Ty->isFloatingPoint() && "Type is not floating point!");
374   if (Ty == Type::FloatTy)
375     return APFloat::IEEEsingle;
376   if (Ty == Type::DoubleTy)
377     return APFloat::IEEEdouble;
378   if (Ty == Type::X86_FP80Ty)
379     return APFloat::x87DoubleExtended;
380   if (Ty == Type::FP128Ty)
381     return APFloat::IEEEquad;
382   if (Ty == Type::PPC_FP128Ty)
383     return APFloat::PPCDoubleDouble;
384   return APFloat::Bogus;
385 }
386
387 LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) {
388   APFloat APN(N);
389   bool ignored;
390   APN.convert(SemanticsForType(unwrap(RealTy)), APFloat::rmNearestTiesToEven,
391               &ignored);
392   return wrap(getGlobalContext().getConstantFP(APN));
393 }
394
395 LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) {
396   return wrap(getGlobalContext().getConstantFP(
397                               APFloat(SemanticsForType(unwrap(RealTy)), Text)));
398 }
399
400 /*--.. Operations on composite constants ...................................--*/
401
402 LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
403                              int DontNullTerminate) {
404   /* Inverted the sense of AddNull because ', 0)' is a
405      better mnemonic for null termination than ', 1)'. */
406   return wrap(getGlobalContext().getConstantArray(std::string(Str, Length),
407                                  DontNullTerminate == 0));
408 }
409
410 LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
411                             LLVMValueRef *ConstantVals, unsigned Length) {
412   return wrap(getGlobalContext().getConstantArray(
413                     getGlobalContext().getArrayType(unwrap(ElementTy), Length),
414                                  unwrap<Constant>(ConstantVals, Length),
415                                  Length));
416 }
417
418 LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
419                              int Packed) {
420   return wrap(getGlobalContext().getConstantStruct(
421                                   unwrap<Constant>(ConstantVals, Count),
422                                   Count, Packed != 0));
423 }
424
425 LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) {
426   return wrap(getGlobalContext().getConstantVector(
427                             unwrap<Constant>(ScalarConstantVals, Size), Size));
428 }
429
430 /*--.. Constant expressions ................................................--*/
431
432 LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty) {
433   return wrap(getGlobalContext().getConstantExprAlignOf(unwrap(Ty)));
434 }
435
436 LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty) {
437   return wrap(getGlobalContext().getConstantExprSizeOf(unwrap(Ty)));
438 }
439
440 LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal) {
441   return wrap(getGlobalContext().getConstantExprNeg(
442                                                 unwrap<Constant>(ConstantVal)));
443 }
444
445 LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal) {
446   return wrap(getGlobalContext().getConstantExprNot(
447                                                 unwrap<Constant>(ConstantVal)));
448 }
449
450 LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
451   return wrap(getGlobalContext().getConstantExprAdd(
452                                    unwrap<Constant>(LHSConstant),
453                                    unwrap<Constant>(RHSConstant)));
454 }
455
456 LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
457   return wrap(getGlobalContext().getConstantExprSub(
458                                    unwrap<Constant>(LHSConstant),
459                                    unwrap<Constant>(RHSConstant)));
460 }
461
462 LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
463   return wrap(getGlobalContext().getConstantExprMul(
464                                    unwrap<Constant>(LHSConstant),
465                                    unwrap<Constant>(RHSConstant)));
466 }
467
468 LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
469   return wrap(getGlobalContext().getConstantExprUDiv(
470                                     unwrap<Constant>(LHSConstant),
471                                     unwrap<Constant>(RHSConstant)));
472 }
473
474 LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
475   return wrap(getGlobalContext().getConstantExprSDiv(
476                                     unwrap<Constant>(LHSConstant),
477                                     unwrap<Constant>(RHSConstant)));
478 }
479
480 LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
481   return wrap(getGlobalContext().getConstantExprFDiv(
482                                     unwrap<Constant>(LHSConstant),
483                                     unwrap<Constant>(RHSConstant)));
484 }
485
486 LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
487   return wrap(getGlobalContext().getConstantExprURem(
488                                     unwrap<Constant>(LHSConstant),
489                                     unwrap<Constant>(RHSConstant)));
490 }
491
492 LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
493   return wrap(getGlobalContext().getConstantExprSRem(
494                                     unwrap<Constant>(LHSConstant),
495                                     unwrap<Constant>(RHSConstant)));
496 }
497
498 LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
499   return wrap(getGlobalContext().getConstantExprFRem(
500                                     unwrap<Constant>(LHSConstant),
501                                     unwrap<Constant>(RHSConstant)));
502 }
503
504 LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
505   return wrap(getGlobalContext().getConstantExprAnd(
506                                    unwrap<Constant>(LHSConstant),
507                                    unwrap<Constant>(RHSConstant)));
508 }
509
510 LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
511   return wrap(getGlobalContext().getConstantExprOr(
512                                   unwrap<Constant>(LHSConstant),
513                                   unwrap<Constant>(RHSConstant)));
514 }
515
516 LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
517   return wrap(getGlobalContext().getConstantExprXor(
518                                    unwrap<Constant>(LHSConstant),
519                                    unwrap<Constant>(RHSConstant)));
520 }
521
522 LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
523                            LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
524   return wrap(getGlobalContext().getConstantExprICmp(Predicate,
525                                     unwrap<Constant>(LHSConstant),
526                                     unwrap<Constant>(RHSConstant)));
527 }
528
529 LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
530                            LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
531   return wrap(getGlobalContext().getConstantExprFCmp(Predicate,
532                                     unwrap<Constant>(LHSConstant),
533                                     unwrap<Constant>(RHSConstant)));
534 }
535
536 LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
537   return wrap(getGlobalContext().getConstantExprShl(
538                                   unwrap<Constant>(LHSConstant),
539                                   unwrap<Constant>(RHSConstant)));
540 }
541
542 LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
543   return wrap(getGlobalContext().getConstantExprLShr(
544                                     unwrap<Constant>(LHSConstant),
545                                     unwrap<Constant>(RHSConstant)));
546 }
547
548 LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
549   return wrap(getGlobalContext().getConstantExprAShr(
550                                     unwrap<Constant>(LHSConstant),
551                                     unwrap<Constant>(RHSConstant)));
552 }
553
554 LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
555                           LLVMValueRef *ConstantIndices, unsigned NumIndices) {
556   return wrap(getGlobalContext().getConstantExprGetElementPtr(
557                                              unwrap<Constant>(ConstantVal),
558                                              unwrap<Constant>(ConstantIndices, 
559                                                               NumIndices),
560                                              NumIndices));
561 }
562
563 LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
564   return wrap(getGlobalContext().getConstantExprTrunc(
565                                      unwrap<Constant>(ConstantVal),
566                                      unwrap(ToType)));
567 }
568
569 LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
570   return wrap(getGlobalContext().getConstantExprSExt(
571                                     unwrap<Constant>(ConstantVal),
572                                     unwrap(ToType)));
573 }
574
575 LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
576   return wrap(getGlobalContext().getConstantExprZExt(
577                                     unwrap<Constant>(ConstantVal),
578                                     unwrap(ToType)));
579 }
580
581 LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
582   return wrap(getGlobalContext().getConstantExprFPTrunc(
583                                        unwrap<Constant>(ConstantVal),
584                                        unwrap(ToType)));
585 }
586
587 LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
588   return wrap(getGlobalContext().getConstantExprFPExtend(
589                                         unwrap<Constant>(ConstantVal),
590                                         unwrap(ToType)));
591 }
592
593 LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
594   return wrap(getGlobalContext().getConstantExprUIToFP(
595                                       unwrap<Constant>(ConstantVal),
596                                       unwrap(ToType)));
597 }
598
599 LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
600   return wrap(getGlobalContext().getConstantExprSIToFP(unwrap<Constant>(ConstantVal),
601                                       unwrap(ToType)));
602 }
603
604 LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
605   return wrap(getGlobalContext().getConstantExprFPToUI(unwrap<Constant>(ConstantVal),
606                                       unwrap(ToType)));
607 }
608
609 LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
610   return wrap(getGlobalContext().getConstantExprFPToSI(
611                                       unwrap<Constant>(ConstantVal),
612                                       unwrap(ToType)));
613 }
614
615 LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
616   return wrap(getGlobalContext().getConstantExprPtrToInt(
617                                         unwrap<Constant>(ConstantVal),
618                                         unwrap(ToType)));
619 }
620
621 LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
622   return wrap(getGlobalContext().getConstantExprIntToPtr(
623                                         unwrap<Constant>(ConstantVal),
624                                         unwrap(ToType)));
625 }
626
627 LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
628   return wrap(getGlobalContext().getConstantExprBitCast(
629                                        unwrap<Constant>(ConstantVal),
630                                        unwrap(ToType)));
631 }
632
633 LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
634                              LLVMValueRef ConstantIfTrue,
635                              LLVMValueRef ConstantIfFalse) {
636   return wrap(getGlobalContext().getConstantExprSelect(
637                                       unwrap<Constant>(ConstantCondition),
638                                       unwrap<Constant>(ConstantIfTrue),
639                                       unwrap<Constant>(ConstantIfFalse)));
640 }
641
642 LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
643                                      LLVMValueRef IndexConstant) {
644   return wrap(getGlobalContext().getConstantExprExtractElement(
645                                               unwrap<Constant>(VectorConstant),
646                                               unwrap<Constant>(IndexConstant)));
647 }
648
649 LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
650                                     LLVMValueRef ElementValueConstant,
651                                     LLVMValueRef IndexConstant) {
652   return wrap(getGlobalContext().getConstantExprInsertElement(
653                                          unwrap<Constant>(VectorConstant),
654                                          unwrap<Constant>(ElementValueConstant),
655                                              unwrap<Constant>(IndexConstant)));
656 }
657
658 LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
659                                     LLVMValueRef VectorBConstant,
660                                     LLVMValueRef MaskConstant) {
661   return wrap(getGlobalContext().getConstantExprShuffleVector(
662                                              unwrap<Constant>(VectorAConstant),
663                                              unwrap<Constant>(VectorBConstant),
664                                              unwrap<Constant>(MaskConstant)));
665 }
666
667 LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
668                                    unsigned NumIdx) {
669   return wrap(getGlobalContext().getConstantExprExtractValue(
670                                             unwrap<Constant>(AggConstant),
671                                             IdxList, NumIdx));
672 }
673
674 LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
675                                   LLVMValueRef ElementValueConstant,
676                                   unsigned *IdxList, unsigned NumIdx) {
677   return wrap(getGlobalContext().getConstantExprInsertValue(
678                                          unwrap<Constant>(AggConstant),
679                                          unwrap<Constant>(ElementValueConstant),
680                                            IdxList, NumIdx));
681 }
682
683 LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString, 
684                                 const char *Constraints, int HasSideEffects) {
685   return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString, 
686                              Constraints, HasSideEffects));
687 }
688
689 /*--.. Operations on global variables, functions, and aliases (globals) ....--*/
690
691 LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) {
692   return wrap(unwrap<GlobalValue>(Global)->getParent());
693 }
694
695 int LLVMIsDeclaration(LLVMValueRef Global) {
696   return unwrap<GlobalValue>(Global)->isDeclaration();
697 }
698
699 LLVMLinkage LLVMGetLinkage(LLVMValueRef Global) {
700   return static_cast<LLVMLinkage>(unwrap<GlobalValue>(Global)->getLinkage());
701 }
702
703 void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage) {
704   unwrap<GlobalValue>(Global)
705     ->setLinkage(static_cast<GlobalValue::LinkageTypes>(Linkage));
706 }
707
708 const char *LLVMGetSection(LLVMValueRef Global) {
709   return unwrap<GlobalValue>(Global)->getSection().c_str();
710 }
711
712 void LLVMSetSection(LLVMValueRef Global, const char *Section) {
713   unwrap<GlobalValue>(Global)->setSection(Section);
714 }
715
716 LLVMVisibility LLVMGetVisibility(LLVMValueRef Global) {
717   return static_cast<LLVMVisibility>(
718     unwrap<GlobalValue>(Global)->getVisibility());
719 }
720
721 void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz) {
722   unwrap<GlobalValue>(Global)
723     ->setVisibility(static_cast<GlobalValue::VisibilityTypes>(Viz));
724 }
725
726 unsigned LLVMGetAlignment(LLVMValueRef Global) {
727   return unwrap<GlobalValue>(Global)->getAlignment();
728 }
729
730 void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes) {
731   unwrap<GlobalValue>(Global)->setAlignment(Bytes);
732 }
733
734 /*--.. Operations on global variables ......................................--*/
735
736 LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) {
737   return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
738                                  GlobalValue::ExternalLinkage, 0, Name));
739 }
740
741 LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name) {
742   return wrap(unwrap(M)->getNamedGlobal(Name));
743 }
744
745 LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M) {
746   Module *Mod = unwrap(M);
747   Module::global_iterator I = Mod->global_begin();
748   if (I == Mod->global_end())
749     return 0;
750   return wrap(I);
751 }
752
753 LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M) {
754   Module *Mod = unwrap(M);
755   Module::global_iterator I = Mod->global_end();
756   if (I == Mod->global_begin())
757     return 0;
758   return wrap(--I);
759 }
760
761 LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar) {
762   GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
763   Module::global_iterator I = GV;
764   if (++I == GV->getParent()->global_end())
765     return 0;
766   return wrap(I);
767 }
768
769 LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar) {
770   GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
771   Module::global_iterator I = GV;
772   if (I == GV->getParent()->global_begin())
773     return 0;
774   return wrap(--I);
775 }
776
777 void LLVMDeleteGlobal(LLVMValueRef GlobalVar) {
778   unwrap<GlobalVariable>(GlobalVar)->eraseFromParent();
779 }
780
781 LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar) {
782   return wrap(unwrap<GlobalVariable>(GlobalVar)->getInitializer());
783 }
784
785 void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) {
786   unwrap<GlobalVariable>(GlobalVar)
787     ->setInitializer(unwrap<Constant>(ConstantVal));
788 }
789
790 int LLVMIsThreadLocal(LLVMValueRef GlobalVar) {
791   return unwrap<GlobalVariable>(GlobalVar)->isThreadLocal();
792 }
793
794 void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal) {
795   unwrap<GlobalVariable>(GlobalVar)->setThreadLocal(IsThreadLocal != 0);
796 }
797
798 int LLVMIsGlobalConstant(LLVMValueRef GlobalVar) {
799   return unwrap<GlobalVariable>(GlobalVar)->isConstant();
800 }
801
802 void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant) {
803   unwrap<GlobalVariable>(GlobalVar)->setConstant(IsConstant != 0);
804 }
805
806 /*--.. Operations on aliases ......................................--*/
807
808 LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
809                           const char *Name) {
810   return wrap(new GlobalAlias(unwrap(Ty), GlobalValue::ExternalLinkage, Name,
811                               unwrap<Constant>(Aliasee), unwrap (M)));
812 }
813
814 /*--.. Operations on functions .............................................--*/
815
816 LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
817                              LLVMTypeRef FunctionTy) {
818   return wrap(Function::Create(unwrap<FunctionType>(FunctionTy),
819                                GlobalValue::ExternalLinkage, Name, unwrap(M)));
820 }
821
822 LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name) {
823   return wrap(unwrap(M)->getFunction(Name));
824 }
825
826 LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M) {
827   Module *Mod = unwrap(M);
828   Module::iterator I = Mod->begin();
829   if (I == Mod->end())
830     return 0;
831   return wrap(I);
832 }
833
834 LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) {
835   Module *Mod = unwrap(M);
836   Module::iterator I = Mod->end();
837   if (I == Mod->begin())
838     return 0;
839   return wrap(--I);
840 }
841
842 LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) {
843   Function *Func = unwrap<Function>(Fn);
844   Module::iterator I = Func;
845   if (++I == Func->getParent()->end())
846     return 0;
847   return wrap(I);
848 }
849
850 LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn) {
851   Function *Func = unwrap<Function>(Fn);
852   Module::iterator I = Func;
853   if (I == Func->getParent()->begin())
854     return 0;
855   return wrap(--I);
856 }
857
858 void LLVMDeleteFunction(LLVMValueRef Fn) {
859   unwrap<Function>(Fn)->eraseFromParent();
860 }
861
862 unsigned LLVMGetIntrinsicID(LLVMValueRef Fn) {
863   if (Function *F = dyn_cast<Function>(unwrap(Fn)))
864     return F->getIntrinsicID();
865   return 0;
866 }
867
868 unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn) {
869   return unwrap<Function>(Fn)->getCallingConv();
870 }
871
872 void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) {
873   return unwrap<Function>(Fn)->setCallingConv(CC);
874 }
875
876 const char *LLVMGetGC(LLVMValueRef Fn) {
877   Function *F = unwrap<Function>(Fn);
878   return F->hasGC()? F->getGC() : 0;
879 }
880
881 void LLVMSetGC(LLVMValueRef Fn, const char *GC) {
882   Function *F = unwrap<Function>(Fn);
883   if (GC)
884     F->setGC(GC);
885   else
886     F->clearGC();
887 }
888
889 void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
890   Function *Func = unwrap<Function>(Fn);
891   const AttrListPtr PAL = Func->getAttributes();
892   const AttrListPtr PALnew = PAL.addAttr(0, PA);
893   Func->setAttributes(PALnew);
894 }
895
896 void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
897   Function *Func = unwrap<Function>(Fn);
898   const AttrListPtr PAL = Func->getAttributes();
899   const AttrListPtr PALnew = PAL.removeAttr(0, PA);
900   Func->setAttributes(PALnew);
901 }
902
903 /*--.. Operations on parameters ............................................--*/
904
905 unsigned LLVMCountParams(LLVMValueRef FnRef) {
906   // This function is strictly redundant to
907   //   LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef)))
908   return unwrap<Function>(FnRef)->arg_size();
909 }
910
911 void LLVMGetParams(LLVMValueRef FnRef, LLVMValueRef *ParamRefs) {
912   Function *Fn = unwrap<Function>(FnRef);
913   for (Function::arg_iterator I = Fn->arg_begin(),
914                               E = Fn->arg_end(); I != E; I++)
915     *ParamRefs++ = wrap(I);
916 }
917
918 LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) {
919   Function::arg_iterator AI = unwrap<Function>(FnRef)->arg_begin();
920   while (index --> 0)
921     AI++;
922   return wrap(AI);
923 }
924
925 LLVMValueRef LLVMGetParamParent(LLVMValueRef V) {
926   return wrap(unwrap<Argument>(V)->getParent());
927 }
928
929 LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn) {
930   Function *Func = unwrap<Function>(Fn);
931   Function::arg_iterator I = Func->arg_begin();
932   if (I == Func->arg_end())
933     return 0;
934   return wrap(I);
935 }
936
937 LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn) {
938   Function *Func = unwrap<Function>(Fn);
939   Function::arg_iterator I = Func->arg_end();
940   if (I == Func->arg_begin())
941     return 0;
942   return wrap(--I);
943 }
944
945 LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg) {
946   Argument *A = unwrap<Argument>(Arg);
947   Function::arg_iterator I = A;
948   if (++I == A->getParent()->arg_end())
949     return 0;
950   return wrap(I);
951 }
952
953 LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg) {
954   Argument *A = unwrap<Argument>(Arg);
955   Function::arg_iterator I = A;
956   if (I == A->getParent()->arg_begin())
957     return 0;
958   return wrap(--I);
959 }
960
961 void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
962   unwrap<Argument>(Arg)->addAttr(PA);
963 }
964
965 void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
966   unwrap<Argument>(Arg)->removeAttr(PA);
967 }
968
969 void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) {
970   unwrap<Argument>(Arg)->addAttr(
971           Attribute::constructAlignmentFromInt(align));
972 }
973
974 /*--.. Operations on basic blocks ..........................................--*/
975
976 LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB) {
977   return wrap(static_cast<Value*>(unwrap(BB)));
978 }
979
980 int LLVMValueIsBasicBlock(LLVMValueRef Val) {
981   return isa<BasicBlock>(unwrap(Val));
982 }
983
984 LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val) {
985   return wrap(unwrap<BasicBlock>(Val));
986 }
987
988 LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB) {
989   return wrap(unwrap(BB)->getParent());
990 }
991
992 unsigned LLVMCountBasicBlocks(LLVMValueRef FnRef) {
993   return unwrap<Function>(FnRef)->size();
994 }
995
996 void LLVMGetBasicBlocks(LLVMValueRef FnRef, LLVMBasicBlockRef *BasicBlocksRefs){
997   Function *Fn = unwrap<Function>(FnRef);
998   for (Function::iterator I = Fn->begin(), E = Fn->end(); I != E; I++)
999     *BasicBlocksRefs++ = wrap(I);
1000 }
1001
1002 LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn) {
1003   return wrap(&unwrap<Function>(Fn)->getEntryBlock());
1004 }
1005
1006 LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn) {
1007   Function *Func = unwrap<Function>(Fn);
1008   Function::iterator I = Func->begin();
1009   if (I == Func->end())
1010     return 0;
1011   return wrap(I);
1012 }
1013
1014 LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn) {
1015   Function *Func = unwrap<Function>(Fn);
1016   Function::iterator I = Func->end();
1017   if (I == Func->begin())
1018     return 0;
1019   return wrap(--I);
1020 }
1021
1022 LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB) {
1023   BasicBlock *Block = unwrap(BB);
1024   Function::iterator I = Block;
1025   if (++I == Block->getParent()->end())
1026     return 0;
1027   return wrap(I);
1028 }
1029
1030 LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB) {
1031   BasicBlock *Block = unwrap(BB);
1032   Function::iterator I = Block;
1033   if (I == Block->getParent()->begin())
1034     return 0;
1035   return wrap(--I);
1036 }
1037
1038 LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef FnRef, const char *Name) {
1039   return wrap(BasicBlock::Create(Name, unwrap<Function>(FnRef)));
1040 }
1041
1042 LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBBRef,
1043                                        const char *Name) {
1044   BasicBlock *InsertBeforeBB = unwrap(InsertBeforeBBRef);
1045   return wrap(BasicBlock::Create(Name, InsertBeforeBB->getParent(),
1046                                  InsertBeforeBB));
1047 }
1048
1049 void LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef) {
1050   unwrap(BBRef)->eraseFromParent();
1051 }
1052
1053 /*--.. Operations on instructions ..........................................--*/
1054
1055 LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst) {
1056   return wrap(unwrap<Instruction>(Inst)->getParent());
1057 }
1058
1059 LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB) {
1060   BasicBlock *Block = unwrap(BB);
1061   BasicBlock::iterator I = Block->begin();
1062   if (I == Block->end())
1063     return 0;
1064   return wrap(I);
1065 }
1066
1067 LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB) {
1068   BasicBlock *Block = unwrap(BB);
1069   BasicBlock::iterator I = Block->end();
1070   if (I == Block->begin())
1071     return 0;
1072   return wrap(--I);
1073 }
1074
1075 LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst) {
1076   Instruction *Instr = unwrap<Instruction>(Inst);
1077   BasicBlock::iterator I = Instr;
1078   if (++I == Instr->getParent()->end())
1079     return 0;
1080   return wrap(I);
1081 }
1082
1083 LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst) {
1084   Instruction *Instr = unwrap<Instruction>(Inst);
1085   BasicBlock::iterator I = Instr;
1086   if (I == Instr->getParent()->begin())
1087     return 0;
1088   return wrap(--I);
1089 }
1090
1091 /*--.. Call and invoke instructions ........................................--*/
1092
1093 unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) {
1094   Value *V = unwrap(Instr);
1095   if (CallInst *CI = dyn_cast<CallInst>(V))
1096     return CI->getCallingConv();
1097   else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
1098     return II->getCallingConv();
1099   llvm_unreachable("LLVMGetInstructionCallConv applies only to call and invoke!");
1100   return 0;
1101 }
1102
1103 void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC) {
1104   Value *V = unwrap(Instr);
1105   if (CallInst *CI = dyn_cast<CallInst>(V))
1106     return CI->setCallingConv(CC);
1107   else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
1108     return II->setCallingConv(CC);
1109   llvm_unreachable("LLVMSetInstructionCallConv applies only to call and invoke!");
1110 }
1111
1112 void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, 
1113                            LLVMAttribute PA) {
1114   CallSite Call = CallSite(unwrap<Instruction>(Instr));
1115   Call.setAttributes(
1116     Call.getAttributes().addAttr(index, PA));
1117 }
1118
1119 void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index, 
1120                               LLVMAttribute PA) {
1121   CallSite Call = CallSite(unwrap<Instruction>(Instr));
1122   Call.setAttributes(
1123     Call.getAttributes().removeAttr(index, PA));
1124 }
1125
1126 void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index, 
1127                                 unsigned align) {
1128   CallSite Call = CallSite(unwrap<Instruction>(Instr));
1129   Call.setAttributes(
1130     Call.getAttributes().addAttr(index, 
1131         Attribute::constructAlignmentFromInt(align)));
1132 }
1133
1134 /*--.. Operations on call instructions (only) ..............................--*/
1135
1136 int LLVMIsTailCall(LLVMValueRef Call) {
1137   return unwrap<CallInst>(Call)->isTailCall();
1138 }
1139
1140 void LLVMSetTailCall(LLVMValueRef Call, int isTailCall) {
1141   unwrap<CallInst>(Call)->setTailCall(isTailCall);
1142 }
1143
1144 /*--.. Operations on phi nodes .............................................--*/
1145
1146 void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
1147                      LLVMBasicBlockRef *IncomingBlocks, unsigned Count) {
1148   PHINode *PhiVal = unwrap<PHINode>(PhiNode);
1149   for (unsigned I = 0; I != Count; ++I)
1150     PhiVal->addIncoming(unwrap(IncomingValues[I]), unwrap(IncomingBlocks[I]));
1151 }
1152
1153 unsigned LLVMCountIncoming(LLVMValueRef PhiNode) {
1154   return unwrap<PHINode>(PhiNode)->getNumIncomingValues();
1155 }
1156
1157 LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index) {
1158   return wrap(unwrap<PHINode>(PhiNode)->getIncomingValue(Index));
1159 }
1160
1161 LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index) {
1162   return wrap(unwrap<PHINode>(PhiNode)->getIncomingBlock(Index));
1163 }
1164
1165
1166 /*===-- Instruction builders ----------------------------------------------===*/
1167
1168 LLVMBuilderRef LLVMCreateBuilder(void) {
1169   return wrap(new IRBuilder<>(getGlobalContext()));
1170 }
1171
1172 void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
1173                          LLVMValueRef Instr) {
1174   BasicBlock *BB = unwrap(Block);
1175   Instruction *I = Instr? unwrap<Instruction>(Instr) : (Instruction*) BB->end();
1176   unwrap(Builder)->SetInsertPoint(BB, I);
1177 }
1178
1179 void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1180   Instruction *I = unwrap<Instruction>(Instr);
1181   unwrap(Builder)->SetInsertPoint(I->getParent(), I);
1182 }
1183
1184 void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block) {
1185   BasicBlock *BB = unwrap(Block);
1186   unwrap(Builder)->SetInsertPoint(BB);
1187 }
1188
1189 LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder) {
1190    return wrap(unwrap(Builder)->GetInsertBlock());
1191 }
1192
1193 void LLVMClearInsertionPosition(LLVMBuilderRef Builder) {
1194   unwrap(Builder)->ClearInsertionPoint ();
1195 }
1196
1197 void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1198   unwrap(Builder)->Insert(unwrap<Instruction>(Instr));
1199 }
1200
1201 void LLVMDisposeBuilder(LLVMBuilderRef Builder) {
1202   delete unwrap(Builder);
1203 }
1204
1205 /*--.. Instruction builders ................................................--*/
1206
1207 LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef B) {
1208   return wrap(unwrap(B)->CreateRetVoid());
1209 }
1210
1211 LLVMValueRef LLVMBuildRet(LLVMBuilderRef B, LLVMValueRef V) {
1212   return wrap(unwrap(B)->CreateRet(unwrap(V)));
1213 }
1214
1215 LLVMValueRef LLVMBuildBr(LLVMBuilderRef B, LLVMBasicBlockRef Dest) {
1216   return wrap(unwrap(B)->CreateBr(unwrap(Dest)));
1217 }
1218
1219 LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef B, LLVMValueRef If,
1220                              LLVMBasicBlockRef Then, LLVMBasicBlockRef Else) {
1221   return wrap(unwrap(B)->CreateCondBr(unwrap(If), unwrap(Then), unwrap(Else)));
1222 }
1223
1224 LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef B, LLVMValueRef V,
1225                              LLVMBasicBlockRef Else, unsigned NumCases) {
1226   return wrap(unwrap(B)->CreateSwitch(unwrap(V), unwrap(Else), NumCases));
1227 }
1228
1229 LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
1230                              LLVMValueRef *Args, unsigned NumArgs,
1231                              LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
1232                              const char *Name) {
1233   return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch),
1234                                       unwrap(Args), unwrap(Args) + NumArgs,
1235                                       Name));
1236 }
1237
1238 LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef B) {
1239   return wrap(unwrap(B)->CreateUnwind());
1240 }
1241
1242 LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) {
1243   return wrap(unwrap(B)->CreateUnreachable());
1244 }
1245
1246 void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
1247                  LLVMBasicBlockRef Dest) {
1248   unwrap<SwitchInst>(Switch)->addCase(unwrap<ConstantInt>(OnVal), unwrap(Dest));
1249 }
1250
1251 /*--.. Arithmetic ..........................................................--*/
1252
1253 LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1254                           const char *Name) {
1255   return wrap(unwrap(B)->CreateAdd(unwrap(LHS), unwrap(RHS), Name));
1256 }
1257
1258 LLVMValueRef LLVMBuildSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1259                           const char *Name) {
1260   return wrap(unwrap(B)->CreateSub(unwrap(LHS), unwrap(RHS), Name));
1261 }
1262
1263 LLVMValueRef LLVMBuildMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1264                           const char *Name) {
1265   return wrap(unwrap(B)->CreateMul(unwrap(LHS), unwrap(RHS), Name));
1266 }
1267
1268 LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1269                            const char *Name) {
1270   return wrap(unwrap(B)->CreateUDiv(unwrap(LHS), unwrap(RHS), Name));
1271 }
1272
1273 LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1274                            const char *Name) {
1275   return wrap(unwrap(B)->CreateSDiv(unwrap(LHS), unwrap(RHS), Name));
1276 }
1277
1278 LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1279                            const char *Name) {
1280   return wrap(unwrap(B)->CreateFDiv(unwrap(LHS), unwrap(RHS), Name));
1281 }
1282
1283 LLVMValueRef LLVMBuildURem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1284                            const char *Name) {
1285   return wrap(unwrap(B)->CreateURem(unwrap(LHS), unwrap(RHS), Name));
1286 }
1287
1288 LLVMValueRef LLVMBuildSRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1289                            const char *Name) {
1290   return wrap(unwrap(B)->CreateSRem(unwrap(LHS), unwrap(RHS), Name));
1291 }
1292
1293 LLVMValueRef LLVMBuildFRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1294                            const char *Name) {
1295   return wrap(unwrap(B)->CreateFRem(unwrap(LHS), unwrap(RHS), Name));
1296 }
1297
1298 LLVMValueRef LLVMBuildShl(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1299                           const char *Name) {
1300   return wrap(unwrap(B)->CreateShl(unwrap(LHS), unwrap(RHS), Name));
1301 }
1302
1303 LLVMValueRef LLVMBuildLShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1304                            const char *Name) {
1305   return wrap(unwrap(B)->CreateLShr(unwrap(LHS), unwrap(RHS), Name));
1306 }
1307
1308 LLVMValueRef LLVMBuildAShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1309                            const char *Name) {
1310   return wrap(unwrap(B)->CreateAShr(unwrap(LHS), unwrap(RHS), Name));
1311 }
1312
1313 LLVMValueRef LLVMBuildAnd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1314                           const char *Name) {
1315   return wrap(unwrap(B)->CreateAnd(unwrap(LHS), unwrap(RHS), Name));
1316 }
1317
1318 LLVMValueRef LLVMBuildOr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1319                          const char *Name) {
1320   return wrap(unwrap(B)->CreateOr(unwrap(LHS), unwrap(RHS), Name));
1321 }
1322
1323 LLVMValueRef LLVMBuildXor(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
1324                           const char *Name) {
1325   return wrap(unwrap(B)->CreateXor(unwrap(LHS), unwrap(RHS), Name));
1326 }
1327
1328 LLVMValueRef LLVMBuildNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1329   return wrap(unwrap(B)->CreateNeg(unwrap(V), Name));
1330 }
1331
1332 LLVMValueRef LLVMBuildNot(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
1333   return wrap(unwrap(B)->CreateNot(unwrap(V), Name));
1334 }
1335
1336 /*--.. Memory ..............................................................--*/
1337
1338 LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
1339                              const char *Name) {
1340   return wrap(unwrap(B)->CreateMalloc(unwrap(Ty), 0, Name));
1341 }
1342
1343 LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
1344                                   LLVMValueRef Val, const char *Name) {
1345   return wrap(unwrap(B)->CreateMalloc(unwrap(Ty), unwrap(Val), Name));
1346 }
1347
1348 LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
1349                              const char *Name) {
1350   return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), 0, Name));
1351 }
1352
1353 LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
1354                                   LLVMValueRef Val, const char *Name) {
1355   return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), unwrap(Val), Name));
1356 }
1357
1358 LLVMValueRef LLVMBuildFree(LLVMBuilderRef B, LLVMValueRef PointerVal) {
1359   return wrap(unwrap(B)->CreateFree(unwrap(PointerVal)));
1360 }
1361
1362
1363 LLVMValueRef LLVMBuildLoad(LLVMBuilderRef B, LLVMValueRef PointerVal,
1364                            const char *Name) {
1365   return wrap(unwrap(B)->CreateLoad(unwrap(PointerVal), Name));
1366 }
1367
1368 LLVMValueRef LLVMBuildStore(LLVMBuilderRef B, LLVMValueRef Val, 
1369                             LLVMValueRef PointerVal) {
1370   return wrap(unwrap(B)->CreateStore(unwrap(Val), unwrap(PointerVal)));
1371 }
1372
1373 LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
1374                           LLVMValueRef *Indices, unsigned NumIndices,
1375                           const char *Name) {
1376   return wrap(unwrap(B)->CreateGEP(unwrap(Pointer), unwrap(Indices),
1377                                    unwrap(Indices) + NumIndices, Name));
1378 }
1379
1380 /*--.. Casts ...............................................................--*/
1381
1382 LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef B, LLVMValueRef Val,
1383                             LLVMTypeRef DestTy, const char *Name) {
1384   return wrap(unwrap(B)->CreateTrunc(unwrap(Val), unwrap(DestTy), Name));
1385 }
1386
1387 LLVMValueRef LLVMBuildZExt(LLVMBuilderRef B, LLVMValueRef Val,
1388                            LLVMTypeRef DestTy, const char *Name) {
1389   return wrap(unwrap(B)->CreateZExt(unwrap(Val), unwrap(DestTy), Name));
1390 }
1391
1392 LLVMValueRef LLVMBuildSExt(LLVMBuilderRef B, LLVMValueRef Val,
1393                            LLVMTypeRef DestTy, const char *Name) {
1394   return wrap(unwrap(B)->CreateSExt(unwrap(Val), unwrap(DestTy), Name));
1395 }
1396
1397 LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef B, LLVMValueRef Val,
1398                              LLVMTypeRef DestTy, const char *Name) {
1399   return wrap(unwrap(B)->CreateFPToUI(unwrap(Val), unwrap(DestTy), Name));
1400 }
1401
1402 LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef B, LLVMValueRef Val,
1403                              LLVMTypeRef DestTy, const char *Name) {
1404   return wrap(unwrap(B)->CreateFPToSI(unwrap(Val), unwrap(DestTy), Name));
1405 }
1406
1407 LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef B, LLVMValueRef Val,
1408                              LLVMTypeRef DestTy, const char *Name) {
1409   return wrap(unwrap(B)->CreateUIToFP(unwrap(Val), unwrap(DestTy), Name));
1410 }
1411
1412 LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef B, LLVMValueRef Val,
1413                              LLVMTypeRef DestTy, const char *Name) {
1414   return wrap(unwrap(B)->CreateSIToFP(unwrap(Val), unwrap(DestTy), Name));
1415 }
1416
1417 LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef B, LLVMValueRef Val,
1418                               LLVMTypeRef DestTy, const char *Name) {
1419   return wrap(unwrap(B)->CreateFPTrunc(unwrap(Val), unwrap(DestTy), Name));
1420 }
1421
1422 LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef B, LLVMValueRef Val,
1423                             LLVMTypeRef DestTy, const char *Name) {
1424   return wrap(unwrap(B)->CreateFPExt(unwrap(Val), unwrap(DestTy), Name));
1425 }
1426
1427 LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef B, LLVMValueRef Val,
1428                                LLVMTypeRef DestTy, const char *Name) {
1429   return wrap(unwrap(B)->CreatePtrToInt(unwrap(Val), unwrap(DestTy), Name));
1430 }
1431
1432 LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef B, LLVMValueRef Val,
1433                                LLVMTypeRef DestTy, const char *Name) {
1434   return wrap(unwrap(B)->CreateIntToPtr(unwrap(Val), unwrap(DestTy), Name));
1435 }
1436
1437 LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef B, LLVMValueRef Val,
1438                               LLVMTypeRef DestTy, const char *Name) {
1439   return wrap(unwrap(B)->CreateBitCast(unwrap(Val), unwrap(DestTy), Name));
1440 }
1441
1442 /*--.. Comparisons .........................................................--*/
1443
1444 LLVMValueRef LLVMBuildICmp(LLVMBuilderRef B, LLVMIntPredicate Op,
1445                            LLVMValueRef LHS, LLVMValueRef RHS,
1446                            const char *Name) {
1447   return wrap(unwrap(B)->CreateICmp(static_cast<ICmpInst::Predicate>(Op),
1448                                     unwrap(LHS), unwrap(RHS), Name));
1449 }
1450
1451 LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef B, LLVMRealPredicate Op,
1452                            LLVMValueRef LHS, LLVMValueRef RHS,
1453                            const char *Name) {
1454   return wrap(unwrap(B)->CreateFCmp(static_cast<FCmpInst::Predicate>(Op),
1455                                     unwrap(LHS), unwrap(RHS), Name));
1456 }
1457
1458 /*--.. Miscellaneous instructions ..........................................--*/
1459
1460 LLVMValueRef LLVMBuildPhi(LLVMBuilderRef B, LLVMTypeRef Ty, const char *Name) {
1461   return wrap(unwrap(B)->CreatePHI(unwrap(Ty), Name));
1462 }
1463
1464 LLVMValueRef LLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn,
1465                            LLVMValueRef *Args, unsigned NumArgs,
1466                            const char *Name) {
1467   return wrap(unwrap(B)->CreateCall(unwrap(Fn), unwrap(Args),
1468                                     unwrap(Args) + NumArgs, Name));
1469 }
1470
1471 LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If,
1472                              LLVMValueRef Then, LLVMValueRef Else,
1473                              const char *Name) {
1474   return wrap(unwrap(B)->CreateSelect(unwrap(If), unwrap(Then), unwrap(Else),
1475                                       Name));
1476 }
1477
1478 LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef B, LLVMValueRef List,
1479                             LLVMTypeRef Ty, const char *Name) {
1480   return wrap(unwrap(B)->CreateVAArg(unwrap(List), unwrap(Ty), Name));
1481 }
1482
1483 LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef B, LLVMValueRef VecVal,
1484                                       LLVMValueRef Index, const char *Name) {
1485   return wrap(unwrap(B)->CreateExtractElement(unwrap(VecVal), unwrap(Index),
1486                                               Name));
1487 }
1488
1489 LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef B, LLVMValueRef VecVal,
1490                                     LLVMValueRef EltVal, LLVMValueRef Index,
1491                                     const char *Name) {
1492   return wrap(unwrap(B)->CreateInsertElement(unwrap(VecVal), unwrap(EltVal),
1493                                              unwrap(Index), Name));
1494 }
1495
1496 LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1,
1497                                     LLVMValueRef V2, LLVMValueRef Mask,
1498                                     const char *Name) {
1499   return wrap(unwrap(B)->CreateShuffleVector(unwrap(V1), unwrap(V2),
1500                                              unwrap(Mask), Name));
1501 }
1502
1503 LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef B, LLVMValueRef AggVal,
1504                                    unsigned Index, const char *Name) {
1505   return wrap(unwrap(B)->CreateExtractValue(unwrap(AggVal), Index, Name));
1506 }
1507
1508 LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef B, LLVMValueRef AggVal,
1509                                   LLVMValueRef EltVal, unsigned Index,
1510                                   const char *Name) {
1511   return wrap(unwrap(B)->CreateInsertValue(unwrap(AggVal), unwrap(EltVal),
1512                                            Index, Name));
1513 }
1514
1515
1516 /*===-- Module providers --------------------------------------------------===*/
1517
1518 LLVMModuleProviderRef
1519 LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M) {
1520   return wrap(new ExistingModuleProvider(unwrap(M)));
1521 }
1522
1523 void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP) {
1524   delete unwrap(MP);
1525 }
1526
1527
1528 /*===-- Memory buffers ----------------------------------------------------===*/
1529
1530 int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
1531                                              LLVMMemoryBufferRef *OutMemBuf,
1532                                              char **OutMessage) {
1533   std::string Error;
1534   if (MemoryBuffer *MB = MemoryBuffer::getFile(Path, &Error)) {
1535     *OutMemBuf = wrap(MB);
1536     return 0;
1537   }
1538   
1539   *OutMessage = strdup(Error.c_str());
1540   return 1;
1541 }
1542
1543 int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
1544                                     char **OutMessage) {
1545   if (MemoryBuffer *MB = MemoryBuffer::getSTDIN()) {
1546     *OutMemBuf = wrap(MB);
1547     return 0;
1548   }
1549   
1550   *OutMessage = strdup("stdin is empty.");
1551   return 1;
1552 }
1553
1554 void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
1555   delete unwrap(MemBuf);
1556 }