Closed
Description
When executing llvm-dwarfdump /usr/bin/python3.10d --debug-loclists
, llvm-dwarfdump crashes.
LLVM version: 19.0.0git (commit b586149, DEBUG build with assertions)
The Python binary can be obtained from python3-dbg_3.10.6-1~22.04_amd64.deb
Console output (beginning skipped):
0x000219a4:
DW_LLE_offset_pair (0x000000000000012d, 0x000000000000014a): DW_OP_reg17 XMM0
DW_LLE_offset_pair (0x000000000000014a, 0x00000000000001ad): DW_OP_reg3 RBX
DW_LLE_offset_pair (0x00000000000001ad, 0x00000000000001b1): DW_OP_entry_value(DW_OP_regval_type XMM0PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: llvm-dwarfdump /usr/bin/python3.10d --debug-loclists
#0 0x00007fef808d6501 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /tmp/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:11
#1 0x00007fef808d69fb PrintStackTraceSignalHandler(void*) /tmp/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
#2 0x00007fef808d49f6 llvm::sys::RunSignalHandlers() /tmp/llvm-project/llvm/lib/Support/Signals.cpp:105:5
#3 0x00007fef808d7195 SignalHandler(int) /tmp/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
#4 0x00007fef7fe42520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#5 0x00007fef826a4bec llvm::DWARFUnitHeader::getOffset() const /tmp/llvm-project/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h:89:39
#6 0x00007fef826a4839 llvm::DWARFUnit::getOffset() const /tmp/llvm-project/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h:321:32
#7 0x00007fef8273e1a0 llvm::prettyPrintBaseTypeRef(llvm::DWARFUnit*, llvm::raw_ostream&, llvm::DIDumpOptions, llvm::ArrayRef<unsigned long>, unsigned int) /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp:243:36
#8 0x00007fef8273e0be llvm::DWARFExpression::prettyPrintRegisterOp(llvm::DWARFUnit*, llvm::raw_ostream&, llvm::DIDumpOptions, unsigned char, llvm::ArrayRef<unsigned long>) /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp:284:7
#9 0x00007fef8273e612 llvm::DWARFExpression::Operation::print(llvm::raw_ostream&, llvm::DIDumpOptions, llvm::DWARFExpression const*, llvm::DWARFUnit*) const /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp:313:9
#10 0x00007fef8273ecb8 llvm::DWARFExpression::print(llvm::raw_ostream&, llvm::DIDumpOptions, llvm::DWARFUnit*, bool) const /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp:368:9
#11 0x00007fef8272827e dumpExpression(llvm::raw_ostream&, llvm::DIDumpOptions, llvm::ArrayRef<unsigned char>, bool, unsigned int, llvm::DWARFUnit*) /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp:120:3
#12 0x00007fef82727a62 llvm::DWARFLocationTable::dumpLocationList(unsigned long*, llvm::raw_ostream&, std::optional<llvm::object::SectionedAddress>, llvm::DWARFObject const&, llvm::DWARFUnit*, llvm::DIDumpOptions, unsigned int) const::$_1::operator()(llvm::DWARFLocationEntry const&) const /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp:158:7
#13 0x00007fef827276bd bool llvm::function_ref<bool (llvm::DWARFLocationEntry const&)>::callback_fn<llvm::DWARFLocationTable::dumpLocationList(unsigned long*, llvm::raw_ostream&, std::optional<llvm::object::SectionedAddress>, llvm::DWARFObject const&, llvm::DWARFUnit*, llvm::DIDumpOptions, unsigned int) const::$_1>(long, llvm::DWARFLocationEntry const&) /tmp/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:5
#14 0x00007fef82728601 llvm::function_ref<bool (llvm::DWARFLocationEntry const&)>::operator()(llvm::DWARFLocationEntry const&) const /tmp/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:5
#15 0x00007fef82726abe llvm::DWARFDebugLoclists::visitLocationList(unsigned long*, llvm::function_ref<bool (llvm::DWARFLocationEntry const&)>) const /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp:335:16
#16 0x00007fef82725cb6 llvm::DWARFLocationTable::dumpLocationList(unsigned long*, llvm::raw_ostream&, std::optional<llvm::object::SectionedAddress>, llvm::DWARFObject const&, llvm::DWARFUnit*, llvm::DIDumpOptions, unsigned int) const /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp:163:7
#17 0x00007fef8272724b llvm::DWARFDebugLoclists::dumpRange(unsigned long, unsigned long, llvm::raw_ostream&, llvm::DWARFObject const&, llvm::DIDumpOptions) /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp:401:17
#18 0x00007fef826a9efd dumpLoclistsSection(llvm::raw_ostream&, llvm::DIDumpOptions, llvm::DWARFDataExtractor, llvm::DWARFObject const&, std::optional<unsigned long>) /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp:975:7
#19 0x00007fef826a6ca2 llvm::DWARFContext::dump(llvm::raw_ostream&, llvm::DIDumpOptions, std::array<std::optional<unsigned long>, 28ul>) /tmp/llvm-project/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp:1078:5
#20 0x000055f13ee9d0e1 dumpObjectFile(llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&) /tmp/llvm-project/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp:725:3
#21 0x000055f13eec3c35 bool std::__invoke_impl<bool, bool (*&)(llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&), llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&>(std::__invoke_other, bool (*&)(llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&), llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&) /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/invoke.h:61:7
#22 0x000055f13eec3bc5 std::enable_if<is_invocable_r_v<bool, bool (*&)(llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&), llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&>, bool>::type std::__invoke_r<bool, bool (*&)(llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&), llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&>(bool (*&)(llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&), llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&) /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/invoke.h:114:2
#23 0x000055f13eec3add std::_Function_handler<bool (llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&), bool (*)(llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&)>::_M_invoke(std::_Any_data const&, llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&) /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_function.h:290:2
#24 0x000055f13eeaa9b5 std::function<bool (llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&)>::operator()(llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&) const /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_function.h:591:2
#25 0x000055f13ee9f1b6 handleBuffer(llvm::StringRef, llvm::MemoryBufferRef, std::function<bool (llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&)>, llvm::raw_ostream&) /tmp/llvm-project/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp:780:11
#26 0x000055f13ee9c27e handleFile(llvm::StringRef, std::function<bool (llvm::object::ObjectFile&, llvm::DWARFContext&, llvm::Twine const&, llvm::raw_ostream&)>, llvm::raw_ostream&) /tmp/llvm-project/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp:818:10
#27 0x000055f13ee9bf92 main /tmp/llvm-project/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp:919:18
#28 0x00007fef7fe29d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#29 0x00007fef7fe29e40 call_init ./csu/../csu/libc-start.c:128:20
#30 0x00007fef7fe29e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#31 0x000055f13ee7f575 _start (/tmp/llvm-project/llvm/build/bin/llvm-dwarfdump+0x14575)
Segmentation fault (core dumped)
Adding a null-check for U
in llvm::prettyPrintBaseTypeRef solves the issue.
Because dumpLoclistsSection
passes nullptr
for parameter DWARFUnit *U
of DWARFLocationTable::dumpLocationList
, which gets forwarded to llvm::prettyPrintBaseTypeRef
, I suppose that nullptr
is also a valid argument for parameter DWARFUnit *U
of llvm::prettyPrintBaseTypeRef
.