X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FCore.cpp;h=bb4f43d69ae16f2d904fff9033563e01fb84a1cf;hb=51cd9d6e073932fcb37f1857c66249d6c7d368ee;hp=c63534df6c614ae4a215cbda0a21d538194f2b25;hpb=88cc699942f7f972ef9bc3afa1df0a44d059e1d8;p=oota-llvm.git diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp index c63534df6c6..bb4f43d69ae 100644 --- a/lib/VMCore/Core.cpp +++ b/lib/VMCore/Core.cpp @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by Gordon Henriksen and is distributed under the -// University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -18,11 +18,23 @@ #include "llvm/DerivedTypes.h" #include "llvm/GlobalVariable.h" #include "llvm/TypeSymbolTable.h" +#include "llvm/ModuleProvider.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/CallSite.h" #include +#include +#include using namespace llvm; +/*===-- Error handling ----------------------------------------------------===*/ + +void LLVMDisposeMessage(char *Message) { + free(Message); +} + + /*===-- Operations on modules ---------------------------------------------===*/ LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) { @@ -33,6 +45,25 @@ void LLVMDisposeModule(LLVMModuleRef M) { delete unwrap(M); } +/*--.. Data layout .........................................................--*/ +const char * LLVMGetDataLayout(LLVMModuleRef M) { + return unwrap(M)->getDataLayout().c_str(); +} + +void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple) { + unwrap(M)->setDataLayout(Triple); +} + +/*--.. Target triple .......................................................--*/ +const char * LLVMGetTarget(LLVMModuleRef M) { + return unwrap(M)->getTargetTriple().c_str(); +} + +void LLVMSetTarget(LLVMModuleRef M, const char *Triple) { + unwrap(M)->setTargetTriple(Triple); +} + +/*--.. Type names ..........................................................--*/ int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty) { return unwrap(M)->addTypeName(Name, unwrap(Ty)); } @@ -46,6 +77,10 @@ void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name) { TST.remove(I); } +void LLVMDumpModule(LLVMModuleRef M) { + unwrap(M)->dump(); +} + /*===-- Operations on types -----------------------------------------------===*/ @@ -55,20 +90,15 @@ LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty) { return static_cast(unwrap(Ty)->getTypeID()); } -void LLVMRefineAbstractType(LLVMTypeRef AbstractType, LLVMTypeRef ConcreteType){ - DerivedType *Ty = unwrap(AbstractType); - Ty->refineAbstractTypeTo(unwrap(ConcreteType)); -} - /*--.. Operations on integer types .........................................--*/ -LLVMTypeRef LLVMInt1Type() { return (LLVMTypeRef) Type::Int1Ty; } -LLVMTypeRef LLVMInt8Type() { return (LLVMTypeRef) Type::Int8Ty; } -LLVMTypeRef LLVMInt16Type() { return (LLVMTypeRef) Type::Int16Ty; } -LLVMTypeRef LLVMInt32Type() { return (LLVMTypeRef) Type::Int32Ty; } -LLVMTypeRef LLVMInt64Type() { return (LLVMTypeRef) Type::Int64Ty; } +LLVMTypeRef LLVMInt1Type(void) { return (LLVMTypeRef) Type::Int1Ty; } +LLVMTypeRef LLVMInt8Type(void) { return (LLVMTypeRef) Type::Int8Ty; } +LLVMTypeRef LLVMInt16Type(void) { return (LLVMTypeRef) Type::Int16Ty; } +LLVMTypeRef LLVMInt32Type(void) { return (LLVMTypeRef) Type::Int32Ty; } +LLVMTypeRef LLVMInt64Type(void) { return (LLVMTypeRef) Type::Int64Ty; } -LLVMTypeRef LLVMCreateIntType(unsigned NumBits) { +LLVMTypeRef LLVMIntType(unsigned NumBits) { return wrap(IntegerType::get(NumBits)); } @@ -78,17 +108,17 @@ unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy) { /*--.. Operations on real types ............................................--*/ -LLVMTypeRef LLVMFloatType() { return (LLVMTypeRef) Type::FloatTy; } -LLVMTypeRef LLVMDoubleType() { return (LLVMTypeRef) Type::DoubleTy; } -LLVMTypeRef LLVMX86FP80Type() { return (LLVMTypeRef) Type::X86_FP80Ty; } -LLVMTypeRef LLVMFP128Type() { return (LLVMTypeRef) Type::FP128Ty; } -LLVMTypeRef LLVMPPCFP128Type() { return (LLVMTypeRef) Type::PPC_FP128Ty; } +LLVMTypeRef LLVMFloatType(void) { return (LLVMTypeRef) Type::FloatTy; } +LLVMTypeRef LLVMDoubleType(void) { return (LLVMTypeRef) Type::DoubleTy; } +LLVMTypeRef LLVMX86FP80Type(void) { return (LLVMTypeRef) Type::X86_FP80Ty; } +LLVMTypeRef LLVMFP128Type(void) { return (LLVMTypeRef) Type::FP128Ty; } +LLVMTypeRef LLVMPPCFP128Type(void) { return (LLVMTypeRef) Type::PPC_FP128Ty; } /*--.. Operations on function types ........................................--*/ -LLVMTypeRef LLVMCreateFunctionType(LLVMTypeRef ReturnType, - LLVMTypeRef *ParamTypes, unsigned ParamCount, - int IsVarArg) { +LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType, + LLVMTypeRef *ParamTypes, unsigned ParamCount, + int IsVarArg) { std::vector Tys; for (LLVMTypeRef *I = ParamTypes, *E = ParamTypes + ParamCount; I != E; ++I) Tys.push_back(unwrap(*I)); @@ -117,8 +147,8 @@ void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest) { /*--.. Operations on struct types ..........................................--*/ -LLVMTypeRef LLVMCreateStructType(LLVMTypeRef *ElementTypes, - unsigned ElementCount, int Packed) { +LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, + unsigned ElementCount, int Packed) { std::vector Tys; for (LLVMTypeRef *I = ElementTypes, *E = ElementTypes + ElementCount; I != E; ++I) @@ -144,15 +174,15 @@ int LLVMIsPackedStruct(LLVMTypeRef StructTy) { /*--.. Operations on array, pointer, and vector types (sequence types) .....--*/ -LLVMTypeRef LLVMCreateArrayType(LLVMTypeRef ElementType, unsigned ElementCount){ +LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) { return wrap(ArrayType::get(unwrap(ElementType), ElementCount)); } -LLVMTypeRef LLVMCreatePointerType(LLVMTypeRef ElementType) { - return wrap(PointerType::get(unwrap(ElementType))); +LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace) { + return wrap(PointerType::get(unwrap(ElementType), AddressSpace)); } -LLVMTypeRef LLVMCreateVectorType(LLVMTypeRef ElementType,unsigned ElementCount){ +LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) { return wrap(VectorType::get(unwrap(ElementType), ElementCount)); } @@ -164,19 +194,41 @@ unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) { return unwrap(ArrayTy)->getNumElements(); } +unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy) { + return unwrap(PointerTy)->getAddressSpace(); +} + unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy) { return unwrap(VectorTy)->getNumElements(); } /*--.. Operations on other types ...........................................--*/ -LLVMTypeRef LLVMVoidType() { return (LLVMTypeRef) Type::VoidTy; } -LLVMTypeRef LLVMLabelType() { return (LLVMTypeRef) Type::LabelTy; } +LLVMTypeRef LLVMVoidType(void) { return (LLVMTypeRef) Type::VoidTy; } +LLVMTypeRef LLVMLabelType(void) { return (LLVMTypeRef) Type::LabelTy; } -LLVMTypeRef LLVMCreateOpaqueType() { +LLVMTypeRef LLVMOpaqueType(void) { return wrap(llvm::OpaqueType::get()); } +/*--.. Operations on type handles ..........................................--*/ + +LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy) { + return wrap(new PATypeHolder(unwrap(PotentiallyAbstractTy))); +} + +void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle) { + delete unwrap(TypeHandle); +} + +LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle) { + return wrap(unwrap(TypeHandle)->get()); +} + +void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy) { + unwrap(AbstractTy)->refineAbstractTypeTo(unwrap(ConcreteTy)); +} + /*===-- Operations on values ----------------------------------------------===*/ @@ -200,11 +252,11 @@ void LLVMDumpValue(LLVMValueRef Val) { /*--.. Operations on constants of any type .................................--*/ -LLVMValueRef LLVMGetNull(LLVMTypeRef Ty) { +LLVMValueRef LLVMConstNull(LLVMTypeRef Ty) { return wrap(Constant::getNullValue(unwrap(Ty))); } -LLVMValueRef LLVMGetAllOnes(LLVMTypeRef Ty) { +LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty) { return wrap(Constant::getAllOnesValue(unwrap(Ty))); } @@ -228,46 +280,271 @@ int LLVMIsUndef(LLVMValueRef Val) { /*--.. Operations on scalar constants ......................................--*/ -LLVMValueRef LLVMGetIntConstant(LLVMTypeRef IntTy, unsigned long long N, - int SignExtend) { +LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N, + int SignExtend) { return wrap(ConstantInt::get(unwrap(IntTy), N, SignExtend != 0)); } -LLVMValueRef LLVMGetRealConstant(LLVMTypeRef RealTy, double N) { - return wrap(ConstantFP::get(unwrap(RealTy), APFloat(N))); +static const fltSemantics &SemanticsForType(Type *Ty) { + assert(Ty->isFloatingPoint() && "Type is not floating point!"); + if (Ty == Type::FloatTy) + return APFloat::IEEEsingle; + if (Ty == Type::DoubleTy) + return APFloat::IEEEdouble; + if (Ty == Type::X86_FP80Ty) + return APFloat::x87DoubleExtended; + if (Ty == Type::FP128Ty) + return APFloat::IEEEquad; + if (Ty == Type::PPC_FP128Ty) + return APFloat::PPCDoubleDouble; + return APFloat::Bogus; +} + +LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) { + APFloat APN(N); + APN.convert(SemanticsForType(unwrap(RealTy)), APFloat::rmNearestTiesToEven); + return wrap(ConstantFP::get(APN)); +} + +LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) { + return wrap(ConstantFP::get(APFloat(SemanticsForType(unwrap(RealTy)), Text))); } /*--.. Operations on composite constants ...................................--*/ -LLVMValueRef LLVMGetStringConstant(const char *Str, unsigned Length, - int DontNullTerminate) { +LLVMValueRef LLVMConstString(const char *Str, unsigned Length, + int DontNullTerminate) { /* Inverted the sense of AddNull because ', 0)' is a better mnemonic for null termination than ', 1)'. */ return wrap(ConstantArray::get(std::string(Str, Length), DontNullTerminate == 0)); } -LLVMValueRef LLVMGetArrayConstant(LLVMTypeRef ElementTy, - LLVMValueRef *ConstantVals, unsigned Length) { +LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy, + LLVMValueRef *ConstantVals, unsigned Length) { return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length), unwrap(ConstantVals, Length), Length)); } -LLVMValueRef LLVMGetStructConstant(LLVMValueRef *ConstantVals, unsigned Count, - int Packed) { +LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count, + int Packed) { return wrap(ConstantStruct::get(unwrap(ConstantVals, Count), Count, Packed != 0)); } -LLVMValueRef LLVMGetVectorConstant(LLVMValueRef *ScalarConstantVals, - unsigned Size) { +LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) { return wrap(ConstantVector::get(unwrap(ScalarConstantVals, Size), Size)); } +/*--.. Constant expressions ................................................--*/ + +LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty) { + return wrap(ConstantExpr::getSizeOf(unwrap(Ty))); +} + +LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal) { + return wrap(ConstantExpr::getNeg(unwrap(ConstantVal))); +} + +LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal) { + return wrap(ConstantExpr::getNot(unwrap(ConstantVal))); +} + +LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getAdd(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getSub(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getMul(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getUDiv(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getSDiv(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getFDiv(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getURem(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getSRem(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getFRem(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getAnd(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getOr(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getXor(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate, + LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getICmp(Predicate, + unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate, + LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getFCmp(Predicate, + unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getShl(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getLShr(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { + return wrap(ConstantExpr::getAShr(unwrap(LHSConstant), + unwrap(RHSConstant))); +} + +LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal, + LLVMValueRef *ConstantIndices, unsigned NumIndices) { + return wrap(ConstantExpr::getGetElementPtr(unwrap(ConstantVal), + unwrap(ConstantIndices, + NumIndices), + NumIndices)); +} + +LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getTrunc(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getSExt(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getZExt(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getFPTrunc(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getFPExtend(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getUIToFP(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getSIToFP(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getFPToUI(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getFPToSI(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getPtrToInt(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getIntToPtr(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { + return wrap(ConstantExpr::getBitCast(unwrap(ConstantVal), + unwrap(ToType))); +} + +LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition, + LLVMValueRef ConstantIfTrue, + LLVMValueRef ConstantIfFalse) { + return wrap(ConstantExpr::getSelect(unwrap(ConstantCondition), + unwrap(ConstantIfTrue), + unwrap(ConstantIfFalse))); +} + +LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant, + LLVMValueRef IndexConstant) { + return wrap(ConstantExpr::getExtractElement(unwrap(VectorConstant), + unwrap(IndexConstant))); +} + +LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant, + LLVMValueRef ElementValueConstant, + LLVMValueRef IndexConstant) { + return wrap(ConstantExpr::getInsertElement(unwrap(VectorConstant), + unwrap(ElementValueConstant), + unwrap(IndexConstant))); +} + +LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant, + LLVMValueRef VectorBConstant, + LLVMValueRef MaskConstant) { + return wrap(ConstantExpr::getShuffleVector(unwrap(VectorAConstant), + unwrap(VectorBConstant), + unwrap(MaskConstant))); +} + /*--.. Operations on global variables, functions, and aliases (globals) ....--*/ +LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) { + return wrap(unwrap(Global)->getParent()); +} + int LLVMIsDeclaration(LLVMValueRef Global) { return unwrap(Global)->isDeclaration(); } @@ -311,7 +588,44 @@ void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes) { LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) { return wrap(new GlobalVariable(unwrap(Ty), false, - GlobalValue::ExternalLinkage, 0, Name, unwrap(M))); + GlobalValue::ExternalLinkage, 0, Name, + unwrap(M))); +} + +LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name) { + return wrap(unwrap(M)->getNamedGlobal(Name)); +} + +LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M) { + Module *Mod = unwrap(M); + Module::global_iterator I = Mod->global_begin(); + if (I == Mod->global_end()) + return 0; + return wrap(I); +} + +LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M) { + Module *Mod = unwrap(M); + Module::global_iterator I = Mod->global_end(); + if (I == Mod->global_begin()) + return 0; + return wrap(--I); +} + +LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar) { + GlobalVariable *GV = unwrap(GlobalVar); + Module::global_iterator I = GV; + if (++I == GV->getParent()->global_end()) + return 0; + return wrap(I); +} + +LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar) { + GlobalVariable *GV = unwrap(GlobalVar); + Module::global_iterator I = GV; + if (I == GV->getParent()->global_begin()) + return 0; + return wrap(--I); } void LLVMDeleteGlobal(LLVMValueRef GlobalVar) { @@ -339,22 +653,102 @@ void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal) { unwrap(GlobalVar)->setThreadLocal(IsThreadLocal != 0); } +int LLVMIsGlobalConstant(LLVMValueRef GlobalVar) { + return unwrap(GlobalVar)->isConstant(); +} + +void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant) { + unwrap(GlobalVar)->setConstant(IsConstant != 0); +} + /*--.. Operations on functions .............................................--*/ LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name, LLVMTypeRef FunctionTy) { - return wrap(new Function(unwrap(FunctionTy), - GlobalValue::ExternalLinkage, Name, unwrap(M))); + return wrap(Function::Create(unwrap(FunctionTy), + GlobalValue::ExternalLinkage, Name, unwrap(M))); +} + +LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name) { + return wrap(unwrap(M)->getFunction(Name)); +} + +LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M) { + Module *Mod = unwrap(M); + Module::iterator I = Mod->begin(); + if (I == Mod->end()) + return 0; + return wrap(I); +} + +LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) { + Module *Mod = unwrap(M); + Module::iterator I = Mod->end(); + if (I == Mod->begin()) + return 0; + return wrap(--I); +} + +LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) { + Function *Func = unwrap(Fn); + Module::iterator I = Func; + if (++I == Func->getParent()->end()) + return 0; + return wrap(I); +} + +LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn) { + Function *Func = unwrap(Fn); + Module::iterator I = Func; + if (I == Func->getParent()->begin()) + return 0; + return wrap(--I); } void LLVMDeleteFunction(LLVMValueRef Fn) { unwrap(Fn)->eraseFromParent(); } +unsigned LLVMGetIntrinsicID(LLVMValueRef Fn) { + if (Function *F = dyn_cast(unwrap(Fn))) + return F->getIntrinsicID(); + return 0; +} + +unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn) { + return unwrap(Fn)->getCallingConv(); +} + +void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) { + return unwrap(Fn)->setCallingConv(CC); +} + +const char *LLVMGetCollector(LLVMValueRef Fn) { + Function *F = unwrap(Fn); + return F->hasCollector()? F->getCollector() : 0; +} + +void LLVMSetCollector(LLVMValueRef Fn, const char *Coll) { + Function *F = unwrap(Fn); + if (Coll) + F->setCollector(Coll); + else + F->clearCollector(); +} + +/*--.. Operations on parameters ............................................--*/ + unsigned LLVMCountParams(LLVMValueRef FnRef) { // This function is strictly redundant to // LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef))) - return unwrap(FnRef)->getArgumentList().size(); + return unwrap(FnRef)->arg_size(); +} + +void LLVMGetParams(LLVMValueRef FnRef, LLVMValueRef *ParamRefs) { + Function *Fn = unwrap(FnRef); + for (Function::arg_iterator I = Fn->arg_begin(), + E = Fn->arg_end(); I != E; I++) + *ParamRefs++ = wrap(I); } LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) { @@ -364,31 +758,59 @@ LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) { return wrap(AI); } -void LLVMGetParams(LLVMValueRef FnRef, LLVMValueRef *ParamRefs) { - Function *Fn = unwrap(FnRef); - for (Function::arg_iterator I = Fn->arg_begin(), - E = Fn->arg_end(); I != E; I++) - *ParamRefs++ = wrap(I); +LLVMValueRef LLVMGetParamParent(LLVMValueRef V) { + return wrap(unwrap(V)->getParent()); } -unsigned LLVMGetIntrinsicID(LLVMValueRef Fn) { - if (Function *F = dyn_cast(unwrap(Fn))) - return F->getIntrinsicID(); - return 0; +LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn) { + Function *Func = unwrap(Fn); + Function::arg_iterator I = Func->arg_begin(); + if (I == Func->arg_end()) + return 0; + return wrap(I); } -unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn) { - return unwrap(Fn)->getCallingConv(); +LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn) { + Function *Func = unwrap(Fn); + Function::arg_iterator I = Func->arg_end(); + if (I == Func->arg_begin()) + return 0; + return wrap(--I); } -void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) { - return unwrap(Fn)->setCallingConv(CC); +LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg) { + Argument *A = unwrap(Arg); + Function::arg_iterator I = A; + if (++I == A->getParent()->arg_end()) + return 0; + return wrap(I); +} + +LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg) { + Argument *A = unwrap(Arg); + Function::arg_iterator I = A; + if (I == A->getParent()->arg_begin()) + return 0; + return wrap(--I); +} + +void LLVMAddParamAttr(LLVMValueRef Arg, LLVMParamAttr PA) { + unwrap(Arg)->addAttr(PA); +} + +void LLVMRemoveParamAttr(LLVMValueRef Arg, LLVMParamAttr PA) { + unwrap(Arg)->removeAttr(PA); +} + +void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) { + unwrap(Arg)->addAttr( + ParamAttr::constructAlignmentFromInt(align)); } /*--.. Operations on basic blocks ..........................................--*/ -LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef Bb) { - return wrap(static_cast(unwrap(Bb))); +LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB) { + return wrap(static_cast(unwrap(BB))); } int LLVMValueIsBasicBlock(LLVMValueRef Val) { @@ -399,8 +821,12 @@ LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val) { return wrap(unwrap(Val)); } +LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB) { + return wrap(unwrap(BB)->getParent()); +} + unsigned LLVMCountBasicBlocks(LLVMValueRef FnRef) { - return unwrap(FnRef)->getBasicBlockList().size(); + return unwrap(FnRef)->size(); } void LLVMGetBasicBlocks(LLVMValueRef FnRef, LLVMBasicBlockRef *BasicBlocksRefs){ @@ -413,21 +839,91 @@ LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn) { return wrap(&unwrap(Fn)->getEntryBlock()); } +LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn) { + Function *Func = unwrap(Fn); + Function::iterator I = Func->begin(); + if (I == Func->end()) + return 0; + return wrap(I); +} + +LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn) { + Function *Func = unwrap(Fn); + Function::iterator I = Func->end(); + if (I == Func->begin()) + return 0; + return wrap(--I); +} + +LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB) { + BasicBlock *Block = unwrap(BB); + Function::iterator I = Block; + if (++I == Block->getParent()->end()) + return 0; + return wrap(I); +} + +LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB) { + BasicBlock *Block = unwrap(BB); + Function::iterator I = Block; + if (I == Block->getParent()->begin()) + return 0; + return wrap(--I); +} + LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef FnRef, const char *Name) { - return wrap(new BasicBlock(Name, unwrap(FnRef))); + return wrap(BasicBlock::Create(Name, unwrap(FnRef))); } LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBBRef, const char *Name) { BasicBlock *InsertBeforeBB = unwrap(InsertBeforeBBRef); - return wrap(new BasicBlock(Name, InsertBeforeBB->getParent(), - InsertBeforeBB)); + return wrap(BasicBlock::Create(Name, InsertBeforeBB->getParent(), + InsertBeforeBB)); } void LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef) { unwrap(BBRef)->eraseFromParent(); } +/*--.. Operations on instructions ..........................................--*/ + +LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst) { + return wrap(unwrap(Inst)->getParent()); +} + +LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB) { + BasicBlock *Block = unwrap(BB); + BasicBlock::iterator I = Block->begin(); + if (I == Block->end()) + return 0; + return wrap(I); +} + +LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB) { + BasicBlock *Block = unwrap(BB); + BasicBlock::iterator I = Block->end(); + if (I == Block->begin()) + return 0; + return wrap(--I); +} + +LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst) { + Instruction *Instr = unwrap(Inst); + BasicBlock::iterator I = Instr; + if (++I == Instr->getParent()->end()) + return 0; + return wrap(I); +} + +LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst) { + Instruction *Instr = unwrap(Inst); + BasicBlock::iterator I = Instr; + if (I == Instr->getParent()->begin()) + return 0; + return wrap(--I); +} + /*--.. Call and invoke instructions ........................................--*/ unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) { @@ -449,11 +945,61 @@ void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC) { assert(0 && "LLVMSetInstructionCallConv applies only to call and invoke!"); } +void LLVMAddInstrParamAttr(LLVMValueRef Instr, unsigned index, + LLVMParamAttr PA) { + CallSite Call = CallSite(unwrap(Instr)); + Call.setParamAttrs( + Call.getParamAttrs().addAttr(index, PA)); +} + +void LLVMRemoveInstrParamAttr(LLVMValueRef Instr, unsigned index, + LLVMParamAttr PA) { + CallSite Call = CallSite(unwrap(Instr)); + Call.setParamAttrs( + Call.getParamAttrs().removeAttr(index, PA)); +} + +void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index, + unsigned align) { + CallSite Call = CallSite(unwrap(Instr)); + Call.setParamAttrs( + Call.getParamAttrs().addAttr(index, + ParamAttr::constructAlignmentFromInt(align))); +} + +/*--.. Operations on phi nodes .............................................--*/ + +void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues, + LLVMBasicBlockRef *IncomingBlocks, unsigned Count) { + PHINode *PhiVal = unwrap(PhiNode); + for (unsigned I = 0; I != Count; ++I) + PhiVal->addIncoming(unwrap(IncomingValues[I]), unwrap(IncomingBlocks[I])); +} + +unsigned LLVMCountIncoming(LLVMValueRef PhiNode) { + return unwrap(PhiNode)->getNumIncomingValues(); +} + +LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index) { + return wrap(unwrap(PhiNode)->getIncomingValue(Index)); +} + +LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index) { + return wrap(unwrap(PhiNode)->getIncomingBlock(Index)); +} + /*===-- Instruction builders ----------------------------------------------===*/ -LLVMBuilderRef LLVMCreateBuilder() { - return wrap(new LLVMBuilder()); +LLVMBuilderRef LLVMCreateBuilder(void) { + return wrap(new IRBuilder()); +} + +void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block, + LLVMValueRef Instr) { + BasicBlock *BB = unwrap(Block); + Instruction *I = Instr? unwrap(Instr) : (Instruction*) BB->end(); + unwrap(Builder)->SetInsertPoint(BB, I); } void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr) { @@ -466,6 +1012,10 @@ void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block) { unwrap(Builder)->SetInsertPoint(BB); } +LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder) { + return wrap(unwrap(Builder)->GetInsertBlock()); +} + void LLVMDisposeBuilder(LLVMBuilderRef Builder) { delete unwrap(Builder); } @@ -511,6 +1061,11 @@ LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) { return wrap(unwrap(B)->CreateUnreachable()); } +void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal, + LLVMBasicBlockRef Dest) { + unwrap(Switch)->addCase(unwrap(OnVal), unwrap(Dest)); +} + /*--.. Arithmetic ..........................................................--*/ LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, @@ -762,3 +1317,46 @@ LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1, return wrap(unwrap(B)->CreateShuffleVector(unwrap(V1), unwrap(V2), unwrap(Mask), Name)); } + + +/*===-- Module providers --------------------------------------------------===*/ + +LLVMModuleProviderRef +LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M) { + return wrap(new ExistingModuleProvider(unwrap(M))); +} + +void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP) { + delete unwrap(MP); +} + + +/*===-- Memory buffers ----------------------------------------------------===*/ + +int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path, + LLVMMemoryBufferRef *OutMemBuf, + char **OutMessage) { + std::string Error; + if (MemoryBuffer *MB = MemoryBuffer::getFile(Path, &Error)) { + *OutMemBuf = wrap(MB); + return 0; + } + + *OutMessage = strdup(Error.c_str()); + return 1; +} + +int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf, + char **OutMessage) { + if (MemoryBuffer *MB = MemoryBuffer::getSTDIN()) { + *OutMemBuf = wrap(MB); + return 0; + } + + *OutMessage = strdup("stdin is empty."); + return 1; +} + +void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) { + delete unwrap(MemBuf); +}