summaryrefslogtreecommitdiff
path: root/test/example/debug-location-propagation.cpp
diff options
context:
space:
mode:
author许鑫权 <XMadrid@users.noreply.github.com>2024-04-22 05:14:13 +0800
committerGitHub <noreply@github.com>2024-04-21 14:14:13 -0700
commit7b7832d65ce28702bbac1b44b6de854029c1e0b1 (patch)
tree998a0e803992673b370ba37785cd9952efd225b7 /test/example/debug-location-propagation.cpp
parent219e668e87b012c0634043ed702534b8be31231f (diff)
downloadbinaryen-7b7832d65ce28702bbac1b44b6de854029c1e0b1.tar.gz
binaryen-7b7832d65ce28702bbac1b44b6de854029c1e0b1.tar.bz2
binaryen-7b7832d65ce28702bbac1b44b6de854029c1e0b1.zip
DebugLocationPropagation: pass debuglocation from parent node to chil… (#6500)
This PR creates a pass to propagate debug location from parent node to child nodes which has no debug location with pre-order traversal. This is useful for compilers that use Binaryen API to generate WebAssembly modules. It behaves like `wasm-opt` read text format file: children are tagged with the debug info of the parent, if they have no annotation of their own. For compilers that use Binaryen API to generate WebAssembly modules, it is a bit redundant to add debugInfo for each expression, Especially when the compiler wrap expressions. With this pass, compilers just need to add debugInfo for the parent node, which is more convenient. For example: ``` (drop (call $voidFunc) ) ``` Without this pass, if the compiler only adds debugInfo for the wrapped expression `drop`, the `call` expression has no corresponding source code mapping in DevTools debugging, which is obviously not user-friendly.
Diffstat (limited to 'test/example/debug-location-propagation.cpp')
-rw-r--r--test/example/debug-location-propagation.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/test/example/debug-location-propagation.cpp b/test/example/debug-location-propagation.cpp
new file mode 100644
index 000000000..b4685e391
--- /dev/null
+++ b/test/example/debug-location-propagation.cpp
@@ -0,0 +1,47 @@
+#include <cassert>
+#include <iostream>
+
+#include <binaryen-c.h>
+#include <wasm.h>
+
+int main() {
+ BinaryenModuleRef module = BinaryenModuleCreate();
+
+ BinaryenType ii[2] = {BinaryenTypeInt32(), BinaryenTypeInt32()};
+ BinaryenType params = BinaryenTypeCreate(ii, 2);
+ BinaryenType results = BinaryenTypeNone();
+
+ BinaryenExpressionRef x = BinaryenLocalGet(module, 0, BinaryenTypeInt32()),
+ y = BinaryenLocalGet(module, 1, BinaryenTypeInt32());
+ BinaryenExpressionRef add = BinaryenBinary(module, BinaryenAddInt32(), x, y);
+ BinaryenExpressionRef drop = BinaryenDrop(module, add);
+ BinaryenExpressionRef funcBody =
+ BinaryenBlock(module, "", &drop, 1, BinaryenTypeNone());
+
+ BinaryenFunctionRef adder =
+ BinaryenAddFunction(module, "adder", params, results, NULL, 0, funcBody);
+
+ BinaryenModuleAddDebugInfoFileName(module, "main");
+
+ BinaryenFunctionSetDebugLocation(adder, x, 0, 2, 13);
+ BinaryenFunctionSetDebugLocation(adder, drop, 0, 2, 2);
+
+ BinaryenModuleValidate(module);
+ BinaryenSetDebugInfo(true);
+ const char* runPasses[] = {"propagate-debug-locs"};
+ BinaryenModuleRunPasses(module, runPasses, 1);
+
+ auto& debugLocations = module->getFunction("adder")->debugLocations;
+ assert(debugLocations.size() == 4);
+ assert(debugLocations[x].columnNumber == 13);
+ assert(debugLocations[y].columnNumber == 13);
+ assert(debugLocations[add].columnNumber == 2);
+ assert(debugLocations[drop].columnNumber == 2);
+
+ BinaryenSetDebugInfo(false);
+ BinaryenModuleDispose(module);
+
+ std::cout << "success." << std::endl;
+
+ return 0;
+}