[llvm] r222003 - Reapply "[dwarfdump] Add support for dumping accelerator tables."

Frédéric Riss friss at apple.com
Thu Nov 20 09:00:47 PST 2014


I addressed you feedback in r222435 and r222436.

Thanks!

> On Nov 19, 2014, at 11:48 PM, Frédéric Riss <friss at apple.com> wrote:
> 
>> 
>> On Nov 19, 2014, at 10:16 PM, Alexey Samsonov <vonosmas at gmail.com <mailto:vonosmas at gmail.com>> wrote:
>> 
>> Nothing critical, just a few comments as I skimmed through the code.
>> 
>> Is it OK that new files (DWARFAcceleratorTable.(h|cpp)) are missing LLVM copyright headers?
> 
> I suppose it’s not! Thanks for the catch.
> 
>> On Fri, Nov 14, 2014 at 8:15 AM, Frederic Riss <friss at apple.com <mailto:friss at apple.com>> wrote:
>> Author: friss
>> Date: Fri Nov 14 10:15:53 2014
>> New Revision: 222003
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=222003&view=rev <http://llvm.org/viewvc/llvm-project?rev=222003&view=rev>
>> Log:
>> Reapply "[dwarfdump] Add support for dumping accelerator tables."
>> 
>> This reverts commit r221842 which was a revert of r221836 and of the
>> test parts of r221837.
>> 
>> This new version fixes an UB bug pointed out by David (along with
>> addressing some other review comments), makes some dumping more
>> resilient to broken input data and forces the accelerator tables
>> to be dumped in the tests where we use them (this decision is
>> platform specific otherwise).
>> 
>> Added:
>>     llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.cpp
>>     llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.h
>>     llvm/trunk/test/DebugInfo/dwarfdump-accel.test
>> Modified:
>>     llvm/trunk/include/llvm/DebugInfo/DIContext.h
>>     llvm/trunk/lib/DebugInfo/CMakeLists.txt
>>     llvm/trunk/lib/DebugInfo/DWARFContext.cpp
>>     llvm/trunk/lib/DebugInfo/DWARFContext.h
>>     llvm/trunk/test/DebugInfo/Inputs/gmlt.ll
>>     llvm/trunk/test/DebugInfo/cross-cu-inlining.ll
>>     llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
>> 
>> Modified: llvm/trunk/include/llvm/DebugInfo/DIContext.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DIContext.h?rev=222003&r1=222002&r2=222003&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DIContext.h?rev=222003&r1=222002&r2=222003&view=diff>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/DebugInfo/DIContext.h (original)
>> +++ llvm/trunk/include/llvm/DebugInfo/DIContext.h Fri Nov 14 10:15:53 2014
>> @@ -107,7 +107,11 @@ enum DIDumpType {
>>    DIDT_GnuPubtypes,
>>    DIDT_Str,
>>    DIDT_StrDwo,
>> -  DIDT_StrOffsetsDwo
>> +  DIDT_StrOffsetsDwo,
>> +  DIDT_AppleNames,
>> +  DIDT_AppleTypes,
>> +  DIDT_AppleNamespaces,
>> +  DIDT_AppleObjC
>>  };
>> 
>>  // In place of applying the relocations to the data we've read from disk we use
>> 
>> Modified: llvm/trunk/lib/DebugInfo/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CMakeLists.txt?rev=222003&r1=222002&r2=222003&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CMakeLists.txt?rev=222003&r1=222002&r2=222003&view=diff>
>> ==============================================================================
>> --- llvm/trunk/lib/DebugInfo/CMakeLists.txt (original)
>> +++ llvm/trunk/lib/DebugInfo/CMakeLists.txt Fri Nov 14 10:15:53 2014
>> @@ -1,6 +1,7 @@
>>  add_llvm_library(LLVMDebugInfo
>>    DIContext.cpp
>>    DWARFAbbreviationDeclaration.cpp
>> +  DWARFAcceleratorTable.cpp
>>    DWARFCompileUnit.cpp
>>    DWARFContext.cpp
>>    DWARFDebugAbbrev.cpp
>> 
>> Added: llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.cpp?rev=222003&view=auto <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.cpp?rev=222003&view=auto>
>> ==============================================================================
>> --- llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.cpp (added)
>> +++ llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.cpp Fri Nov 14 10:15:53 2014
>> @@ -0,0 +1,116 @@
>> +#include "DWARFAcceleratorTable.h"
>> +
>> +#include "llvm/Support/Dwarf.h"
>> +#include "llvm/Support/Format.h"
>> +#include "llvm/Support/raw_ostream.h"
>> +
>> +namespace llvm {
>> +
>> +bool DWARFAcceleratorTable::extract() {
>> +  uint32_t Offset = 0;
>> +
>> +  // Check that we can at least read the header.
>> +  if (!AccelSection.isValidOffset(offsetof(Header, HeaderDataLength)+4))
>> +    return false;
>> +
>> +  Hdr.Magic = AccelSection.getU32(&Offset);
>> +  Hdr.Version = AccelSection.getU16(&Offset);
>> +  Hdr.HashFunction = AccelSection.getU16(&Offset);
>> +  Hdr.NumBuckets = AccelSection.getU32(&Offset);
>> +  Hdr.NumHashes = AccelSection.getU32(&Offset);
>> +  Hdr.HeaderDataLength = AccelSection.getU32(&Offset);
>> +
>> +  // Check that we can read all the hashes and offsets from the
>> +  // section (see SourceLevelDebugging.rst for the structure of the index).
>> +  if (!AccelSection.isValidOffset(sizeof(Hdr) + Hdr.HeaderDataLength +
>> +                                  Hdr.NumBuckets*4 + Hdr.NumHashes*8))
>> +    return false;
>> +
>> +  HdrData.DIEOffsetBase = AccelSection.getU32(&Offset);
>> +  uint32_t NumAtoms = AccelSection.getU32(&Offset);
>> +
>> +  for (unsigned i = 0; i < NumAtoms; ++i) {
>> +    uint16_t AtomType = AccelSection.getU16(&Offset);
>> +    DWARFFormValue AtomForm(AccelSection.getU16(&Offset));
>> +    HdrData.Atoms.push_back(std::make_pair(AtomType, AtomForm));
>> +  }
>> +
>> +  return true;
>> +}
>> +
>> +void DWARFAcceleratorTable::dump(raw_ostream &OS) {
>> +  // Dump the header.
>> +  OS << "Magic = " << format("0x%08x", Hdr.Magic) << '\n'
>> +     << "Version = " << format("0x%04x", Hdr.Version) << '\n'
>> +     << "Hash function = " << format("0x%08x", Hdr.HashFunction) << '\n'
>> +     << "Bucket count = " << Hdr.NumBuckets << '\n'
>> +     << "Hashes count = " << Hdr.NumHashes << '\n'
>> +     << "HeaderData length = " << Hdr.HeaderDataLength << '\n'
>> +     << "DIE offset base = " << HdrData.DIEOffsetBase << '\n'
>> +     << "Number of atoms = " << HdrData.Atoms.size() << '\n';
>> +
>> +  unsigned i = 0;
>> +  for (const auto &Atom: HdrData.Atoms) {
>> +    OS << format("Atom[%d] Type: ", i++);
>> +    if (const char *TypeString = dwarf::AtomTypeString(Atom.first))
>> +      OS << TypeString;
>> +    else
>> +      OS << format("DW_ATOM_Unknown_0x%x", Atom.first);
>> +    OS << " Form: ";
>> +    if (const char *FormString = dwarf::FormEncodingString(Atom.second.getForm()))
>> +      OS << FormString;
>> +    else
>> +      OS << format("DW_FORM_Unknown_0x%x", Atom.second.getForm());
>> +    OS << '\n';
>> +  }
>> +
>> +  // Now go through the actual tables and dump them.
>> +  uint32_t Offset = sizeof(Hdr) + Hdr.HeaderDataLength;
>> +  unsigned HashesBase = Offset + Hdr.NumBuckets * 4;
>> +  unsigned OffsetsBase = HashesBase + Hdr.NumHashes * 4;
>> +
>> +  for (unsigned Bucket = 0; Bucket < Hdr.NumBuckets; ++Bucket) {
>> +    unsigned Index = AccelSection.getU32(&Offset);
>> +
>> +    OS << format("Bucket[%d]\n", Bucket);
>> +    if (Index == UINT32_MAX) {
>> +      OS << "  EMPTY\n";
>> +      continue;
>> +    }
>> +
>> +    for (unsigned HashIdx = Index; HashIdx < Hdr.NumHashes; ++HashIdx) {
>> +      unsigned HashOffset = HashesBase + HashIdx*4;
>> +      unsigned OffsetsOffset = OffsetsBase + HashIdx*4;
>> +      uint32_t Hash = AccelSection.getU32(&HashOffset);
>> +
>> +      if (Hash % Hdr.NumBuckets != Bucket)
>> +        break;
>> +
>> +      unsigned DataOffset = AccelSection.getU32(&OffsetsOffset);
>> +      OS << format("  Hash = 0x%08x Offset = 0x%08x\n", Hash, DataOffset);
>> +      if (!AccelSection.isValidOffset(DataOffset)) {
>> +        OS << "    Invalid section offset\n";
>> +        continue;
>> +      }
>> +      while (unsigned StringOffset = AccelSection.getU32(&DataOffset)) {
>> +        OS << format("    Name: %08x \"%s\"\n", StringOffset,
>> +                     StringSection.getCStr(&StringOffset));
>> +        unsigned NumData = AccelSection.getU32(&DataOffset);
>> +        for (unsigned Data = 0; Data < NumData; ++Data) {
>> +          OS << format("    Data[%d] => ", Data);
>> +          unsigned i = 0;
>> +          for (auto &Atom : HdrData.Atoms) {
>> +            OS << format("{Atom[%d]: ", i++);
>> +            if (Atom.second.extractValue(AccelSection, &DataOffset, nullptr))
>> +              Atom.second.dump(OS, nullptr);
>> +            else
>> +              OS << "Error extracting the value";
>> +            OS << "} ";
>> +          }
>> +          OS << '\n';
>> +        }
>> +      }
>> +    }
>> +  }
>> +}
>> +}
>> 
>> Added: llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.h?rev=222003&view=auto <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.h?rev=222003&view=auto>
>> ==============================================================================
>> --- llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.h (added)
>> +++ llvm/trunk/lib/DebugInfo/DWARFAcceleratorTable.h Fri Nov 14 10:15:53 2014
>> @@ -0,0 +1,38 @@
>> +
>> +#include "llvm/ADT/SmallVector.h"
>> +#include "llvm/DebugInfo/DWARFFormValue.h"
>> +
>> +#include <cstdint>
>> +
>> +namespace llvm {
>> +
>> +class DWARFAcceleratorTable {
>> +
>> +  struct Header {
>> +    uint32_t Magic;
>> +    uint16_t Version;
>> +    uint16_t HashFunction;
>> +    uint32_t NumBuckets;
>> +    uint32_t NumHashes;
>> +    uint32_t HeaderDataLength;
>> +  };
>> +
>> +  struct HeaderData {
>> +    typedef uint16_t AtomType;
>> +    uint32_t DIEOffsetBase;
>> +    SmallVector<std::pair<AtomType, DWARFFormValue>, 1> Atoms;
>> +  };
>> +
>> +  struct Header Hdr;
>> +  struct HeaderData HdrData;
>> +  DataExtractor AccelSection;
>> +  DataExtractor StringSection;
>> +public:
>> +  DWARFAcceleratorTable(DataExtractor AccelSection, DataExtractor StringSection)
>> +    : AccelSection(AccelSection), StringSection(StringSection) {}
>> +
>> +  bool extract();
>> +  void dump(raw_ostream &OS);
>> ^^
>> IMO it would be clearer if you make dump() method const,
>> and don't overwrite HdrData.Atoms there (that's somewhat weird, header data just
>> specifies the forms of the atoms), so you need the instances of DWARFFormValue
>> that you would extract only in the dump() method, not as class members.
> 
> I did it to avoid creating the same DWARFFormValue objects over and over. I suppose that creating one of those is cheap enough that it doesn’t matter though...
> 
>>  
>> +};
>> +
>> +}
>> 
>> Modified: llvm/trunk/lib/DebugInfo/DWARFContext.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFContext.cpp?rev=222003&r1=222002&r2=222003&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFContext.cpp?rev=222003&r1=222002&r2=222003&view=diff>
>> ==============================================================================
>> --- llvm/trunk/lib/DebugInfo/DWARFContext.cpp (original)
>> +++ llvm/trunk/lib/DebugInfo/DWARFContext.cpp Fri Nov 14 10:15:53 2014
>> @@ -9,6 +9,7 @@
>> 
>>  #include "DWARFContext.h"
>>  #include "DWARFDebugArangeSet.h"
>> +#include "DWARFAcceleratorTable.h"
>> 
>>  #include "llvm/ADT/SmallString.h"
>>  #include "llvm/ADT/StringSwitch.h"
>> @@ -59,6 +60,17 @@ static void dumpPubSection(raw_ostream &
>>    }
>>  }
>> 
>> +static void dumpAccelSection(raw_ostream &OS, StringRef Name, StringRef Data,
>> +                             StringRef StringSection, bool LittleEndian) {
>> +  DataExtractor AccelSection(Data, LittleEndian, 0);
>> +  DataExtractor StrData(StringSection, LittleEndian, 0);
>> +  OS << "\n." << Name << " contents:\n";
>> +  DWARFAcceleratorTable Accel(AccelSection, StrData);
>> +  if (!Accel.extract())
>> +    return;
>> +  Accel.dump(OS);
>> +}
>> +
>>  void DWARFContext::dump(raw_ostream &OS, DIDumpType DumpType) {
>>    if (DumpType == DIDT_All || DumpType == DIDT_Abbrev) {
>>      OS << ".debug_abbrev contents:\n";
>> @@ -218,6 +230,22 @@ void DWARFContext::dump(raw_ostream &OS,
>>        OS << format("%8.8x\n", strOffsetExt.getU32(&offset));
>>      }
>>    }
>> +
>> +  if (DumpType == DIDT_All || DumpType == DIDT_AppleNames)
>> +    dumpAccelSection(OS, "apple_names", getAppleNamesSection(),
>> +                     getStringSection(), isLittleEndian());
>> 
>> I find it weird that you don't include leading dot (".") in the section name,
>> but we're doing the same for pubSections for some reason…
> 
> This is done for every section because leading ‘.’ and ‘_’ are removed some that they can be handled in a platform independent way (mach-o uses ‘_’).
> 
>> +
>> +  if (DumpType == DIDT_All || DumpType == DIDT_AppleTypes)
>> +    dumpAccelSection(OS, "apple_types", getAppleTypesSection(),
>> +                     getStringSection(), isLittleEndian());
>> +
>> +  if (DumpType == DIDT_All || DumpType == DIDT_AppleNamespaces)
>> +    dumpAccelSection(OS, "apple_namespaces", getAppleNamespacesSection(),
>> +                     getStringSection(), isLittleEndian());
>> +
>> +  if (DumpType == DIDT_All || DumpType == DIDT_AppleObjC)
>> +    dumpAccelSection(OS, "apple_objc", getAppleObjCSection(),
>> +                     getStringSection(), isLittleEndian());
>>  }
>> 
>>  const DWARFDebugAbbrev *DWARFContext::getDebugAbbrev() {
>> @@ -565,6 +593,11 @@ DWARFContextInMemory::DWARFContextInMemo
>>              .Case("debug_str.dwo", &StringDWOSection)
>>              .Case("debug_str_offsets.dwo", &StringOffsetDWOSection)
>>              .Case("debug_addr", &AddrSection)
>> +            .Case("apple_names", &AppleNamesSection)
>> +            .Case("apple_types", &AppleTypesSection)
>> +            .Case("apple_namespaces", &AppleNamespacesSection)
>> +            .Case("apple_namespac", &AppleNamespacesSection)
>> ^^
>> Just checking, is apple_namespac a legacy name of the section?
>> Googling it doesn't produce any results.
> 
> The short version is the one used on mach-o systems where the section names are limited in length. This makes me think that we must not be able to dump gnu_pub{types,names} on these systems, because the names are truncated also.
> 
>> +            .Case("apple_objc", &AppleObjCSection)
>>              // Any more debug info sections go here.
>>              .Default(nullptr);
>>      if (SectionData) {
>> 
>> Modified: llvm/trunk/lib/DebugInfo/DWARFContext.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFContext.h?rev=222003&r1=222002&r2=222003&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFContext.h?rev=222003&r1=222002&r2=222003&view=diff>
>> ==============================================================================
>> --- llvm/trunk/lib/DebugInfo/DWARFContext.h (original)
>> +++ llvm/trunk/lib/DebugInfo/DWARFContext.h Fri Nov 14 10:15:53 2014
>> @@ -192,6 +192,10 @@ public:
>>    virtual StringRef getStringOffsetDWOSection() = 0;
>>    virtual StringRef getRangeDWOSection() = 0;
>>    virtual StringRef getAddrSection() = 0;
>> +  virtual StringRef getAppleNamesSection() = 0;
>> +  virtual StringRef getAppleTypesSection() = 0;
>> +  virtual StringRef getAppleNamespacesSection() = 0;
>> +  virtual StringRef getAppleObjCSection() = 0;
>> 
>>    static bool isSupportedVersion(unsigned version) {
>>      return version == 2 || version == 3 || version == 4;
>> @@ -236,6 +240,10 @@ class DWARFContextInMemory : public DWAR
>>    StringRef StringOffsetDWOSection;
>>    StringRef RangeDWOSection;
>>    StringRef AddrSection;
>> +  StringRef AppleNamesSection;
>> +  StringRef AppleTypesSection;
>> +  StringRef AppleNamespacesSection;
>> +  StringRef AppleObjCSection;
>> 
>>    SmallVector<SmallString<32>, 4> UncompressedSections;
>> 
>> @@ -256,6 +264,10 @@ public:
>>    StringRef getPubTypesSection() override { return PubTypesSection; }
>>    StringRef getGnuPubNamesSection() override { return GnuPubNamesSection; }
>>    StringRef getGnuPubTypesSection() override { return GnuPubTypesSection; }
>> +  StringRef getAppleNamesSection() override { return AppleNamesSection; }
>> +  StringRef getAppleTypesSection() override { return AppleTypesSection; }
>> +  StringRef getAppleNamespacesSection() override { return AppleNamespacesSection; }
>> +  StringRef getAppleObjCSection() override { return AppleObjCSection; }
>> 
>>    // Sections for DWARF5 split dwarf proposal.
>>    const DWARFSection &getInfoDWOSection() override { return InfoDWOSection; }
>> 
>> Modified: llvm/trunk/test/DebugInfo/Inputs/gmlt.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Inputs/gmlt.ll?rev=222003&r1=222002&r2=222003&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Inputs/gmlt.ll?rev=222003&r1=222002&r2=222003&view=diff>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/Inputs/gmlt.ll (original)
>> +++ llvm/trunk/test/DebugInfo/Inputs/gmlt.ll Fri Nov 14 10:15:53 2014
>> @@ -95,6 +95,8 @@
>>  ; CHECK: .debug_pubtypes contents:
>>  ; CHECK-NOT: Offset
>> 
>> +; CHECK: .apple{{.*}} contents:
>> +
>>  ; Function Attrs: nounwind uwtable
>>  define void @_Z2f1v() #0 {
>>  entry:
>> 
>> Modified: llvm/trunk/test/DebugInfo/cross-cu-inlining.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/cross-cu-inlining.ll?rev=222003&r1=222002&r2=222003&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/cross-cu-inlining.ll?rev=222003&r1=222002&r2=222003&view=diff>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/cross-cu-inlining.ll (original)
>> +++ llvm/trunk/test/DebugInfo/cross-cu-inlining.ll Fri Nov 14 10:15:53 2014
>> @@ -1,6 +1,7 @@
>>  ; REQUIRES: object-emission
>> 
>>  ; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck -implicit-check-not=DW_TAG %s
>> +; RUN: %llc_dwarf -dwarf-accel-tables=Enable -O0 -filetype=obj < %s | llvm-dwarfdump - | FileCheck --check-prefix=CHECK-ACCEL --check-prefix=CHECK %s
>> 
>>  ; Build from source:
>>  ; $ clang++ a.cpp b.cpp -g -c -emit-llvm
>> @@ -52,6 +53,16 @@
>>  ; CHECK:     DW_AT_location
>>  ; CHECK:     DW_AT_abstract_origin {{.*}} {0x[[ABS_VAR]]} "x"
>> 
>> +; Check that both the inline and the non out of line version of func are
>> +; correctly referenced in the accelerator table. Before r221837, the one
>> +; in the second compilation unit had a wrong offset
>> +; CHECK-ACCEL: .apple_names contents:
>> +; CHECK-ACCEL: Name{{.*}}"func"
>> +; CHECK-ACCEL-NOT: Name
>> +; CHECK-ACCEL: Atom[0]{{.*}}[[INLINED]]
>> +; CHECK-ACCEL-NOT: Name
>> +; CHECK-ACCEL: Atom[0]{{.*}}[[FUNC]]
>> +
>>  @i = external global i32
>> 
>>  ; Function Attrs: uwtable
>> 
>> Added: llvm/trunk/test/DebugInfo/dwarfdump-accel.test
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/dwarfdump-accel.test?rev=222003&view=auto <http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/dwarfdump-accel.test?rev=222003&view=auto>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/dwarfdump-accel.test (added)
>> +++ llvm/trunk/test/DebugInfo/dwarfdump-accel.test Fri Nov 14 10:15:53 2014
>> @@ -0,0 +1,63 @@
>> +RUN: llvm-dwarfdump %p/Inputs/dwarfdump-objc.x86_64.o | FileCheck %s
>> +
>> +Gather some DIE indexes to verify the accelerator table contents.
>> +CHECK: .debug_info contents
>> +CHECK: [[TESTINTERFACE:0x[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
>> +CHECK-NOT: DW_TAG
>> +CHECK:     DW_AT_name{{.*}}"TestInterface"
>> +CHECK: [[READONLY:0x[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
>> +CHECK-NOT: DW_TAG
>> +CHECK:     DW_AT_name{{.*}}"-[TestInterface ReadOnly]"
>> +CHECK: [[ASSIGN:0x[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
>> +CHECK-NOT: DW_TAG
>> +CHECK:     DW_AT_name{{.*}}"-[TestInterface Assign]"
>> +CHECK: [[SETASSIGN:0x[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
>> +CHECK-NOT: DW_TAG
>> +CHECK:     DW_AT_name{{.*}}"-[TestInterface setAssign:]"
>> +
>> +
>> +Check that the section header is printed correclty.
>> +CHECK: .apple_names contents:
>> +CHECK: Magic = 0x48415348
>> +CHECK: Version = 0x0001
>> +CHECK: Hash function = 0x00000000
>> +CHECK: Bucket count = 11
>> +CHECK: Hashes count = 22
>> +CHECK: HeaderData length = 12
>> +CHECK: DIE offset base = 0
>> +CHECK: Number of atoms = 1
>> +CHECK: Atom[0]  Type: DW_ATOM_die_offset Form: DW_FORM_data4
>> +
>> +Check that empty buckets are handled correctly.
>> +CHECK: Bucket[2]
>> +CHECK:   EMPTY
>> +CHECK: Bucket[3]
>> +
>> +Check that the accelerators point to the right DIEs.
>> +CHECK:     Name:{{.*}}"-[TestInterface ReadOnly]"
>> +CHECK-NOT: Name
>> +CHECK:     {Atom[0]: [[READONLY]]}
>> +CHECK:     Name:{{.*}}"-[TestInterface setAssign:]"
>> +CHECK-NOT: Name
>> +CHECK:     {Atom[0]: [[SETASSIGN]]}
>> +CHECK:     Name:{{.*}}"-[TestInterface Assign]"
>> +CHECK-NOT: Name
>> +CHECK:     {Atom[0]: [[ASSIGN]]}
>> +
>> +Check that types are referenced correctly.
>> +CHECK: .apple_types contents:
>> +CHECK:     Name{{.*}}"TestInterface"
>> +CHECK-NOT: Name
>> +CHECK:     {Atom[0]: [[TESTINTERFACE]]}
>> +
>> +Check that an empty ecceleratorsection is handled correctly.
>> +CHECK: .apple_namespaces contents:
>> +CHECK-NOT: Magic
>> +
>> +Check ObjC specific accelerators.
>> +CHECK: .apple_objc contents:
>> +CHECK:     Name{{.*}}"TestInterface"
>> +CHECK-NOT Name
>> +CHECK:     {Atom[0]: [[READONLY]]}
>> +CHECK:     {Atom[0]: [[ASSIGN]]}
>> +CHECK:     {Atom[0]: [[SETASSIGN]]}
>> 
>> Modified: llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp?rev=222003&r1=222002&r2=222003&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp?rev=222003&r1=222002&r2=222003&view=diff>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp (original)
>> +++ llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp Fri Nov 14 10:15:53 2014
>> @@ -45,6 +45,10 @@ DumpType("debug-dump", cl::init(DIDT_All
>>          clEnumValN(DIDT_All, "all", "Dump all debug sections"),
>>          clEnumValN(DIDT_Abbrev, "abbrev", ".debug_abbrev"),
>>          clEnumValN(DIDT_AbbrevDwo, "abbrev.dwo", ".debug_abbrev.dwo"),
>> +        clEnumValN(DIDT_AppleNames, "apple_names", ".apple_names"),
>> +        clEnumValN(DIDT_AppleTypes, "apple_types", ".apple_types"),
>> +        clEnumValN(DIDT_AppleNamespaces, "apple_namespaces", ".apple_namespaces"),
>> +        clEnumValN(DIDT_AppleObjC, "apple_objc", ".apple_objc"),
>>          clEnumValN(DIDT_Aranges, "aranges", ".debug_aranges"),
>>          clEnumValN(DIDT_Info, "info", ".debug_info"),
>>          clEnumValN(DIDT_InfoDwo, "info.dwo", ".debug_info.dwo"),
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>> 
>> 
>> 
>> -- 
>> Alexey Samsonov
>> vonosmas at gmail.com <mailto:vonosmas at gmail.com>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141120/3c1131c1/attachment.html>


More information about the llvm-commits mailing list