|
1 | 1 | // Copyright 2025 Wizard authors. All rights reserved. |
2 | 2 | // See LICENSE for details of Apache 2.0 license. |
3 | 3 |
|
| 4 | +def valuerep = Target.tagging; |
| 5 | + |
4 | 6 | // Represents a compressed frame. |
5 | 7 | // {ret_addr} is a pointer into the code of {func}. |
6 | 8 | // TODO: make it more compact |
@@ -40,7 +42,13 @@ component X86_64Compression { |
40 | 42 | collector.reset(); |
41 | 43 | builder.reset(); |
42 | 44 | stack.walk<void>(collector.visitFrame, void, stack.rsp, false); |
43 | | - for (i = collector.frames.length - 1; i >= 0; i--) builder.addFrame(collector.frames[i]); |
| 45 | + for (i = collector.frames.length - 1; i >= 0; i--) { |
| 46 | + var next_vfp = stack.vsp; |
| 47 | + if (i != 0) { |
| 48 | + next_vfp = collector.frames[i-1].getFrameAccessor().vfp(); |
| 49 | + } |
| 50 | + builder.addFrame(collector.frames[i], next_vfp); |
| 51 | + } |
44 | 52 |
|
45 | 53 | var compressed = X86_64CompressedStack.new(); |
46 | 54 | builder.build(compressed); |
@@ -152,27 +160,28 @@ class CompressedStackBuilder { |
152 | 160 | def values = Vector<Value>.new(); |
153 | 161 |
|
154 | 162 | def reset() { frames.clear(); values.clear(); } |
155 | | - def addFrame(frame: TargetFrame) { |
| 163 | + def addFrame(frame: TargetFrame, next_vfp: Pointer) { |
156 | 164 | var accessor = frame.getFrameAccessor(); |
157 | 165 | var func = accessor.func(); |
158 | 166 | var pc = accessor.pc(); |
159 | 167 |
|
160 | | - var n_locals = accessor.numLocals(); |
161 | | - var n_operands = accessor.numOperands(); |
162 | | - var n_vals = n_locals + n_operands; |
163 | | - |
164 | 168 | // XXX: a neater way to access ret_addr pointer? |
165 | 169 | var ret_addr = (frame.sp + (-Pointer.SIZE)).load<Pointer>(); |
166 | 170 |
|
167 | | - frames.put(CompressedFrame(func, pc, n_vals, ret_addr)); |
168 | | - |
169 | 171 | if (Debug.compression) { |
170 | 172 | var vfp_ptr = accessor.sp + X86_64InterpreterFrame.vfp.offset - Pointer.NULL; |
171 | 173 | var vfp_val = accessor.vfp() - Pointer.NULL; |
172 | 174 | Trace.OUT.put2("vfp (at compression) *(0x%x) = 0x%x", vfp_ptr, vfp_val).ln(); |
173 | 175 | } |
174 | | - for (i < n_locals) values.put(accessor.getLocal(i)); |
175 | | - for (i < n_operands) values.put(accessor.getOperand(i - n_operands + 1)); |
| 176 | + |
| 177 | + var offset = 0; |
| 178 | + for (this_vfp = accessor.vfp(); this_vfp < next_vfp; this_vfp += valuerep.slot_size) { |
| 179 | + var value = accessor.getValue(offset); |
| 180 | + values.put(value); |
| 181 | + offset++; |
| 182 | + } |
| 183 | + |
| 184 | + frames.put(CompressedFrame(func, pc, offset, ret_addr)); |
176 | 185 | } |
177 | 186 |
|
178 | 187 | def build(to: X86_64CompressedStack) { |
|
0 commit comments