X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FCore.cpp;h=f85dbe76119e0e9b1c224d250e4d5c53f18dc267;hb=b983d67465a939c43173e381f9063d9d9245f45b;hp=4c56e556eb3a8eec42bc630787c3774677495661;hpb=57cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71;p=oota-llvm.git diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp index 4c56e556eb3..f85dbe76119 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. // //===----------------------------------------------------------------------===// // @@ -17,13 +17,27 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/GlobalVariable.h" +#include "llvm/GlobalAlias.h" #include "llvm/TypeSymbolTable.h" #include "llvm/ModuleProvider.h" +#include "llvm/InlineAsm.h" +#include "llvm/IntrinsicInst.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) { @@ -34,6 +48,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)); } @@ -47,6 +80,10 @@ void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name) { TST.remove(I); } +void LLVMDumpModule(LLVMModuleRef M) { + unwrap(M)->dump(); +} + /*===-- Operations on types -----------------------------------------------===*/ @@ -56,18 +93,13 @@ 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 LLVMIntType(unsigned NumBits) { return wrap(IntegerType::get(NumBits)); @@ -79,11 +111,11 @@ 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 ........................................--*/ @@ -175,14 +207,14 @@ unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy) { /*--.. 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 LLVMOpaqueType() { +LLVMTypeRef LLVMOpaqueType(void) { return wrap(llvm::OpaqueType::get()); } -/* Operations on type handles */ +/*--.. Operations on type handles ..........................................--*/ LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy) { return wrap(new PATypeHolder(unwrap(PotentiallyAbstractTy))); @@ -221,6 +253,17 @@ void LLVMDumpValue(LLVMValueRef Val) { unwrap(Val)->dump(); } + +/*--.. Conversion functions ................................................--*/ + +#define LLVM_DEFINE_VALUE_CAST(name) \ + LLVMValueRef LLVMIsA##name(LLVMValueRef Val) { \ + return wrap(static_cast(dyn_cast_or_null(unwrap(Val)))); \ + } + +LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST) + + /*--.. Operations on constants of any type .................................--*/ LLVMValueRef LLVMConstNull(LLVMTypeRef Ty) { @@ -256,8 +299,31 @@ LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N, return wrap(ConstantInt::get(unwrap(IntTy), N, SignExtend != 0)); } +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) { - return wrap(ConstantFP::get(unwrap(RealTy), APFloat(N))); + APFloat APN(N); + bool ignored; + APN.convert(SemanticsForType(unwrap(RealTy)), APFloat::rmNearestTiesToEven, + &ignored); + 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 ...................................--*/ @@ -290,6 +356,10 @@ LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) { /*--.. Constant expressions ................................................--*/ +LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty) { + return wrap(ConstantExpr::getAlignOf(unwrap(Ty))); +} + LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty) { return wrap(ConstantExpr::getSizeOf(unwrap(Ty))); } @@ -489,8 +559,32 @@ LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant, unwrap(MaskConstant))); } +LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList, + unsigned NumIdx) { + return wrap(ConstantExpr::getExtractValue(unwrap(AggConstant), + IdxList, NumIdx)); +} + +LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant, + LLVMValueRef ElementValueConstant, + unsigned *IdxList, unsigned NumIdx) { + return wrap(ConstantExpr::getInsertValue(unwrap(AggConstant), + unwrap(ElementValueConstant), + IdxList, NumIdx)); +} + +LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString, + const char *Constraints, int HasSideEffects) { + return wrap(InlineAsm::get(dyn_cast(unwrap(Ty)), AsmString, + Constraints, HasSideEffects)); +} + /*--.. 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(); } @@ -534,19 +628,48 @@ 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)); } -void LLVMDeleteGlobal(LLVMValueRef GlobalVar) { - unwrap(GlobalVar)->eraseFromParent(); +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); } -int LLVMHasInitializer(LLVMValueRef GlobalVar) { - return unwrap(GlobalVar)->hasInitializer(); +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) { + unwrap(GlobalVar)->eraseFromParent(); } LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar) { @@ -574,40 +697,60 @@ void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant) { unwrap(GlobalVar)->setConstant(IsConstant != 0); } +/*--.. Operations on aliases ......................................--*/ + +LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee, + const char *Name) { + return wrap(new GlobalAlias(unwrap(Ty), GlobalValue::ExternalLinkage, Name, + unwrap(Aliasee), unwrap (M))); +} + /*--.. 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)); } -void LLVMDeleteFunction(LLVMValueRef Fn) { - unwrap(Fn)->eraseFromParent(); +LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M) { + Module *Mod = unwrap(M); + Module::iterator I = Mod->begin(); + if (I == Mod->end()) + return 0; + return wrap(I); } -unsigned LLVMCountParams(LLVMValueRef FnRef) { - // This function is strictly redundant to - // LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef))) - return unwrap(FnRef)->getArgumentList().size(); +LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) { + Module *Mod = unwrap(M); + Module::iterator I = Mod->end(); + if (I == Mod->begin()) + return 0; + return wrap(--I); } -LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) { - Function::arg_iterator AI = unwrap(FnRef)->arg_begin(); - while (index --> 0) - AI++; - return wrap(AI); +LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) { + Function *Func = unwrap(Fn); + Module::iterator I = Func; + if (++I == Func->getParent()->end()) + return 0; + return wrap(I); } -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 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) { @@ -624,23 +767,108 @@ void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) { return unwrap(Fn)->setCallingConv(CC); } -const char *LLVMGetCollector(LLVMValueRef Fn) { +const char *LLVMGetGC(LLVMValueRef Fn) { Function *F = unwrap(Fn); - return F->hasCollector()? F->getCollector() : 0; + return F->hasGC()? F->getGC() : 0; } -void LLVMSetCollector(LLVMValueRef Fn, const char *Coll) { +void LLVMSetGC(LLVMValueRef Fn, const char *GC) { Function *F = unwrap(Fn); - if (Coll) - F->setCollector(Coll); + if (GC) + F->setGC(GC); else - F->clearCollector(); + F->clearGC(); +} + +void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) { + Function *Func = unwrap(Fn); + const AttrListPtr PAL = Func->getAttributes(); + const AttrListPtr PALnew = PAL.addAttr(0, PA); + Func->setAttributes(PALnew); +} + +void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) { + Function *Func = unwrap(Fn); + const AttrListPtr PAL = Func->getAttributes(); + const AttrListPtr PALnew = PAL.removeAttr(0, PA); + Func->setAttributes(PALnew); +} + +/*--.. Operations on parameters ............................................--*/ + +unsigned LLVMCountParams(LLVMValueRef FnRef) { + // This function is strictly redundant to + // LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef))) + 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) { + Function::arg_iterator AI = unwrap(FnRef)->arg_begin(); + while (index --> 0) + AI++; + return wrap(AI); +} + +LLVMValueRef LLVMGetParamParent(LLVMValueRef V) { + return wrap(unwrap(V)->getParent()); +} + +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); +} + +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); +} + +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 LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA) { + unwrap(Arg)->addAttr(PA); +} + +void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA) { + unwrap(Arg)->removeAttr(PA); +} + +void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) { + unwrap(Arg)->addAttr( + Attribute::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) { @@ -651,8 +879,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){ @@ -665,21 +897,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) { @@ -701,6 +1003,38 @@ void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC) { assert(0 && "LLVMSetInstructionCallConv applies only to call and invoke!"); } +void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, + LLVMAttribute PA) { + CallSite Call = CallSite(unwrap(Instr)); + Call.setAttributes( + Call.getAttributes().addAttr(index, PA)); +} + +void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index, + LLVMAttribute PA) { + CallSite Call = CallSite(unwrap(Instr)); + Call.setAttributes( + Call.getAttributes().removeAttr(index, PA)); +} + +void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index, + unsigned align) { + CallSite Call = CallSite(unwrap(Instr)); + Call.setAttributes( + Call.getAttributes().addAttr(index, + Attribute::constructAlignmentFromInt(align))); +} + +/*--.. Operations on call instructions (only) ..............................--*/ + +int LLVMIsTailCall(LLVMValueRef Call) { + return unwrap(Call)->isTailCall(); +} + +void LLVMSetTailCall(LLVMValueRef Call, int isTailCall) { + unwrap(Call)->setTailCall(isTailCall); +} + /*--.. Operations on phi nodes .............................................--*/ void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues, @@ -725,8 +1059,15 @@ LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned 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) { @@ -739,6 +1080,18 @@ void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block) { unwrap(Builder)->SetInsertPoint(BB); } +LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder) { + return wrap(unwrap(Builder)->GetInsertBlock()); +} + +void LLVMClearInsertionPosition(LLVMBuilderRef Builder) { + unwrap(Builder)->ClearInsertionPoint (); +} + +void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr) { + unwrap(Builder)->Insert(unwrap(Instr)); +} + void LLVMDisposeBuilder(LLVMBuilderRef Builder) { delete unwrap(Builder); } @@ -784,6 +1137,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, @@ -1036,6 +1394,18 @@ LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1, unwrap(Mask), Name)); } +LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef B, LLVMValueRef AggVal, + unsigned Index, const char *Name) { + return wrap(unwrap(B)->CreateExtractValue(unwrap(AggVal), Index, Name)); +} + +LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef B, LLVMValueRef AggVal, + LLVMValueRef EltVal, unsigned Index, + const char *Name) { + return wrap(unwrap(B)->CreateInsertValue(unwrap(AggVal), unwrap(EltVal), + Index, Name)); +} + /*===-- Module providers --------------------------------------------------===*/ @@ -1048,3 +1418,33 @@ 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); +}