diff --git a/frysk-core/frysk/debuginfo/LocationExpression.java b/frysk-core/frysk/debuginfo/LocationExpression.java index 48c9258..d61b7c0 100644 --- a/frysk-core/frysk/debuginfo/LocationExpression.java +++ b/frysk-core/frysk/debuginfo/LocationExpression.java @@ -39,45 +39,38 @@ package frysk.debuginfo; -import java.lang.Math; - -import java.util.LinkedList; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; -import frysk.isa.ISA; -import frysk.isa.Register; -import frysk.stack.Frame; +import lib.dwfl.DwAt; +import lib.dwfl.DwOp; import lib.dwfl.DwarfDie; import lib.dwfl.DwarfOp; -import lib.dwfl.DwOp; -import lib.dwfl.DwAt; +import frysk.isa.Register; +import frysk.stack.Frame; public class LocationExpression { public final static int locationTypeRegDisp = 1, locationTypeAddress = 2, locationTypeReg = 3; - private final Frame frame; DwarfDie die; List ops; int locationType; LinkedList stack; - private final ISA isa; - public LocationExpression(Frame frame, DwarfDie die, List ops) { + public LocationExpression(DwarfDie die, List ops) { locationType = 0; - this.frame = frame; this.die = die; this.ops = ops; this.stack = null; - this.isa = frame.getTask().getISA(); } /** * Decode a location list and return the value. * */ - public long decode () { + public long decode (Frame frame) { stack = new LinkedList(); int nops = ops.size(); @@ -162,7 +155,7 @@ public class LocationExpression { case DwOp.REG31_: if (locationType == 0) locationType = locationTypeReg; - Register register = DwarfRegisterMapFactory.getRegisterMap(isa) + Register register = DwarfRegisterMapFactory.getRegisterMap(frame.getTask().getISA()) .getRegister(operator - DwOp.REG0_); long regval = frame.getRegister(register); stack.addFirst(new Long(regval)); @@ -201,7 +194,7 @@ public class LocationExpression { case DwOp.BREG30_: case DwOp.BREG31_: locationType = locationTypeRegDisp; - register = DwarfRegisterMapFactory.getRegisterMap(isa) + register = DwarfRegisterMapFactory.getRegisterMap(frame.getTask().getISA()) .getRegister(operator - DwOp.BREG0_); regval = frame.getRegister(register); stack.addFirst(new Long(operand1 + regval)); @@ -209,7 +202,7 @@ public class LocationExpression { case DwOp.REGX_: - register = DwarfRegisterMapFactory.getRegisterMap(isa) + register = DwarfRegisterMapFactory.getRegisterMap(frame.getTask().getISA()) .getRegister((int)operand1); regval = frame.getRegister(register); stack.addFirst(new Long(regval)); @@ -224,8 +217,8 @@ public class LocationExpression { case DwOp.FBREG_: locationType = locationTypeRegDisp; long pc = frame.getAdjustedAddress(); - LocationExpression frameBaseOps = new LocationExpression (frame, die, die.getFrameBase(pc)); - stack.addFirst(new Long(operand1 + frameBaseOps.decode())); + LocationExpression frameBaseOps = new LocationExpression (die, die.getFrameBase(pc)); + stack.addFirst(new Long(operand1 + frameBaseOps.decode(frame))); break; // ??? unsigned not properly handled (use bignum?) See DwarfDie.java @@ -408,7 +401,7 @@ public class LocationExpression { * @param size - Size of variable * @return List of memory or register pieces */ - public List decode (int size) + public List decode (Frame frame, int size) { stack = new LinkedList(); int nops = ops.size(); @@ -501,7 +494,7 @@ public class LocationExpression { case DwOp.REG31_: if (locationType == 0) locationType = locationTypeReg; - Register register = DwarfRegisterMapFactory.getRegisterMap(isa) + Register register = DwarfRegisterMapFactory.getRegisterMap(frame.getTask().getISA()) .getRegister(operator - DwOp.REG0_); // Push the register onto the dwfl stack stack.addFirst(register); @@ -540,7 +533,7 @@ public class LocationExpression { case DwOp.BREG30_: case DwOp.BREG31_: locationType = locationTypeRegDisp; - register = DwarfRegisterMapFactory.getRegisterMap(isa) + register = DwarfRegisterMapFactory.getRegisterMap(frame.getTask().getISA()) .getRegister(operator - DwOp.BREG0_); long regval = frame.getRegister(register); stack.addFirst(new Long(operand1 + regval)); @@ -549,14 +542,14 @@ public class LocationExpression { case DwOp.REGX_: if (locationType == 0) locationType = locationTypeReg; - register = DwarfRegisterMapFactory.getRegisterMap(isa) + register = DwarfRegisterMapFactory.getRegisterMap(frame.getTask().getISA()) .getRegister((int)operand1); stack.addFirst(register); break; case DwOp.BREGX_: locationType = locationTypeRegDisp; - register = DwarfRegisterMapFactory.getRegisterMap(isa) + register = DwarfRegisterMapFactory.getRegisterMap(frame.getTask().getISA()) .getRegister((int)operand1); regval = frame.getRegister(register); stack.addFirst(new Long(operand2 + regval)); @@ -571,8 +564,8 @@ public class LocationExpression { case DwOp.FBREG_: locationType = locationTypeRegDisp; long pc = frame.getAdjustedAddress(); - LocationExpression frameBaseOps = new LocationExpression (frame, die, die.getFrameBase(pc)); - stack.addFirst(new Long(operand1 + frameBaseOps.decode())); + LocationExpression frameBaseOps = new LocationExpression (die, die.getFrameBase(pc)); + stack.addFirst(new Long(operand1 + frameBaseOps.decode(frame))); break; // ??? unsigned not properly handled (use bignum?) See DwarfDie.java @@ -760,7 +753,7 @@ public class LocationExpression { break; } // Otherwise, check the type of element on stack top and add to list - addToList (pieces, operand1); + addToList (frame, pieces, operand1); break; default: @@ -774,7 +767,7 @@ public class LocationExpression { */ if (pieces.isEmpty()) { - addToList (pieces, size); + addToList (frame, pieces, size); } return pieces; @@ -784,7 +777,7 @@ public class LocationExpression { * Function that checks the type of element on the stack top and adds it to the * list of location */ - private void addToList (List pieces, long size) + private void addToList (Frame frame, List pieces, long size) { /* * If stackTop is a Register, add it as a RegisterPiece to list pieces @@ -803,13 +796,13 @@ public class LocationExpression { * Return register number for a one entry DW_OP_regX location list * */ - public Register getRegisterNumber () { + public Register getRegisterNumber (Frame frame) { if (ops.size() == 1) { int operator = ((DwarfOp) ops.get(0)).operator; if (operator >= DwOp.REG0_ || operator <= DwOp.REG31_) { locationType = locationTypeReg; - return DwarfRegisterMapFactory.getRegisterMap(isa) + return DwarfRegisterMapFactory.getRegisterMap(frame.getTask().getISA()) .getRegister(operator - DwOp.REG0_); } }