dwarf/op: return register values when they are the only piece
When there is a single piece and it's a register value just return it. This is important for clang compiled programs which will use DW_OP_regN to specify the value of the frame base.
This commit is contained in:
parent
c078223d56
commit
96890bbe1e
@ -54,7 +54,11 @@ func ExecuteStackProgram(regs DwarfRegisters, instructions []byte, ptrSize int)
|
|||||||
}
|
}
|
||||||
opcode := Opcode(opcodeByte)
|
opcode := Opcode(opcodeByte)
|
||||||
if ctxt.reg && opcode != DW_OP_piece {
|
if ctxt.reg && opcode != DW_OP_piece {
|
||||||
break
|
// last opcode was DW_OP_regN and next one isn't DW_OP_piece so convert
|
||||||
|
// the register piece into a stack value.
|
||||||
|
ctxt.stack = append(ctxt.stack, int64(regs.Uint64Val(ctxt.pieces[len(ctxt.pieces)-1].RegNum)))
|
||||||
|
ctxt.pieces = ctxt.pieces[:len(ctxt.pieces)-1]
|
||||||
|
ctxt.reg = false
|
||||||
}
|
}
|
||||||
fn, ok := oplut[opcode]
|
fn, ok := oplut[opcode]
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -68,6 +72,9 @@ func ExecuteStackProgram(regs DwarfRegisters, instructions []byte, ptrSize int)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ctxt.pieces != nil {
|
if ctxt.pieces != nil {
|
||||||
|
if len(ctxt.pieces) == 1 && ctxt.pieces[0].IsRegister {
|
||||||
|
return int64(regs.Uint64Val(ctxt.pieces[0].RegNum)), ctxt.pieces, nil
|
||||||
|
}
|
||||||
return 0, ctxt.pieces, nil
|
return 0, ctxt.pieces, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user