🐛 fix global/local debug index

This commit is contained in:
ValKmjolnir 2025-03-12 21:37:29 +08:00
parent a7a2a0a369
commit eeb126ab65
2 changed files with 68 additions and 25 deletions

View File

@ -225,12 +225,24 @@ void vm::function_call_trace() {
std::stack<const nas_func*> functions; std::stack<const nas_func*> functions;
std::stack<u64> callsite; std::stack<u64> callsite;
// load call trace // load call trace, from bottom to top
for(var* i = bottom; i <= top; ++i) { for(var* i = bottom; i <= top; ++i) {
// i-1 is the callsite program counter of this function // i-1 is the callsite program counter of this function
if (i->is_addr() && i+2<=top && // +-------+----------------+
(i+1)->is_ret() && (i+1)->ret()>0 && // | func | func() {..} | <-- i + 2
(i+2)->is_func()) { // +-------+----------------+
// | ret | 0x3bf | <-- i + 1 (value should not be 0x0)
// +-------+----------------+
// | addr | 0x7ff5f61ae020 | <-- i
// +-------+----------------+
// TODO: op_cnt may destroy the order, so maybe this need refact
if (i + 2 > top) {
continue;
}
if (!i->is_addr()) {
continue;
}
if ((i+1)->is_ret() && (i+1)->ret()>0 && (i+2)->is_func()) {
functions.push(&(i+2)->func()); functions.push(&(i+2)->func());
callsite.push((i+1)->ret()); callsite.push((i+1)->ret());
} }
@ -239,10 +251,18 @@ void vm::function_call_trace() {
// another condition may exist // another condition may exist
// have ret pc on stack, but no function at the top of the ret pc // have ret pc on stack, but no function at the top of the ret pc
for(var * i = top; i >= bottom; --i) { for(var * i = top; i >= bottom; --i) {
// +-------+----------------+
// | xxxx | xxxx | <-- i + 2 (not function or not exist)
// +-------+----------------+
// | ret | 0x3bf | <-- i + 1 (value should not be 0x0)
// +-------+----------------+
// | addr | 0x7ff5f61ae020 | <-- i
// +-------+----------------+
if ((i->is_addr() && i+2<=top && (i+1)->is_ret() && !(i+2)->is_func()) || if ((i->is_addr() && i+2<=top && (i+1)->is_ret() && !(i+2)->is_func()) ||
(i->is_addr() && i+1<=top && i+2>top && (i+1)->is_ret())) { (i->is_addr() && i+1<=top && i+2>top && (i+1)->is_ret())) {
functions.push(&ctx.funcr.func()); functions.push(&ctx.funcr.func());
callsite.push((i+1)->ret()); callsite.push((i+1)->ret());
break;
} }
} }
@ -370,7 +390,7 @@ void vm::global_state() {
<< reinterpret_cast<u64>(global) << ")\n" << std::dec; << reinterpret_cast<u64>(global) << ")\n" << std::dec;
for(usize i = 0; i<global_size; ++i) { for(usize i = 0; i<global_size; ++i) {
std::clog << " 0x" << std::hex << std::setw(8) std::clog << " 0x" << std::hex << std::setw(8)
<< std::setfill('0') << i << std::dec << std::setfill('0') << static_cast<u64>(i) << std::dec
<< " "; << " ";
auto name = global_symbol_name[i]; auto name = global_symbol_name[i];
if (name.length()>=10) { if (name.length()>=10) {
@ -379,7 +399,8 @@ void vm::global_state() {
} }
std::clog << "| " << std::left << std::setw(10) std::clog << "| " << std::left << std::setw(10)
<< std::setfill(' ') << name << " "; << std::setfill(' ') << name << " "
<< std::internal;
value_info(global[i]); value_info(global[i]);
} }
} }

View File

@ -9,15 +9,18 @@ var test_func = func(test_processes...) {
var info = runtime.gc.info(); var info = runtime.gc.info();
var gc_total = info.total; var gc_total = info.total;
var duration = 0; var duration = 0;
foreach(var f; test_processes) { foreach (var t; test_processes) {
println("[", os.time(), "] testing ", id(f)); var name = t[0];
var f = t[1];
print("[", os.time(), "] testing ", name, " : ");
time_stamp.stamp(); time_stamp.stamp();
f(); f();
duration = time_stamp.elapsedMSec(); duration = time_stamp.elapsedMSec();
info = runtime.gc.info(); info = runtime.gc.info();
println("[", os.time(), "] ", duration, " ms, gc ", println(duration, " ms, gc ",
(info.total-gc_total)*100/duration, "%, ", (info.total-gc_total)*100/duration, "%, ",
1000/duration, " cps"); 1000/duration, " count/sec"
);
gc_total = info.total; gc_total = info.total;
} }
@ -34,23 +37,25 @@ var test_func = func(test_processes...) {
println("---------------------"); println("---------------------");
} }
var MAX_ITER_NUM = 2e5;
var append_vec = func { var append_vec = func {
var res = []; var res = [];
for(var i=0; i<1e6; i+=1) { for(var i=0; i<MAX_ITER_NUM; i+=1) {
append(res, [1]); append(res, [1, 2, 3, 4]);
} }
} }
var append_hash = func { var append_hash = func {
var res = []; var res = [];
for(var i=0; i<1e6; i+=1) { for(var i=0; i<MAX_ITER_NUM; i+=1) {
append(res, {a:1, b:2}); append(res, {a:1, b:2, c:3, d:4});
} }
} }
var append_func = func { var append_func = func {
var res = []; var res = [];
for(var i=0; i<1e6; i+=1) { for(var i=0; i<MAX_ITER_NUM; i+=1) {
append(res, func { append(res, func {
println(arg); println(arg);
}); });
@ -59,23 +64,40 @@ var append_func = func {
var append_vec_in_vec = func { var append_vec_in_vec = func {
var res = []; var res = [];
for(var i=0; i<1e6; i+=1) { for(var i=0; i<MAX_ITER_NUM; i+=1) {
append(res, [[]]); append(res, [[], [], [], []]);
}
}
var append_hash_in_vec = func {
var res = [];
for(var i=0; i<MAX_ITER_NUM; i+=1) {
append(res, {a:{}, b:{}, c:{}, d:{}});
} }
} }
var append_vec_in_hash = func { var append_vec_in_hash = func {
for(var i=0; i<1e6; i+=1) { var res = [];
append([], {a:[], b:[]}); for(var i=0; i<MAX_ITER_NUM; i+=1) {
append(res, {a:[], b:[], c:[], d:[]});
} }
} }
for(var i=0; i<10; i+=1) { var append_hash_in_hash = func {
var res = [];
for(var i=0; i<MAX_ITER_NUM; i+=1) {
append(res, {a:{}, b:{}, c:{}, d:{}});
}
}
for (var i = 0; i < 10; i += 1) {
test_func( test_func(
append_vec, ["vec", append_vec],
append_hash, ["hash", append_hash],
append_func, ["func", append_func],
append_vec_in_vec, ["vec<vec>", append_vec_in_vec],
append_vec_in_hash ["vec<hash>", append_hash_in_vec],
["hash<str, vec>", append_vec_in_hash],
["hash<str, hash>", append_hash_in_hash]
); );
} }