[llvm] r222003 - Reapply "[dwarfdump] Add support for dumping accelerator tables."
David Blaikie
dblaikie at gmail.com
Fri Nov 14 10:20:04 PST 2014
On Fri, Nov 14, 2014 at 8:15 AM, Frederic Riss <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
> 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).
>
Was confused for a sec here - the choice of whether to dump or not
shouldn't be platform specific. But I see yo umeant the choice of whether
LLVM (llc) /emits/ the accelerator tables is platform specific and needs to
be explicitly specified to make the test portable.
>
> 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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);
> +};
> +
> +}
>
> 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
>
> ==============================================================================
> --- 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());
> +
> + 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)
> + .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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
> 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/20141114/0833dab9/attachment.html>
More information about the llvm-commits
mailing list