
Output the architecture specific register name when printing location expression after DW_OP_regN and DW_OP_bregN operators.
59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
package op
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func assertExprResult(t *testing.T, expected int64, instructions []byte) {
|
|
t.Helper()
|
|
actual, _, err := ExecuteStackProgram(DwarfRegisters{}, instructions, 8, nil)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
if actual != expected {
|
|
buf := new(strings.Builder)
|
|
PrettyPrint(buf, instructions, nil)
|
|
t.Errorf("actual %d != expected %d (in %s)", actual, expected, buf.String())
|
|
}
|
|
}
|
|
|
|
func TestExecuteStackProgram(t *testing.T) {
|
|
assertExprResult(t, 56, []byte{byte(DW_OP_consts), 0x1c, byte(DW_OP_consts), 0x1c, byte(DW_OP_plus)})
|
|
}
|
|
|
|
func TestSignExtension(t *testing.T) {
|
|
var tgt uint64 = 0xffffffffffffff88
|
|
assertExprResult(t, int64(tgt), []byte{byte(DW_OP_const1s), 0x88})
|
|
tgt = 0xffffffffffff8888
|
|
assertExprResult(t, int64(tgt), []byte{byte(DW_OP_const2s), 0x88, 0x88})
|
|
}
|
|
|
|
func TestStackOps(t *testing.T) {
|
|
assertExprResult(t, 1, []byte{byte(DW_OP_lit1), byte(DW_OP_lit2), byte(DW_OP_drop)})
|
|
assertExprResult(t, 0, []byte{byte(DW_OP_lit1), byte(DW_OP_lit0), byte(DW_OP_pick), 0})
|
|
assertExprResult(t, 1, []byte{byte(DW_OP_lit1), byte(DW_OP_lit0), byte(DW_OP_pick), 1})
|
|
}
|
|
|
|
func TestBra(t *testing.T) {
|
|
assertExprResult(t, 32, []byte{
|
|
byte(DW_OP_lit1),
|
|
byte(DW_OP_lit5),
|
|
|
|
byte(DW_OP_dup),
|
|
byte(DW_OP_lit0),
|
|
byte(DW_OP_eq),
|
|
byte(DW_OP_bra), 9, 0x0,
|
|
|
|
byte(DW_OP_swap),
|
|
byte(DW_OP_dup),
|
|
byte(DW_OP_plus),
|
|
byte(DW_OP_swap),
|
|
byte(DW_OP_lit1),
|
|
byte(DW_OP_minus),
|
|
byte(DW_OP_skip), 0xf1, 0xff,
|
|
|
|
byte(DW_OP_drop),
|
|
})
|
|
}
|