Commit 5c051659 authored by James Henderson's avatar James Henderson
Browse files

Revert "[DebugInfo] Make most debug line prologue errors non-fatal to parsing"

This reverts commit b94191fe.

The change broke both an LLD test and the LLDB build.
parent b94191fe
Loading
Loading
Loading
Loading
+3 −7
Original line number Diff line number Diff line
@@ -138,7 +138,6 @@ public:
    void clear();
    void dump(raw_ostream &OS, DIDumpOptions DumpOptions) const;
    Error parse(const DWARFDataExtractor &DebugLineData, uint64_t *OffsetPtr,
                function_ref<void(Error)> RecoverableErrorCallback,
                const DWARFContext &Ctx, const DWARFUnit *U = nullptr);
  };

@@ -342,12 +341,9 @@ public:
    /// Skip the current line table and go to the following line table (if
    /// present) immediately.
    ///
    /// \param RecoverableErrorCallback - report any recoverable prologue
    /// parsing issues via this callback.
    /// \param UnrecoverableErrorCallback - report any unrecoverable prologue
    /// parsing issues via this callback.
    void skip(function_ref<void(Error)> RecoverableErrorCallback,
              function_ref<void(Error)> UnrecoverableErrorCallback);
    /// \param ErrorCallback - report any prologue parsing issues via this
    /// callback.
    void skip(function_ref<void(Error)> ErrorCallback);

    /// Indicates if the parser has parsed as much as possible.
    ///
+1 −1
Original line number Diff line number Diff line
@@ -467,7 +467,7 @@ void DWARFContext::dump(
                             Optional<uint64_t> DumpOffset) {
    while (!Parser.done()) {
      if (DumpOffset && Parser.getOffset() != *DumpOffset) {
        Parser.skip(dumpWarning, dumpWarning);
        Parser.skip(dumpWarning);
        continue;
      }
      OS << "debug_line[" << format("0x%8.8" PRIx64, Parser.getOffset())
+16 −31
Original line number Diff line number Diff line
@@ -299,9 +299,9 @@ parseV5DirFileTables(const DWARFDataExtractor &DebugLineData,
  return Error::success();
}

Error DWARFDebugLine::Prologue::parse(
    const DWARFDataExtractor &DebugLineData, uint64_t *OffsetPtr,
    function_ref<void(Error)> RecoverableErrorCallback, const DWARFContext &Ctx,
Error DWARFDebugLine::Prologue::parse(const DWARFDataExtractor &DebugLineData,
                                      uint64_t *OffsetPtr,
                                      const DWARFContext &Ctx,
                                      const DWARFUnit *U) {
  const uint64_t PrologueOffset = *OffsetPtr;

@@ -311,8 +311,6 @@ Error DWARFDebugLine::Prologue::parse(
    FormParams.Format = dwarf::DWARF64;
    TotalLength = DebugLineData.getU64(OffsetPtr);
  } else if (TotalLength >= dwarf::DW_LENGTH_lo_reserved) {
    // Treat this error as unrecoverable - we have no way of knowing where the
    // table ends.
    return createStringError(errc::invalid_argument,
        "parsing line table prologue at offset 0x%8.8" PRIx64
        " unsupported reserved unit length found of value 0x%8.8" PRIx64,
@@ -320,9 +318,6 @@ Error DWARFDebugLine::Prologue::parse(
  }
  FormParams.Version = DebugLineData.getU16(OffsetPtr);
  if (getVersion() < 2)
    // Treat this error as unrecoverable - we cannot be sure what any of
    // the data represents including the length field, so cannot skip it or make
    // any reasonable assumptions.
    return createStringError(errc::not_supported,
                       "parsing line table prologue at offset 0x%8.8" PRIx64
                       " found unsupported version 0x%2.2" PRIx16,
@@ -357,32 +352,25 @@ Error DWARFDebugLine::Prologue::parse(
    if (Error E =
            parseV5DirFileTables(DebugLineData, OffsetPtr, FormParams, Ctx, U,
                                 ContentTypes, IncludeDirectories, FileNames)) {
      RecoverableErrorCallback(joinErrors(
      return joinErrors(
          createStringError(
              errc::invalid_argument,
              "parsing line table prologue at 0x%8.8" PRIx64
              " found an invalid directory or file table description at"
              " 0x%8.8" PRIx64,
              PrologueOffset, *OffsetPtr),
          std::move(E)));
      // Skip to the end of the prologue, since the chances are that the parser
      // did not read the whole table. This prevents the length check below from
      // executing.
      if (*OffsetPtr < EndPrologueOffset)
        *OffsetPtr = EndPrologueOffset;
          std::move(E));
    }
  } else
    parseV2DirFileTables(DebugLineData, OffsetPtr, EndPrologueOffset,
                         ContentTypes, IncludeDirectories, FileNames);

  if (*OffsetPtr != EndPrologueOffset) {
    RecoverableErrorCallback(createStringError(
        errc::invalid_argument,
  if (*OffsetPtr != EndPrologueOffset)
    return createStringError(errc::invalid_argument,
                       "parsing line table prologue at 0x%8.8" PRIx64
        " should have ended at 0x%8.8" PRIx64 " but it ended at 0x%8.8" PRIx64,
        PrologueOffset, EndPrologueOffset, *OffsetPtr));
    *OffsetPtr = EndPrologueOffset;
  }
                       " should have ended at 0x%8.8" PRIx64
                       " but it ended at 0x%8.8" PRIx64,
                       PrologueOffset, EndPrologueOffset, *OffsetPtr);
  return Error::success();
}

@@ -528,8 +516,7 @@ Error DWARFDebugLine::LineTable::parse(

  clear();

  Error PrologueErr = Prologue.parse(DebugLineData, OffsetPtr,
                                     RecoverableErrorCallback, Ctx, U);
  Error PrologueErr = Prologue.parse(DebugLineData, OffsetPtr, Ctx, U);

  if (OS) {
    // The presence of OS signals verbose dumping.
@@ -1171,16 +1158,14 @@ DWARFDebugLine::LineTable DWARFDebugLine::SectionParser::parseNext(
}

void DWARFDebugLine::SectionParser::skip(
    function_ref<void(Error)> RecoverableErrorCallback,
    function_ref<void(Error)> UnrecoverableErrorCallback) {
    function_ref<void(Error)> ErrorCallback) {
  assert(DebugLineData.isValidOffset(Offset) &&
         "parsing should have terminated");
  DWARFUnit *U = prepareToParse(Offset);
  uint64_t OldOffset = Offset;
  LineTable LT;
  if (Error Err = LT.Prologue.parse(DebugLineData, &Offset,
                                    RecoverableErrorCallback, Context, U))
    UnrecoverableErrorCallback(std::move(Err));
  if (Error Err = LT.Prologue.parse(DebugLineData, &Offset, Context, U))
    ErrorCallback(std::move(Err));
  moveToNextTable(OldOffset, LT.Prologue);
}

+51 −62
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@
.long   .Lunit_short_prologue_end - .Lunit_short_prologue_start # unit length
.Lunit_short_prologue_start:
.short  4               # version
.long   .Lprologue_short_prologue_end-.Lprologue_short_prologue_start # Length of Prologue
.long   .Lprologue_short_prologue_end-.Lprologue_short_prologue_start - 2 # Length of Prologue
.Lprologue_short_prologue_start:
.byte   1               # Minimum Instruction Length
.byte   1               # Maximum Operations per Instruction
@@ -79,13 +79,9 @@
.asciz "file1"          # File table
.byte   0, 0, 0
.asciz "file2"
.byte   1, 2
.byte   1, 2, 3
.byte   0
.Lprologue_short_prologue_end:
.byte   6               # Read as part of the prologue,
                        # then later again as DW_LNS_negate_stmt.
# FIXME: There should be an additional 0 byte here, but the file name parsing
#        code does not recognise a missing null terminator.
# Header end
.byte   0, 9, 2         # DW_LNE_set_address
.quad   0x1122334455667788
.byte   0, 1, 1         # DW_LNE_end_sequence
@@ -95,7 +91,7 @@
.long   .Lunit_long_prologue_end - .Lunit_long_prologue_start # unit length
.Lunit_long_prologue_start:
.short  4               # version
.long   .Lprologue_long_prologue_end-.Lprologue_long_prologue_start # Length of Prologue
.long   .Lprologue_long_prologue_end-.Lprologue_long_prologue_start + 1 # Length of Prologue
.Lprologue_long_prologue_start:
.byte   1               # Minimum Instruction Length
.byte   1               # Maximum Operations per Instruction
@@ -112,8 +108,6 @@
.asciz "file2"
.byte   1, 2, 3
.byte   0
# Skipped byte (treated as part of prologue).
.byte   6
.Lprologue_long_prologue_end:
.byte   0, 9, 2        # DW_LNE_set_address
.quad   0x1111222233334444
@@ -186,7 +180,7 @@
.short  5               # DWARF version number
.byte   8               # Address Size
.byte   0               # Segment Selector Size
.long   .Linvalid_description_header_end0 - .Linvalid_description_params0 # Length of Prologue (invalid)
.long   15              # Length of Prologue (invalid)
.Linvalid_description_params0:
.byte   1               # Minimum Instruction Length
.byte   1               # Maximum Operations per Instruction
@@ -194,27 +188,26 @@
.byte   -5              # Line Base
.byte   14              # Line Range
.byte   13              # Opcode Base
.byte   0, 1, 1, 1, 1, 0, 0, 0, 1, 0 # Standard Opcode Lengths
.Linvalid_description_header_end0:
# The bytes from here onwards will also be read as part of the main body.
                        # --- Prologue interpretation --- | --- Main body interpretation ---
.byte   0, 1            # More standard opcodes           | First part of DW_LNE_end_sequence
.byte   0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 # Standard Opcode Lengths
# Directory table format
.byte   1               # One element per directory entry | End of DW_LNE_end_sequence
.byte   1               # DW_LNCT_path                    | DW_LNS_copy
.byte   0x08            # DW_FORM_string                  | DW_LNS_const_add_pc
.byte   1               # One element per directory entry
.byte   1               # DW_LNCT_path
.byte   0x08            # DW_FORM_string
# Directory table entries
.byte   1               # 1 directory                     | DW_LNS_copy
.asciz  "/tmp"          # Directory name                  | four special opcodes + start of DW_LNE_end_sequence
.byte   1               # 1 directory
.asciz  "/tmp"
# File table format
.byte   1               # 1 element per file entry        | DW_LNE_end_sequence length
.byte   1               # DW_LNCT_path                    | DW_LNE_end_sequence opcode
.byte   0x08            # DW_FORM_string                  | DW_LNS_const_add_pc
.byte   2               # 2 elements per file entry
.byte   1               # DW_LNCT_path
.byte   0x08            # DW_FORM_string
.byte   2               # DW_LNCT_directory_index
.byte   0x0b            # DW_FORM_data1
# File table entries
.byte   1               # 1 file                          | DW_LNS_copy
.asciz  "xyz"           # File name                       | three special opcodes + start of DW_LNE_set_address
# Header end
.byte   9, 2            # Remainder of DW_LNE_set_address
.byte   1               # 1 file
.asciz  "a.c"
.byte   1
.Linvalid_description_header_end0:
.byte   0, 9, 2         # DW_LNE_set_address
.quad   0xbabb1ebabb1e
.byte   0, 1, 1         # DW_LNE_end_sequence
.Linvalid_description_end0:
@@ -225,7 +218,7 @@
.short  5               # DWARF version number
.byte   8               # Address Size
.byte   0               # Segment Selector Size
.long   .Linvalid_file_header_end0 - .Linvalid_file_params0 # Length of Prologue (invalid)
.long   .Linvalid_file_header_end0-.Linvalid_file_params0-7     # Length of Prologue (invalid)
.Linvalid_file_params0:
.byte   1               # Minimum Instruction Length
.byte   1               # Maximum Operations per Instruction
@@ -246,16 +239,12 @@
.byte   1               # DW_LNCT_path
.byte   0x08            # DW_FORM_string
.byte   2               # DW_LNCT_directory_index
.Linvalid_file_header_end0:
# The bytes from here onwards will also be read as part of the main body.
                        # --- Prologue interpretation --- | --- Main body interpretation ---
.byte   0x0b            # DW_FORM_data1                   | DW_LNS_set_epilogue_begin
.byte   0x0b            # DW_FORM_data1
# File table entries
.byte   1               # 1 file                          | DW_LNS_copy
.asciz  "xyz"           # File name                       | 3 special opcodes + start of DW_LNE_end_sequence
.byte   1               # Dir index                       | DW_LNE_end_sequence length
# Header end
.byte   1               # DW_LNE_end_sequence opcode
.byte   1               # 1 file
.asciz  "a.c"
.byte   1
.Linvalid_file_header_end0:
.byte   0, 9, 2         # DW_LNE_set_address
.quad   0xab4acadab4a
.byte   0, 1, 1         # DW_LNE_end_sequence
@@ -267,7 +256,7 @@
.short  5               # DWARF version number
.byte   8               # Address Size
.byte   0               # Segment Selector Size
.long   .Linvalid_dir_header_end0 - .Linvalid_dir_params0 # Length of Prologue (invalid)
.long   .Linvalid_dir_header_end0-.Linvalid_dir_params0-16     # Length of Prologue (invalid)
.Linvalid_dir_params0:
.byte   1               # Minimum Instruction Length
.byte   1               # Maximum Operations per Instruction
@@ -282,19 +271,19 @@
.byte   0x08            # DW_FORM_string
# Directory table entries
.byte   1               # 1 directory
.Linvalid_dir_header_end0:
# The bytes from here onwards will also be read as part of the main body.
                        # --- Prologue interpretation --- | --- Main body interpretation ---
.asciz  "/tmp"          # Directory name                  | 4 special opcodes + start of DW_LNE_end_sequence
.asciz  "/tmp"
# File table format
.byte   1               # 1 element per file entry        | DW_LNE_end_sequence length
.byte   1               # DW_LNCT_path                    | DW_LNE_end_sequence length opcode
.byte   0x08            # DW_FORM_string                  | DW_LNS_const_add_pc
.byte   2               # 2 elements per file entry
.byte   1               # DW_LNCT_path
.byte   0x08            # DW_FORM_string
.byte   2               # DW_LNCT_directory_index
.byte   0x0b            # DW_FORM_data1
# File table entries
.byte   1               # 1 file                          | DW_LNS_copy
.asciz  "xyz"           # File name                       | start of DW_LNE_set_address
# Header end
.byte   9, 2            # DW_LNE_set_address length + opcode
.byte   1               # 1 file
.asciz  "a.c"
.byte   1
.Linvalid_dir_header_end0:
.byte   0, 9, 2         # DW_LNE_set_address
.quad   0x4444333322221111
.byte   0, 1, 1         # DW_LNE_end_sequence
.Linvalid_dir_end0:
@@ -334,7 +323,7 @@
.asciz  "a.c"
.byte   0
# Data to show that the rest of the prologue is skipped.
.byte   1
.byte   6
.Linvalid_md5_header_end0:
.byte   0, 9, 2         # DW_LNE_set_address
.quad   0x1234123412341234
@@ -348,7 +337,7 @@
.short  5               # DWARF version number
.byte   8               # Address Size
.byte   0               # Segment Selector Size
.long   .Linvalid_md5_header_end1 - .Linvalid_md5_params1 # Length of Prologue
.long   .Linvalid_md5_header_end1-.Linvalid_md5_params1 - 10 # Length of Prologue
.Linvalid_md5_params1:
.byte   1               # Minimum Instruction Length
.byte   1               # Maximum Operations per Instruction
@@ -365,20 +354,20 @@
.byte   1               # 1 directory
.asciz  "/tmp"
# File table format
.byte   2               # 2 elements per file entry
.byte   3               # 2 elements per file entry
.byte   1               # DW_LNCT_path
.byte   0x08            # DW_FORM_string
.byte   5               # DW_LNCT_MD5
.Linvalid_md5_header_end1:
# The bytes from here onwards will also be read as part of the main body.
                        # --- Prologue interpretation --- | --- Main body interpretation ---
.byte   0x0b            # DW_FORM_data1                   | DW_LNS_set_epilogue_begin
.byte   0x0b            # DW_FORM_data1
.byte   2               # DW_LNCT_directory_index
.byte   0x0b            # DW_FORM_data1
# File table entries
.byte   1               # 1 file                          | DW_LNS_copy
.asciz  "xyz"           # File name                       | 3 special opcodes + DW_LNE_set_address start
.byte   9               # MD5 hash value                  | DW_LNE_set_address length
# Header end
.byte   2               # DW_LNE_set_address opcode
.byte   1               # 1 file
.asciz  "a.c"
.byte   6               # This byte will be consumed when reading the MD5 value.
.byte   0xb             # This byte will not be read as part of the prologue.
.Linvalid_md5_header_end1:
.byte   0, 9, 2         # DW_LNE_set_address
.quad   0x4321432143214321
.byte   0, 1, 1         # DW_LNE_end_sequence
.Linvalid_md5_end1:
+31 −32
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@
# RUN: FileCheck %s --input-file=%t-malformed-off-first.err --check-prefix=ALL

## Don't stop looking for the later unit if non-fatal issues are found.
# RUN: llvm-dwarfdump -debug-line=0x2ec %t-malformed.o 2> %t-malformed-off-last.err \
# RUN: llvm-dwarfdump -debug-line=0x2f8 %t-malformed.o 2> %t-malformed-off-last.err \
# RUN:   | FileCheck %s --check-prefix=LAST --implicit-check-not='debug_line[{{.*}}]'
# RUN: FileCheck %s --input-file=%t-malformed-off-last.err --check-prefix=ALL

@@ -53,7 +53,8 @@
# FATAL-NEXT: total_length: 0xfffffffe
# FATAL-NOT:  debug_line

## For non-fatal issues, the table data should be dumped.
## For non-fatal prologue issues, the table prologue should be dumped, and any
## subsequent tables should also be.
## Case 1: Version 0 table.
# NONFATAL:      debug_line[0x00000048]
# NONFATAL-NEXT: Line table prologue
@@ -69,7 +70,7 @@
# NONFATAL-NEXT: Line table prologue
# NONFATAL-NOT:  include_directories
# NONFATAL-NOT:  file_names
# NONFATAL:      0x8877665544332211 {{.*}} end_sequence
# NONFATAL-NOT:  Address

## Case 4: Prologue with length shorter than parsed.
# NONFATAL:      debug_line[0x00000081]
@@ -78,11 +79,12 @@
# NONFATAL-NEXT:            name: "file2"
# NONFATAL-NEXT:       dir_index: 1
# NONFATAL-NEXT:        mod_time: 0x00000002
# NONFATAL-NEXT:          length: 0x00000006
# NONFATAL:      0x1122334455667788 {{.*}} 0 end_sequence{{$}}
# NONFATAL-NEXT:          length: 0x00000003
# NONFATAL-NOT:  file_names
# NONFATAL-NOT:  Address

## Case 5: Prologue with length longer than parsed.
# NONFATAL:      debug_line[0x000000c8]
# NONFATAL:      debug_line[0x000000c9]
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      file_names[  2]:
# NONFATAL-NEXT:            name: "file2"
@@ -90,7 +92,7 @@
# NONFATAL-NEXT:        mod_time: 0x00000002
# NONFATAL-NEXT:          length: 0x00000003
# NONFATAL-NOT:  file_names
# NONFATAL:      0x1111222233334444 {{.*}} is_stmt end_sequence
# NONFATAL-NOT:  Address

## Case 6: Extended opcode with incorrect length versus expected.
# NONFATAL:      debug_line[0x00000111]
@@ -110,47 +112,44 @@
# NONFATAL:      standard_opcode_lengths[DW_LNS_set_isa] = 1
# NONFATAL-NEXT: include_directories[  0] = "/tmp"
# NONFATAL-NEXT: file_names[  0]:
# NONFATAL-NEXT:            name: "xyz"
# NONFATAL:      0x0000000000000000 1 0 1 0 0 is_stmt end_sequence
# NONFATAL:      0x0000babb1ebabb1e {{.*}} end_sequence
# NONFATAL-NEXT:            name: "a.c"
# NONFATAL-NEXT:       dir_index: 1
# NONFATAL-NOT:  Address

## Case 9: V5 prologue ends during file table.
# NONFATAL:      debug_line[0x000001ee]
# NONFATAL:      debug_line[0x000001f2]
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      include_directories[  0] = "/tmp"
# NONFATAL-NEXT: file_names[  0]:
# NONFATAL-NEXT:            name: "xyz"
# NONFATAL-NEXT:            name: "a.c"
# NONFATAL-NEXT:       dir_index: 1
# NONFATAL:      0x0000000000000000 {{.*}} epilogue_begin
# NONFATAL:      0x00000ab4acadab4a {{.*}} end_sequence
# NONFATAL-NOT:  Address

## Case 10: V5 prologue ends during directory table.
# NONFATAL:      debug_line[0x0000022f]
# NONFATAL:      debug_line[0x00000232]
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      include_directories[  0] = "/tmp"
# NONFATAL-NEXT: file_names[  0]:
# NONFATAL-NEXT:            name: "xyz"
# NONFATAL:      0x0000000000000002 2 0 1 0 0 is_stmt{{$}}
# NONFATAL:      0x4444333322221111 {{.*}} end_sequence
# NONFATAL-NEXT:            name: "a.c"
# NONFATAL-NEXT:       dir_index: 1
# NONFATAL-NOT:  Address

## Case 11: V5 invalid MD5 hash form when there is still data to be read.
# NONFATAL:      debug_line[0x0000026b]
# NONFATAL:      debug_line[0x00000272]
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      include_directories[  0] = "/tmp"
# NONFATAL-NOT:  file_names
# NONFATAL-NOT:  is_stmt
# NONFATAL:      0x1234123412341234 {{.*}} end_sequence
# NONFATAL-NOT:  Address

## Case 12: V5 invalid MD5 hash form when data beyond the prologue length has
## been read before the MD5 problem is identified.
# NONFATAL: debug_line[0x000002ae]
# NONFATAL: debug_line[0x000002b5]
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      include_directories[  0] = "/tmp"
# NONFATAL-NOT:  file_names
# NONFATAL:      0x0000000000000000 {{.*}} epilogue_begin
# NONFATAL:      0x4321432143214321 {{.*}} is_stmt end_sequence
# NONFATAL-NOT:  Address

# LAST:          debug_line[0x000002ec]
# LAST:          debug_line[0x000002f8]
# LAST:          0x00000000cafebabe {{.*}} end_sequence

# RESERVED: warning: parsing line table prologue at offset 0x00000048 unsupported reserved unit length found of value 0xfffffffe
@@ -160,17 +159,17 @@
# ALL-NEXT: warning: parsing line table prologue at offset 0x0000004e found unsupported version 0x01
# ALL-NEXT: warning: parsing line table prologue at 0x00000054 found an invalid directory or file table description at 0x00000073
# ALL-NEXT: warning: failed to parse entry content descriptions because no path was found
# FIXME - The latter offset in the next line should be 0xad. The filename parsing code does not notice a missing terminating byte.
# ALL-NEXT: warning: parsing line table prologue at 0x00000081 should have ended at 0x000000b9 but it ended at 0x000000ba
# ALL-NEXT: warning: parsing line table prologue at 0x000000c8 should have ended at 0x00000103 but it ended at 0x00000102
# ALL-NEXT: warning: parsing line table prologue at 0x000000c9 should have ended at 0x00000104 but it ended at 0x00000103
# OTHER-NEXT: warning: unexpected line op length at offset 0x00000158 expected 0x02 found 0x01
# OTHER-NEXT: warning: unexpected line op length at offset 0x0000015c expected 0x01 found 0x02
# OTHER-NEXT: warning: last sequence in debug line table at offset 0x0000016c is not terminated
# ALL-NEXT: warning: parsing line table prologue at 0x000001b2 should have ended at 0x000001ce but it ended at 0x000001e1
# ALL-NEXT: warning: parsing line table prologue at 0x000001ee should have ended at 0x00000219 but it ended at 0x00000220
# ALL-NEXT: warning: parsing line table prologue at 0x0000022f should have ended at 0x00000251 but it ended at 0x0000025e
# ALL-NEXT: warning: parsing line table prologue at 0x0000026b found an invalid directory or file table description at 0x0000029f
# ALL-NEXT: warning: parsing line table prologue at 0x000001b2 should have ended at 0x000001cd but it ended at 0x000001e4
# ALL-NEXT: warning: parsing line table prologue at 0x000001f2 should have ended at 0x0000021d but it ended at 0x00000224
# ALL-NEXT: warning: parsing line table prologue at 0x00000232 should have ended at 0x00000254 but it ended at 0x00000264
# ALL-NEXT: warning: parsing line table prologue at 0x00000272 found an invalid directory or file table description at 0x000002a6
# ALL-NEXT: warning: failed to parse file entry because the MD5 hash is invalid
# ALL-NEXT: warning: parsing line table prologue at 0x000002ae found an invalid directory or file table description at 0x000002e0
# ALL-NEXT: warning: parsing line table prologue at 0x000002b5 found an invalid directory or file table description at 0x000002e9
# ALL-NEXT: warning: failed to parse file entry because the MD5 hash is invalid
# ALL-NEXT: warning: parsing line table prologue at 0x000002ae should have ended at 0x000002d9 but it ended at 0x000002e0
# ALL-NOT:  warning:
Loading