Skip to content

Commit

Permalink
Print all debug annotations when BINARYEN_PRINT_FULL (#5904)
Browse files Browse the repository at this point in the history
In general, full print mode should print out all the things to avoid confusion. It
already did so for blocks (that the text format sometimes elides), types, etc. Doing
it for debug info can avoid confusion when debugging (in fact, this was one of the
main reasons I've been confused about how source maps work in Binaryen...).

Also add a comment to the code just landed in #5903
  • Loading branch information
kripken authored Aug 29, 2023
1 parent 65eb421 commit b29cdd4
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 1 deletion.
23 changes: 22 additions & 1 deletion src/passes/Print.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,25 @@ struct PrintSExpression : public UnifiedExpressionVisitor<PrintSExpression> {

std::vector<HeapType> heapTypes;

// Track the print indent so that we can see when it changes. That affects how
// we print debug annotations. In particular, we don't want to print repeated
// debug locations for children, like this:
//
// ;;@ file.cpp:20:4
// (block
// ;; no need to annotate here; children have the parent's location by
// ;; default anyhow
// (nop)
//
// But we do want to print an annotation even if it repeats if it is not a
// child:
//
// ;;@ file.cpp:20:4
// (block)
// ;;@ file.cpp:20:4 - this is clearer to annotate, to avoid confusion with
// the case where there is no debug info on the nop
// (nop)
//
unsigned lastPrintIndent = 0;

// Print type names by saved name or index if we have a module, or otherwise
Expand Down Expand Up @@ -2377,7 +2396,9 @@ std::ostream& PrintSExpression::printPrefixedTypes(const char* prefix,

void PrintSExpression::printDebugLocation(
const Function::DebugLocation& location) {
if (lastPrintedLocation == location && indent > lastPrintIndent) {
// Do not skip repeated debug info in full mode, for less-confusing debugging:
// full mode prints out everything in the most verbose manner.
if (lastPrintedLocation == location && indent > lastPrintIndent && !full) {
return;
}
lastPrintedLocation = location;
Expand Down
67 changes: 67 additions & 0 deletions test/lit/debug/full.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
;; RUN: wasm-opt %s -S -o - | filecheck %s --check-prefix=NRML
;; RUN: env BINARYEN_PRINT_FULL=1 wasm-opt %s -S -o - | filecheck %s --check-prefix=FULL

;;
;; Compare normal text output with debug info to full mode.
;;
;; Full mode does not skip repeated debug info in some cases, see below. It also
;; annotates the type of each node.
;;

(module
;; NRML: (func $a
;; NRML-NEXT: ;;@ src.cpp:1:2
;; NRML-NEXT: (block $block
;; NRML-NEXT: (drop
;; NRML-NEXT: (i32.const 0)
;; NRML-NEXT: )
;; NRML-NEXT: ;;@ src.cpp:3:4
;; NRML-NEXT: (drop
;; NRML-NEXT: (i32.const 1)
;; NRML-NEXT: )
;; NRML-NEXT: ;;@ src.cpp:3:4
;; NRML-NEXT: (drop
;; NRML-NEXT: (i32.const 2)
;; NRML-NEXT: )
;; NRML-NEXT: )
;; NRML-NEXT: ;;@ src.cpp:1:2
;; NRML-NEXT: )
;; FULL: (func $a
;; FULL-NEXT: [none] ;;@ src.cpp:1:2
;; FULL-NEXT: [none](block $block
;; FULL-NEXT: [none] ;;@ src.cpp:1:2
;; FULL-NEXT: (drop
;; FULL-NEXT: [i32] ;;@ src.cpp:1:2
;; FULL-NEXT: (i32.const 0)
;; FULL-NEXT: )
;; FULL-NEXT: [none] ;;@ src.cpp:3:4
;; FULL-NEXT: (drop
;; FULL-NEXT: [i32] ;;@ src.cpp:3:4
;; FULL-NEXT: (i32.const 1)
;; FULL-NEXT: )
;; FULL-NEXT: [none] ;;@ src.cpp:3:4
;; FULL-NEXT: (drop
;; FULL-NEXT: [i32] ;;@ src.cpp:3:4
;; FULL-NEXT: (i32.const 2)
;; FULL-NEXT: )
;; FULL-NEXT: ) ;; end block block
;; FULL-NEXT: ;;@ src.cpp:1:2
;; FULL-NEXT: )
(func $a
;;@ src.cpp:1:2
(block $block
(drop (i32.const 0)) ;; this child has the same location as the parent
;; block, and only in full mode will we print such
;; repeating info, including on the const child of
;; the drop
;;@ src.cpp:3:4
(drop (i32.const 1))
(drop (i32.const 2)) ;; this child has the same location as the sibling
;; before it, but we print it in normal mode as well
;; as full mode (as that seems less confusing). in
;; full mode, however, we also annotate the location
;; of the const node children of the drops.
)
)
)

0 comments on commit b29cdd4

Please sign in to comment.