Merge branch 'master' into merge-2.067

This commit is contained in:
Kai Nacke 2015-04-05 03:29:30 +02:00
commit ced658da92
7 changed files with 99 additions and 14 deletions

View file

@ -45,8 +45,6 @@ env:
- LLVM_PACKAGE="llvm-3.3 llvm-3.3-dev" TEST_DEBUG=1 - LLVM_PACKAGE="llvm-3.3 llvm-3.3-dev" TEST_DEBUG=1
- LLVM_PACKAGE="llvm-3.3 llvm-3.3-dev" - LLVM_PACKAGE="llvm-3.3 llvm-3.3-dev"
- LLVM_PACKAGE="llvm-3.4 llvm-3.4-dev" TEST_DEBUG=1 - LLVM_PACKAGE="llvm-3.4 llvm-3.4-dev" TEST_DEBUG=1
- LLVM_PACKAGE="llvm-3.4 llvm-3.4-dev" OPTS="-DMULTILIB=ON" TEST_BITNESS=32
- LLVM_PACKAGE="llvm-3.4 llvm-3.4-dev" OPTS="-DMULTILIB=ON" TEST_BITNESS=64
- LLVM_PACKAGE="llvm-3.4 llvm-3.4-dev" TEST_DEBUG=1 OPTS="-DBUILD_SHARED_LIBS=ON" - LLVM_PACKAGE="llvm-3.4 llvm-3.4-dev" TEST_DEBUG=1 OPTS="-DBUILD_SHARED_LIBS=ON"
- LLVM_PACKAGE="llvm-3.4 llvm-3.4-dev" OPTS="-DBUILD_SHARED_LIBS=ON" - LLVM_PACKAGE="llvm-3.4 llvm-3.4-dev" OPTS="-DBUILD_SHARED_LIBS=ON"
- LLVM_PACKAGE="llvm-3.5 llvm-3.5-dev libedit2 libedit-dev" TEST_DEBUG=1 - LLVM_PACKAGE="llvm-3.5 llvm-3.5-dev libedit2 libedit-dev" TEST_DEBUG=1
@ -57,6 +55,8 @@ env:
- LLVM_PACKAGE="llvm-3.7 llvm-3.7-dev libedit2 libedit-dev" - LLVM_PACKAGE="llvm-3.7 llvm-3.7-dev libedit2 libedit-dev"
matrix: matrix:
allow_failures: allow_failures:
- env: LLVM_PACKAGE="llvm-3.4 llvm-3.4-dev" OPTS="-DMULTILIB=ON" TEST_BITNESS=32
- env: LLVM_PACKAGE="llvm-3.4 llvm-3.4-dev" OPTS="-DMULTILIB=ON" TEST_BITNESS=64
- env: LLVM_PACKAGE="llvm-3.6 llvm-3.6-dev libedit2 libedit-dev" TEST_DEBUG=1 - env: LLVM_PACKAGE="llvm-3.6 llvm-3.6-dev libedit2 libedit-dev" TEST_DEBUG=1
- env: LLVM_PACKAGE="llvm-3.6 llvm-3.6-dev libedit2 libedit-dev" - env: LLVM_PACKAGE="llvm-3.6 llvm-3.6-dev libedit2 libedit-dev"
- env: LLVM_PACKAGE="llvm-3.7 llvm-3.7-dev libedit2 libedit-dev" TEST_DEBUG=1 - env: LLVM_PACKAGE="llvm-3.7 llvm-3.7-dev libedit2 libedit-dev" TEST_DEBUG=1

View file

@ -1393,21 +1393,41 @@ int main(int argc, char **argv)
char* moduleName = m->toChars(); char* moduleName = m->toChars();
#endif #endif
#if LDC_LLVM_VER >= 303 #if LDC_LLVM_VER >= 306
llvm::Module *dest = new llvm::Module(moduleName, context); llvm::Linker linker(llvmModules[0]);
llvm::Linker linker(dest); #elif LDC_LLVM_VER >= 303
llvm::Linker linker(new llvm::Module(moduleName, context));
#else #else
llvm::Linker linker("ldc", moduleName, context); llvm::Linker linker("ldc", moduleName, context);
#endif #endif
std::string errormsg; std::string errormsg;
#if LDC_LLVM_VER >= 306
for (size_t i = 1; i < llvmModules.size(); i++)
#else
for (size_t i = 0; i < llvmModules.size(); i++) for (size_t i = 0; i < llvmModules.size(); i++)
#endif
{ {
#if LDC_LLVM_VER >= 306 #if LDC_LLVM_VER >= 306
linker.linkInModule(llvmModules[i]); // Issue #855: There seems to be a problem with identified structs.
// If a module imports a class or struct from another module and
// both modules are compiled together then both modules use the
// same type object. The error happens if the type is already
// remapped in one module and then the other module is linked.
// The workaround seems to be to do the linking twice, always
// uniquing all identified structs.
//
// This replaces the line:
// linker.linkInModule(llvmModules[i]);
//
// TODO: Check LLVM bug database if this is a bug.
llvm::Linker dummy(new llvm::Module("dummy module", context));
dummy.linkInModule(llvmModules[i]);
linker.linkInModule(dummy.getModule());
dummy.deleteModule();
#else #else
#if LDC_LLVM_VER >= 303 #if LDC_LLVM_VER >= 303
if (linker.linkInModule(llvmModules[i], llvm::Linker::DestroySource, &errormsg)) if (linker.linkInModule(llvmModules[i], &errormsg))
#else #else
if (linker.LinkInModule(llvmModules[i], &errormsg)) if (linker.LinkInModule(llvmModules[i], &errormsg))
#endif #endif
@ -1420,8 +1440,10 @@ int main(int argc, char **argv)
writeModule(linker.getModule(), filename); writeModule(linker.getModule(), filename);
global.params.objfiles->push(const_cast<char*>(filename)); global.params.objfiles->push(const_cast<char*>(filename));
#if LDC_LLVM_VER >= 303 #if LDC_LLVM_VER >= 304
delete dest; linker.deleteModule();
#elif LDC_LLVM_VER == 303
delete linker.getModule();
#endif #endif
} }

View file

@ -389,7 +389,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);

View file

@ -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);
} }

View file

@ -396,7 +396,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);
@ -1826,7 +1830,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());
} }
@ -2874,14 +2878,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));

View file

@ -360,8 +360,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);
} }
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
@ -490,14 +496,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()
); );
} }

View file

@ -302,6 +302,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);
@ -514,6 +517,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