mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-09 04:15:58 +03:00
LLVM 3.7: llvm::ConstantExpr::getElementPtr() wants element type.
This is the same change like the one on the GEP instruction.
This commit is contained in:
parent
1b3abdbb14
commit
a4924c50e1
5 changed files with 68 additions and 5 deletions
|
@ -384,7 +384,11 @@ LLConstant* DtoConstArrayInitializer(ArrayInitializer* arrinit)
|
||||||
|
|
||||||
LLConstant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) };
|
LLConstant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) };
|
||||||
|
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
LLConstant* gep = llvm::ConstantExpr::getGetElementPtr(isaPointer(gvar)->getElementType(), gvar, idxs, true);
|
||||||
|
#else
|
||||||
LLConstant* gep = llvm::ConstantExpr::getGetElementPtr(gvar, idxs, true);
|
LLConstant* gep = llvm::ConstantExpr::getGetElementPtr(gvar, idxs, true);
|
||||||
|
#endif
|
||||||
gep = llvm::ConstantExpr::getBitCast(gvar, getPtrToType(llelemty));
|
gep = llvm::ConstantExpr::getBitCast(gvar, getPtrToType(llelemty));
|
||||||
|
|
||||||
return DtoConstSlice(DtoConstSize_t(arrlen), gep, arrty);
|
return DtoConstSlice(DtoConstSize_t(arrlen), gep, arrty);
|
||||||
|
|
|
@ -205,7 +205,11 @@ public:
|
||||||
|
|
||||||
llvm::ConstantInt* zero = LLConstantInt::get(LLType::getInt32Ty(gIR->context()), 0, false);
|
llvm::ConstantInt* zero = LLConstantInt::get(LLType::getInt32Ty(gIR->context()), 0, false);
|
||||||
LLConstant* idxs[2] = { zero, zero };
|
LLConstant* idxs[2] = { zero, zero };
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(isaPointer(gvar)->getElementType(), gvar, idxs, true);
|
||||||
|
#else
|
||||||
LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar, idxs, true);
|
LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar, idxs, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (t->ty == Tpointer)
|
if (t->ty == Tpointer)
|
||||||
{
|
{
|
||||||
|
@ -235,7 +239,11 @@ public:
|
||||||
{
|
{
|
||||||
llvm::Constant* ptr = toConstElem(e->e1);
|
llvm::Constant* ptr = toConstElem(e->e1);
|
||||||
dinteger_t idx = undoStrideMul(e->loc, t1b, e->e2->toInteger());
|
dinteger_t idx = undoStrideMul(e->loc, t1b, e->e2->toInteger());
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
result = llvm::ConstantExpr::getGetElementPtr(isaPointer(ptr)->getElementType(), ptr, DtoConstSize_t(idx));
|
||||||
|
#else
|
||||||
result = llvm::ConstantExpr::getGetElementPtr(ptr, DtoConstSize_t(idx));
|
result = llvm::ConstantExpr::getGetElementPtr(ptr, DtoConstSize_t(idx));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -257,7 +265,11 @@ public:
|
||||||
dinteger_t idx = undoStrideMul(e->loc, t1b, e->e2->toInteger());
|
dinteger_t idx = undoStrideMul(e->loc, t1b, e->e2->toInteger());
|
||||||
|
|
||||||
llvm::Constant* negIdx = llvm::ConstantExpr::getNeg(DtoConstSize_t(idx));
|
llvm::Constant* negIdx = llvm::ConstantExpr::getNeg(DtoConstSize_t(idx));
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
result = llvm::ConstantExpr::getGetElementPtr(isaPointer(ptr)->getElementType(), ptr, negIdx);
|
||||||
|
#else
|
||||||
result = llvm::ConstantExpr::getGetElementPtr(ptr, negIdx);
|
result = llvm::ConstantExpr::getGetElementPtr(ptr, negIdx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -311,7 +323,11 @@ public:
|
||||||
Type *type = vd->type->toBasetype();
|
Type *type = vd->type->toBasetype();
|
||||||
if (type->ty == Tarray || type->ty == Tdelegate) {
|
if (type->ty == Tarray || type->ty == Tdelegate) {
|
||||||
LLConstant* idxs[2] = { DtoConstSize_t(0), DtoConstSize_t(1) };
|
LLConstant* idxs[2] = { DtoConstSize_t(0), DtoConstSize_t(1) };
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
value = llvm::ConstantExpr::getGetElementPtr(isaPointer(value)->getElementType(), value, idxs, true);
|
||||||
|
#else
|
||||||
value = llvm::ConstantExpr::getGetElementPtr(value, idxs, true);
|
value = llvm::ConstantExpr::getGetElementPtr(value, idxs, true);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
result = DtoBitCast(value, DtoType(tb));
|
result = DtoBitCast(value, DtoType(tb));
|
||||||
}
|
}
|
||||||
|
@ -376,7 +392,11 @@ public:
|
||||||
if (e->offset % elemSize == 0)
|
if (e->offset % elemSize == 0)
|
||||||
{
|
{
|
||||||
// We can turn this into a "nice" GEP.
|
// We can turn this into a "nice" GEP.
|
||||||
result = llvm::ConstantExpr::getGetElementPtr(base,
|
result = llvm::ConstantExpr::getGetElementPtr(
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
LLType::getInt8Ty(gIR->context()),
|
||||||
|
#endif
|
||||||
|
base,
|
||||||
DtoConstSize_t(e->offset / elemSize));
|
DtoConstSize_t(e->offset / elemSize));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -384,6 +404,9 @@ public:
|
||||||
// Offset isn't a multiple of base type size, just cast to i8* and
|
// Offset isn't a multiple of base type size, just cast to i8* and
|
||||||
// apply the byte offset.
|
// apply the byte offset.
|
||||||
result = llvm::ConstantExpr::getGetElementPtr(
|
result = llvm::ConstantExpr::getGetElementPtr(
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
getVoidPtrType(),
|
||||||
|
#endif
|
||||||
DtoBitCast(base, getVoidPtrType()),
|
DtoBitCast(base, getVoidPtrType()),
|
||||||
DtoConstSize_t(e->offset));
|
DtoConstSize_t(e->offset));
|
||||||
}
|
}
|
||||||
|
@ -430,7 +453,11 @@ public:
|
||||||
LLConstant* idxs[2] = { DtoConstSize_t(0), index };
|
LLConstant* idxs[2] = { DtoConstSize_t(0), index };
|
||||||
LLConstant *val = isaConstant(getIrGlobal(vd)->value);
|
LLConstant *val = isaConstant(getIrGlobal(vd)->value);
|
||||||
val = DtoBitCast(val, DtoType(vd->type->pointerTo()));
|
val = DtoBitCast(val, DtoType(vd->type->pointerTo()));
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
LLConstant* gep = llvm::ConstantExpr::getGetElementPtr(isaPointer(val)->getElementType(), val, idxs, true);
|
||||||
|
#else
|
||||||
LLConstant* gep = llvm::ConstantExpr::getGetElementPtr(val, idxs, true);
|
LLConstant* gep = llvm::ConstantExpr::getGetElementPtr(val, idxs, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
// bitcast to requested type
|
// bitcast to requested type
|
||||||
assert(e->type->toBasetype()->ty == Tpointer);
|
assert(e->type->toBasetype()->ty == Tpointer);
|
||||||
|
@ -561,7 +588,11 @@ public:
|
||||||
|
|
||||||
// build a constant dynamic array reference with the .ptr field pointing into store
|
// build a constant dynamic array reference with the .ptr field pointing into store
|
||||||
LLConstant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) };
|
LLConstant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) };
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
LLConstant* globalstorePtr = llvm::ConstantExpr::getGetElementPtr(isaPointer(store)->getElementType(), store, idxs, true);
|
||||||
|
#else
|
||||||
LLConstant* globalstorePtr = llvm::ConstantExpr::getGetElementPtr(store, idxs, true);
|
LLConstant* globalstorePtr = llvm::ConstantExpr::getGetElementPtr(store, idxs, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
result = DtoConstSlice(DtoConstSize_t(e->elements->dim), globalstorePtr);
|
result = DtoConstSlice(DtoConstSize_t(e->elements->dim), globalstorePtr);
|
||||||
}
|
}
|
||||||
|
|
14
gen/toir.cpp
14
gen/toir.cpp
|
@ -365,7 +365,11 @@ public:
|
||||||
|
|
||||||
llvm::ConstantInt* zero = LLConstantInt::get(LLType::getInt32Ty(gIR->context()), 0, false);
|
llvm::ConstantInt* zero = LLConstantInt::get(LLType::getInt32Ty(gIR->context()), 0, false);
|
||||||
LLConstant* idxs[2] = { zero, zero };
|
LLConstant* idxs[2] = { zero, zero };
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(isaPointer(gvar)->getElementType(), gvar, idxs, true);
|
||||||
|
#else
|
||||||
LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar, idxs, true);
|
LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar, idxs, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (dtype->ty == Tarray) {
|
if (dtype->ty == Tarray) {
|
||||||
LLConstant* clen = LLConstantInt::get(DtoSize_t(), e->len, false);
|
LLConstant* clen = LLConstantInt::get(DtoSize_t(), e->len, false);
|
||||||
|
@ -1785,7 +1789,7 @@ public:
|
||||||
offset = LLConstantInt::get(DtoSize_t(), static_cast<uint64_t>(-1), true);
|
offset = LLConstantInt::get(DtoSize_t(), static_cast<uint64_t>(-1), true);
|
||||||
post = llvm::GetElementPtrInst::Create(
|
post = llvm::GetElementPtrInst::Create(
|
||||||
#if LDC_LLVM_VER >= 307
|
#if LDC_LLVM_VER >= 307
|
||||||
val->getType(),
|
isaPointer(val)->getElementType(),
|
||||||
#endif
|
#endif
|
||||||
val, offset, "", p->scopebb());
|
val, offset, "", p->scopebb());
|
||||||
}
|
}
|
||||||
|
@ -2836,14 +2840,22 @@ public:
|
||||||
LLConstant* initval = arrayConst(keysInits, indexType);
|
LLConstant* initval = arrayConst(keysInits, indexType);
|
||||||
LLConstant* globalstore = new LLGlobalVariable(*gIR->module, initval->getType(),
|
LLConstant* globalstore = new LLGlobalVariable(*gIR->module, initval->getType(),
|
||||||
false, LLGlobalValue::InternalLinkage, initval, ".aaKeysStorage");
|
false, LLGlobalValue::InternalLinkage, initval, ".aaKeysStorage");
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
LLConstant* slice = llvm::ConstantExpr::getGetElementPtr(isaPointer(globalstore)->getElementType(), globalstore, idxs, true);
|
||||||
|
#else
|
||||||
LLConstant* slice = llvm::ConstantExpr::getGetElementPtr(globalstore, idxs, true);
|
LLConstant* slice = llvm::ConstantExpr::getGetElementPtr(globalstore, idxs, true);
|
||||||
|
#endif
|
||||||
slice = DtoConstSlice(DtoConstSize_t(e->keys->dim), slice);
|
slice = DtoConstSlice(DtoConstSize_t(e->keys->dim), slice);
|
||||||
LLValue* keysArray = DtoAggrPaint(slice, funcTy->getParamType(1));
|
LLValue* keysArray = DtoAggrPaint(slice, funcTy->getParamType(1));
|
||||||
|
|
||||||
initval = arrayConst(valuesInits, vtype);
|
initval = arrayConst(valuesInits, vtype);
|
||||||
globalstore = new LLGlobalVariable(*gIR->module, initval->getType(),
|
globalstore = new LLGlobalVariable(*gIR->module, initval->getType(),
|
||||||
false, LLGlobalValue::InternalLinkage, initval, ".aaValuesStorage");
|
false, LLGlobalValue::InternalLinkage, initval, ".aaValuesStorage");
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
slice = llvm::ConstantExpr::getGetElementPtr(isaPointer(globalstore)->getElementType(), globalstore, idxs, true);
|
||||||
|
#else
|
||||||
slice = llvm::ConstantExpr::getGetElementPtr(globalstore, idxs, true);
|
slice = llvm::ConstantExpr::getGetElementPtr(globalstore, idxs, true);
|
||||||
|
#endif
|
||||||
slice = DtoConstSlice(DtoConstSize_t(e->keys->dim), slice);
|
slice = DtoConstSlice(DtoConstSize_t(e->keys->dim), slice);
|
||||||
LLValue* valuesArray = DtoAggrPaint(slice, funcTy->getParamType(2));
|
LLValue* valuesArray = DtoAggrPaint(slice, funcTy->getParamType(2));
|
||||||
|
|
||||||
|
|
|
@ -361,8 +361,14 @@ LLValue* DtoGEPi(LLValue* ptr, unsigned i0, unsigned i1, const char* var, llvm::
|
||||||
|
|
||||||
LLConstant* DtoGEPi(LLConstant* ptr, unsigned i0, unsigned i1)
|
LLConstant* DtoGEPi(LLConstant* ptr, unsigned i0, unsigned i1)
|
||||||
{
|
{
|
||||||
|
LLPointerType* p = isaPointer(ptr);
|
||||||
|
assert(p && "GEP expects a pointer type");
|
||||||
LLValue* v[] = { DtoConstUint(i0), DtoConstUint(i1) };
|
LLValue* v[] = { DtoConstUint(i0), DtoConstUint(i1) };
|
||||||
return llvm::ConstantExpr::getGetElementPtr(ptr, v, true);
|
return llvm::ConstantExpr::getGetElementPtr(
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
p->getElementType(),
|
||||||
|
#endif
|
||||||
|
ptr, v, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -491,14 +497,18 @@ LLConstant* DtoConstFP(Type* t, longdouble value)
|
||||||
LLConstant* DtoConstString(const char* str)
|
LLConstant* DtoConstString(const char* str)
|
||||||
{
|
{
|
||||||
llvm::StringRef s(str ? str : "");
|
llvm::StringRef s(str ? str : "");
|
||||||
LLConstant* init = llvm::ConstantDataArray::getString(gIR->context(), s, true);
|
llvm::Constant* init = llvm::ConstantDataArray::getString(gIR->context(), s, true);
|
||||||
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(
|
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(
|
||||||
*gIR->module, init->getType(), true, llvm::GlobalValue::InternalLinkage, init, ".str");
|
*gIR->module, init->getType(), true, llvm::GlobalValue::InternalLinkage, init, ".str");
|
||||||
gvar->setUnnamedAddr(true);
|
gvar->setUnnamedAddr(true);
|
||||||
LLConstant* idxs[] = { DtoConstUint(0), DtoConstUint(0) };
|
LLConstant* idxs[] = { DtoConstUint(0), DtoConstUint(0) };
|
||||||
return DtoConstSlice(
|
return DtoConstSlice(
|
||||||
DtoConstSize_t(s.size()),
|
DtoConstSize_t(s.size()),
|
||||||
llvm::ConstantExpr::getGetElementPtr(gvar, idxs, true),
|
llvm::ConstantExpr::getGetElementPtr(
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
init->getType(),
|
||||||
|
#endif
|
||||||
|
gvar, idxs, true),
|
||||||
Type::tchar->arrayOf()
|
Type::tchar->arrayOf()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -301,6 +301,9 @@ llvm::GlobalVariable * IrAggr::getInterfaceVtbl(BaseClass * b, bool new_instance
|
||||||
|
|
||||||
llvm::GlobalVariable* interfaceInfosZ = getInterfaceArraySymbol();
|
llvm::GlobalVariable* interfaceInfosZ = getInterfaceArraySymbol();
|
||||||
llvm::Constant* c = llvm::ConstantExpr::getGetElementPtr(
|
llvm::Constant* c = llvm::ConstantExpr::getGetElementPtr(
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
isaPointer(interfaceInfosZ)->getElementType(),
|
||||||
|
#endif
|
||||||
interfaceInfosZ, idxs, true);
|
interfaceInfosZ, idxs, true);
|
||||||
|
|
||||||
constants.push_back(c);
|
constants.push_back(c);
|
||||||
|
@ -513,6 +516,9 @@ LLConstant * IrAggr::getClassInfoInterfaces()
|
||||||
};
|
};
|
||||||
|
|
||||||
LLConstant* ptr = llvm::ConstantExpr::getGetElementPtr(
|
LLConstant* ptr = llvm::ConstantExpr::getGetElementPtr(
|
||||||
|
#if LDC_LLVM_VER >= 307
|
||||||
|
isaPointer(classInterfacesArray)->getElementType(),
|
||||||
|
#endif
|
||||||
classInterfacesArray, idxs, true);
|
classInterfacesArray, idxs, true);
|
||||||
|
|
||||||
// return as a slice
|
// return as a slice
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue