[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