move
move copied to clipboard
Debug Info for Move compiler
🚀 Feature Request
Add to Move compiler support for creating debug info (dwarf) in llvm
Motivation
Needed for debugger
Pitch
Use llvmdi facility
Additional context
None
Our move compiler allows to visualize the control flow per function.
For example for this vector.2.move program:
module 0x101::vector {
native public fun empty<Element>(): vector<Element>;
native public fun borrow<Element>(v: &vector<Element>, i: u64): ∈
native public fun push_back<Element>(v: &mut vector<Element>, e: Element);
public fun singleton<Element>(e: Element): vector<Element> {
let v = empty();
push_back(&mut v, e);
v
}
public fun test_singleton_contains() {
let x_int = 1;
assert!(*borrow(&singleton(x_int), 0) == x_int, 0);
}
}
One can call compiler:
> move-mv-llvm-compiler -S -c /home/sol/tmp/vector.2.move -g -o /home/sol/tmp/vector_out/ --dot-out-dir /home/sol/tmp/vector_out --gen-dot-cfg write
and this will produce the bytecode:
public fun vector::test_singleton_contains() {
var $t0|tmp#$0: vector<u64>
var $t1|x_int: u64
var $t2: u64
var $t3: u64
var $t4: vector<u64>
var $t5: &vector<u64>
var $t6: u64
var $t7: &u64
var $t8: u64
var $t9: u64
var $t10: bool
var $t11: u64
0: $t2 := 1
1: $t1 := $t2
2: $t3 := copy($t1)
3: $t4 := vector::singleton<u64>($t3)
4: $t0 := $t4
5: $t5 := borrow_local($t0)
6: $t6 := 0
7: $t7 := vector::borrow<u64>($t5, $t6)
8: $t8 := read_ref($t7)
9: $t9 := move($t1)
10: $t10 := ==($t8, $t9)
11: if ($t10) goto 12 else goto 14
12: label L1
13: goto 17
14: label L0
15: $t11 := 0
16: abort($t11)
17: label L2
18: return ()
}
and .dot file 0000000000000101_vector_test_singleton.dot, which can be converted to png:
> dot -Tpng -o /home/sol/tmp/vector_out/vector_test_singleton.png /home/sol/tmp/vector_out/0000000000000101_vector_test_singleton.dot
png: