diff options
author | Thomas Lively <tlively@google.com> | 2024-03-06 10:24:54 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-06 10:24:54 -0800 |
commit | 4ca311d83187bad3b5790635efc687b747a1b1e7 (patch) | |
tree | e6257f323a97a5d9a4bfe68942468f7da792f3dc | |
parent | f44912bf234d5e19a1adb34c770335f4b3190e2a (diff) | |
download | binaryen-4ca311d83187bad3b5790635efc687b747a1b1e7.tar.gz binaryen-4ca311d83187bad3b5790635efc687b747a1b1e7.tar.bz2 binaryen-4ca311d83187bad3b5790635efc687b747a1b1e7.zip |
Print '(offset ...)` in data and element segments (#6379)
Previously we just printed the offset instruction(s) directly, which is a valid
shorthand only when there is a single instruction. In the case of extended
constant instructions, there can potentially be multiple instructions, in which
case the explicit `offset` clause is required. Print the full clause when
necessary.
-rw-r--r-- | src/passes/Print.cpp | 15 | ||||
-rw-r--r-- | test/lit/validation/extended-const.wast | 10 |
2 files changed, 23 insertions, 2 deletions
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 3f0cfbabb..b0c83c437 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -21,6 +21,7 @@ #include <ir/iteration.h> #include <ir/module-utils.h> #include <ir/table-utils.h> +#include <ir/utils.h> #include <pass.h> #include <pretty_printing.h> #include <support/string.h> @@ -3113,7 +3114,14 @@ void PrintSExpression::visitElementSegment(ElementSegment* curr) { } o << ' '; + bool needExplicitOffset = Measurer{}.measure(curr->offset) > 1; + if (needExplicitOffset) { + o << "(offset "; + } visit(curr->offset); + if (needExplicitOffset) { + o << ')'; + } if (usesExpressions || currModule->tables.size() > 1) { o << ' '; @@ -3183,7 +3191,14 @@ void PrintSExpression::visitDataSegment(DataSegment* curr) { curr->memory.print(o); o << ") "; } + bool needExplicitOffset = Measurer{}.measure(curr->offset) > 1; + if (needExplicitOffset) { + o << "(offset "; + } visit(curr->offset); + if (needExplicitOffset) { + o << ")"; + } o << ' '; } String::printEscaped(o, {curr->data.data(), curr->data.size()}); diff --git a/test/lit/validation/extended-const.wast b/test/lit/validation/extended-const.wast index 6b506671f..054c5e28e 100644 --- a/test/lit/validation/extended-const.wast +++ b/test/lit/validation/extended-const.wast @@ -11,14 +11,20 @@ ;; EXTENDED: (global.get $gimport$0) ;; EXTENDED: (i32.const 42) ;; EXTENDED: )) -;; EXTENDED: (data $0 (i32.sub +;; EXTENDED: (data $0 (offset (i32.sub ;; EXTENDED: (global.get $gimport$0) ;; EXTENDED: (i32.const 10) -;; EXTENDED: ) "hello world") +;; EXTENDED: )) "hello world") +;; EXTENDED: (elem $0 (offset (i32.sub +;; EXTENDED: (global.get $gimport$0) +;; EXTENDED: (i32.const 10) +;; EXTENDED: ))) (module (import "env" "global" (global i32)) (memory 1 1) + (table 1 1 funcref) (global i32 (i32.add (global.get 0) (i32.const 42))) (data (offset (i32.sub (global.get 0) (i32.const 10))) "hello world") + (elem (offset (i32.sub (global.get 0) (i32.const 10))) func) ) |