From a62a94fa435d9ba55ee6a34ff5def3327b7beeca Mon Sep 17 00:00:00 2001 From: Elie Morisse Date: Tue, 21 Aug 2018 00:09:41 -0300 Subject: [PATCH] Debug info: move the IrTypeAggr::diCompositeType field into IrAggr to get it reset when emitting a new module diCompositeType might contain references to another compile unit, so has to be re-created for each module. --- gen/dibuilder.cpp | 15 +++++++-------- ir/iraggr.h | 4 ++++ ir/irtypeaggr.h | 4 ---- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/gen/dibuilder.cpp b/gen/dibuilder.cpp index 9ec1e0ec1d..c90948ff00 100644 --- a/gen/dibuilder.cpp +++ b/gen/dibuilder.cpp @@ -506,11 +506,10 @@ ldc::DIType ldc::DIBuilder::CreateCompositeType(Type *type) { LLType *T = DtoType(ad->type); if (t->ty == Tclass) T = T->getPointerElementType(); - IrTypeAggr *ir = ad->type->ctype->isAggr(); - assert(ir); + IrAggr *irAggr = getIrAggr(ad, true); - if (static_cast(ir->diCompositeType) != nullptr) { - return ir->diCompositeType; + if (static_cast(irAggr->diCompositeType) != nullptr) { + return irAggr->diCompositeType; } const llvm::StringRef name = ad->ident->toChars(); @@ -534,7 +533,7 @@ ldc::DIType ldc::DIBuilder::CreateCompositeType(Type *type) { // set diCompositeType to handle recursive types properly unsigned tag = (t->ty == Tstruct) ? llvm::dwarf::DW_TAG_structure_type : llvm::dwarf::DW_TAG_class_type; - ir->diCompositeType = DBuilder.createReplaceableCompositeType( + irAggr->diCompositeType = DBuilder.createReplaceableCompositeType( tag, name, scope, file, linnum); if (!ad->isInterfaceDeclaration()) // plain interfaces don't have one @@ -602,9 +601,9 @@ ldc::DIType ldc::DIBuilder::CreateCompositeType(Type *type) { uniqueIdent(t)); // UniqueIdentifier } - ir->diCompositeType = DBuilder.replaceTemporary( - llvm::TempDINode(ir->diCompositeType), static_cast(ret)); - ir->diCompositeType = ret; + irAggr->diCompositeType = DBuilder.replaceTemporary( + llvm::TempDINode(irAggr->diCompositeType), static_cast(ret)); + irAggr->diCompositeType = ret; return ret; } diff --git a/ir/iraggr.h b/ir/iraggr.h index 3bf720b814..bb26d617ea 100644 --- a/ir/iraggr.h +++ b/ir/iraggr.h @@ -46,6 +46,10 @@ struct IrAggr { /// Aggregate D type. Type *type = nullptr; + /// Composite type debug description. This is not only to cache, but also + /// used for resolving forward references. + llvm::DIType *diCompositeType = nullptr; + ////////////////////////////////////////////////////////////////////////// // Returns the static default initializer of a field. diff --git a/ir/irtypeaggr.h b/ir/irtypeaggr.h index 5e7a27c7d9..ec6d8d82f8 100644 --- a/ir/irtypeaggr.h +++ b/ir/irtypeaggr.h @@ -67,10 +67,6 @@ public: void getMemberLocation(VarDeclaration *var, unsigned &fieldIndex, unsigned &byteOffset) const; - /// Composite type debug description. This is not only to cache, but also - /// used for resolving forward references. - llvm::DIType *diCompositeType = nullptr; - /// true, if the LLVM struct type for the aggregate is declared as packed bool packed = false;