ssa: debug info of interface

This commit is contained in:
Li Jie
2024-09-18 18:26:36 +08:00
parent a53ab7438c
commit 6bfb1a7fff
2 changed files with 52 additions and 11 deletions

View File

@@ -33,10 +33,10 @@ type StructWithAllTypeFields struct {
e E e E
pf *StructWithAllTypeFields // resursive pf *StructWithAllTypeFields // resursive
pi *int pi *int
// intr Interface intr Interface
// m map[string]uint64 // m map[string]uint64
// c chan int // c chan int
// err error err error
// fn func(string) (int, error) // fn func(string) (int, error)
} }
@@ -80,10 +80,10 @@ func FuncWithAllTypeParams(
f StructWithAllTypeFields, f StructWithAllTypeFields,
pf *StructWithAllTypeFields, pf *StructWithAllTypeFields,
pi *int, pi *int,
// intr Interface, intr Interface,
// m map[string]uint64, // m map[string]uint64,
// c chan int, // c chan int,
// err error, err error,
// fn func(string) (int, error), // fn func(string) (int, error),
) (int, error) { ) (int, error) {
println( println(
@@ -92,7 +92,9 @@ func FuncWithAllTypeParams(
c64, c128, c64, c128,
slice, arr[0:], slice, arr[0:],
s, s,
// &e, &f, pf, pi, intr, m, c, err, &e,
// &f, pf, pi, intr, m, c,
err,
// fn, // fn,
) )
return 1, errors.New("Some error") return 1, errors.New("Some error")
@@ -123,10 +125,10 @@ func main() {
e: E{i: 30}, e: E{i: 30},
pf: &StructWithAllTypeFields{}, pf: &StructWithAllTypeFields{},
pi: &i, pi: &i,
// intr: &Struct{}, intr: &Struct{},
// m: make(map[string]uint64), // m: make(map[string]uint64),
// c: make(chan int), // c: make(chan int),
// err: errors.New("Test error"), err: errors.New("Test error"),
// fn: func(s string) (int, error) { // fn: func(s string) (int, error) {
// println("fn:", s) // println("fn:", s)
// return 1, errors.New("fn error") // return 1, errors.New("fn error")
@@ -143,7 +145,9 @@ func main() {
s.s, s.s,
s.e, s, s.e, s,
s.pf, s.pi, s.pf, s.pi,
// s.intr, s.m, s.c, s.err, s.intr,
//s.m, s.c,
s.err,
// s.fn, // s.fn,
) )
println(i, err) println(i, err)

View File

@@ -149,7 +149,8 @@ func (b diBuilder) createType(ty Type, pos token.Position) DIType {
case *types.Named: case *types.Named:
return b.diType(b.prog.rawType(t.Underlying()), pos) return b.diType(b.prog.rawType(t.Underlying()), pos)
case *types.Interface: case *types.Interface:
return b.createBasicType(ty) ty := b.prog.rawType(b.prog.rtType("Iface").RawType().Underlying())
return b.createInterfaceType(ty)
case *types.Slice: case *types.Slice:
ty := b.prog.rawType(b.prog.rtType("Slice").RawType().Underlying()) ty := b.prog.rawType(b.prog.rtType("Slice").RawType().Underlying())
tyElem := b.prog.rawType(t.Elem()) tyElem := b.prog.rawType(t.Elem())
@@ -361,6 +362,44 @@ func (b diBuilder) createSliceType(ty, tyElem Type) DIType {
} }
} }
func (b diBuilder) createInterfaceType(ty Type) DIType {
tyRaw := ty.RawType().Underlying()
tyIntr := b.prog.rawType(tyRaw)
tyType := b.prog.VoidPtr()
tyData := b.prog.VoidPtr()
return &aDIType{ll: b.di.CreateStructType(
llvm.Metadata{},
llvm.DIStructType{
Name: ty.RawType().String(),
SizeInBits: b.prog.SizeOf(tyIntr) * 8,
AlignInBits: uint32(b.prog.sizes.Alignof(ty.RawType()) * 8),
Elements: []llvm.Metadata{
b.di.CreateMemberType(
llvm.Metadata{},
llvm.DIMemberType{
Name: "type",
SizeInBits: b.prog.SizeOf(tyType) * 8,
AlignInBits: uint32(b.prog.sizes.Alignof(tyType.RawType()) * 8),
OffsetInBits: b.prog.OffsetOf(ty, 0) * 8,
Type: b.diType(tyType, token.Position{}).ll,
},
),
b.di.CreateMemberType(
llvm.Metadata{},
llvm.DIMemberType{
Name: "data",
SizeInBits: b.prog.SizeOf(tyData) * 8,
AlignInBits: uint32(b.prog.sizes.Alignof(tyData.RawType()) * 8),
OffsetInBits: b.prog.OffsetOf(ty, 1) * 8,
Type: b.diType(tyData, token.Position{}).ll,
},
),
},
},
)}
}
func (b diBuilder) createComplexType(t Type) DIType { func (b diBuilder) createComplexType(t Type) DIType {
var tfield Type var tfield Type
if t.RawType().(*types.Basic).Kind() == types.Complex128 { if t.RawType().(*types.Basic).Kind() == types.Complex128 {
@@ -617,8 +656,6 @@ const (
func skipType(t types.Type) bool { func skipType(t types.Type) bool {
switch t.(type) { switch t.(type) {
case *types.Interface:
return true
case *types.Signature: case *types.Signature:
return true return true
} }