|
24 | 24 | #include "refproxy.h" |
25 | 25 | #include <queue> |
26 | 26 | #include <unordered_set> |
27 | | -#include <vector> |
28 | 27 | #ifdef FUZZING |
29 | 28 | #include "emu.h" |
30 | 29 | #endif // FUZZING |
@@ -81,6 +80,7 @@ class CommitTrace { |
81 | 80 | virtual ~CommitTrace() {} |
82 | 81 | virtual const char *get_type() = 0; |
83 | 82 | virtual void display(bool use_spike = false); |
| 83 | + void display_line(int index, bool use_spike, bool is_retire); |
84 | 84 |
|
85 | 85 | protected: |
86 | 86 | virtual void display_custom() = 0; |
@@ -159,48 +159,48 @@ class DiffState { |
159 | 159 | bool dump_commit_trace = false; |
160 | 160 |
|
161 | 161 | DiffState(); |
162 | | - void record_group(uint64_t pc, uint64_t count) { |
163 | | - retire_group_pc_queue[retire_group_pointer] = pc; |
164 | | - retire_group_cnt_queue[retire_group_pointer] = count; |
165 | | - retire_group_pointer = (retire_group_pointer + 1) % DEBUG_GROUP_TRACE_SIZE; |
166 | | - }; |
| 162 | + void record_group(uint64_t pc, uint32_t count) { |
| 163 | + if (retire_group_queue.size() >= DEBUG_GROUP_TRACE_SIZE) { |
| 164 | + retire_group_queue.pop(); |
| 165 | + } |
| 166 | + retire_group_queue.push({pc, count}); |
| 167 | + } |
167 | 168 | void record_inst(uint64_t pc, uint32_t inst, uint8_t en, uint8_t dest, uint64_t data, bool skip, bool delayed, |
168 | 169 | uint8_t lqidx, uint8_t sqidx, uint16_t robidx, uint8_t isLoad, uint8_t isStore) { |
169 | 170 | push_back_trace(new InstrTrace(pc, inst, en, dest, data, lqidx, sqidx, robidx, isLoad, isStore, skip, delayed)); |
170 | | - retire_inst_pointer = (retire_inst_pointer + 1) % DEBUG_INST_TRACE_SIZE; |
171 | 171 | }; |
172 | 172 | void record_exception(uint64_t pc, uint32_t inst, uint64_t cause) { |
173 | 173 | push_back_trace(new ExceptionTrace(pc, inst, cause)); |
174 | | - retire_inst_pointer = (retire_inst_pointer + 1) % DEBUG_INST_TRACE_SIZE; |
175 | 174 | }; |
176 | 175 | void record_interrupt(uint64_t pc, uint32_t inst, uint64_t cause) { |
177 | 176 | push_back_trace(new InterruptTrace(pc, inst, cause)); |
178 | | - retire_inst_pointer = (retire_inst_pointer + 1) % DEBUG_INST_TRACE_SIZE; |
179 | 177 | }; |
180 | 178 | void display(int coreid); |
181 | 179 |
|
182 | 180 | private: |
| 181 | + const bool use_spike; |
| 182 | + |
183 | 183 | const static int DEBUG_GROUP_TRACE_SIZE = 16; |
184 | | - int retire_group_pointer = 0; |
185 | | - uint64_t retire_group_pc_queue[DEBUG_GROUP_TRACE_SIZE] = {0}; |
186 | | - uint32_t retire_group_cnt_queue[DEBUG_GROUP_TRACE_SIZE] = {0}; |
| 184 | + std::queue<std::pair<uint64_t, uint32_t>> retire_group_queue; |
187 | 185 |
|
188 | 186 | const static int DEBUG_INST_TRACE_SIZE = 32; |
189 | | - int retire_inst_pointer = 0; |
190 | | - std::vector<CommitTrace *> commit_trace; |
| 187 | + std::queue<CommitTrace *> commit_trace; |
191 | 188 |
|
192 | 189 | void push_back_trace(CommitTrace *trace) { |
193 | | - if (commit_trace[retire_inst_pointer]) { |
194 | | - delete commit_trace[retire_inst_pointer]; |
| 190 | + if (commit_trace.size() >= DEBUG_INST_TRACE_SIZE) { |
| 191 | + delete commit_trace.front(); |
| 192 | + commit_trace.pop(); |
195 | 193 | } |
196 | | - commit_trace[retire_inst_pointer] = trace; |
| 194 | + commit_trace.push(trace); |
197 | 195 | if (dump_commit_trace) { |
198 | | - display_commit_instr(retire_inst_pointer); |
| 196 | + static uint64_t commit_counter = 0; |
| 197 | + trace->display_line(commit_counter, use_spike, false); |
| 198 | + commit_counter++; |
| 199 | + fflush(stdout); |
199 | 200 | } |
200 | 201 | } |
201 | 202 | void display_commit_count(int i); |
202 | | - void display_commit_instr(int i); |
203 | | - void display_commit_instr(int i, bool use_spike); |
| 203 | + void display_commit_instr(int index, CommitTrace *trace, bool is_retire); |
204 | 204 | }; |
205 | 205 |
|
206 | 206 | class Difftest { |
|
0 commit comments