New LLVM version macro

This commit is contained in:
Anton Mitrokhin
2015-06-16 15:00:00 +03:00
parent 0b62c28436
commit 0afa3f5713
20 changed files with 559 additions and 448 deletions

104
type.cpp
View File

@@ -43,14 +43,14 @@
#include <stdio.h>
#include <map>
#if defined(LLVM_3_2)
#if ISPC_LLVM_VERSION == ISPC_LLVM_3_2
#include <llvm/Value.h>
#include <llvm/Module.h>
#else
#include <llvm/IR/Value.h>
#include <llvm/IR/Module.h>
#endif
#if !defined(LLVM_3_2) && !defined(LLVM_3_3) && !defined(LLVM_3_4) // LLVM 3.5+
#if ISPC_LLVM_VERSION >= ISPC_LLVM_3_5 // LLVM 3.5+
#include <llvm/IR/DebugInfo.h>
#include <llvm/IR/DIBuilder.h>
#else
@@ -79,12 +79,13 @@ lShouldPrintName(const std::string &name) {
/** Utility routine to create a llvm array type of the given number of
the given element type. */
#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5) || defined (LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
static llvm::DIType lCreateDIArray(llvm::DIType eltType, int count) {
#else // LLVM 3.7++
static llvm::DIType *lCreateDIArray(llvm::DIType *eltType, int count) {
#endif
#ifdef LLVM_3_2
#if ISPC_LLVM_VERSION == ISPC_LLVM_3_2
int lowerBound = 0, upperBound = count-1;
if (count == 0) {
@@ -94,11 +95,11 @@ static llvm::DIType *lCreateDIArray(llvm::DIType *eltType, int count) {
}
llvm::Value *sub = m->diBuilder->getOrCreateSubrange(lowerBound, upperBound);
#elif defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5)
#elif ISPC_LLVM_VERSION < ISPC_LLVM_3_6
llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, count);
#endif
#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_6
std::vector<llvm::Value *> subs;
#else // LLVM 3.6++
llvm::Metadata *sub = m->diBuilder->getOrCreateSubrange(0, count);
@@ -106,7 +107,7 @@ static llvm::DIType *lCreateDIArray(llvm::DIType *eltType, int count) {
#endif
subs.push_back(sub);
#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5) || defined (LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIArray subArray = m->diBuilder->getOrCreateArray(subs);
uint64_t size = eltType.getSizeInBits() * count;
uint64_t align = eltType.getAlignInBits();
@@ -525,7 +526,7 @@ AtomicType::LLVMType(llvm::LLVMContext *ctx) const {
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType AtomicType::GetDIType(llvm::DIDescriptor scope) const {
#else //LLVM 3.7++
llvm::DIType *AtomicType::GetDIType(llvm::DIScope *scope) const {
@@ -535,7 +536,7 @@ llvm::DIType *AtomicType::GetDIType(llvm::DIScope *scope) const {
if (variability.type == Variability::Uniform) {
switch (basicType) {
case TYPE_VOID:
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
return llvm::DIType();
#else //LLVM 3.7++
return NULL;
@@ -586,7 +587,7 @@ llvm::DIType *AtomicType::GetDIType(llvm::DIScope *scope) const {
break;
default:
FATAL("unhandled basic type in AtomicType::GetDIType()");
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
return llvm::DIType();
#else //LLVM 3.7++
return NULL;
@@ -594,21 +595,23 @@ llvm::DIType *AtomicType::GetDIType(llvm::DIScope *scope) const {
}
}
else if (variability == Variability::Varying) {
#ifdef LLVM_3_2
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_3
llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth()-1);
#elif defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5)
#elif ISPC_LLVM_VERSION >= ISPC_VERSION_3_3 && ISPC_LLVM_VERSION < ISPC_LLVM_3_6
llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth());
#else // LLVM 3.6++
llvm::Metadata *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth());
#endif
#if defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5) || defined (LLVM_3_6)
#if ISPC_LLVM_VERSION >= ISPC_VERSION_3_3 && ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIArray subArray = m->diBuilder->getOrCreateArray(sub);
llvm::DIType unifType = GetAsUniformType()->GetDIType(scope);
uint64_t size = unifType.getSizeInBits() * g->target->getVectorWidth();
uint64_t align = unifType.getAlignInBits() * g->target->getVectorWidth();
#else // LLVM 3.7++
#elif ISPC_LLVM_VERSION >= ISPC_VERSION_3_7 // LLVM 3.7+
llvm::DINodeArray subArray = m->diBuilder->getOrCreateArray(sub);
llvm::DIType *unifType = GetAsUniformType()->GetDIType(scope);
//llvm::DebugNodeArray subArray = m->diBuilder->getOrCreateArray(sub);
//llvm::MDType *unifType = GetAsUniformType()->GetDIType(scope);
uint64_t size = unifType->getSizeInBits() * g->target->getVectorWidth();
uint64_t align = unifType->getAlignInBits()* g->target->getVectorWidth();
#endif
@@ -844,13 +847,13 @@ EnumType::LLVMType(llvm::LLVMContext *ctx) const {
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType EnumType::GetDIType(llvm::DIDescriptor scope) const {
#else // LLVM 3.7++
llvm::DIType *EnumType::GetDIType(llvm::DIScope *scope) const {
#endif
#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_6
std::vector<llvm::Value *> enumeratorDescriptors;
#else // LLVM 3.6++
std::vector<llvm::Metadata *> enumeratorDescriptors;
@@ -860,7 +863,7 @@ llvm::DIType *EnumType::GetDIType(llvm::DIScope *scope) const {
Assert(enumerators[i]->constValue != NULL);
int count = enumerators[i]->constValue->GetValues(&enumeratorValue);
Assert(count == 1);
#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_6
llvm::Value *descriptor =
#else // LLVM 3.6++
llvm::Metadata *descriptor =
@@ -868,7 +871,7 @@ llvm::DIType *EnumType::GetDIType(llvm::DIScope *scope) const {
m->diBuilder->createEnumerator(enumerators[i]->name, enumeratorValue);
enumeratorDescriptors.push_back(descriptor);
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIArray elementArray =
m->diBuilder->getOrCreateArray(enumeratorDescriptors);
llvm::DIFile diFile = pos.GetDIFile();
@@ -891,19 +894,20 @@ llvm::DIType *EnumType::GetDIType(llvm::DIScope *scope) const {
case Variability::Uniform:
return diType;
case Variability::Varying: {
#ifdef LLVM_3_2
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_3
llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth()-1);
#elif defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5)
#elif ISPC_LLVM_VERSION < ISPC_LLVM_3_6
llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth());
#else // LLVM 3.6++
llvm::Metadata *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth());
#endif
#if defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5) || defined (LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIArray subArray = m->diBuilder->getOrCreateArray(sub);
uint64_t size = diType.getSizeInBits() * g->target->getVectorWidth();
uint64_t size = diType.getSizeInBits() * g->target->getVectorWidth();
uint64_t align = diType.getAlignInBits() * g->target->getVectorWidth();
#else // LLVM 3.7++
#elif ISPC_LLVM_VERSION >= ISPC_LLVM_3_7 // LLVM 3.7++
llvm::DINodeArray subArray = m->diBuilder->getOrCreateArray(sub);
//llvm::DebugNodeArray subArray = m->diBuilder->getOrCreateArray(sub);
uint64_t size = diType->getSizeInBits() * g->target->getVectorWidth();
uint64_t align = diType->getAlignInBits()* g->target->getVectorWidth();
#endif
@@ -914,7 +918,7 @@ llvm::DIType *EnumType::GetDIType(llvm::DIScope *scope) const {
}
default:
FATAL("Unexpected variability in EnumType::GetDIType()");
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
return llvm::DIType();
#else //LLVM 3.7++
return NULL;
@@ -1252,7 +1256,7 @@ PointerType::LLVMType(llvm::LLVMContext *ctx) const {
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType PointerType::GetDIType(llvm::DIDescriptor scope) const {
if (baseType == NULL) {
Assert(m->errorCount > 0);
@@ -1275,7 +1279,7 @@ llvm::DIType *PointerType::GetDIType(llvm::DIScope *scope) const {
ptrAlignBits);
case Variability::Varying: {
// emit them as an array of pointers
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType eltType =
#else //LLVM 3.7++
llvm::DIDerivedType *eltType =
@@ -1289,7 +1293,7 @@ llvm::DIType *PointerType::GetDIType(llvm::DIScope *scope) const {
}
default:
FATAL("Unexpected variability in PointerType::GetDIType()");
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
return llvm::DIType();
#else //LLVM 3.7++
return NULL;
@@ -1567,7 +1571,7 @@ ArrayType::TotalElementCount() const {
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType ArrayType::GetDIType(llvm::DIDescriptor scope) const {
if (child == NULL) {
Assert(m->errorCount > 0);
@@ -1816,16 +1820,16 @@ VectorType::LLVMType(llvm::LLVMContext *ctx) const {
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType VectorType::GetDIType(llvm::DIDescriptor scope) const {
llvm::DIType eltType = base->GetDIType(scope);
#else //LLVM 3.7++
llvm::DIType *VectorType::GetDIType(llvm::DIScope *scope) const {
llvm::DIType *eltType = base->GetDIType(scope);
#endif
#ifdef LLVM_3_2
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_3
llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, numElements-1);
#elif defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5)
#elif ISPC_LLVM_VERSION < ISPC_LLVM_3_6
llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, numElements);
#else // LLVM 3.6++
llvm::Metadata *sub = m->diBuilder->getOrCreateSubrange(0, numElements);
@@ -1834,7 +1838,7 @@ llvm::DIType *VectorType::GetDIType(llvm::DIScope *scope) const {
// vectors of varying types are already naturally aligned to the
// machine's vector width, but arrays of uniform types need to be
// explicitly aligned to the machines natural vector alignment.
#if defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5) || defined (LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIArray subArray = m->diBuilder->getOrCreateArray(sub);
uint64_t sizeBits = eltType.getSizeInBits() * numElements;
uint64_t align = eltType.getAlignInBits();
@@ -1855,7 +1859,7 @@ llvm::DIType *VectorType::GetDIType(llvm::DIScope *scope) const {
}
else {
FATAL("Unexpected variability in VectorType::GetDIType()");
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
return llvm::DIType();
#else // LLVM 3.7++
return NULL;
@@ -2259,13 +2263,13 @@ StructType::LLVMType(llvm::LLVMContext *ctx) const {
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType StructType::GetDIType(llvm::DIDescriptor scope) const {
#else //LLVM 3.7++
llvm::DIType *StructType::GetDIType(llvm::DIScope *scope) const {
#endif
uint64_t currentSize = 0, align = 0;
#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_6
std::vector<llvm::Value *> elementLLVMTypes;
#else // LLVM 3.6++
std::vector<llvm::Metadata *> elementLLVMTypes;
@@ -2274,7 +2278,7 @@ llvm::DIType *StructType::GetDIType(llvm::DIScope *scope) const {
// alignment and size, using that to figure out its offset w.r.t. the
// start of the structure.
for (unsigned int i = 0; i < elementTypes.size(); ++i) {
#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5) || defined (LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType eltType = GetElementType(i)->GetDIType(scope);
uint64_t eltAlign = eltType.getAlignInBits();
uint64_t eltSize = eltType.getSizeInBits();
@@ -2296,7 +2300,7 @@ llvm::DIType *StructType::GetDIType(llvm::DIScope *scope) const {
Assert((currentSize == 0) || (currentSize % eltAlign) == 0);
int line = elementPositions[i].first_line;
#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5) || defined (LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIFile diFile = elementPositions[i].GetDIFile();
llvm::DIType fieldType =
#else // LLVM 3.7++
@@ -2316,7 +2320,7 @@ llvm::DIType *StructType::GetDIType(llvm::DIScope *scope) const {
if (currentSize > 0 && (currentSize % align))
currentSize += align - (currentSize % align);
#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5) || defined (LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIArray elements = m->diBuilder->getOrCreateArray(elementLLVMTypes);
llvm::DIFile diFile = pos.GetDIFile();
#else // LLVM 3.7++
@@ -2331,9 +2335,9 @@ llvm::DIType *StructType::GetDIType(llvm::DIScope *scope) const {
currentSize, // Size in bits
align, // Alignment in bits
0, // Flags
#if defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION >= ISPC_LLVM_3_3 && ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType(), // DerivedFrom
#elif !defined(LLVM_3_2) // LLVM 3.7++
#elif ISPC_LLVM_VERSION >= ISPC_LLVM_3_7 // LLVM 3.7++
NULL,
#endif
elements);
@@ -2564,7 +2568,7 @@ UndefinedStructType::LLVMType(llvm::LLVMContext *ctx) const {
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType UndefinedStructType::GetDIType(llvm::DIDescriptor scope) const {
llvm::DIFile diFile = pos.GetDIFile();
llvm::DIArray elements;
@@ -2581,9 +2585,9 @@ llvm::DIType *UndefinedStructType::GetDIType(llvm::DIScope *scope) const {
0, // Size
0, // Align
0, // Flags
#if defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION >= ISPC_LLVM_3_3 && ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType(), // DerivedFrom
#elif !defined(LLVM_3_2) // LLVM 3.7++
#elif ISPC_LLVM_VERSION >= ISPC_LLVM_3_7 // LLVM 3.7++
NULL,
#endif
elements);
@@ -2838,7 +2842,7 @@ ReferenceType::LLVMType(llvm::LLVMContext *ctx) const {
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType ReferenceType::GetDIType(llvm::DIDescriptor scope) const {
if (targetType == NULL) {
Assert(m->errorCount > 0);
@@ -3117,13 +3121,13 @@ FunctionType::LLVMType(llvm::LLVMContext *ctx) const {
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DIType FunctionType::GetDIType(llvm::DIDescriptor scope) const {
#else //LLVM 3.7++
llvm::DIType *FunctionType::GetDIType(llvm::DIScope *scope) const {
#endif
#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_6
std::vector<llvm::Value *> retArgTypes;
#else // LLVM 3.6++
std::vector<llvm::Metadata *> retArgTypes;
@@ -3133,22 +3137,22 @@ llvm::DIType *FunctionType::GetDIType(llvm::DIScope *scope) const {
const Type *t = GetParameterType(i);
if (t == NULL)
#if defined(LLVM_3_2) || defined(LLVM_3_3)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_4
return llvm::DIType();
#elif defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
#elif ISPC_LLVM_VERSION < ISPC_LLVM_3_7
return llvm::DICompositeType();
#else // LLVM 3.7++
return NULL;
#endif
retArgTypes.push_back(t->GetDIType(scope));
}
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5)
#if ISPC_LLVM_VERSION < ISPC_LLVM_3_6
llvm::DIArray retArgTypesArray =
m->diBuilder->getOrCreateArray(llvm::ArrayRef<llvm::Value *>(retArgTypes));
llvm::DIType diType =
// FIXME: DIFile
m->diBuilder->createSubroutineType(llvm::DIFile(), retArgTypesArray);
#elif defined(LLVM_3_6)
#elif ISPC_LLVM_VERSION < ISPC_LLVM_3_7
llvm::DITypeArray retArgTypesArray =
m->diBuilder->getOrCreateTypeArray(retArgTypes);
llvm::DIType diType =