diff options
author | Alon Zakai <azakai@google.com> | 2020-03-04 17:37:22 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-04 17:37:22 -0800 |
commit | 5034bf1dd28c9066422680cf516513af92bbbb8a (patch) | |
tree | e188019ba0599b54749b1419cff565f401b22d70 | |
parent | 57a81a04f7a49593438dcae4ca8cbad8e465dc2e (diff) | |
download | binaryen-5034bf1dd28c9066422680cf516513af92bbbb8a.tar.gz binaryen-5034bf1dd28c9066422680cf516513af92bbbb8a.tar.bz2 binaryen-5034bf1dd28c9066422680cf516513af92bbbb8a.zip |
DWARF: Ignore a compile unit with no abbreviations (#2678)
Such a module can't have valid DIEs, since we have no way to
interpret them.
Also check if DWARF sections from LLVM have contents -
when they are empty the section may exist but have a null
for its data.
Fixes #2673
-rw-r--r-- | src/wasm/wasm-debug.cpp | 2 | ||||
-rw-r--r-- | test/passes/dwarf_unit_with_no_abbrevs_noprint.bin.txt | 0 | ||||
-rw-r--r-- | test/passes/dwarf_unit_with_no_abbrevs_noprint.passes | 1 | ||||
-rw-r--r-- | test/passes/dwarf_unit_with_no_abbrevs_noprint.wasm | bin | 0 -> 90489 bytes | |||
-rw-r--r-- | third_party/llvm-project/DWARFVisitor.cpp | 5 |
5 files changed, 7 insertions, 1 deletions
diff --git a/src/wasm/wasm-debug.cpp b/src/wasm/wasm-debug.cpp index 50a04a6e6..286b63e69 100644 --- a/src/wasm/wasm-debug.cpp +++ b/src/wasm/wasm-debug.cpp @@ -56,7 +56,7 @@ struct BinaryenDWARFInfo { BinaryenDWARFInfo(const Module& wasm) { // Get debug sections from the wasm. for (auto& section : wasm.userSections) { - if (Name(section.name).startsWith(".debug_")) { + if (Name(section.name).startsWith(".debug_") && section.data.data()) { // TODO: efficiency sections[section.name.substr(1)] = llvm::MemoryBuffer::getMemBufferCopy( llvm::StringRef(section.data.data(), section.data.size())); diff --git a/test/passes/dwarf_unit_with_no_abbrevs_noprint.bin.txt b/test/passes/dwarf_unit_with_no_abbrevs_noprint.bin.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/test/passes/dwarf_unit_with_no_abbrevs_noprint.bin.txt diff --git a/test/passes/dwarf_unit_with_no_abbrevs_noprint.passes b/test/passes/dwarf_unit_with_no_abbrevs_noprint.passes new file mode 100644 index 000000000..48ea00769 --- /dev/null +++ b/test/passes/dwarf_unit_with_no_abbrevs_noprint.passes @@ -0,0 +1 @@ +roundtrip_g diff --git a/test/passes/dwarf_unit_with_no_abbrevs_noprint.wasm b/test/passes/dwarf_unit_with_no_abbrevs_noprint.wasm Binary files differnew file mode 100644 index 000000000..bf50db775 --- /dev/null +++ b/test/passes/dwarf_unit_with_no_abbrevs_noprint.wasm diff --git a/third_party/llvm-project/DWARFVisitor.cpp b/third_party/llvm-project/DWARFVisitor.cpp index 44bb33b47..ba3d1e0c5 100644 --- a/third_party/llvm-project/DWARFVisitor.cpp +++ b/third_party/llvm-project/DWARFVisitor.cpp @@ -59,6 +59,11 @@ template <typename T> void DWARFYAML::VisitorImpl<T>::traverseDebugInfo() { DebugInfo.AbbrevDecls[AbbrevEnd].Code) { AbbrevEnd++; } + // XXX BINARYEN If there are no abbreviations, there is nothing to + // do in this unit. + if (AbbrevStart == AbbrevEnd) { + continue; + } onStartCompileUnit(Unit); if (Unit.Entries.empty()) { // XXX BINARYEN continue; |