ssa: debug info of function/closure

This commit is contained in:
Li Jie
2024-09-18 20:31:45 +08:00
parent 27f892a14b
commit 90a83c8f11
3 changed files with 21 additions and 64 deletions

View File

@@ -37,7 +37,9 @@ type StructWithAllTypeFields struct {
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)
pad1 int
pad2 int
} }
type Interface interface { type Interface interface {
@@ -84,7 +86,7 @@ func FuncWithAllTypeParams(
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(
i8, i16, i32, i64, i, u8, u16, u32, u64, u, i8, i16, i32, i64, i, u8, u16, u32, u64, u,
@@ -96,7 +98,7 @@ func FuncWithAllTypeParams(
&f, pf, pi, intr, m, &f, pf, pi, intr, m,
c, c,
err, err,
// fn, fn,
) )
return 1, errors.New("Some error") return 1, errors.New("Some error")
} }
@@ -130,10 +132,13 @@ func main() {
m: map[string]uint64{"a": 31, "b": 32}, m: map[string]uint64{"a": 31, "b": 32},
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") i = 201
// }, return 1, errors.New("fn error")
},
pad1: 100,
pad2: 200,
} }
println("s:", &s) println("s:", &s)
FuncWithAllTypeStructParam(s) FuncWithAllTypeStructParam(s)
@@ -150,7 +155,7 @@ func main() {
s.m, s.m,
s.c, s.c,
s.err, s.err,
// s.fn, s.fn,
) )
println(i, err) println(i, err)
println("called function with types") println("called function with types")

View File

@@ -735,7 +735,7 @@ func (p *context) compileInstr(b llssa.Builder, instr ssa.Instruction) {
return return
} }
pos := p.goProg.Fset.Position(getPos(v)) pos := p.goProg.Fset.Position(v.Pos())
value := p.compileValue(b, v.X) value := p.compileValue(b, v.X)
fn := v.Parent() fn := v.Parent()
dbgVar := p.getLocalVariable(b, fn, variable) dbgVar := p.getLocalVariable(b, fn, variable)
@@ -754,40 +754,6 @@ type poser interface {
Pos() token.Pos Pos() token.Pos
} }
func getPos(v poser) token.Pos {
pos := v.Pos()
if pos.IsValid() {
return pos
}
panic(fmt.Errorf("getPos: invalid position - %T", v))
// switch v := v.(type) {
// case *ssa.MakeInterface:
// return getPos(v.X)
// case *ssa.MakeClosure:
// return v.Fn.(*ssa.Function).Pos()
// case *ssa.Return:
// syntax := v.Parent().Syntax()
// if syntax != nil {
// return syntax.End()
// }
// return token.NoPos
// case *ssa.FieldAddr:
// return getPos(v.X)
// case *ssa.IndexAddr:
// return getPos(v.X)
// case *ssa.Slice:
// return getPos(v.X)
// case *ssa.Store:
// return getPos(v.Addr)
// case *ssa.Extract:
// return getPos(v.Tuple)
// default:
// fmt.Printf("getPos: unknown instr - %T\n", v)
// return token.NoPos
// }
}
func (p *context) getLocalVariable(b llssa.Builder, fn *ssa.Function, v *types.Var) llssa.DIVar { func (p *context) getLocalVariable(b llssa.Builder, fn *ssa.Function, v *types.Var) llssa.DIVar {
pos := p.fset.Position(v.Pos()) pos := p.fset.Position(v.Pos())
t := b.Prog.Type(v.Type(), llssa.InGo) t := b.Prog.Type(v.Type(), llssa.InGo)

View File

@@ -152,7 +152,8 @@ func (b diBuilder) createType(ty Type, pos token.Position) DIType {
case *types.Struct: case *types.Struct:
return b.createStructType(ty, pos) return b.createStructType(ty, pos)
case *types.Signature: case *types.Signature:
return b.createFuncPtrType(b.prog.rawType(t), pos) tyFn := b.prog.Closure(ty)
return b.createFuncPtrType(tyFn, pos)
case *types.Tuple: case *types.Tuple:
return b.createBasicType(ty) return b.createBasicType(ty)
case *types.Array: case *types.Array:
@@ -366,8 +367,6 @@ func (b diBuilder) createMapType(tyMap, tk, tv Type) DIType {
} }
func (b diBuilder) createChanType(t Type) DIType { func (b diBuilder) createChanType(t Type) DIType {
tyElem := b.prog.rawType(t.RawType().(*types.Chan).Elem())
fmt.Printf("tyElem: %v, %T\n", tyElem, tyElem)
return &aDIType{ll: b.di.CreateStructType( return &aDIType{ll: b.di.CreateStructType(
llvm.Metadata{}, llvm.Metadata{},
llvm.DIStructType{ llvm.DIStructType{
@@ -452,18 +451,11 @@ func (b diBuilder) createStructType(ty Type, pos token.Position) (ret DIType) {
} }
func (b diBuilder) createFuncPtrType(ty Type, pos token.Position) DIType { func (b diBuilder) createFuncPtrType(ty Type, pos token.Position) DIType {
sig := ty.RawType().(*types.Signature) ptr := b.prog.VoidPtr()
retTy := b.diType(b.prog.rawType(sig.Results()), pos)
paramTys := make([]DIType, sig.Params().Len())
for i := 0; i < sig.Params().Len(); i++ {
paramTys[i] = b.diType(b.prog.rawType(sig.Params().At(i).Type()), pos)
}
rt := b.createSubroutineType(b.file(pos.Filename), retTy, paramTys)
return &aDIType{ll: b.di.CreatePointerType(llvm.DIPointerType{ return &aDIType{ll: b.di.CreatePointerType(llvm.DIPointerType{
Pointee: rt.ll, Pointee: b.diType(ptr, pos).ll,
SizeInBits: b.prog.SizeOf(ty) * 8, SizeInBits: b.prog.SizeOf(ptr) * 8,
AlignInBits: 8, AlignInBits: uint32(b.prog.sizes.Alignof(ptr.RawType()) * 8),
AddressSpace: 0,
})} })}
} }
@@ -583,8 +575,7 @@ func (b Builder) debug(v Expr) (dbgPtr Expr, dbgVal Expr, deref bool) {
case *types.Slice: case *types.Slice:
ty = b.Prog.Type(b.Prog.rtType("Slice").RawType().Underlying(), InGo) ty = b.Prog.Type(b.Prog.rtType("Slice").RawType().Underlying(), InGo)
case *types.Signature: case *types.Signature:
fmt.Printf("t: %T, %v\n", t, t) ty = b.Prog.Closure(b.Prog.rawType(t))
ty = b.Prog.Type(b.Prog.rtType("Func").RawType().Underlying(), InGo)
case *types.Named: case *types.Named:
ty = b.Prog.Type(t.Underlying(), InGo) ty = b.Prog.Type(t.Underlying(), InGo)
case *types.Map: case *types.Map:
@@ -592,7 +583,6 @@ func (b Builder) debug(v Expr) (dbgPtr Expr, dbgVal Expr, deref bool) {
default: default:
ty = v.Type ty = v.Type
} }
// fmt.Printf("ty: %T, %v, %T, %v\n", ty.RawType(), ty.RawType(), t, t)
dbgPtr = b.AllocaT(ty) dbgPtr = b.AllocaT(ty)
dbgPtr.Type = b.Prog.Pointer(v.Type) dbgPtr.Type = b.Prog.Pointer(v.Type)
b.Store(dbgPtr, v) b.Store(dbgPtr, v)
@@ -606,10 +596,6 @@ const (
) )
func skipType(t types.Type) bool { func skipType(t types.Type) bool {
switch t.(type) {
case *types.Signature:
return true
}
return false return false
} }