[llvm] r237721 - [DWARF parser] Add basic support for DWZ DWARF multifile extensions.

Sanjay Patel spatel at rotateright.com
Wed May 20 10:47:42 PDT 2015


Hi Alexey -

I have zero knowledge of LLVMObject, but if I can assist by running any
experiments / testcases, please let me know.


On Wed, May 20, 2015 at 11:06 AM, Alexey Samsonov <vonosmas at gmail.com>
wrote:

> Interesting. This looks like a bug in LLVMObject library. I can't
> reproduce this specific failure, but instead can make llvm-symbolizer crash
> on the same object file.
>
> I'll revert the test case while I'm investigating it. Help in figuring out
> the problem in Object library is welcome.
>
> On Wed, May 20, 2015 at 8:36 AM, Sanjay Patel <spatel at rotateright.com>
> wrote:
>
>> Anyone else seeing this 'make check' failure? I'm running Darwin x86-64;
>> fails the same on 2 different machines.
>>
>> FAIL: LLVM :: DebugInfo/dwarfdump-dwz.test (7308 of 13739)
>> ******************** TEST 'LLVM :: DebugInfo/dwarfdump-dwz.test' FAILED
>> ********************
>> Script:
>> --
>> /Users/spatel/myllvm/build/./bin/llvm-dwarfdump
>> /Users/spatel/myllvm/llvm/test/DebugInfo/Inputs/dwarfdump-test-dwz.elf-x86-64
>> -debug-dump=info | /Users/spatel/myllvm/build/./bin/FileCheck
>> /Users/spatel/myllvm/llvm/test/DebugInfo/dwarfdump-dwz.test -check-prefix
>> DUMP_INFO
>> --
>> Exit Code: 2
>>
>> Command Output (stderr):
>> --
>> 0  llvm-dwarfdump           0x000000010b1e523e
>> llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 46
>> 1  llvm-dwarfdump           0x000000010b1e6b09
>> PrintStackTraceSignalHandler(void*) + 25
>> 2  llvm-dwarfdump           0x000000010b1e6f68 SignalHandler(int) + 584
>> 3  libsystem_platform.dylib 0x00007fff8f71bf1a _sigtramp + 26
>> 4  libsystem_platform.dylib 0x00007fff54bb0690 _sigtramp + 3309914000
>> 5  llvm-dwarfdump           0x000000010b0dd1ba
>> llvm::object::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1,
>> 2ul, true> >::ELFFile(llvm::StringRef, std::__1::error_code&) + 1882
>> 6  llvm-dwarfdump           0x000000010b0d387d
>> llvm::object::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1,
>> 2ul, true> >::ELFFile(llvm::StringRef, std::__1::error_code&) + 45
>> 7  llvm-dwarfdump           0x000000010b0d383c
>> llvm::object::ELFObjectFile<llvm::object::ELFType<(llvm::support::endianness)1,
>> 2ul, true> >::ELFObjectFile(llvm::MemoryBufferRef, std::__1::error_code&) +
>> 220
>> 8  llvm-dwarfdump           0x000000010b0d3483
>> llvm::object::ELFObjectFile<llvm::object::ELFType<(llvm::support::endianness)1,
>> 2ul, true> >::ELFObjectFile(llvm::MemoryBufferRef, std::__1::error_code&) +
>> 67
>> 9  llvm-dwarfdump           0x000000010b0d2bfa
>> llvm::object::ObjectFile::createELFObjectFile(llvm::MemoryBufferRef) + 1994
>> 10 llvm-dwarfdump           0x000000010b11b834
>> llvm::object::ObjectFile::createObjectFile(llvm::MemoryBufferRef,
>> llvm::sys::fs::file_magic) + 308
>> 11 llvm-dwarfdump           0x000000010b0583e6
>> llvm::object::ObjectFile::createObjectFile(llvm::MemoryBufferRef) + 118
>> 12 llvm-dwarfdump           0x000000010b05036e DumpInput(llvm::StringRef)
>> + 798
>> 13 llvm-dwarfdump           0x000000010b04ffee main + 1518
>> 14 libdyld.dylib            0x00007fff8f1d25c9 start + 1
>> 15 libdyld.dylib            0x0000000000000003 start + 1893915195
>> Stack dump:
>> 0.    Program arguments: /Users/spatel/myllvm/build/./bin/llvm-dwarfdump
>> /Users/spatel/myllvm/llvm/test/DebugInfo/Inputs/dwarfdump-test-dwz.elf-x86-64
>> -debug-dump=info
>> FileCheck error: '-' is empty.
>>
>>
>> On Tue, May 19, 2015 at 2:29 PM, Alexey Samsonov <vonosmas at gmail.com>
>> wrote:
>>
>>> Author: samsonov
>>> Date: Tue May 19 15:29:28 2015
>>> New Revision: 237721
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=237721&view=rev
>>> Log:
>>> [DWARF parser] Add basic support for DWZ DWARF multifile extensions.
>>>
>>> This change implements basic support for DWARF alternate sections
>>> proposal: http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open
>>>
>>> LLVM tools now understand new forms: DW_FORM_GNU_ref_alt and
>>> DW_FORM_GNU_strp_alt, which are used as references to .debug_info and
>>> .debug_str sections respectively, stored in a separate file, and
>>> possibly shared between different executables / shared objects.
>>>
>>> llvm-dwarfdump and llvm-symbolizer don't yet know how to access this
>>> alternate debug file (usually pointed by .gnu_debugaltlink section),
>>> but they can at lease properly parse and dump regular files, which
>>> refer to it.
>>>
>>> This change should fix crashes of llvm-dwarfdump and llvm-symbolizer on
>>> files produced by running "dwz" tool. Such files are already installed
>>> on some modern Linux distributions.
>>>
>>> Added:
>>>     llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test-dwz.elf-x86-64
>>>  (with props)
>>>     llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test.elf-x86-64.dwz
>>>     llvm/trunk/test/DebugInfo/dwarfdump-dwz.test
>>> Modified:
>>>     llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h
>>>     llvm/trunk/include/llvm/Support/Dwarf.h
>>>     llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugInfoEntry.cpp
>>>     llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp
>>>     llvm/trunk/lib/Support/Dwarf.cpp
>>>     llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test.cc
>>>
>>> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h?rev=237721&r1=237720&r2=237721&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h (original)
>>> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h Tue May 19
>>> 15:29:28 2015
>>> @@ -87,6 +87,8 @@ public:
>>>
>>>    static ArrayRef<uint8_t> getFixedFormSizes(uint8_t AddrSize,
>>>                                               uint16_t Version);
>>> +private:
>>> +  void dumpString(raw_ostream &OS, const DWARFUnit *U) const;
>>>  };
>>>
>>>  }
>>>
>>> Modified: llvm/trunk/include/llvm/Support/Dwarf.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Dwarf.h?rev=237721&r1=237720&r2=237721&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Support/Dwarf.h (original)
>>> +++ llvm/trunk/include/llvm/Support/Dwarf.h Tue May 19 15:29:28 2015
>>> @@ -285,7 +285,11 @@ enum Form : uint16_t {
>>>
>>>    // Extensions for Fission proposal
>>>    DW_FORM_GNU_addr_index = 0x1f01,
>>> -  DW_FORM_GNU_str_index = 0x1f02
>>> +  DW_FORM_GNU_str_index = 0x1f02,
>>> +
>>> +  // Alternate debug sections proposal (output of "dwz" tool).
>>> +  DW_FORM_GNU_ref_alt = 0x1f20,
>>> +  DW_FORM_GNU_strp_alt = 0x1f21
>>>  };
>>>
>>>  enum LocationAtom {
>>>
>>> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugInfoEntry.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugInfoEntry.cpp?rev=237721&r1=237720&r2=237721&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugInfoEntry.cpp (original)
>>> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugInfoEntry.cpp Tue May 19
>>> 15:29:28 2015
>>> @@ -161,14 +161,15 @@ void DWARFDebugInfoEntryMinimal::dumpAtt
>>>    // We have dumped the attribute raw value. For some attributes
>>>    // having both the raw value and the pretty-printed value is
>>>    // interesting. These attributes are handled below.
>>> -  if ((attr == DW_AT_specification || attr == DW_AT_abstract_origin) &&
>>> -      // The signature references aren't handled.
>>> -      formValue.getForm() != DW_FORM_ref_sig8) {
>>> -    uint32_t Ref = formValue.getAsReference(u).getValue();
>>> -    DWARFDebugInfoEntryMinimal DIE;
>>> -    if (const DWARFUnit *RefU = findUnitAndExtractFast(DIE, u, &Ref))
>>> -      if (const char *Ref = DIE.getName(RefU, DINameKind::LinkageName))
>>> -        OS << " \"" << Ref << '\"';
>>> +  if (attr == DW_AT_specification || attr == DW_AT_abstract_origin) {
>>> +    Optional<uint64_t> Ref = formValue.getAsReference(u);
>>> +    if (Ref.hasValue()) {
>>> +      uint32_t RefOffset = Ref.getValue();
>>> +      DWARFDebugInfoEntryMinimal DIE;
>>> +      if (const DWARFUnit *RefU = findUnitAndExtractFast(DIE, u,
>>> &RefOffset))
>>> +        if (const char *Name = DIE.getName(RefU,
>>> DINameKind::LinkageName))
>>> +          OS << " \"" << Name << '\"';
>>> +    }
>>>    } else if (attr == DW_AT_APPLE_property_attribute) {
>>>      if (Optional<uint64_t> OptVal = formValue.getAsUnsignedConstant())
>>>        dumpApplePropertyAttribute(OS, *OptVal);
>>>
>>> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp?rev=237721&r1=237720&r2=237721&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp (original)
>>> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp Tue May 19
>>> 15:29:28 2015
>>> @@ -113,14 +113,17 @@ bool DWARFFormValue::isFormClass(DWARFFo
>>>    if (Form < ArrayRef<FormClass>(DWARF4FormClasses).size() &&
>>>        DWARF4FormClasses[Form] == FC)
>>>      return true;
>>> -  // Check DW_FORM_ref_sig8 from DWARF4.
>>> -  if (Form == DW_FORM_ref_sig8)
>>> +  // Check more forms from DWARF4 and DWARF5 proposals.
>>> +  switch (Form) {
>>> +  case DW_FORM_ref_sig8:
>>> +  case DW_FORM_GNU_ref_alt:
>>>      return (FC == FC_Reference);
>>> -  // Check for some DWARF5 forms.
>>> -  if (Form == DW_FORM_GNU_addr_index)
>>> +  case DW_FORM_GNU_addr_index:
>>>      return (FC == FC_Address);
>>> -  if (Form == DW_FORM_GNU_str_index)
>>> +  case DW_FORM_GNU_str_index:
>>> +  case DW_FORM_GNU_strp_alt:
>>>      return (FC == FC_String);
>>> +  }
>>>    // In DWARF3 DW_FORM_data4 and DW_FORM_data8 served also as a section
>>> offset.
>>>    // Don't check for DWARF version here, as some producers may still do
>>> this
>>>    // by mistake.
>>> @@ -199,15 +202,6 @@ bool DWARFFormValue::extractValue(DataEx
>>>      case DW_FORM_sdata:
>>>        Value.sval = data.getSLEB128(offset_ptr);
>>>        break;
>>> -    case DW_FORM_strp: {
>>> -      Value.uval = data.getU32(offset_ptr);
>>> -      if (!cu)
>>> -        break;
>>> -      RelocAddrMap::const_iterator AI =
>>> cu->getRelocMap()->find(*offset_ptr-4);
>>> -      if (AI != cu->getRelocMap()->end())
>>> -        Value.uval += AI->second.second;
>>> -      break;
>>> -    }
>>>      case DW_FORM_udata:
>>>      case DW_FORM_ref_udata:
>>>        Value.uval = data.getULEB128(offset_ptr);
>>> @@ -219,14 +213,18 @@ bool DWARFFormValue::extractValue(DataEx
>>>        Form = data.getULEB128(offset_ptr);
>>>        indirect = true;
>>>        break;
>>> -    case DW_FORM_sec_offset: {
>>> +    case DW_FORM_sec_offset:
>>> +    case DW_FORM_strp:
>>> +    case DW_FORM_GNU_ref_alt:
>>> +    case DW_FORM_GNU_strp_alt: {
>>>        // FIXME: This is 64-bit for DWARF64.
>>>        Value.uval = data.getU32(offset_ptr);
>>>        if (!cu)
>>>          break;
>>> -      RelocAddrMap::const_iterator AI =
>>> cu->getRelocMap()->find(*offset_ptr-4);
>>> +      RelocAddrMap::const_iterator AI =
>>> +          cu->getRelocMap()->find(*offset_ptr - 4);
>>>        if (AI != cu->getRelocMap()->end())
>>> -        Value.uval +=  AI->second.second;
>>> +        Value.uval += AI->second.second;
>>>        break;
>>>      }
>>>      case DW_FORM_flag_present:
>>> @@ -323,7 +321,6 @@ DWARFFormValue::skipValue(uint16_t form,
>>>        return true;
>>>
>>>      // 4 byte values
>>> -    case DW_FORM_strp:
>>>      case DW_FORM_data4:
>>>      case DW_FORM_ref4:
>>>        *offset_ptr += 4;
>>> @@ -353,6 +350,9 @@ DWARFFormValue::skipValue(uint16_t form,
>>>
>>>      // FIXME: 4 for DWARF32, 8 for DWARF64.
>>>      case DW_FORM_sec_offset:
>>> +    case DW_FORM_strp:
>>> +    case DW_FORM_GNU_ref_alt:
>>> +    case DW_FORM_GNU_strp_alt:
>>>        *offset_ptr += 4;
>>>        return true;
>>>
>>> @@ -424,24 +424,17 @@ DWARFFormValue::dump(raw_ostream &OS, co
>>>    case DW_FORM_udata:     OS << Value.uval; break;
>>>    case DW_FORM_strp: {
>>>      OS << format(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue);
>>> -    Optional<const char *> DbgStr = getAsCString(cu);
>>> -    if (DbgStr.hasValue()) {
>>> -      raw_ostream &COS = WithColor(OS, syntax::String);
>>> -      COS << '"';
>>> -      COS.write_escaped(DbgStr.getValue());
>>> -      COS << '"';
>>> -    }
>>> +    dumpString(OS, cu);
>>>      break;
>>>    }
>>>    case DW_FORM_GNU_str_index: {
>>>      OS << format(" indexed (%8.8x) string = ", (uint32_t)uvalue);
>>> -    Optional<const char *> DbgStr = getAsCString(cu);
>>> -    if (DbgStr.hasValue()) {
>>> -      raw_ostream &COS = WithColor(OS, syntax::String);
>>> -      COS << '"';
>>> -      COS.write_escaped(DbgStr.getValue());
>>> -      COS << '"';
>>> -    }
>>> +    dumpString(OS, cu);
>>> +    break;
>>> +  }
>>> +  case DW_FORM_GNU_strp_alt: {
>>> +    OS << format("alt indirect string, offset: 0x%" PRIx64 "", uvalue);
>>> +    dumpString(OS, cu);
>>>      break;
>>>    }
>>>    case DW_FORM_ref_addr:
>>> @@ -467,6 +460,9 @@ DWARFFormValue::dump(raw_ostream &OS, co
>>>      cu_relative_offset = true;
>>>      OS << format("cu + 0x%" PRIx64, uvalue);
>>>      break;
>>> +  case DW_FORM_GNU_ref_alt:
>>> +    OS << format("<alt 0x%" PRIx64 ">", uvalue);
>>> +    break;
>>>
>>>      // All DW_FORM_indirect attributes should be resolved prior to
>>> calling
>>>      // this function
>>> @@ -492,12 +488,23 @@ DWARFFormValue::dump(raw_ostream &OS, co
>>>    }
>>>  }
>>>
>>> +void DWARFFormValue::dumpString(raw_ostream &OS, const DWARFUnit *U)
>>> const {
>>> +  Optional<const char *> DbgStr = getAsCString(U);
>>> +  if (DbgStr.hasValue()) {
>>> +    raw_ostream &COS = WithColor(OS, syntax::String);
>>> +    COS << '"';
>>> +    COS.write_escaped(DbgStr.getValue());
>>> +    COS << '"';
>>> +  }
>>> +}
>>> +
>>>  Optional<const char *> DWARFFormValue::getAsCString(const DWARFUnit *U)
>>> const {
>>>    if (!isFormClass(FC_String))
>>>      return None;
>>>    if (Form == DW_FORM_string)
>>>      return Value.cstr;
>>> -  if (!U)
>>> +  // FIXME: Add support for DW_FORM_GNU_strp_alt
>>> +  if (Form == DW_FORM_GNU_strp_alt || U == nullptr)
>>>      return None;
>>>    uint32_t Offset = Value.uval;
>>>    if (Form == DW_FORM_GNU_str_index) {
>>> @@ -539,9 +546,9 @@ Optional<uint64_t> DWARFFormValue::getAs
>>>      return Value.uval + U->getOffset();
>>>    case DW_FORM_ref_addr:
>>>      return Value.uval;
>>> -  // FIXME: Add proper support for DW_FORM_ref_sig8
>>> +  // FIXME: Add proper support for DW_FORM_ref_sig8 and
>>> DW_FORM_GNU_ref_alt.
>>>    default:
>>> -    return Value.uval;
>>> +    return None;
>>>    }
>>>  }
>>>
>>>
>>> Modified: llvm/trunk/lib/Support/Dwarf.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Dwarf.cpp?rev=237721&r1=237720&r2=237721&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Support/Dwarf.cpp (original)
>>> +++ llvm/trunk/lib/Support/Dwarf.cpp Tue May 19 15:29:28 2015
>>> @@ -233,6 +233,10 @@ const char *llvm::dwarf::FormEncodingStr
>>>      // DWARF5 Fission Extension Forms
>>>    case DW_FORM_GNU_addr_index:           return
>>> "DW_FORM_GNU_addr_index";
>>>    case DW_FORM_GNU_str_index:            return "DW_FORM_GNU_str_index";
>>> +
>>> +  // Alternate debug sections proposal (output of "dwz" tool).
>>> +  case DW_FORM_GNU_ref_alt:              return "DW_FORM_GNU_ref_alt";
>>> +  case DW_FORM_GNU_strp_alt:             return "DW_FORM_GNU_strp_alt";
>>>    }
>>>    return nullptr;
>>>  }
>>>
>>> Added: llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test-dwz.elf-x86-64
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test-dwz.elf-x86-64?rev=237721&view=auto
>>>
>>> ==============================================================================
>>> Binary files
>>> llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test-dwz.elf-x86-64 (added) and
>>> llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test-dwz.elf-x86-64 Tue May 19
>>> 15:29:28 2015 differ
>>>
>>> Propchange:
>>> llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test-dwz.elf-x86-64
>>>
>>> ------------------------------------------------------------------------------
>>>     svn:executable = *
>>>
>>> Modified: llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test.cc
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test.cc?rev=237721&r1=237720&r2=237721&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test.cc (original)
>>> +++ llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test.cc Tue May 19
>>> 15:29:28 2015
>>> @@ -21,3 +21,9 @@ int main() {
>>>  // $ cp dwarfdump-test.cc /tmp/dbginfo
>>>  // $ cd /tmp/dbginfo
>>>  // $ clang++ -g dwarfdump-test.cc -o <output>
>>> +
>>> +// The result is also used as an input to .dwz tool:
>>> +// $ cp <output> output1.dwz
>>> +// $ cp <output> output2.dwz
>>> +// $ dwz -m output.dwz -r output1.dwz output2.dwz
>>> +// $ rm output2.dwz
>>>
>>> Added: llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test.elf-x86-64.dwz
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test.elf-x86-64.dwz?rev=237721&view=auto
>>>
>>> ==============================================================================
>>> Binary files
>>> llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test.elf-x86-64.dwz (added) and
>>> llvm/trunk/test/DebugInfo/Inputs/dwarfdump-test.elf-x86-64.dwz Tue May 19
>>> 15:29:28 2015 differ
>>>
>>> Added: llvm/trunk/test/DebugInfo/dwarfdump-dwz.test
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/dwarfdump-dwz.test?rev=237721&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/DebugInfo/dwarfdump-dwz.test (added)
>>> +++ llvm/trunk/test/DebugInfo/dwarfdump-dwz.test Tue May 19 15:29:28 2015
>>> @@ -0,0 +1,14 @@
>>> +; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test-dwz.elf-x86-64
>>> -debug-dump=info | FileCheck %s -check-prefix DUMP_INFO
>>> +
>>> +; DUMP_INFO: .debug_info
>>> +; DUMP_INFO: DW_TAG_compile_unit [2] *
>>> +; DUMP_INFO-NEXT: DW_AT_producer [DW_FORM_GNU_strp_alt]     (alt
>>> indirect string, offset: 0x0)
>>> +; DUMP_INFO-NEXT: DW_AT_language [DW_FORM_data2]
>>> (DW_LANG_C_plus_plus)
>>> +; DUMP_INFO-NEXT: DW_AT_name [DW_FORM_GNU_strp_alt] (alt indirect
>>> string, offset: 0x31)
>>> +; DUMP_INFO-NEXT: DW_AT_low_pc [DW_FORM_addr]       (0x0000000000000000)
>>> +; DUMP_INFO-NEXT: DW_AT_stmt_list [DW_FORM_data4]   (0x00000000)
>>> +; DUMP_INFO-NEXT: DW_AT_comp_dir [DW_FORM_GNU_strp_alt]     (alt
>>> indirect string, offset: 0x6b)
>>> +
>>> +; DUMP_INFO: DW_TAG_imported_unit [4]
>>> +; DUMP_INFO-NEXT: DW_AT_import [DW_FORM_GNU_ref_alt]      (<alt 0xb>)
>>> +
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>
>>
>
>
> --
> Alexey Samsonov
> vonosmas at gmail.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150520/fd6bcf77/attachment.html>


More information about the llvm-commits mailing list