From 9b13dc5acd35d3cbe0f568f4abb9b3284be941d3 Mon Sep 17 00:00:00 2001 From: Marcin Kolny Date: Thu, 1 Aug 2024 17:12:40 +0100 Subject: [PATCH] Save build ID in a source map This is based on the two proposals: * https://github.com/WebAssembly/tool-conventions/blob/main/BuildId.md * https://github.com/tc39/source-map/blob/main/proposals/debug-id.md --- src/wasm-binary.h | 1 + src/wasm/wasm-binary.cpp | 27 +++++++++++++++++- src/wasm/wasm.cpp | 1 + test/lit/binary/custom-section-build-id.test | 7 +++++ .../binary/custom-section-build-id.test.wasm | Bin 0 -> 29 bytes 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/lit/binary/custom-section-build-id.test create mode 100644 test/lit/binary/custom-section-build-id.test.wasm diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 8a6f825fffa..e6231612e44 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -414,6 +414,7 @@ extern const char* Dylink; extern const char* Dylink0; extern const char* Linking; extern const char* Producers; +extern const char* BuildId; extern const char* TargetFeatures; extern const char* AtomicsFeature; diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 0a65fbadbf4..8da3f69a1db 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -16,6 +16,7 @@ #include #include +#include #include "ir/eh-utils.h" #include "ir/module-utils.h" @@ -1211,7 +1212,31 @@ void WasmBinaryWriter::initializeDebugInfo() { } void WasmBinaryWriter::writeSourceMapProlog() { - *sourceMap << "{\"version\":3,\"sources\":["; + *sourceMap << "{\"version\":3,"; + + for (const auto& section : wasm->customSections) { + if (section.name == BinaryConsts::CustomSections::BuildId) { + U32LEB ret; + size_t pos = 0; + ret.read([&]() { return section.data[pos++]; }); + + if (section.data.size() != pos + ret.value) { + std::cerr + << "warning: build id section with an incorrect size detected!\n"; + break; + } + + *sourceMap << "\"debugId\":\""; + for (size_t i = pos; i < section.data.size(); i++) { + *sourceMap << std::setfill('0') << std::setw(2) << std::hex + << static_cast(static_cast(section.data[i])); + } + *sourceMap << "\","; + break; + } + } + + *sourceMap << "\"sources\":["; for (size_t i = 0; i < wasm->debugInfoFileNames.size(); i++) { if (i > 0) { *sourceMap << ","; diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp index 4c30a4e32bd..8bcd62e2711 100644 --- a/src/wasm/wasm.cpp +++ b/src/wasm/wasm.cpp @@ -36,6 +36,7 @@ const char* Dylink = "dylink"; const char* Dylink0 = "dylink.0"; const char* Linking = "linking"; const char* Producers = "producers"; +const char* BuildId = "build_id"; const char* TargetFeatures = "target_features"; const char* AtomicsFeature = "atomics"; const char* BulkMemoryFeature = "bulk-memory"; diff --git a/test/lit/binary/custom-section-build-id.test b/test/lit/binary/custom-section-build-id.test new file mode 100644 index 00000000000..65d88675261 --- /dev/null +++ b/test/lit/binary/custom-section-build-id.test @@ -0,0 +1,7 @@ +# Verify that the build id is included in the source map. + +;; RUN: wasm-opt %s.wasm -o %t.wasm -osm %t.map +;; RUN: cat %t.map | filecheck %s + +;; CHECK: {"version":3,"debugId":"01ab23cd45ef67ab89","sources":[],"names":[],"mappings":""} + diff --git a/test/lit/binary/custom-section-build-id.test.wasm b/test/lit/binary/custom-section-build-id.test.wasm new file mode 100644 index 0000000000000000000000000000000000000000..caa70f82100f71617145bb2dea6d3ba7f1f57206 GIT binary patch literal 29 jcmZQbEY4+Q00Lo-q|(fsl=#dPPR7;BXI