tls: add gc-aware pthread slots
This commit is contained in:
93
ssa/di.go
93
ssa/di.go
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user