From ac15169034c70fc22c921fa4719ea6f670b3068d Mon Sep 17 00:00:00 2001 From: Andrew Wilkins Date: Mon, 2 Mar 2015 12:42:45 +0000 Subject: [PATCH] [llgo] debug: create replaceable type through DIBuilder Summary: llgo was asserting in DebugInfo, which was interpreting the temporary MDNodes we were creating as DIScopes instead of DITypes (in DIScope::getRef). This proposal changes llgo to use DIBuilder's createReplaceableCompositeType method to create a DIType that can be RAUW'd. Reviewers: pcc Reviewed By: pcc Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D7852 llvm-svn: 230953 --- llgo/debug/debug.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/llgo/debug/debug.go b/llgo/debug/debug.go index d470655c..b8c6bf6 100644 --- a/llgo/debug/debug.go +++ b/llgo/debug/debug.go @@ -340,18 +340,26 @@ func (d *DIBuilder) descriptorStruct(t *types.Struct, name string) llvm.Metadata } func (d *DIBuilder) descriptorNamed(t *types.Named) llvm.Metadata { - // Create a placeholder for the named type, to terminate cycles. - placeholder := llvm.GlobalContext().TemporaryMDNode(nil) - d.types.Set(t, placeholder) var diFile llvm.Metadata var line int if file := d.fset.File(t.Obj().Pos()); file != nil { line = file.Line(t.Obj().Pos()) diFile = d.getFile(file) } + + // Create a placeholder for the named type, to terminate cycles. + name := t.Obj().Name() + placeholder := d.builder.CreateReplaceableCompositeType(d.scope(), llvm.DIReplaceableCompositeType{ + Tag: dwarf.TagStructType, + Name: name, + File: diFile, + Line: line, + }) + d.types.Set(t, placeholder) + typedef := d.builder.CreateTypedef(llvm.DITypedef{ Type: d.DIType(t.Underlying()), - Name: t.Obj().Name(), + Name: name, File: diFile, Line: line, }) -- 2.7.4