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

Alexey Samsonov vonosmas at gmail.com
Wed May 20 10:06:22 PDT 2015


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/519f8da6/attachment.html>


More information about the llvm-commits mailing list