You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
5.0 KiB
C++
173 lines
5.0 KiB
C++
/**
|
|
* Compatibility header that wraps LLVM API breakage and lets us compile with
|
|
* old and new versions of LLVM.
|
|
*
|
|
* First LLVM version supported is 2.9.
|
|
*/
|
|
|
|
#ifndef __LANGUAGEKIT_LLVM_HACKS__
|
|
#define __LANGUAGEKIT_LLVM_HACKS__
|
|
#if LLVM_MAJOR < 3 || (LLVM_MAJOR >=3 && LLVM_MINOR <= 2)
|
|
#if LLVM_MAJOR < 3 || (LLVM_MAJOR >=3 && LLVM_MINOR <= 1)
|
|
#include <llvm/Support/IRBuilder.h>
|
|
#else
|
|
#include <llvm/IRBuilder.h>
|
|
#endif
|
|
#include <llvm/Function.h>
|
|
#include <llvm/Module.h>
|
|
#include <llvm/LLVMContext.h>
|
|
#include <llvm/Instructions.h>
|
|
#include <llvm/Metadata.h>
|
|
#include <llvm/Intrinsics.h>
|
|
#include <llvm/Constants.h>
|
|
#include <llvm/GlobalAlias.h>
|
|
#include <llvm/GlobalVariable.h>
|
|
#include <llvm/DefaultPasses.h>
|
|
#else
|
|
#include <llvm/IR/IRBuilder.h>
|
|
#include <llvm/IR/Function.h>
|
|
#include <llvm/IR/Module.h>
|
|
#include <llvm/IR/LLVMContext.h>
|
|
#include <llvm/IR/Instructions.h>
|
|
#include <llvm/IR/Metadata.h>
|
|
#include <llvm/IR/Intrinsics.h>
|
|
#include <llvm/IR/Constants.h>
|
|
#include <llvm/IR/GlobalVariable.h>
|
|
#include <llvm/IR/GlobalAlias.h>
|
|
#include <llvm/PassSupport.h>
|
|
#endif
|
|
|
|
#if (LLVM_MAJOR > 3) || ((LLVM_MAJOR == 3) && (LLVM_MINOR >= 3))
|
|
# define InlineCostAnalyzer InlineCostAnalysis
|
|
#endif
|
|
|
|
// Only preserve names in a debug build. This simplifies the
|
|
// IR in a release build, but makes it much harder to debug.
|
|
#ifndef DEBUG
|
|
typedef llvm::IRBuilder<false> CGBuilder;
|
|
#else
|
|
typedef llvm::IRBuilder<> CGBuilder;
|
|
#endif
|
|
|
|
__attribute((unused)) static inline
|
|
llvm::PHINode* CreatePHI(llvm::Type *Ty,
|
|
unsigned NumReservedValues,
|
|
const llvm::Twine &NameStr="",
|
|
llvm::Instruction *InsertBefore=0) {
|
|
#if LLVM_MAJOR < 3
|
|
llvm::PHINode *phi = llvm::PHINode::Create(Ty, NameStr, InsertBefore);
|
|
phi->reserveOperandSpace(NumReservedValues);
|
|
return phi;
|
|
#else
|
|
return llvm::PHINode::Create(Ty, NumReservedValues, NameStr, InsertBefore);
|
|
#endif
|
|
}
|
|
|
|
__attribute((unused)) static inline
|
|
llvm::PHINode* IRBuilderCreatePHI(CGBuilder *Builder,
|
|
llvm::Type *Ty,
|
|
unsigned NumReservedValues,
|
|
const llvm::Twine &NameStr="")
|
|
{
|
|
#if LLVM_MAJOR < 3
|
|
llvm::PHINode *phi = Builder->CreatePHI(Ty, NameStr);
|
|
phi->reserveOperandSpace(NumReservedValues);
|
|
return phi;
|
|
#else
|
|
return Builder->CreatePHI(Ty, NumReservedValues, NameStr);
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
__attribute((unused)) static inline
|
|
llvm::MDNode* CreateMDNode(llvm::LLVMContext &C,
|
|
llvm::Value **V,
|
|
unsigned length=1) {
|
|
#if LLVM_MAJOR < 3
|
|
return llvm::MDNode::get(C, V, length);
|
|
#else
|
|
llvm::ArrayRef<llvm::Value*> val(V, length);
|
|
return llvm::MDNode::get(C, val);
|
|
#endif
|
|
}
|
|
|
|
template<typename T>
|
|
static inline
|
|
llvm::InvokeInst* IRBuilderCreateInvoke(CGBuilder *Builder,
|
|
llvm::Value *callee,
|
|
llvm::BasicBlock *dest,
|
|
llvm::BasicBlock *dest2,
|
|
T values,
|
|
const llvm::Twine &NameStr="")
|
|
{
|
|
#if LLVM_MAJOR < 3
|
|
return Builder->CreateInvoke(callee, dest, dest2, values.begin(), values.end(), NameStr);
|
|
#else
|
|
return Builder->CreateInvoke(callee, dest, dest2, values, NameStr);
|
|
#endif
|
|
}
|
|
|
|
template<typename T>
|
|
static inline
|
|
llvm::CallInst* IRBuilderCreateCall(CGBuilder *Builder,
|
|
llvm::Value *callee,
|
|
T values,
|
|
const llvm::Twine &NameStr="")
|
|
{
|
|
#if LLVM_MAJOR < 3
|
|
return Builder->CreateCall(callee, values.begin(), values.end(), NameStr);
|
|
#else
|
|
return Builder->CreateCall(callee, values, NameStr);
|
|
#endif
|
|
}
|
|
|
|
template<typename T>
|
|
static inline
|
|
llvm::CallInst* CreateCall(llvm::Value *callee,
|
|
T values,
|
|
const llvm::Twine &NameStr,
|
|
llvm::Instruction *before)
|
|
{
|
|
#if LLVM_MAJOR < 3
|
|
return llvm::CallInst::Create(callee, values.begin(), values.end(), NameStr, before);
|
|
#else
|
|
return llvm::CallInst::Create(callee, values, NameStr, before);
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
#if LLVM_MAJOR < 3
|
|
#define GetStructType(context, ...) StructType::get(context, __VA_ARGS__)
|
|
#else
|
|
#define GetStructType(context, ...) StructType::get(__VA_ARGS__)
|
|
#endif
|
|
|
|
__attribute((unused)) static inline
|
|
llvm::Constant* GetConstantStruct(llvm::LLVMContext &C, const std::vector<llvm::Constant*>
|
|
&V, bool Packed) {
|
|
#if LLVM_MAJOR < 3
|
|
return llvm::ConstantStruct::get(C, V, Packed);
|
|
#else
|
|
return llvm::ConstantStruct::getAnon(C, V, Packed);
|
|
#endif
|
|
}
|
|
|
|
|
|
#if LLVM_MAJOR < 3
|
|
typedef const llvm::Type LLVMType;
|
|
typedef const llvm::StructType LLVMStructTy;
|
|
typedef const llvm::ArrayType LLVMArrayTy;
|
|
typedef const llvm::PointerType LLVMPointerTy;
|
|
typedef const llvm::IntegerType LLVMIntegerTy;
|
|
#else
|
|
typedef llvm::Type LLVMType;
|
|
typedef llvm::StructType LLVMStructTy;
|
|
typedef llvm::ArrayType LLVMArrayTy;
|
|
typedef llvm::PointerType LLVMPointerTy;
|
|
typedef llvm::IntegerType LLVMIntegerTy;
|
|
#endif
|
|
|
|
#endif
|