mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-19 17:33:29 +00:00
106 lines
2.5 KiB
Go
106 lines
2.5 KiB
Go
|
//===- string.go - Stringer implementation for Type -----------------------===//
|
||
|
//
|
||
|
// The LLVM Compiler Infrastructure
|
||
|
//
|
||
|
// This file is distributed under the University of Illinois Open Source
|
||
|
// License. See LICENSE.TXT for details.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
//
|
||
|
// This file implements the Stringer interface for the Type type.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
package llvm
|
||
|
|
||
|
import "fmt"
|
||
|
|
||
|
func (t TypeKind) String() string {
|
||
|
switch t {
|
||
|
case VoidTypeKind:
|
||
|
return "VoidTypeKind"
|
||
|
case FloatTypeKind:
|
||
|
return "FloatTypeKind"
|
||
|
case DoubleTypeKind:
|
||
|
return "DoubleTypeKind"
|
||
|
case X86_FP80TypeKind:
|
||
|
return "X86_FP80TypeKind"
|
||
|
case FP128TypeKind:
|
||
|
return "FP128TypeKind"
|
||
|
case PPC_FP128TypeKind:
|
||
|
return "PPC_FP128TypeKind"
|
||
|
case LabelTypeKind:
|
||
|
return "LabelTypeKind"
|
||
|
case IntegerTypeKind:
|
||
|
return "IntegerTypeKind"
|
||
|
case FunctionTypeKind:
|
||
|
return "FunctionTypeKind"
|
||
|
case StructTypeKind:
|
||
|
return "StructTypeKind"
|
||
|
case ArrayTypeKind:
|
||
|
return "ArrayTypeKind"
|
||
|
case PointerTypeKind:
|
||
|
return "PointerTypeKind"
|
||
|
case VectorTypeKind:
|
||
|
return "VectorTypeKind"
|
||
|
case MetadataTypeKind:
|
||
|
return "MetadataTypeKind"
|
||
|
}
|
||
|
panic("unreachable")
|
||
|
}
|
||
|
|
||
|
func (t Type) String() string {
|
||
|
ts := typeStringer{s: make(map[Type]string)}
|
||
|
return ts.typeString(t)
|
||
|
}
|
||
|
|
||
|
type typeStringer struct {
|
||
|
s map[Type]string
|
||
|
}
|
||
|
|
||
|
func (ts *typeStringer) typeString(t Type) string {
|
||
|
if s, ok := ts.s[t]; ok {
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
k := t.TypeKind()
|
||
|
s := k.String()
|
||
|
s = s[:len(s)-len("Kind")]
|
||
|
|
||
|
switch k {
|
||
|
case ArrayTypeKind:
|
||
|
s += fmt.Sprintf("(%v[%v])", ts.typeString(t.ElementType()), t.ArrayLength())
|
||
|
case PointerTypeKind:
|
||
|
s += fmt.Sprintf("(%v)", ts.typeString(t.ElementType()))
|
||
|
case FunctionTypeKind:
|
||
|
params := t.ParamTypes()
|
||
|
s += "("
|
||
|
if len(params) > 0 {
|
||
|
s += fmt.Sprintf("%v", ts.typeString(params[0]))
|
||
|
for i := 1; i < len(params); i++ {
|
||
|
s += fmt.Sprintf(", %v", ts.typeString(params[i]))
|
||
|
}
|
||
|
}
|
||
|
s += fmt.Sprintf("):%v", ts.typeString(t.ReturnType()))
|
||
|
case StructTypeKind:
|
||
|
if name := t.StructName(); name != "" {
|
||
|
ts.s[t] = "%" + name
|
||
|
s = fmt.Sprintf("%%%s: %s", name, s)
|
||
|
}
|
||
|
etypes := t.StructElementTypes()
|
||
|
s += "("
|
||
|
if n := len(etypes); n > 0 {
|
||
|
s += ts.typeString(etypes[0])
|
||
|
for i := 1; i < n; i++ {
|
||
|
s += fmt.Sprintf(", %v", ts.typeString(etypes[i]))
|
||
|
}
|
||
|
}
|
||
|
s += ")"
|
||
|
case IntegerTypeKind:
|
||
|
s += fmt.Sprintf("(%d bits)", t.IntTypeWidth())
|
||
|
}
|
||
|
|
||
|
ts.s[t] = s
|
||
|
return s
|
||
|
}
|