X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-llvm-cpp.cpp;h=253cd42ff81b93f61cfa49d1a40eac51737e1a82;hb=f0cb764a7eaf46ef5c71feab8d505091fd257b42;hp=8ac2da6b60711132f7873655aa30e318bc9a18d9;hpb=c05d7a78f8df50ef172c9e61660781073738929d;p=mono.git diff --git a/mono/mini/mini-llvm-cpp.cpp b/mono/mini/mini-llvm-cpp.cpp index 8ac2da6b607..253cd42ff81 100644 --- a/mono/mini/mini-llvm-cpp.cpp +++ b/mono/mini/mini-llvm-cpp.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include "mini-llvm-cpp.h" @@ -56,7 +57,11 @@ mono_llvm_build_alloca (LLVMBuilderRef builder, LLVMTypeRef Ty, LLVMValueRef ArraySize, int alignment, const char *Name) { +#if LLVM_API_VERSION >= 500 + return wrap (unwrap (builder)->Insert (new AllocaInst (unwrap (Ty), 0, unwrap (ArraySize), alignment), Name)); +#else return wrap (unwrap (builder)->Insert (new AllocaInst (unwrap (Ty), unwrap (ArraySize), alignment), Name)); +#endif } LLVMValueRef @@ -244,6 +249,106 @@ mono_llvm_set_call_notail (LLVMValueRef func) #endif } +#if LLVM_API_VERSION > 500 +static Attribute::AttrKind +convert_attr (AttrKind kind) +{ + switch (kind) { + case LLVM_ATTR_NO_UNWIND: + return Attribute::NoUnwind; + case LLVM_ATTR_NO_INLINE: + return Attribute::NoInline; + case LLVM_ATTR_OPTIMIZE_FOR_SIZE: + return Attribute::OptimizeForSize; + case LLVM_ATTR_IN_REG: + return Attribute::InReg; + case LLVM_ATTR_STRUCT_RET: + return Attribute::StructRet; + case LLVM_ATTR_NO_ALIAS: + return Attribute::NoAlias; + case LLVM_ATTR_BY_VAL: + return Attribute::ByVal; + case LLVM_ATTR_UW_TABLE: + return Attribute::UWTable; + default: + assert (0); + return Attribute::NoUnwind; + } +} +#else +static LLVMAttribute +convert_attr (AttrKind kind) +{ + switch (kind) { + case LLVM_ATTR_NO_UNWIND: + return LLVMNoUnwindAttribute; + case LLVM_ATTR_NO_INLINE: + return LLVMNoInlineAttribute; + case LLVM_ATTR_OPTIMIZE_FOR_SIZE: + return LLVMOptimizeForSizeAttribute; + case LLVM_ATTR_IN_REG: + return LLVMInRegAttribute; + case LLVM_ATTR_STRUCT_RET: + return LLVMStructRetAttribute; + case LLVM_ATTR_NO_ALIAS: + return LLVMNoAliasAttribute; + case LLVM_ATTR_BY_VAL: + return LLVMByValAttribute; + case LLVM_ATTR_UW_TABLE: + return LLVMUWTable; + default: + assert (0); + return LLVMNoUnwindAttribute; + } +} +#endif + +void +mono_llvm_add_func_attr (LLVMValueRef func, AttrKind kind) +{ +#if LLVM_API_VERSION > 100 + unwrap (func)->addAttribute (AttributeList::FunctionIndex, convert_attr (kind)); +#else + Function *Func = unwrap(func); + const AttributeSet PAL = Func->getAttributes(); + AttrBuilder B(convert_attr (kind)); + const AttributeSet PALnew = + PAL.addAttributes(Func->getContext(), AttributeSet::FunctionIndex, + AttributeSet::get(Func->getContext(), + AttributeSet::FunctionIndex, B)); + Func->setAttributes(PALnew); +#endif +} + +void +mono_llvm_add_param_attr (LLVMValueRef param, AttrKind kind) +{ +#if LLVM_API_VERSION > 100 + Function *func = unwrap (param)->getParent (); + int n = unwrap (param)->getArgNo (); + func->addParamAttr (n, convert_attr (kind)); +#else + Argument *A = unwrap(param); + AttrBuilder B(convert_attr (kind)); + A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); +#endif +} + +void +mono_llvm_add_instr_attr (LLVMValueRef val, int index, AttrKind kind) +{ +#if LLVM_API_VERSION > 100 + CallSite (unwrap (val)).addAttribute (index, convert_attr (kind)); +#else + CallSite Call = CallSite(unwrap(val)); + AttrBuilder B(convert_attr (kind)); + Call.setAttributes( + Call.getAttributes().addAttributes(Call->getContext(), index, + AttributeSet::get(Call->getContext(), + index, B))); +#endif +} + #if LLVM_API_VERSION > 100 void* @@ -257,7 +362,14 @@ mono_llvm_di_create_compile_unit (void *di_builder, const char *cu_name, const c { DIBuilder *builder = (DIBuilder*)di_builder; +#if LLVM_API_VERSION >= 500 + DIFile *di_file; + + di_file = builder->createFile (cu_name, dir); + return builder->createCompileUnit (dwarf::DW_LANG_C99, di_file, producer, true, "", 0); +#else return builder->createCompileUnit (dwarf::DW_LANG_C99, cu_name, dir, producer, true, "", 0); +#endif } void*