Misc. debuginfo fixes

As LLVM's CodeView component now uses additional asserts, e.g.,
to make sure the size of a static array equals N * elementSize.
This commit is contained in:
Martin 2016-07-22 14:23:56 +02:00
parent d034ede92e
commit c9cb63fb54
2 changed files with 47 additions and 52 deletions

View file

@ -370,11 +370,7 @@ ldc::DIType ldc::DIBuilder::CreateCompositeType(Type *type) {
} }
} }
#if LDC_LLVM_VER >= 307 auto elemsArray = DBuilder.getOrCreateArray(elems);
llvm::DINodeArray elemsArray = DBuilder.getOrCreateArray(elems);
#else
llvm::DIArray elemsArray = DBuilder.getOrCreateArray(elems);
#endif
ldc::DIType ret; ldc::DIType ret;
if (t->ty == Tclass) { if (t->ty == Tclass) {
@ -460,9 +456,9 @@ ldc::DIType ldc::DIBuilder::CreateSArrayType(Type *type) {
TypeSArray *tsa = static_cast<TypeSArray *>(t); TypeSArray *tsa = static_cast<TypeSArray *>(t);
int64_t Count = tsa->dim->toInteger(); int64_t Count = tsa->dim->toInteger();
#if LDC_LLVM_VER >= 306 #if LDC_LLVM_VER >= 306
llvm::Metadata *subscript = DBuilder.getOrCreateSubrange(0, Count - 1); llvm::Metadata *subscript = DBuilder.getOrCreateSubrange(0, Count);
#else #else
llvm::Value *subscript = DBuilder.getOrCreateSubrange(0, Count - 1); llvm::Value *subscript = DBuilder.getOrCreateSubrange(0, Count);
#endif #endif
subscripts.push_back(subscript); subscripts.push_back(subscript);
t = t->nextOf(); t = t->nextOf();
@ -478,8 +474,7 @@ ldc::DIType ldc::DIBuilder::CreateSArrayType(Type *type) {
} }
ldc::DIType ldc::DIBuilder::CreateAArrayType(Type *type) { ldc::DIType ldc::DIBuilder::CreateAArrayType(Type *type) {
// FIXME: Implement return CreatePointerType(Type::tvoidptr);
return DBuilder.createUnspecifiedType(type->toChars());
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -507,30 +502,39 @@ ldc::DISubroutineType ldc::DIBuilder::CreateFunctionType(Type *type) {
#endif #endif
} }
ldc::DISubroutineType ldc::DIBuilder::CreateDelegateType(Type *type) { ldc::DIType ldc::DIBuilder::CreateDelegateType(Type *type) {
// FIXME: Implement ldc::DICompileUnit CU(GetCU());
TypeDelegate *t = static_cast<TypeDelegate *>(type); assert(CU && "Compilation unit missing or corrupted");
// Create "dummy" subroutine type for the return type
#if LDC_LLVM_VER >= 306
llvm::SmallVector<llvm::Metadata *, 16> Elts;
#else
llvm::SmallVector<llvm::Value *, 16> Elts;
#endif
Elts.push_back(DBuilder.createUnspecifiedType(type->toChars()));
#if LDC_LLVM_VER >= 306
auto EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);
#else
auto EltTypeArray = DBuilder.getOrCreateArray(Elts);
#endif
#if LDC_LLVM_VER >= 308
return DBuilder.createSubroutineType(EltTypeArray);
#else
Loc loc(IR->dmodule->srcfile->toChars(), 0, 0); Loc loc(IR->dmodule->srcfile->toChars(), 0, 0);
ldc::DIFile file(CreateFile(loc)); ldc::DIFile file(CreateFile(loc));
return DBuilder.createSubroutineType(file, EltTypeArray);
DIType voidPtrType = CreatePointerType(Type::tvoidptr);
#if LDC_LLVM_VER >= 306
llvm::Metadata *elems[] =
#else
llvm::Value *elems[] =
#endif #endif
{CreatePointerType(Type::tvoidptr),
CreateFunctionType(static_cast<TypeDelegate *>(type)->next)};
auto elemsArray = DBuilder.getOrCreateArray(elems);
#if LDC_LLVM_VER >= 307
ldc::DIType derivedFrom = nullptr;
#else
ldc::DIType derivedFrom;
#endif
return DBuilder.createStructType(
CU, // compile unit where defined
"delegate", // name
file, // file where defined
0, // line number where defined
getTypeAllocSize(getVoidPtrType()) * 2 * 8, // size in bits
getABITypeAlign(getVoidPtrType()) * 8, // alignment in bits
0, // flags
derivedFrom, // derived from
elemsArray);
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -544,9 +548,8 @@ bool isOpaqueEnumType(Type *type) {
ldc::DIType ldc::DIBuilder::CreateTypeDescription(Type *type, bool derefclass) { ldc::DIType ldc::DIBuilder::CreateTypeDescription(Type *type, bool derefclass) {
// Check for opaque enum first, Bugzilla 13792 // Check for opaque enum first, Bugzilla 13792
if (isOpaqueEnumType(type)) { if (isOpaqueEnumType(type))
return DBuilder.createUnspecifiedType(type->toChars()); return DBuilder.createUnspecifiedType(type->toChars());
}
Type *t = type->toBasetype(); Type *t = type->toBasetype();
if (derefclass && t->ty == Tclass) { if (derefclass && t->ty == Tclass) {
@ -554,39 +557,31 @@ ldc::DIType ldc::DIBuilder::CreateTypeDescription(Type *type, bool derefclass) {
t = type->toBasetype(); t = type->toBasetype();
} }
if (t->ty == Tvoid || t->ty == Tnull) { if (t->ty == Tnull)
return DBuilder.createUnspecifiedType(t->toChars()); return DBuilder.createUnspecifiedType(t->toChars());
} if (t->ty == Tvoid)
return CreateBasicType(Type::tuns8); // byte
if (t->isintegral() || t->isfloating()) { if (t->isintegral() || t->isfloating()) {
if (t->ty == Tvector) { if (t->ty == Tvector)
return CreateVectorType(type); return CreateVectorType(type);
} if (type->ty == Tenum)
if (type->ty == Tenum) {
return CreateEnumType(type); return CreateEnumType(type);
}
return CreateBasicType(type); return CreateBasicType(type);
} }
if (t->ty == Tpointer) { if (t->ty == Tpointer)
return CreatePointerType(type); return CreatePointerType(type);
} if (t->ty == Tarray)
if (t->ty == Tarray) {
return CreateArrayType(type); return CreateArrayType(type);
} if (t->ty == Tsarray)
if (t->ty == Tsarray) {
return CreateSArrayType(type); return CreateSArrayType(type);
} if (t->ty == Taarray)
if (t->ty == Taarray) {
return CreateAArrayType(type); return CreateAArrayType(type);
} if (t->ty == Tstruct || t->ty == Tclass)
if (t->ty == Tstruct || t->ty == Tclass) {
return CreateCompositeType(type); return CreateCompositeType(type);
} if (t->ty == Tfunction)
if (t->ty == Tfunction) {
return CreateFunctionType(type); return CreateFunctionType(type);
} if (t->ty == Tdelegate)
if (t->ty == Tdelegate) {
return CreateDelegateType(type); return CreateDelegateType(type);
}
// Crash if the type is not supported. // Crash if the type is not supported.
llvm_unreachable("Unsupported type in debug info"); llvm_unreachable("Unsupported type in debug info");

View file

@ -192,7 +192,7 @@ private:
DIType CreateSArrayType(Type *type); DIType CreateSArrayType(Type *type);
DIType CreateAArrayType(Type *type); DIType CreateAArrayType(Type *type);
DISubroutineType CreateFunctionType(Type *type); DISubroutineType CreateFunctionType(Type *type);
DISubroutineType CreateDelegateType(Type *type); DIType CreateDelegateType(Type *type);
DIType CreateTypeDescription(Type *type, bool derefclass = false); DIType CreateTypeDescription(Type *type, bool derefclass = false);
public: public: