tls: add gc-aware pthread slots

This commit is contained in:
Li Jie
2025-10-15 10:23:09 +08:00
parent dba7bd498f
commit 2110db7263
7 changed files with 501 additions and 0 deletions

View File

@@ -53,6 +53,96 @@ func newDIBuilder(prog Program, pkg Package, positioner Positioner) diBuilder {
return b
}
func hasTypeParam(typ types.Type) bool {
visited := make(map[types.Type]bool)
var visit func(types.Type) bool
visit = func(tt types.Type) bool {
if tt == nil {
return false
}
if visited[tt] {
return false
}
visited[tt] = true
switch t := tt.(type) {
case *types.TypeParam:
return true
case *types.Named:
if tp := t.TypeParams(); tp != nil && tp.Len() > 0 {
if ta := t.TypeArgs(); ta == nil || ta.Len() == 0 {
return true
}
}
if ta := t.TypeArgs(); ta != nil {
for i := 0; i < ta.Len(); i++ {
if visit(ta.At(i)) {
return true
}
}
}
return visit(t.Underlying())
case *types.Pointer:
return visit(t.Elem())
case *types.Slice:
return visit(t.Elem())
case *types.Array:
return visit(t.Elem())
case *types.Map:
return visit(t.Key()) || visit(t.Elem())
case *types.Chan:
return visit(t.Elem())
case *types.Signature:
if tp := t.TypeParams(); tp != nil && tp.Len() > 0 {
return true
}
if params := t.Params(); params != nil {
for i := 0; i < params.Len(); i++ {
if visit(params.At(i).Type()) {
return true
}
}
}
if results := t.Results(); results != nil {
for i := 0; i < results.Len(); i++ {
if visit(results.At(i).Type()) {
return true
}
}
}
return false
case *types.Tuple:
for i := 0; i < t.Len(); i++ {
if visit(t.At(i).Type()) {
return true
}
}
return false
case *types.Struct:
for i := 0; i < t.NumFields(); i++ {
if visit(t.Field(i).Type()) {
return true
}
}
return false
case *types.Interface:
for i := 0; i < t.NumMethods(); i++ {
if visit(t.Method(i).Type()) {
return true
}
}
for i := 0; i < t.NumEmbeddeds(); i++ {
if visit(t.EmbeddedType(i)) {
return true
}
}
return false
default:
return false
}
}
return visit(typ)
}
// New method to add named metadata operand
func (b diBuilder) addNamedMetadataOperand(name string, intValue int, stringValue string, intValue2 int) {
ctx := b.m.Context()
@@ -522,6 +612,9 @@ func (b diBuilder) dbgValue(v Expr, dv DIVar, scope DIScope, pos token.Position,
}
func (b diBuilder) diType(t Type, pos token.Position) DIType {
if hasTypeParam(t.RawType()) {
return &aDIType{}
}
name := t.RawType().String()
return b.diTypeEx(name, t, pos)
}