This commit is contained in:
parent
bdb1b9595f
commit
4aa4d613a1
12 changed files with 58 additions and 85 deletions
|
@ -13,12 +13,9 @@ func showSSA(root *core.Function) {
|
||||||
ansi.Yellow.Println(f.UniqueName + ":")
|
ansi.Yellow.Println(f.UniqueName + ":")
|
||||||
|
|
||||||
for _, block := range f.Blocks {
|
for _, block := range f.Blocks {
|
||||||
// ansi.Dim.Printf("| %-3s | %-30s | %-30s | %-4s |\n", "ID", "Raw", "Type", "Uses")
|
|
||||||
// ansi.Dim.Printf("| %s | %s | %s | %s |\n", strings.Repeat("-", 3), strings.Repeat("-", 30), strings.Repeat("-", 30), strings.Repeat("-", 4))
|
|
||||||
|
|
||||||
for i, instr := range block.Instructions {
|
for i, instr := range block.Instructions {
|
||||||
ansi.Dim.Printf("%%%-1d = ", i)
|
ansi.Dim.Printf("%%%-1d = ", i)
|
||||||
fmt.Printf("%-30s ", instr.Debug())
|
fmt.Printf("%-30s ", instr.Debug(false))
|
||||||
ansi.Dim.Printf(" %-30s", instr.Type().Name())
|
ansi.Dim.Printf(" %-30s", instr.Type().Name())
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,12 +43,16 @@ func (v *BinaryOp) IsConst() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *BinaryOp) Debug() string {
|
func (v *BinaryOp) Debug(expand bool) string {
|
||||||
|
if expand {
|
||||||
|
return fmt.Sprintf("%s %s %s", v.Left, expression.Operators[v.Op].Symbol, v.Right)
|
||||||
|
}
|
||||||
|
|
||||||
return fmt.Sprintf("%%%d %s %%%d", v.Left.ID(), expression.Operators[v.Op].Symbol, v.Right.ID())
|
return fmt.Sprintf("%%%d %s %%%d", v.Left.ID(), expression.Operators[v.Op].Symbol, v.Right.ID())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *BinaryOp) String() string {
|
func (v *BinaryOp) String() string {
|
||||||
return fmt.Sprintf("%s %s %s", v.Left, expression.Operators[v.Op].Symbol, v.Right)
|
return v.Debug(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *BinaryOp) Type() types.Type {
|
func (v *BinaryOp) Type() types.Type {
|
||||||
|
|
|
@ -32,7 +32,7 @@ func (v *Bytes) IsConst() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Bytes) Debug() string {
|
func (v *Bytes) Debug(expand bool) string {
|
||||||
return v.String()
|
return v.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,16 +28,26 @@ func (v *Call) IsConst() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Call) Debug() string {
|
func (v *Call) Debug(expand bool) string {
|
||||||
tmp := strings.Builder{}
|
tmp := strings.Builder{}
|
||||||
tmp.WriteString("%")
|
|
||||||
tmp.WriteString(strconv.Itoa(v.Arguments[0].ID()))
|
if expand {
|
||||||
|
tmp.WriteString(v.Arguments[0].String())
|
||||||
|
} else {
|
||||||
|
tmp.WriteString("%")
|
||||||
|
tmp.WriteString(strconv.Itoa(v.Arguments[0].ID()))
|
||||||
|
}
|
||||||
|
|
||||||
tmp.WriteString("(")
|
tmp.WriteString("(")
|
||||||
args := v.Arguments[1:]
|
args := v.Arguments[1:]
|
||||||
|
|
||||||
for i, arg := range args {
|
for i, arg := range args {
|
||||||
tmp.WriteString("%")
|
if expand {
|
||||||
tmp.WriteString(strconv.Itoa(arg.ID()))
|
tmp.WriteString(arg.String())
|
||||||
|
} else {
|
||||||
|
tmp.WriteString("%")
|
||||||
|
tmp.WriteString(strconv.Itoa(arg.ID()))
|
||||||
|
}
|
||||||
|
|
||||||
if i != len(args)-1 {
|
if i != len(args)-1 {
|
||||||
tmp.WriteString(", ")
|
tmp.WriteString(", ")
|
||||||
|
@ -49,21 +59,7 @@ func (v *Call) Debug() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Call) String() string {
|
func (v *Call) String() string {
|
||||||
tmp := strings.Builder{}
|
return v.Debug(true)
|
||||||
tmp.WriteString(v.Arguments[0].String())
|
|
||||||
tmp.WriteString("(")
|
|
||||||
args := v.Arguments[1:]
|
|
||||||
|
|
||||||
for i, arg := range args {
|
|
||||||
tmp.WriteString(arg.String())
|
|
||||||
|
|
||||||
if i != len(args)-1 {
|
|
||||||
tmp.WriteString(", ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp.WriteString(")")
|
|
||||||
return tmp.String()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Call) Type() types.Type {
|
func (v *Call) Type() types.Type {
|
||||||
|
|
|
@ -29,7 +29,7 @@ func (v *Function) IsConst() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Function) Debug() string {
|
func (v *Function) Debug(expand bool) string {
|
||||||
return v.String()
|
return v.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ func (v *Int) IsConst() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Int) Debug() string {
|
func (v *Int) Debug(expand bool) string {
|
||||||
return v.String()
|
return v.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ func (v *Parameter) IsConst() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Parameter) Debug() string {
|
func (v *Parameter) Debug(expand bool) string {
|
||||||
return v.String()
|
return v.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ func (v *Return) IsConst() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Return) Debug() string {
|
func (v *Return) Debug(expand bool) string {
|
||||||
if len(v.Arguments) == 0 {
|
if len(v.Arguments) == 0 {
|
||||||
return "return"
|
return "return"
|
||||||
}
|
}
|
||||||
|
@ -47,8 +47,12 @@ func (v *Return) Debug() string {
|
||||||
tmp.WriteString("return ")
|
tmp.WriteString("return ")
|
||||||
|
|
||||||
for i, arg := range v.Arguments {
|
for i, arg := range v.Arguments {
|
||||||
tmp.WriteString("%")
|
if expand {
|
||||||
tmp.WriteString(strconv.Itoa(arg.ID()))
|
tmp.WriteString(arg.String())
|
||||||
|
} else {
|
||||||
|
tmp.WriteString("%")
|
||||||
|
tmp.WriteString(strconv.Itoa(arg.ID()))
|
||||||
|
}
|
||||||
|
|
||||||
if i != len(v.Arguments)-1 {
|
if i != len(v.Arguments)-1 {
|
||||||
tmp.WriteString(", ")
|
tmp.WriteString(", ")
|
||||||
|
@ -59,22 +63,7 @@ func (v *Return) Debug() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Return) String() string {
|
func (v *Return) String() string {
|
||||||
if len(v.Arguments) == 0 {
|
return v.Debug(true)
|
||||||
return "return"
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp := strings.Builder{}
|
|
||||||
tmp.WriteString("return ")
|
|
||||||
|
|
||||||
for i, arg := range v.Arguments {
|
|
||||||
tmp.WriteString(arg.String())
|
|
||||||
|
|
||||||
if i != len(v.Arguments)-1 {
|
|
||||||
tmp.WriteString(", ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return tmp.String()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Return) Type() types.Type {
|
func (v *Return) Type() types.Type {
|
||||||
|
|
|
@ -29,14 +29,18 @@ func (v *Struct) IsConst() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Struct) Debug() string {
|
func (v *Struct) Debug(expand bool) string {
|
||||||
tmp := strings.Builder{}
|
tmp := strings.Builder{}
|
||||||
tmp.WriteString(v.Typ.Name())
|
tmp.WriteString(v.Typ.Name())
|
||||||
tmp.WriteString("{")
|
tmp.WriteString("{")
|
||||||
|
|
||||||
for i, arg := range v.Arguments {
|
for i, arg := range v.Arguments {
|
||||||
tmp.WriteString("%")
|
if expand {
|
||||||
tmp.WriteString(strconv.Itoa(arg.ID()))
|
tmp.WriteString(arg.String())
|
||||||
|
} else {
|
||||||
|
tmp.WriteString("%")
|
||||||
|
tmp.WriteString(strconv.Itoa(arg.ID()))
|
||||||
|
}
|
||||||
|
|
||||||
if i != len(v.Arguments)-1 {
|
if i != len(v.Arguments)-1 {
|
||||||
tmp.WriteString(", ")
|
tmp.WriteString(", ")
|
||||||
|
@ -48,20 +52,7 @@ func (v *Struct) Debug() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Struct) String() string {
|
func (v *Struct) String() string {
|
||||||
tmp := strings.Builder{}
|
return v.Debug(false)
|
||||||
tmp.WriteString(v.Typ.Name())
|
|
||||||
tmp.WriteString("{")
|
|
||||||
|
|
||||||
for i, arg := range v.Arguments {
|
|
||||||
tmp.WriteString(arg.String())
|
|
||||||
|
|
||||||
if i != len(v.Arguments)-1 {
|
|
||||||
tmp.WriteString(", ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp.WriteString("}")
|
|
||||||
return tmp.String()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Struct) Type() types.Type {
|
func (v *Struct) Type() types.Type {
|
||||||
|
|
|
@ -32,12 +32,16 @@ func (v *StructField) IsConst() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *StructField) Debug() string {
|
func (v *StructField) Debug(expand bool) string {
|
||||||
|
if expand {
|
||||||
|
return fmt.Sprintf("%s.%s", v.Struct, v.Field)
|
||||||
|
}
|
||||||
|
|
||||||
return fmt.Sprintf("%%%d.%s", v.Struct.ID(), v.Field)
|
return fmt.Sprintf("%%%d.%s", v.Struct.ID(), v.Field)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *StructField) String() string {
|
func (v *StructField) String() string {
|
||||||
return fmt.Sprintf("%s.%s", v.Struct, v.Field)
|
return v.Debug(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *StructField) Type() types.Type {
|
func (v *StructField) Type() types.Type {
|
||||||
|
|
|
@ -28,13 +28,17 @@ func (v *Syscall) IsConst() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Syscall) Debug() string {
|
func (v *Syscall) Debug(expand bool) string {
|
||||||
tmp := strings.Builder{}
|
tmp := strings.Builder{}
|
||||||
tmp.WriteString("syscall(")
|
tmp.WriteString("syscall(")
|
||||||
|
|
||||||
for i, arg := range v.Arguments {
|
for i, arg := range v.Arguments {
|
||||||
tmp.WriteString("%")
|
if expand {
|
||||||
tmp.WriteString(strconv.Itoa(arg.ID()))
|
tmp.WriteString(arg.String())
|
||||||
|
} else {
|
||||||
|
tmp.WriteString("%")
|
||||||
|
tmp.WriteString(strconv.Itoa(arg.ID()))
|
||||||
|
}
|
||||||
|
|
||||||
if i != len(v.Arguments)-1 {
|
if i != len(v.Arguments)-1 {
|
||||||
tmp.WriteString(", ")
|
tmp.WriteString(", ")
|
||||||
|
@ -46,19 +50,7 @@ func (v *Syscall) Debug() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Syscall) String() string {
|
func (v *Syscall) String() string {
|
||||||
tmp := strings.Builder{}
|
return v.Debug(true)
|
||||||
tmp.WriteString("syscall(")
|
|
||||||
|
|
||||||
for i, arg := range v.Arguments {
|
|
||||||
tmp.WriteString(arg.String())
|
|
||||||
|
|
||||||
if i != len(v.Arguments)-1 {
|
|
||||||
tmp.WriteString(", ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp.WriteString(")")
|
|
||||||
return tmp.String()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Syscall) Type() types.Type {
|
func (v *Syscall) Type() types.Type {
|
||||||
|
|
|
@ -7,7 +7,7 @@ import (
|
||||||
|
|
||||||
type Value interface {
|
type Value interface {
|
||||||
// Essentials
|
// Essentials
|
||||||
Debug() string
|
Debug(bool) string
|
||||||
ID() int
|
ID() int
|
||||||
IsConst() bool
|
IsConst() bool
|
||||||
SetID(int)
|
SetID(int)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue