ssa: fix type name of debug info

This commit is contained in:
Li Jie
2024-09-18 23:04:09 +08:00
parent 87f6c8087f
commit 3ba405383e

View File

@@ -102,13 +102,13 @@ type aDIType struct {
type DIType = *aDIType type DIType = *aDIType
func (b diBuilder) createType(ty Type, pos token.Position) DIType { func (b diBuilder) createType(name string, ty Type, pos token.Position) DIType {
var typ llvm.Metadata var typ llvm.Metadata
switch t := ty.RawType().(type) { switch t := ty.RawType().(type) {
case *types.Basic: case *types.Basic:
if t.Kind() == types.UnsafePointer { if t.Kind() == types.UnsafePointer {
typ = b.di.CreatePointerType(llvm.DIPointerType{ typ = b.di.CreatePointerType(llvm.DIPointerType{
Name: "unsafe.Pointer", Name: name,
SizeInBits: b.prog.SizeOf(b.prog.rawType(t)) * 8, SizeInBits: b.prog.SizeOf(b.prog.rawType(t)) * 8,
AlignInBits: uint32(b.prog.sizes.Alignof(t) * 8), AlignInBits: uint32(b.prog.sizes.Alignof(t) * 8),
AddressSpace: 0, AddressSpace: 0,
@@ -134,37 +134,38 @@ func (b diBuilder) createType(ty Type, pos token.Position) DIType {
} }
typ = b.di.CreateBasicType(llvm.DIBasicType{ typ = b.di.CreateBasicType(llvm.DIBasicType{
Name: t.Name(), Name: name,
SizeInBits: b.prog.SizeOf(b.prog.rawType(t)) * 8, SizeInBits: b.prog.SizeOf(b.prog.rawType(t)) * 8,
Encoding: encoding, Encoding: encoding,
}) })
case *types.Pointer: case *types.Pointer:
return b.createPointerType(b.prog.rawType(t.Elem()), pos) return b.createPointerType(name, b.prog.rawType(t.Elem()), pos)
case *types.Named: case *types.Named:
return b.diType(b.prog.rawType(t.Underlying()), pos) ty = b.prog.rawType(t.Underlying())
return b.diTypeEx(name, ty, pos)
case *types.Interface: case *types.Interface:
ty := b.prog.rtType("Iface") ty := b.prog.rtType("Iface")
return b.createInterfaceType(ty) return b.createInterfaceType(name, ty)
case *types.Slice: case *types.Slice:
ty := b.prog.rtType("Slice") ty := b.prog.rtType("Slice")
tyElem := b.prog.rawType(t.Elem()) tyElem := b.prog.rawType(t.Elem())
return b.createSliceType(ty, tyElem) return b.createSliceType(name, ty, tyElem)
case *types.Struct: case *types.Struct:
return b.createStructType(ty, pos) return b.createStructType(name, ty, pos)
case *types.Signature: case *types.Signature:
tyFn := b.prog.Closure(ty) tyFn := b.prog.Closure(ty)
return b.createFuncPtrType(tyFn, pos) return b.createFuncPtrType(name, tyFn, pos)
case *types.Tuple: case *types.Tuple:
return b.createBasicType(ty) return b.createBasicType(name, ty)
case *types.Array: case *types.Array:
return b.createArrayType(ty, t.Len()) return b.createArrayType(ty, t.Len())
case *types.Chan: case *types.Chan:
return b.createChanType(ty) return b.createChanType(name, ty)
case *types.Map: case *types.Map:
ty := b.prog.rtType("Map") ty := b.prog.rtType("Map")
tk := b.prog.rawType(t.Key()) tk := b.prog.rawType(t.Key())
tv := b.prog.rawType(t.Elem()) tv := b.prog.rawType(t.Elem())
return b.createMapType(ty, tk, tv) return b.createMapType(name, ty, tk, tv)
default: default:
panic(fmt.Errorf("can't create debug info of type: %v, %T", ty.RawType(), ty.RawType())) panic(fmt.Errorf("can't create debug info of type: %v, %T", ty.RawType(), ty.RawType()))
} }
@@ -246,9 +247,9 @@ func (b diBuilder) createAutoVariable(scope DIScope, pos token.Position, name st
} }
} }
func (b diBuilder) createBasicType(t Type) DIType { func (b diBuilder) createBasicType(name string, t Type) DIType {
return &aDIType{ll: b.di.CreateBasicType(llvm.DIBasicType{ return &aDIType{ll: b.di.CreateBasicType(llvm.DIBasicType{
Name: t.RawType().String(), Name: name,
SizeInBits: b.prog.SizeOf(t) * 8, SizeInBits: b.prog.SizeOf(t) * 8,
Encoding: llvm.DW_ATE_unsigned, Encoding: llvm.DW_ATE_unsigned,
})} })}
@@ -285,7 +286,7 @@ func (b diBuilder) createArrayType(ty Type, l int64) DIType {
})} })}
} }
func (b diBuilder) createSliceType(ty, tyElem Type) DIType { func (b diBuilder) createSliceType(name string, ty, tyElem Type) DIType {
pos := token.Position{} pos := token.Position{}
diElemTyPtr := b.prog.Pointer(tyElem) diElemTyPtr := b.prog.Pointer(tyElem)
@@ -293,7 +294,7 @@ func (b diBuilder) createSliceType(ty, tyElem Type) DIType {
ll: b.di.CreateStructType( ll: b.di.CreateStructType(
llvm.Metadata{}, llvm.Metadata{},
llvm.DIStructType{ llvm.DIStructType{
Name: ty.RawType().String(), Name: name,
SizeInBits: b.prog.SizeOf(ty) * 8, SizeInBits: b.prog.SizeOf(ty) * 8,
AlignInBits: uint32(b.prog.sizes.Alignof(ty.RawType()) * 8), AlignInBits: uint32(b.prog.sizes.Alignof(ty.RawType()) * 8),
Elements: []llvm.Metadata{ Elements: []llvm.Metadata{
@@ -306,7 +307,7 @@ func (b diBuilder) createSliceType(ty, tyElem Type) DIType {
} }
} }
func (b diBuilder) createInterfaceType(ty Type) DIType { func (b diBuilder) createInterfaceType(name string, ty Type) DIType {
tyRaw := ty.RawType().Underlying() tyRaw := ty.RawType().Underlying()
tyIntr := b.prog.rawType(tyRaw) tyIntr := b.prog.rawType(tyRaw)
tyType := b.prog.VoidPtr() tyType := b.prog.VoidPtr()
@@ -315,7 +316,7 @@ func (b diBuilder) createInterfaceType(ty Type) DIType {
return &aDIType{ll: b.di.CreateStructType( return &aDIType{ll: b.di.CreateStructType(
llvm.Metadata{}, llvm.Metadata{},
llvm.DIStructType{ llvm.DIStructType{
Name: ty.RawType().String(), Name: name,
SizeInBits: b.prog.SizeOf(tyIntr) * 8, SizeInBits: b.prog.SizeOf(tyIntr) * 8,
AlignInBits: uint32(b.prog.sizes.Alignof(ty.RawType()) * 8), AlignInBits: uint32(b.prog.sizes.Alignof(ty.RawType()) * 8),
Elements: []llvm.Metadata{ Elements: []llvm.Metadata{
@@ -344,11 +345,11 @@ func (b diBuilder) createMemberTypeEx(name string, tyStruct, tyField Type, idxFi
) )
} }
func (b diBuilder) createMapType(tyMap, tk, tv Type) DIType { func (b diBuilder) createMapType(name string, tyMap, tk, tv Type) DIType {
tyCount := b.prog.Int() tyCount := b.prog.Int()
return &aDIType{ return &aDIType{
ll: b.di.CreatePointerType(llvm.DIPointerType{ ll: b.di.CreatePointerType(llvm.DIPointerType{
Name: tyMap.RawType().String(), Name: name,
Pointee: b.di.CreateStructType( Pointee: b.di.CreateStructType(
llvm.Metadata{}, llvm.Metadata{},
llvm.DIStructType{ llvm.DIStructType{
@@ -366,11 +367,11 @@ func (b diBuilder) createMapType(tyMap, tk, tv Type) DIType {
} }
} }
func (b diBuilder) createChanType(t Type) DIType { func (b diBuilder) createChanType(name string, t Type) DIType {
return &aDIType{ll: b.di.CreateStructType( return &aDIType{ll: b.di.CreateStructType(
llvm.Metadata{}, llvm.Metadata{},
llvm.DIStructType{ llvm.DIStructType{
Name: t.RawType().String(), Name: name,
SizeInBits: b.prog.SizeOf(t) * 8, SizeInBits: b.prog.SizeOf(t) * 8,
AlignInBits: uint32(b.prog.sizes.Alignof(t.RawType()) * 8), AlignInBits: uint32(b.prog.sizes.Alignof(t.RawType()) * 8),
Elements: []llvm.Metadata{}, Elements: []llvm.Metadata{},
@@ -400,8 +401,9 @@ func (b diBuilder) createComplexType(t Type) DIType {
})} })}
} }
func (b diBuilder) createPointerType(ty Type, pos token.Position) DIType { func (b diBuilder) createPointerType(name string, ty Type, pos token.Position) DIType {
return &aDIType{ll: b.di.CreatePointerType(llvm.DIPointerType{ return &aDIType{ll: b.di.CreatePointerType(llvm.DIPointerType{
Name: name,
Pointee: b.diType(ty, pos).ll, Pointee: b.diType(ty, pos).ll,
SizeInBits: b.prog.SizeOf(ty) * 8, SizeInBits: b.prog.SizeOf(ty) * 8,
AlignInBits: uint32(b.prog.sizes.Alignof(ty.RawType())) * 8, AlignInBits: uint32(b.prog.sizes.Alignof(ty.RawType())) * 8,
@@ -409,7 +411,7 @@ func (b diBuilder) createPointerType(ty Type, pos token.Position) DIType {
})} })}
} }
func (b diBuilder) createStructType(ty Type, pos token.Position) (ret DIType) { func (b diBuilder) createStructType(name string, ty Type, pos token.Position) (ret DIType) {
structType := ty.RawType().(*types.Struct) structType := ty.RawType().(*types.Struct)
scope := b.file(pos.Filename) scope := b.file(pos.Filename)
@@ -417,7 +419,7 @@ func (b diBuilder) createStructType(ty Type, pos token.Position) (ret DIType) {
scope.ll, scope.ll,
llvm.DIReplaceableCompositeType{ llvm.DIReplaceableCompositeType{
Tag: dwarf.TagStructType, Tag: dwarf.TagStructType,
Name: ty.RawType().String(), Name: name,
File: b.file(pos.Filename).ll, File: b.file(pos.Filename).ll,
Line: pos.Line, Line: pos.Line,
SizeInBits: b.prog.SizeOf(ty) * 8, SizeInBits: b.prog.SizeOf(ty) * 8,
@@ -425,6 +427,7 @@ func (b diBuilder) createStructType(ty Type, pos token.Position) (ret DIType) {
}, },
)} )}
b.types[ty] = ret b.types[ty] = ret
fmt.Printf("create struct type: %s %p \n", name, ret)
fields := make([]llvm.Metadata, structType.NumFields()) fields := make([]llvm.Metadata, structType.NumFields())
@@ -437,7 +440,7 @@ func (b diBuilder) createStructType(ty Type, pos token.Position) (ret DIType) {
st := b.di.CreateStructType( st := b.di.CreateStructType(
scope.ll, scope.ll,
llvm.DIStructType{ llvm.DIStructType{
Name: ty.RawType().String(), Name: name,
File: b.file(pos.Filename).ll, File: b.file(pos.Filename).ll,
Line: pos.Line, Line: pos.Line,
SizeInBits: b.prog.SizeOf(ty) * 8, SizeInBits: b.prog.SizeOf(ty) * 8,
@@ -450,9 +453,10 @@ func (b diBuilder) createStructType(ty Type, pos token.Position) (ret DIType) {
return return
} }
func (b diBuilder) createFuncPtrType(ty Type, pos token.Position) DIType { func (b diBuilder) createFuncPtrType(name string, ty Type, pos token.Position) DIType {
ptr := b.prog.VoidPtr() ptr := b.prog.VoidPtr()
return &aDIType{ll: b.di.CreatePointerType(llvm.DIPointerType{ return &aDIType{ll: b.di.CreatePointerType(llvm.DIPointerType{
Name: name,
Pointee: b.diType(ptr, pos).ll, Pointee: b.diType(ptr, pos).ll,
SizeInBits: b.prog.SizeOf(ptr) * 8, SizeInBits: b.prog.SizeOf(ptr) * 8,
AlignInBits: uint32(b.prog.sizes.Alignof(ptr.RawType()) * 8), AlignInBits: uint32(b.prog.sizes.Alignof(ptr.RawType()) * 8),
@@ -505,10 +509,15 @@ func (b diBuilder) dbgValue(v Expr, dv DIVar, scope DIScope, pos token.Position,
} }
func (b diBuilder) diType(t Type, pos token.Position) DIType { func (b diBuilder) diType(t Type, pos token.Position) DIType {
name := t.RawType().String()
return b.diTypeEx(name, t, pos)
}
func (b diBuilder) diTypeEx(name string, t Type, pos token.Position) DIType {
if ty, ok := b.types[t]; ok { if ty, ok := b.types[t]; ok {
return ty return ty
} }
ty := b.createType(t, pos) ty := b.createType(name, t, pos)
b.types[t] = ty b.types[t] = ty
return ty return ty
} }