Index: lib/DebugInfo/DWARF/DWARFUnit.cpp =================================================================== --- lib/DebugInfo/DWARF/DWARFUnit.cpp +++ lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -320,8 +320,14 @@ Offset -= HeaderSize; } llvm::DWARFDebugRnglistTable Table; + uint64_t StartOffset = Offset; if (Error E = Table.extractHeaderAndOffsets(DA, &Offset)) return std::move(E); + if (Format != Table.getFormat()) + return createStringError(errc::invalid_argument, + "Mismatched DWARF formats between CU and range " + "list table with base = 0x%" PRIx64 "\n", + StartOffset); return Table; } Index: test/DebugInfo/X86/debuginfo-rnglists-format-mismatch.s =================================================================== --- /dev/null +++ test/DebugInfo/X86/debuginfo-rnglists-format-mismatch.s @@ -0,0 +1,40 @@ +# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o - | \ +# RUN: llvm-dwarfdump -debug-info - 2>&1 > /dev/null | \ +# RUN: FileCheck %s + + .section .debug_abbrev.dwo,"",@progbits + .byte 0x01 # Abbrev code + .byte 0x11 # DW_TAG_compile_unit + .byte 0x00 # DW_CHILDREN_no + .byte 0x55 # DW_AT_ranges + .byte 0x23 # DW_FORM_rnglistx + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x00 # EOM(3) + + .section .debug_info.dwo,"",@progbits + .long .LCUend - .LCUversion # Length of Unit +.LCUversion: + .short 5 # DWARF version number + .byte 5 # DW_UT_split_compile + .byte 4 # Address Size (in bytes) + .long 0 # Offset Into Abbrev Section + .byte 1 # Abbreviation code + .uleb128 0 # DW_AT_ranges +.LCUend: + + .section .debug_rnglists.dwo,"",@progbits + .long 0xffffffff # DWARF64 mark + .quad .LRTend - .LRTversion # table length +.LRTversion: + .short 5 # version + .byte 4 # address size + .byte 0 # segment selector size + .long 1 # offset entry count +.LRTbase: + .quad .LRTlist0 - .LRTbase +.LRTlist0: + .byte 0 # DW_RLE_end_of_list +.LRTend: + +# CHECK: error: parsing a range list table: Mismatched DWARF formats between CU and range list table with base = 0x0