[llvm] r324078 - Add missing new files from r324077

James Henderson via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 5 02:49:53 PST 2018


Thanks. I think r324223 should fix this.

On 4 February 2018 at 17:18, Simon Dardis <Simon.Dardis at mips.com> wrote:

> Hi James,
>
> This commit appears to have broken llvm-mips-linux since build #3577,
> ( http://lab.llvm.org:8011/builders/llvm-mips-linux/builds/3577 ), can
> you take
> a look at this please?
>
> Thanks,
> Simon
> ________________________________________
> From: llvm-commits [llvm-commits-bounces at lists.llvm.org] on behalf of
> James Henderson via llvm-commits [llvm-commits at lists.llvm.org]
> Sent: Friday, February 2, 2018 12:45 PM
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r324078 - Add missing new files from r324077
>
> Author: jhenderson
> Date: Fri Feb  2 04:45:57 2018
> New Revision: 324078
>
> URL: http://llvm.org/viewvc/llvm-project?rev=324078&view=rev
> Log:
> Add missing new files from r324077
>
> Differential Revision: https://reviews.llvm.org/D42481
>
> Added:
>     llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAddressRange.h
>     llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRnglists.h
>     llvm/trunk/lib/DebugInfo/DWARF/DWARFAddressRange.cpp
>     llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp
>     llvm/trunk/test/tools/llvm-dwarfdump/X86/Inputs/debug_
> rnglists_short_section.s
>     llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists.s
>     llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists_empty.s
>     llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists_invalid.s
>
> Added: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAddressRange.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/DebugInfo/DWARF/DWARFAddressRange.h?rev=324078&view=auto
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAddressRange.h (added)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAddressRange.h Fri Feb
> 2 04:45:57 2018
> @@ -0,0 +1,66 @@
> +//===- DWARFAddressRange.h --------------------------------------*- C++
> -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===------------------------------------------------------
> ----------------===//
> +
> +#ifndef LLVM_DEBUGINFO_DWARF_DWARFADDRESSRANGE_H
> +#define LLVM_DEBUGINFO_DWARF_DWARFADDRESSRANGE_H
> +
> +#include <cstdint>
> +#include <tuple>
> +#include <vector>
> +
> +namespace llvm {
> +
> +class raw_ostream;
> +
> +struct DWARFAddressRange {
> +  uint64_t LowPC;
> +  uint64_t HighPC;
> +  uint64_t SectionIndex;
> +
> +  DWARFAddressRange() = default;
> +
> +  /// Used for unit testing.
> +  DWARFAddressRange(uint64_t LowPC, uint64_t HighPC, uint64_t
> SectionIndex = 0)
> +      : LowPC(LowPC), HighPC(HighPC), SectionIndex(SectionIndex) {}
> +
> +  /// Returns true if LowPC is smaller or equal to HighPC. This accounts
> for
> +  /// dead-stripped ranges.
> +  bool valid() const { return LowPC <= HighPC; }
> +
> +  /// Returns true if [LowPC, HighPC) intersects with [RHS.LowPC,
> RHS.HighPC).
> +  bool intersects(const DWARFAddressRange &RHS) const {
> +    // Empty ranges can't intersect.
> +    if (LowPC == HighPC || RHS.LowPC == RHS.HighPC)
> +      return false;
> +    return (LowPC < RHS.HighPC) && (HighPC > RHS.LowPC);
> +  }
> +
> +  /// Returns true if [LowPC, HighPC) fully contains [RHS.LowPC,
> RHS.HighPC).
> +  bool contains(const DWARFAddressRange &RHS) const {
> +    if (LowPC <= RHS.LowPC && RHS.LowPC <= HighPC)
> +      return LowPC <= RHS.HighPC && RHS.HighPC <= HighPC;
> +    return false;
> +  }
> +
> +  void dump(raw_ostream &OS, uint32_t AddressSize) const;
> +};
> +
> +static inline bool operator<(const DWARFAddressRange &LHS,
> +                             const DWARFAddressRange &RHS) {
> +  return std::tie(LHS.LowPC, LHS.HighPC) < std::tie(RHS.LowPC,
> RHS.HighPC);
> +}
> +
> +raw_ostream &operator<<(raw_ostream &OS, const DWARFAddressRange &R);
> +
> +/// DWARFAddressRangesVector - represents a set of absolute address
> ranges.
> +using DWARFAddressRangesVector = std::vector<DWARFAddressRange>;
> +
> +} // end namespace llvm
> +
> +#endif // LLVM_DEBUGINFO_DWARF_DWARFADDRESSRANGE_H
>
> Added: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRnglists.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/DebugInfo/DWARF/DWARFDebugRnglists.h?rev=324078&view=auto
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRnglists.h (added)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRnglists.h Fri Feb
> 2 04:45:57 2018
> @@ -0,0 +1,59 @@
> +//===- DWARFDebugRnglists.h -------------------------------------*- C++
> -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===------------------------------------------------------
> ----------------===//
> +
> +#ifndef LLVM_DEBUGINFO_DWARFDEBUGRNGLISTS_H
> +#define LLVM_DEBUGINFO_DWARFDEBUGRNGLISTS_H
> +
> +#include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
> +#include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h"
> +#include <cstdint>
> +#include <vector>
> +
> +namespace llvm {
> +
> +class Error;
> +class raw_ostream;
> +
> +class DWARFDebugRnglists {
> +private:
> +  struct Header {
> +    /// The total length of the entries for this table, not including the
> length
> +    /// field itself.
> +    uint32_t Length = 0;
> +    /// The DWARF version number.
> +    uint16_t Version;
> +    /// The size in bytes of an address on the target architecture. For
> +    /// segmented addressing, this is the size of the offset portion of
> the
> +    /// address.
> +    uint8_t AddrSize;
> +    /// The size in bytes of a segment selector on the target
> architecture.
> +    /// If the target system uses a flat address space, this value is 0.
> +    uint8_t SegSize;
> +    /// The number of offsets that follow the header before the range
> lists.
> +    uint32_t OffsetEntryCount;
> +  };
> +
> +  Header HeaderData;
> +  std::vector<uint64_t> Offsets;
> +  std::vector<DWARFAddressRangesVector> Ranges;
> +
> +public:
> +  void clear();
> +  Error extract(DWARFDataExtractor Data, uint32_t *OffsetPtr);
> +  void dump(raw_ostream &OS) const;
> +
> +  /// Returns the length of this table, including the length field, or 0
> if the
> +  /// length has not been determined (e.g. because the table has not yet
> been
> +  /// parsed, or there was a problem in parsing).
> +  uint64_t length() const;
> +};
> +
> +} // end namespace llvm
> +
> +#endif // LLVM_DEBUGINFO_DWARFDEBUGRNGLISTS_H
>
> Added: llvm/trunk/lib/DebugInfo/DWARF/DWARFAddressRange.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/
> DWARFAddressRange.cpp?rev=324078&view=auto
> ============================================================
> ==================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFAddressRange.cpp (added)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFAddressRange.cpp Fri Feb  2
> 04:45:57 2018
> @@ -0,0 +1,26 @@
> +//===- DWARFDebugAranges.cpp ------------------------------------*- C++
> -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===------------------------------------------------------
> ----------------===//
> +
> +#include "llvm/DebugInfo/DWARF/DWARFAddressRange.h"
> +
> +#include "llvm/Support/Format.h"
> +#include "llvm/Support/raw_ostream.h"
> +
> +using namespace llvm;
> +
> +void DWARFAddressRange::dump(raw_ostream &OS, uint32_t AddressSize)
> const {
> +
> +  OS << format("[0x%*.*" PRIx64 ", ", AddressSize * 2, AddressSize * 2,
> LowPC)
> +     << format(" 0x%*.*" PRIx64 ")", AddressSize * 2, AddressSize * 2,
> HighPC);
> +}
> +
> +raw_ostream &llvm::operator<<(raw_ostream &OS, const DWARFAddressRange
> &R) {
> +  R.dump(OS, /* AddressSize */ 8);
> +  return OS;
> +}
>
> Added: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/
> DWARFDebugRnglists.cpp?rev=324078&view=auto
> ============================================================
> ==================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp (added)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp Fri Feb  2
> 04:45:57 2018
> @@ -0,0 +1,192 @@
> +//===- DWARFDebugRnglists.cpp ------------------------------
> ---------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===------------------------------------------------------
> ----------------===//
> +
> +#include "llvm/DebugInfo/DWARF/DWARFDebugRnglists.h"
> +
> +#include "llvm/BinaryFormat/Dwarf.h"
> +#include "llvm/Support/Error.h"
> +#include "llvm/Support/Format.h"
> +#include "llvm/Support/raw_ostream.h"
> +
> +using namespace llvm;
> +
> +void DWARFDebugRnglists::clear() {
> +  HeaderData = {};
> +  Offsets.clear();
> +  Ranges.clear();
> +}
> +
> +template <typename... Ts>
> +static Error createError(char const *Fmt, const Ts &... Vals) {
> +  std::string Buffer;
> +  raw_string_ostream Stream(Buffer);
> +  Stream << format(Fmt, Vals...);
> +  return make_error<StringError>(Stream.str(), inconvertibleErrorCode());
> +}
> +
> +Error DWARFDebugRnglists::extract(DWARFDataExtractor Data,
> +                                  uint32_t *OffsetPtr) {
> +  clear();
> +  uint32_t TableOffset = *OffsetPtr;
> +
> +  // Read and verify the length field.
> +  if (!Data.isValidOffsetForDataOfSize(*OffsetPtr, sizeof(uint32_t)))
> +    return createError("section is not large enough to contain a "
> +                       ".debug_rnglists table length at offset 0x%"
> PRIx32,
> +                       *OffsetPtr);
> +  // TODO: Add support for DWARF64.
> +  HeaderData.Length = Data.getU32(OffsetPtr);
> +  if (HeaderData.Length + sizeof(uint32_t) < sizeof(Header))
> +    return createError(".debug_rnglists table at offset 0x%" PRIx32
> +                       " has too small length (0x%" PRIx32
> +                       ") to contain a complete header",
> +                       TableOffset, length());
> +  uint64_t End = TableOffset + length();
> +  if (!Data.isValidOffsetForDataOfSize(TableOffset, End - TableOffset))
> +    return createError(
> +        "section is not large enough to contain a .debug_rnglists table "
> +        "of length 0x%" PRIx32 " at offset 0x%" PRIx32,
> +        length(), TableOffset);
> +
> +  HeaderData.Version = Data.getU16(OffsetPtr);
> +  HeaderData.AddrSize = Data.getU8(OffsetPtr);
> +  HeaderData.SegSize = Data.getU8(OffsetPtr);
> +  HeaderData.OffsetEntryCount = Data.getU32(OffsetPtr);
> +
> +  // Perform basic validation of the remaining header fields.
> +  if (HeaderData.Version != 5)
> +    return createError("unrecognised .debug_rnglists table version %"
> PRIu16
> +                       " in table at offset 0x%" PRIx32,
> +                       HeaderData.Version, TableOffset);
> +  if (HeaderData.AddrSize != 4 && HeaderData.AddrSize != 8)
> +    return createError(".debug_rnglists table at offset 0x%" PRIx32
> +                       " has unsupported address size %hhu",
> +                       TableOffset, HeaderData.AddrSize);
> +  if (HeaderData.SegSize != 0)
> +    return createError(".debug_rnglists table at offset 0x%" PRIx32
> +                       " has unsupported segment selector size %" PRIu8,
> +                       TableOffset, HeaderData.SegSize);
> +  if (End < TableOffset + sizeof(HeaderData) +
> +                HeaderData.OffsetEntryCount * sizeof(uint32_t))
> +    return createError(".debug_rnglists table at offset 0x%" PRIx32
> +                       " has more offset entries (%" PRIu32
> +                       ") than there is space for",
> +                       TableOffset, HeaderData.OffsetEntryCount);
> +
> +  Data.setAddressSize(HeaderData.AddrSize);
> +
> +  for (uint32_t I = 0; I < HeaderData.OffsetEntryCount; ++I)
> +    Offsets.push_back(Data.getU32(OffsetPtr));
> +
> +  DWARFAddressRangesVector CurrentRanges;
> +  while (*OffsetPtr < End) {
> +    uint8_t Encoding = Data.getU8(OffsetPtr);
> +    switch (Encoding) {
> +    case dwarf::DW_RLE_end_of_list:
> +      Ranges.insert(Ranges.end(), CurrentRanges);
> +      CurrentRanges.clear();
> +      break;
> +    // TODO: Support other encodings.
> +    case dwarf::DW_RLE_base_addressx:
> +      return createError("unsupported rnglists encoding
> DW_RLE_base_addressx "
> +                         "at offset 0x%" PRIx32,
> +                         *OffsetPtr - 1);
> +    case dwarf::DW_RLE_startx_endx:
> +      return createError("unsupported rnglists encoding
> DW_RLE_startx_endx at "
> +                         "offset 0x%" PRIx32,
> +                         *OffsetPtr - 1);
> +    case dwarf::DW_RLE_startx_length:
> +      return createError("unsupported rnglists encoding
> DW_RLE_startx_length "
> +                         "at offset 0x%" PRIx32,
> +                         *OffsetPtr - 1);
> +    case dwarf::DW_RLE_offset_pair:
> +      return createError("unsupported rnglists encoding
> DW_RLE_offset_pair at "
> +                         "offset 0x%" PRIx32,
> +                         *OffsetPtr - 1);
> +    case dwarf::DW_RLE_base_address:
> +      return createError("unsupported rnglists encoding
> DW_RLE_base_address at "
> +                         "offset 0x%" PRIx32,
> +                         *OffsetPtr - 1);
> +    case dwarf::DW_RLE_start_end: {
> +      if (End - *OffsetPtr < HeaderData.AddrSize * 2)
> +        return createError("insufficient space remaining in table for "
> +                           "DW_RLE_start_end encoding "
> +                           "at offset 0x%" PRIx32,
> +                           *OffsetPtr - 1);
> +      uint64_t Start = Data.getAddress(OffsetPtr);
> +      uint64_t End = Data.getAddress(OffsetPtr);
> +      CurrentRanges.emplace_back(Start, End);
> +      break;
> +    }
> +    case dwarf::DW_RLE_start_length: {
> +      uint32_t PreviousOffset = *OffsetPtr - 1;
> +      uint64_t Start = Data.getAddress(OffsetPtr);
> +      uint64_t Length = Data.getULEB128(OffsetPtr);
> +      if (End < *OffsetPtr)
> +        return createError("read past end of table when reading "
> +                           "DW_RLE_start_length encoding at offset 0x%"
> PRIx32,
> +                           PreviousOffset);
> +      CurrentRanges.emplace_back(Start, Start + Length);
> +      break;
> +    }
> +    default:
> +      Ranges.insert(Ranges.end(), CurrentRanges);
> +      return createError("unknown rnglists encoding 0x%" PRIx32
> +                         " at offset 0x%" PRIx32,
> +                         uint32_t(Encoding), *OffsetPtr - 1);
> +    }
> +  }
> +
> +  // If OffsetPtr does not indicate the End offset, then either the above
> loop
> +  // terminated prematurely, or we encountered a malformed encoding, but
> did not
> +  // report an error when we should have done.
> +  assert(*OffsetPtr == End &&
> +         "did not detect malformed data or loop ended unexpectedly");
> +
> +  // If CurrentRanges is not empty, we have a malformed section, because
> we did
> +  // not find a DW_RLE_end_of_list marker at the end of the last list.
> +  if (!CurrentRanges.empty())
> +    return createError(
> +        "no end of list marker detected at end of .debug_rnglists table "
> +        "starting at offset 0x%" PRIx32,
> +        TableOffset);
> +  return Error::success();
> +}
> +
> +void DWARFDebugRnglists::dump(raw_ostream &OS) const {
> +  // TODO: Add verbose printing of the raw encodings.
> +  OS << format("Range List Header: length = 0x%8.8x, version = 0x%4.4x, "
> +               "addr_size = 0x%2.2x, seg_size = 0x%2.2x,
> offset_entry_count = "
> +               "0x%8.8x\n",
> +               HeaderData.Length, HeaderData.Version, HeaderData.AddrSize,
> +               HeaderData.SegSize, HeaderData.OffsetEntryCount);
> +
> +  if (HeaderData.OffsetEntryCount > 0) {
> +    OS << "Offsets: [";
> +    for (const auto &Off : Offsets)
> +      OS << format("\n0x%8.8x", Off);
> +    OS << "\n]\n";
> +  }
> +  OS << "Ranges:\n";
> +
> +  const uint32_t HexWidth = HeaderData.AddrSize * 2;
> +  for (const auto &List : Ranges) {
> +    for (const auto &Entry : List)
> +      OS << format("[0x%*.*" PRIx64 ", 0x%*.*" PRIx64 ")\n", HexWidth,
> HexWidth,
> +                   Entry.LowPC, HexWidth, HexWidth, Entry.HighPC);
> +    OS << "<End of list>\n";
> +  }
> +}
> +
> +uint64_t DWARFDebugRnglists::length() const {
> +  if (HeaderData.Length == 0)
> +    return 0;
> +  // TODO: DWARF64 support.
> +  return HeaderData.Length + sizeof(uint32_t);
> +}
>
> Added: llvm/trunk/test/tools/llvm-dwarfdump/X86/Inputs/debug_
> rnglists_short_section.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/
> llvm-dwarfdump/X86/Inputs/debug_rnglists_short_section.
> s?rev=324078&view=auto
> ============================================================
> ==================
> --- llvm/trunk/test/tools/llvm-dwarfdump/X86/Inputs/debug_rnglists_short_section.s
> (added)
> +++ llvm/trunk/test/tools/llvm-dwarfdump/X86/Inputs/debug_rnglists_short_section.s
> Fri Feb  2 04:45:57 2018
> @@ -0,0 +1,2 @@
> +.section .debug_rnglists,"", at progbits
> +.byte 3, 0, 0 # Short section
>
> Added: llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/
> llvm-dwarfdump/X86/debug_rnglists.s?rev=324078&view=auto
> ============================================================
> ==================
> --- llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists.s (added)
> +++ llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists.s Fri Feb  2
> 04:45:57 2018
> @@ -0,0 +1,147 @@
> +# RUN: llvm-mc %s -filetype obj -triple x86_64-pc-linux -o - | \
> +# RUN: llvm-dwarfdump --debug-rnglists - 2> %t.err | FileCheck %s
> +# RUN: FileCheck %s --input-file %t.err --check-prefix=ERR
> +
> +# CHECK: .debug_rnglists contents:
> +# CHECK-NEXT: Range List Header: length = 0x0000003f, version = 0x0005,
> addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000002
> +# CHECK-NEXT: Offsets: [
> +# CHECK-NEXT:    0x00000008
> +# CHECK-NEXT:    0x0000002b
> +# CHECK-NEXT: ]
> +# CHECK-NEXT: Ranges:
> +# CHECK-NEXT: [0x0000000000000010, 0x0000000000000020)
> +# CHECK-NEXT: [0x0000000000000025, 0x00000000000000a5)
> +# CHECK-NEXT: <End of list>
> +# CHECK-NEXT: [0x0000000000000100, 0x0000000000000200)
> +# CHECK-NEXT: <End of list>
> +# CHECK-NEXT: Range List Header: length = 0x0000001b, version = 0x0005,
> addr_size = 0x04, seg_size = 0x00, offset_entry_count = 0x00000000
> +# CHECK-NEXT: Ranges:
> +# CHECK-NEXT: [0x00000000, 0x00000000)
> +# CHECK-NEXT: [0x00000002, 0x00000006)
> +# CHECK-NEXT: <End of list>
> +# CHECK-NEXT: Range List Header: length = 0x00000008, version = 0x0005,
> addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
> +# CHECK-NOT: Offsets:
> +# CHECK: Ranges:
> +# CHECK-NOT: [
> +# CHECK-NOT: Range List Header:
> +
> +# ERR-NOT:  error:
> +# ERR:      error: unsupported rnglists encoding DW_RLE_base_addressx at
> offset 0x7a
> +# ERR-NEXT: error: unsupported rnglists encoding DW_RLE_startx_endx at
> offset 0x89
> +# ERR-NEXT: error: unsupported rnglists encoding DW_RLE_startx_length at
> offset 0x99
> +# ERR-NEXT: error: unsupported rnglists encoding DW_RLE_offset_pair at
> offset 0xa9
> +# ERR-NEXT: error: unsupported rnglists encoding DW_RLE_base_address at
> offset 0xb9
> +# ERR-NOT:  error:
> +
> +.section .debug_rnglists,"", at progbits
> +
> +# First table (tests DW_RLE_end_of_list, start_end, and start_length
> encodings)
> +.long 63 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 2  # Offset entry count
> +
> +# Offset array
> +.long 8  # Offset Entry 0
> +.long 43 # Offset Entry 1
> +
> +# First range list
> +.byte 6          # DW_RLE_start_end
> +.quad 0x10, 0x20   # Start, end address
> +.byte 7          # DW_RLE_start_length
> +.quad 0x25         # Start address
> +.byte 0x80, 0x01   # Length
> +.byte 0          # DW_RLE_end_of_list
> +
> +# Second range list
> +.byte 6          # DW_RLE_start_end
> +.quad 0x100, 0x200 # Start, end address
> +.byte 0          # DW_RLE_end_of_list
> +
> +# Second table (shows support for size 4 addresses)
> +.long 27 # Table length
> +.short 5 # Version
> +.byte 4  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 6          # DW_RLE_start_end
> +.long 0, 0         # Start, end address
> +.byte 6          # DW_RLE_start_end
> +.long 0x2, 0x6     # Start, end address
> +.byte 0          # DW_RLE_end_of_list
> +
> +# Third (empty) table
> +.long 8  # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# The following entries are for encodings unsupported at the time of
> writing.
> +# The test should be updated as these encodings are supported.
> +
> +# Fourth table (testing DW_RLE_base_addressx)
> +.long 11 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 1          # DW_RLE_base_addressx
> +.byte 0            # Base address (index 0 in .debug_addr)
> +.byte 0          # DW_RLE_end_of_list
> +
> +# Fifth table (testing DW_RLE_startx_endx)
> +.long 12 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 2          # DW_RLE_startx_endx
> +.byte 1            # Start address (index in .debug_addr)
> +.byte 10           # End address (index in .debug_addr)
> +.byte 0          # DW_RLE_end_of_list
> +
> +# Sixth table (testing DW_RLE_startx_length)
> +.long 12 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 3          # DW_RLE_startx_length
> +.byte 2            # Start address (index in .debug_addr)
> +.byte 42           # Length
> +.byte 0          # DW_RLE_end_of_list
> +
> +# Seventh table (testing DW_RLE_offset_pair)
> +.long 12 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 4          # DW_RLE_offset_pair
> +.byte 3            # Start offset (index in .debug_addr)
> +.byte 19           # End offset (index in .debug_addr)
> +.byte 0          # DW_RLE_end_of_list
> +
> +# Eigth table (testing DW_RLE_base_address)
> +.long 18 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 5          # DW_RLE_base_address
> +.quad 0x1000       # Base address
> +.byte 0          # DW_RLE_end_of_list
>
> Added: llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists_empty.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/
> llvm-dwarfdump/X86/debug_rnglists_empty.s?rev=324078&view=auto
> ============================================================
> ==================
> --- llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists_empty.s
> (added)
> +++ llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists_empty.s Fri
> Feb  2 04:45:57 2018
> @@ -0,0 +1,7 @@
> +# RUN: llvm-mc %s -filetype obj -triple x86_64-pc-linux -o - | \
> +# RUN: llvm-dwarfdump --debug-rnglists - | FileCheck %s
> +# CHECK: .debug_rnglists contents:
> +# CHECK-NOT: Range List Header:
> +# CHECK-NOT: error:
> +
> +.section .debug_rnglists,"", at progbits
>
> Added: llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists_invalid.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/
> llvm-dwarfdump/X86/debug_rnglists_invalid.s?rev=324078&view=auto
> ============================================================
> ==================
> --- llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists_invalid.s
> (added)
> +++ llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists_invalid.s Fri
> Feb  2 04:45:57 2018
> @@ -0,0 +1,161 @@
> +# RUN: llvm-mc %S/Inputs/debug_rnglists_short_section.s -filetype obj
> -triple x86_64-pc-linux -o - | \
> +# RUN: llvm-dwarfdump --debug-rnglists - 2>&1 | FileCheck %s
> --check-prefix=SHORT
> +# SHORT-NOT: error:
> +# SHORT-NOT: Range List Header
> +# SHORT: error: section is not large enough to contain a .debug_rnglists
> table length at offset 0
> +# SHORT-NOT: Range List Header
> +# SHORT-NOT: error:
> +
> +# RUN: llvm-mc %s -filetype obj -triple x86_64-pc-linux -o - | \
> +# RUN: llvm-dwarfdump --debug-rnglists - 2> %t.err | FileCheck %s
> --check-prefix=GOOD
> +# RUN: FileCheck %s --input-file %t.err
> +
> +# GOOD: .debug_rnglists contents:
> +# GOOD-NEXT: Range List Header: length = 0x0000001e, version = 0x0005,
> addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000001
> +# GOOD-NEXT: Offsets: [
> +# GOOD-NEXT:    0x00000004
> +# GOOD-NEXT: ]
> +# GOOD-NEXT: Ranges:
> +# GOOD-NEXT: [0x0000000000000010, 0x0000000000000020)
> +# GOOD-NEXT: <End of list>
> +# GOOD-NEXT: Range List Header: length = 0x0000001a, version = 0x0005,
> addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
> +# GOOD-NEXT: Ranges:
> +# GOOD-NEXT: [0x0000000000000030, 0x0000000000000040)
> +# GOOD-NEXT: <End of list>
> +# GOOD-NOT:  Range List Header
> +
> +# CHECK-NOT: error:
> +# CHECK: error: .debug_rnglists table at offset 0x22 has too small length
> (0xb) to contain a complete header
> +# CHECK-NEXT: error: unrecognised .debug_rnglists table version 4 in
> table at offset 0x2d
> +# CHECK-NEXT: error: .debug_rnglists table at offset 0x39 has unsupported
> address size 2
> +# CHECK-NEXT: error: .debug_rnglists table at offset 0x45 has unsupported
> segment selector size 4
> +# CHECK-NEXT: error: .debug_rnglists table at offset 0x51 has more offset
> entries (12345678) than there is space for
> +# CHECK-NEXT: error: insufficient space remaining in table for
> DW_RLE_start_end encoding at offset 0x69
> +# CHECK-NEXT: error: read past end of table when reading
> DW_RLE_start_length encoding at offset 0x82
> +# CHECK-NEXT: error: unknown rnglists encoding 0x2a at offset 0x98
> +# CHECK-NEXT: error: no end of list marker detected at end of
> .debug_rnglists table starting at offset 0xaa
> +# CHECK-NEXT: error: section is not large enough to contain a
> .debug_rnglists table of length 0x1f at offset 0xe5
> +# CHECK-NOT: error:
> +
> +.section .debug_rnglists,"", at progbits
> +
> +# Table 1 (good)
> +.long 30 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 1  # Offset entry count
> +
> +# Offsets
> +.long 4
> +
> +# First range list
> +.byte 6         # DW_RLE_start_length
> +.quad 0x10, 0x20   # Encoding payload
> +.byte 0         # DW_RLE_end_of_list
> +
> +# Table 2 (length too small for header)
> +.long 7  # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.byte 0, 0, 0  # Truncated offset entry count
> +
> +# Table 3 (unknown version)
> +.long 8  # Table length
> +.short 4 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# Table 4 (unsupported address size)
> +.long 8  # Table length
> +.short 5 # Version
> +.byte 2  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# Table 5 (unsupported segment selector size)
> +.long 8  # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 4  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# Table 6 (bad offset entry count)
> +.long 8  # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 12345678  # Offset entry count
> +
> +# Table 7 (malformed DW_RLE_start_end)
> +.long 21 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 6          # DW_RLE_start_end
> +.quad 1            # Start address
> +.long 4            # Truncated end address
> +
> +# Table 8 (malformed DW_RLE_start_length)
> +.long 18 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 7          # DW_RLE_start_length
> +.quad 1            # Start address
> +.byte 0xFF         # Length - invalid ULEB, so will continue reading past
> the end
> +
> +# Table 9 (unknown encoding)
> +.long 26 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 42         # Unknown encoding
> +.quad 0x10, 0x20   # Encoding payload
> +.byte 0          # DW_RLE_end_of_list
> +
> +# Table 10 (missing end of list marker)
> +.long 25 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 6         # DW_RLE_start_length
> +.quad 0x10, 0x20   # Encoding payload
> +
> +# Table 11 (good)
> +.long 26 # Table length
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 6         # DW_RLE_start_length
> +.quad 0x30, 0x40   # Encoding payload
> +.byte 0         # DW_RLE_end_of_list
> +
> +# Table 12 (length too long)
> +.long 27 # Table length - 1 greater than actual contents
> +.short 5 # Version
> +.byte 8  # Address size
> +.byte 0  # Segment selector size
> +.long 0  # Offset entry count
> +
> +# First range list
> +.byte 6          # DW_RLE_start_end
> +.quad 1, 2         # Start, end address
> +.byte 0          # DW_RLE_end_of_list
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180205/d57090e6/attachment.html>


More information about the llvm-commits mailing list