diff --git a/src/wasm-binary.h b/src/wasm-binary.h index d568abd6c4a..989ce891a5f 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 d9985212fe2..4082fbf5f2a 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" @@ -1212,7 +1213,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 ae70e4a2238..d138e422610 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 00000000000..caa70f82100 Binary files /dev/null and b/test/lit/binary/custom-section-build-id.test.wasm differ