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