purego_string.go raw

   1  //go:build purego
   2  
   3  package llvm
   4  
   5  import "fmt"
   6  
   7  func (t TypeKind) String() string {
   8  	switch t {
   9  	case VoidTypeKind:
  10  		return "VoidTypeKind"
  11  	case FloatTypeKind:
  12  		return "FloatTypeKind"
  13  	case DoubleTypeKind:
  14  		return "DoubleTypeKind"
  15  	case X86_FP80TypeKind:
  16  		return "X86_FP80TypeKind"
  17  	case FP128TypeKind:
  18  		return "FP128TypeKind"
  19  	case PPC_FP128TypeKind:
  20  		return "PPC_FP128TypeKind"
  21  	case LabelTypeKind:
  22  		return "LabelTypeKind"
  23  	case IntegerTypeKind:
  24  		return "IntegerTypeKind"
  25  	case FunctionTypeKind:
  26  		return "FunctionTypeKind"
  27  	case StructTypeKind:
  28  		return "StructTypeKind"
  29  	case ArrayTypeKind:
  30  		return "ArrayTypeKind"
  31  	case PointerTypeKind:
  32  		return "PointerTypeKind"
  33  	case VectorTypeKind:
  34  		return "VectorTypeKind"
  35  	case MetadataTypeKind:
  36  		return "MetadataTypeKind"
  37  	}
  38  	panic("unreachable")
  39  }
  40  
  41  func (t Type) String() string {
  42  	ts := typeStringer{s: make(map[Type]string)}
  43  	return ts.typeString(t)
  44  }
  45  
  46  type typeStringer struct {
  47  	s map[Type]string
  48  }
  49  
  50  func (ts *typeStringer) typeString(t Type) string {
  51  	if s, ok := ts.s[t]; ok {
  52  		return s
  53  	}
  54  
  55  	k := t.TypeKind()
  56  	s := k.String()
  57  	s = s[:len(s)-len("Kind")]
  58  
  59  	switch k {
  60  	case ArrayTypeKind:
  61  		s += fmt.Sprintf("(%v[%v])", ts.typeString(t.ElementType()), t.ArrayLength())
  62  	case PointerTypeKind:
  63  		s += fmt.Sprintf("(%v)", ts.typeString(t.ElementType()))
  64  	case FunctionTypeKind:
  65  		params := t.ParamTypes()
  66  		s += "("
  67  		if len(params) > 0 {
  68  			s += fmt.Sprintf("%v", ts.typeString(params[0]))
  69  			for i := 1; i < len(params); i++ {
  70  				s += fmt.Sprintf(", %v", ts.typeString(params[i]))
  71  			}
  72  		}
  73  		s += fmt.Sprintf("):%v", ts.typeString(t.ReturnType()))
  74  	case StructTypeKind:
  75  		if name := t.StructName(); name != "" {
  76  			ts.s[t] = "%" + name
  77  			s = fmt.Sprintf("%%%s: %s", name, s)
  78  		}
  79  		etypes := t.StructElementTypes()
  80  		s += "("
  81  		if n := len(etypes); n > 0 {
  82  			s += ts.typeString(etypes[0])
  83  			for i := 1; i < n; i++ {
  84  				s += fmt.Sprintf(", %v", ts.typeString(etypes[i]))
  85  			}
  86  		}
  87  		s += ")"
  88  	case IntegerTypeKind:
  89  		s += fmt.Sprintf("(%d bits)", t.IntTypeWidth())
  90  	}
  91  
  92  	ts.s[t] = s
  93  	return s
  94  }
  95