[llvm-commits] [llvm] r167558 - in /llvm/trunk: include/llvm/DebugInfo/DIContext.h include/llvm/Object/RelocVisitor.h include/llvm/Support/DataExtractor.h lib/DebugInfo/DIContext.cpp lib/DebugInfo/DWARFContext.h lib/DebugInfo/DWARFFormValue.cpp test/DebugInfo/X86/elf-names.ll tools/llvm-dwarfdump/llvm-dwarfdump.cpp

Alexey Samsonov samsonov at google.com
Thu Nov 8 06:15:46 PST 2012


On Thu, Nov 8, 2012 at 3:22 AM, Eric Christopher <echristo at gmail.com> wrote:

> Author: echristo
> Date: Wed Nov  7 17:22:07 2012
> New Revision: 167558
>
> URL: http://llvm.org/viewvc/llvm-project?rev=167558&view=rev
> Log:
> Add a relocation visitor to lib object. This works via caching relocated
> values in a map that can be passed to consumers. Add a testcase that
> ensures this works for llvm-dwarfdump.
>
> Added:
>     llvm/trunk/include/llvm/Object/RelocVisitor.h
>     llvm/trunk/test/DebugInfo/X86/elf-names.ll
> Modified:
>     llvm/trunk/include/llvm/DebugInfo/DIContext.h
>     llvm/trunk/include/llvm/Support/DataExtractor.h
>     llvm/trunk/lib/DebugInfo/DIContext.cpp
>     llvm/trunk/lib/DebugInfo/DWARFContext.h
>     llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp
>     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=167558&r1=167557&r2=167558&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DIContext.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DIContext.h Wed Nov  7 17:22:07 2012
> @@ -15,6 +15,7 @@
>  #ifndef LLVM_DEBUGINFO_DICONTEXT_H
>  #define LLVM_DEBUGINFO_DICONTEXT_H
>
> +#include "llvm/ADT/DenseMap.h"
>  #include "llvm/ADT/SmallVector.h"
>  #include "llvm/ADT/SmallString.h"
>  #include "llvm/ADT/StringRef.h"
> @@ -89,6 +90,13 @@
>    }
>  };
>
> +// In place of applying the relocations to the data we've read from disk
> we use
> +// a separate mapping table to the side and checking that at locations in
> the dwarf
> +// we expec relocated values. This adds a bit of complexity to the dwarf
> +// parsing/extraction at the benefit of not allocating memory for the
> entire
> +// size of the debug info sections.
> +typedef DenseMap<uint64_t, std::pair<uint8_t, int64_t> > RelocAddrMap;
> +
>  class DIContext {
>  public:
>    virtual ~DIContext();
> @@ -100,7 +108,8 @@
>                                      StringRef aRangeSection = StringRef(),
>                                      StringRef lineSection = StringRef(),
>                                      StringRef stringSection = StringRef(),
> -                                    StringRef rangeSection = StringRef());
> +                                    StringRef rangeSection = StringRef(),
> +                                    const RelocAddrMap &Map =
> RelocAddrMap());
>
>    virtual void dump(raw_ostream &OS) = 0;
>
>
> Added: llvm/trunk/include/llvm/Object/RelocVisitor.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/RelocVisitor.h?rev=167558&view=auto
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/RelocVisitor.h (added)
> +++ llvm/trunk/include/llvm/Object/RelocVisitor.h Wed Nov  7 17:22:07 2012
> @@ -0,0 +1,131 @@
> +//===-- RelocVisitor.h - Visitor for object file relocations -*- C++
> -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file provides a wrapper around all the different types of
> relocations
> +// in different file formats, such that a client can handle them in a
> unified
> +// manner by only implementing a minimal number of functions.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef _LLVM_OBJECT_RELOCVISITOR
> +#define _LLVM_OBJECT_RELOCVISITOR
> +
> +#include "llvm/Support/Debug.h"
> +#include "llvm/Support/raw_ostream.h"
> +#include "llvm/Object/ObjectFile.h"
> +#include "llvm/Object/ELF.h"
> +#include "llvm/ADT/StringRef.h"
> +
> +namespace llvm {
> +namespace object {
> +
> +struct RelocToApply {
> +  // The computed value after applying the relevant relocations.
> +  int64_t Value;
> +
> +  // The width of the value; how many bytes to touch when applying the
> +  // relocation.
> +  char Width;
> +  RelocToApply(const RelocToApply &In) : Value(In.Value), Width(In.Width)
> {}
> +  RelocToApply(int64_t Value, char Width) : Value(Value), Width(Width) {}
> +  RelocToApply() : Value(0), Width(0) {}
> +};
> +
> +/// @brief Base class for object file relocation visitors.
> +class RelocVisitor {
> +public:
> +  explicit RelocVisitor(llvm::StringRef FileFormat)
> +    : FileFormat(FileFormat), HasError(false) {}
> +
> +  // TODO: Should handle multiple applied relocations via either passing
> in the
> +  // previously computed value or just count paired relocations as a
> single
> +  // visit.
> +  RelocToApply visit(uint32_t RelocType, RelocationRef R, uint64_t
> SecAddr = 0,
> +                     uint64_t Value = 0) {
> +    if (FileFormat == "ELF64-x86-64") {
> +      switch (RelocType) {
> +        case llvm::ELF::R_X86_64_NONE:
> +          return visitELF_X86_64_NONE(R);
> +        case llvm::ELF::R_X86_64_64:
> +          return visitELF_X86_64_64(R, Value);
> +        case llvm::ELF::R_X86_64_PC32:
> +          return visitELF_X86_64_PC32(R, Value, SecAddr);
> +        case llvm::ELF::R_X86_64_32:
> +          return visitELF_X86_64_32(R, Value);
> +        case llvm::ELF::R_X86_64_32S:
> +          return visitELF_X86_64_32S(R, Value);
> +        default:
> +          HasError = true;
> +          return RelocToApply();
> +      }
> +    }
> +    return RelocToApply();
> +  }
> +
> +  bool error() { return HasError; }
> +
> +private:
> +  llvm::StringRef FileFormat;
> +  bool HasError;
> +
> +  /// Operations
> +
> +  // Width is the width in bytes of the extend.
> +  RelocToApply zeroExtend(RelocToApply r, char Width) {
> +    if (Width == r.Width)
> +      return r;
> +    r.Value &= (1 << ((Width * 8))) - 1;
> +    return r;
> +  }
> +  RelocToApply signExtend(RelocToApply r, char Width) {
> +    if (Width == r.Width)
> +      return r;
> +    bool SignBit = r.Value & (1 << ((Width * 8) - 1));
> +    if (SignBit) {
> +      r.Value |= ~((1 << (Width * 8)) - 1);
> +    } else {
> +      r.Value &= (1 << (Width * 8)) - 1;
> +    }
> +    return r;
> +  }
> +
> +  /// X86-64 ELF
> +  RelocToApply visitELF_X86_64_NONE(RelocationRef R) {
> +    return RelocToApply(0, 0);
> +  }
> +  RelocToApply visitELF_X86_64_64(RelocationRef R, uint64_t Value) {
> +    int64_t Addend;
> +    R.getAdditionalInfo(Addend);
> +    return RelocToApply(Value + Addend, 8);
> +  }
> +  RelocToApply visitELF_X86_64_PC32(RelocationRef R, uint64_t Value,
> +                                    uint64_t SecAddr) {
> +    int64_t Addend;
> +    R.getAdditionalInfo(Addend);
> +    uint64_t Address;
> +    R.getAddress(Address);
> +    return RelocToApply(Value + Addend - Address, 4);
> +  }
> +  RelocToApply visitELF_X86_64_32(RelocationRef R, uint64_t Value) {
> +    int64_t Addend;
> +    R.getAdditionalInfo(Addend);
> +    uint32_t Res = (Value + Addend) & 0xFFFFFFFF;
> +    return RelocToApply(Res, 4);
> +  }
> +  RelocToApply visitELF_X86_64_32S(RelocationRef R, uint64_t Value) {
> +    int64_t Addend;
> +    R.getAdditionalInfo(Addend);
> +    int32_t Res = (Value + Addend) & 0xFFFFFFFF;
> +    return RelocToApply(Res, 4);
> +  }
> +};
> +
> +}
> +}
> +#endif
>
> Modified: llvm/trunk/include/llvm/Support/DataExtractor.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DataExtractor.h?rev=167558&r1=167557&r2=167558&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/DataExtractor.h (original)
> +++ llvm/trunk/include/llvm/Support/DataExtractor.h Wed Nov  7 17:22:07
> 2012
> @@ -10,6 +10,7 @@
>  #ifndef LLVM_SUPPORT_DATAEXTRACTOR_H
>  #define LLVM_SUPPORT_DATAEXTRACTOR_H
>
> +#include "llvm/ADT/DenseMap.h"
>  #include "llvm/ADT/StringRef.h"
>  #include "llvm/Support/DataTypes.h"
>
>
> Modified: llvm/trunk/lib/DebugInfo/DIContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DIContext.cpp?rev=167558&r1=167557&r2=167558&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DIContext.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DIContext.cpp Wed Nov  7 17:22:07 2012
> @@ -19,8 +19,9 @@
>                                        StringRef aRangeSection,
>                                        StringRef lineSection,
>                                        StringRef stringSection,
> -                                      StringRef rangeSection) {
> +                                      StringRef rangeSection,
> +                                      const RelocAddrMap &Map) {
>    return new DWARFContextInMemory(isLittleEndian, infoSection,
> abbrevSection,
>                                    aRangeSection, lineSection,
> stringSection,
> -                                  rangeSection);
> +                                  rangeSection, Map);
>  }
>
> Modified: llvm/trunk/lib/DebugInfo/DWARFContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFContext.h?rev=167558&r1=167557&r2=167558&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARFContext.h (original)
> +++ llvm/trunk/lib/DebugInfo/DWARFContext.h Wed Nov  7 17:22:07 2012
> @@ -26,6 +26,7 @@
>  /// methods that a concrete implementation provides.
>  class DWARFContext : public DIContext {
>    bool IsLittleEndian;
> +  const RelocAddrMap &RelocMap;
>

Hm, reference as a class member is kinda scary thing. In addition, this
function:

static DIContext *getDWARFContext(....
                                   StringRef rangeSection = StringRef());
                                   StringRef rangeSection = StringRef(),
                                   const RelocAddrMap &Map =
RelocAddrMap());

is simply broken if you doesn't provide "Map" argument - your reference
become
dangling immediately after the function returns. I've verified that it
indeed leads to crash.


>
>    SmallVector<DWARFCompileUnit, 1> CUs;
>    OwningPtr<DWARFDebugAbbrev> Abbrev;
> @@ -38,9 +39,11 @@
>    /// Read compile units from the debug_info section and store them in
> CUs.
>    void parseCompileUnits();
>  protected:
> -  DWARFContext(bool isLittleEndian) : IsLittleEndian(isLittleEndian) {}
> +  DWARFContext(bool isLittleEndian, const RelocAddrMap &Map) :
> +    IsLittleEndian(isLittleEndian), RelocMap(Map) {}
>  public:
>    virtual void dump(raw_ostream &OS);
> +
>    /// Get the number of compile units in this context.
>    unsigned getNumCompileUnits() {
>      if (CUs.empty())
> @@ -70,6 +73,7 @@
>        DILineInfoSpecifier Specifier = DILineInfoSpecifier());
>
>    bool isLittleEndian() const { return IsLittleEndian; }
> +  const RelocAddrMap &relocMap() const { return RelocMap; }
>
>    virtual StringRef getInfoSection() = 0;
>    virtual StringRef getAbbrevSection() = 0;
> @@ -108,8 +112,9 @@
>                         StringRef aRangeSection,
>                         StringRef lineSection,
>                         StringRef stringSection,
> -                       StringRef rangeSection)
> -    : DWARFContext(isLittleEndian),
> +                       StringRef rangeSection,
> +                       const RelocAddrMap &Map = RelocAddrMap())
> +    : DWARFContext(isLittleEndian, Map),
>        InfoSection(infoSection),
>        AbbrevSection(abbrevSection),
>        ARangeSection(aRangeSection),
>
> Modified: llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp?rev=167558&r1=167557&r2=167558&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp Wed Nov  7 17:22:07 2012
> @@ -10,6 +10,7 @@
>  #include "DWARFFormValue.h"
>  #include "DWARFCompileUnit.h"
>  #include "DWARFContext.h"
> +#include "llvm/Support/Debug.h"
>  #include "llvm/Support/Dwarf.h"
>  #include "llvm/Support/Format.h"
>  #include "llvm/Support/raw_ostream.h"
> @@ -98,8 +99,16 @@
>      indirect = false;
>      switch (Form) {
>      case DW_FORM_addr:
> -    case DW_FORM_ref_addr:
> -      Value.uval = data.getUnsigned(offset_ptr, cu->getAddressByteSize());
> +    case DW_FORM_ref_addr: {
> +      RelocAddrMap::const_iterator AI
> +        = cu->getContext().relocMap().find(*offset_ptr);
> +      if (AI != cu->getContext().relocMap().end()) {
> +        const std::pair<uint8_t, int64_t> &R = AI->second;
> +        Value.uval = R.second;
> +        *offset_ptr += R.first;
> +      } else
> +        Value.uval = data.getUnsigned(offset_ptr,
> cu->getAddressByteSize());
> +    }
>        break;
>      case DW_FORM_exprloc:
>      case DW_FORM_block:
> @@ -138,9 +147,17 @@
>      case DW_FORM_sdata:
>        Value.sval = data.getSLEB128(offset_ptr);
>        break;
> -    case DW_FORM_strp:
> -      Value.uval = data.getU32(offset_ptr);
> +    case DW_FORM_strp: {
> +      RelocAddrMap::const_iterator AI
> +        = cu->getContext().relocMap().find(*offset_ptr);
> +      if (AI != cu->getContext().relocMap().end()) {
> +        const std::pair<uint8_t, int64_t> &R = AI->second;
> +        Value.uval = R.second;
> +        *offset_ptr += R.first;
> +      } else
> +        Value.uval = data.getU32(offset_ptr);
>        break;
> +    }
>      case DW_FORM_udata:
>      case DW_FORM_ref_udata:
>        Value.uval = data.getULEB128(offset_ptr);
>
> Added: llvm/trunk/test/DebugInfo/X86/elf-names.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/elf-names.ll?rev=167558&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/elf-names.ll (added)
> +++ llvm/trunk/test/DebugInfo/X86/elf-names.ll Wed Nov  7 17:22:07 2012
> @@ -0,0 +1,109 @@
> +; RUN: llc -mtriple=x86_64-unknown-linux-gnu %s -o %t -filetype=obj
> +; RUN: llvm-dwarfdump %t | FileCheck %s
> +
> +; CHECK: 0x0000000b: DW_TAG_compile_unit
> +; CHECK: 0x00000012:   DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000035]
> = "foo.cpp")
> +; CHECK: 0x0000003c:   DW_TAG_class_type
> +; CHECK: 0x0000003d:     DW_AT_name [DW_FORM_strp]       (
> .debug_str[0x0000006d] = "D")
> +; CHECK: 0x00000044:     DW_TAG_member
> +; CHECK: 0x00000045:       DW_AT_name [DW_FORM_strp]     (
> .debug_str[0x0000005d] = "c1")
> +
> +%class.D = type { i32, i32, i32, i32 }
> +
> + at _ZN1DC1Ev = alias void (%class.D*)* @_ZN1DC2Ev
> + at _ZN1DC1ERKS_ = alias void (%class.D*, %class.D*)* @_ZN1DC2ERKS_
> +
> +define void @_ZN1DC2Ev(%class.D* nocapture %this) unnamed_addr nounwind
> uwtable align 2 {
> +entry:
> +  tail call void @llvm.dbg.value(metadata !{%class.D* %this}, i64 0,
> metadata !29), !dbg !36
> +  %c1 = getelementptr inbounds %class.D* %this, i64 0, i32 0, !dbg !37
> +  store i32 1, i32* %c1, align 4, !dbg !37, !tbaa !39
> +  %c2 = getelementptr inbounds %class.D* %this, i64 0, i32 1, !dbg !42
> +  store i32 2, i32* %c2, align 4, !dbg !42, !tbaa !39
> +  %c3 = getelementptr inbounds %class.D* %this, i64 0, i32 2, !dbg !43
> +  store i32 3, i32* %c3, align 4, !dbg !43, !tbaa !39
> +  %c4 = getelementptr inbounds %class.D* %this, i64 0, i32 3, !dbg !44
> +  store i32 4, i32* %c4, align 4, !dbg !44, !tbaa !39
> +  ret void, !dbg !45
> +}
> +
> +define void @_ZN1DC2ERKS_(%class.D* nocapture %this, %class.D* nocapture
> %d) unnamed_addr nounwind uwtable align 2 {
> +entry:
> +  tail call void @llvm.dbg.value(metadata !{%class.D* %this}, i64 0,
> metadata !34), !dbg !46
> +  tail call void @llvm.dbg.value(metadata !{%class.D* %d}, i64 0,
> metadata !35), !dbg !46
> +  %c1 = getelementptr inbounds %class.D* %d, i64 0, i32 0, !dbg !47
> +  %0 = load i32* %c1, align 4, !dbg !47, !tbaa !39
> +  %c12 = getelementptr inbounds %class.D* %this, i64 0, i32 0, !dbg !47
> +  store i32 %0, i32* %c12, align 4, !dbg !47, !tbaa !39
> +  %c2 = getelementptr inbounds %class.D* %d, i64 0, i32 1, !dbg !49
> +  %1 = load i32* %c2, align 4, !dbg !49, !tbaa !39
> +  %c23 = getelementptr inbounds %class.D* %this, i64 0, i32 1, !dbg !49
> +  store i32 %1, i32* %c23, align 4, !dbg !49, !tbaa !39
> +  %c3 = getelementptr inbounds %class.D* %d, i64 0, i32 2, !dbg !50
> +  %2 = load i32* %c3, align 4, !dbg !50, !tbaa !39
> +  %c34 = getelementptr inbounds %class.D* %this, i64 0, i32 2, !dbg !50
> +  store i32 %2, i32* %c34, align 4, !dbg !50, !tbaa !39
> +  %c4 = getelementptr inbounds %class.D* %d, i64 0, i32 3, !dbg !51
> +  %3 = load i32* %c4, align 4, !dbg !51, !tbaa !39
> +  %c45 = getelementptr inbounds %class.D* %this, i64 0, i32 3, !dbg !51
> +  store i32 %3, i32* %c45, align 4, !dbg !51, !tbaa !39
> +  ret void, !dbg !52
> +}
> +
> +declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone
> +
> +!llvm.dbg.cu = !{!0}
> +
> +!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"foo.cpp", metadata
> !"/usr/local/google/home/echristo", metadata !"clang version 3.2 (trunk
> 167506) (llvm/trunk 167505)", i1 true, i1 true, metadata !"", i32 0,
> metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit
> ] [/usr/local/google/home/echristo/foo.cpp] [DW_LANG_C_plus_plus]
> +!1 = metadata !{metadata !2}
> +!2 = metadata !{i32 0}
> +!3 = metadata !{metadata !4}
> +!4 = metadata !{metadata !5, metadata !31}
> +!5 = metadata !{i32 786478, i32 0, null, metadata !"D", metadata !"D",
> metadata !"_ZN1DC2Ev", metadata !6, i32 12, metadata !7, i1 false, i1 true,
> i32 0, i32 0, null, i32 256, i1 true, void (%class.D*)* @_ZN1DC2Ev, null,
> metadata !17, metadata !27, i32 12} ; [ DW_TAG_subprogram ] [line 12] [def]
> [D]
> +!6 = metadata !{i32 786473, metadata !"foo.cpp", metadata
> !"/usr/local/google/home/echristo", null} ; [ DW_TAG_file_type ]
> +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64
> 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!8 = metadata !{null, metadata !9}
> +!9 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64,
> i64 64, i64 0, i32 1088, metadata !10} ; [ DW_TAG_pointer_type ] [line 0,
> size 64, align 64, offset 0] [from D]
> +!10 = metadata !{i32 786434, null, metadata !"D", metadata !6, i32 1, i64
> 128, i64 32, i32 0, i32 0, null, metadata !11, i32 0, null, null} ; [
> DW_TAG_class_type ] [D] [line 1, size 128, align 32, offset 0] [from ]
> +!11 = metadata !{metadata !12, metadata !14, metadata !15, metadata !16,
> metadata !17, metadata !20}
> +!12 = metadata !{i32 786445, metadata !10, metadata !"c1", metadata !6,
> i32 6, i64 32, i64 32, i64 0, i32 1, metadata !13} ; [ DW_TAG_member ] [c1]
> [line 6, size 32, align 32, offset 0] [private] [from int]
> +!13 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32,
> i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32,
> align 32, offset 0, enc DW_ATE_signed]
> +!14 = metadata !{i32 786445, metadata !10, metadata !"c2", metadata !6,
> i32 7, i64 32, i64 32, i64 32, i32 1, metadata !13} ; [ DW_TAG_member ]
> [c2] [line 7, size 32, align 32, offset 32] [private] [from int]
> +!15 = metadata !{i32 786445, metadata !10, metadata !"c3", metadata !6,
> i32 8, i64 32, i64 32, i64 64, i32 1, metadata !13} ; [ DW_TAG_member ]
> [c3] [line 8, size 32, align 32, offset 64] [private] [from int]
> +!16 = metadata !{i32 786445, metadata !10, metadata !"c4", metadata !6,
> i32 9, i64 32, i64 32, i64 96, i32 1, metadata !13} ; [ DW_TAG_member ]
> [c4] [line 9, size 32, align 32, offset 96] [private] [from int]
> +!17 = metadata !{i32 786478, i32 0, metadata !10, metadata !"D", metadata
> !"D", metadata !"", metadata !6, i32 3, metadata !7, i1 false, i1 false,
> i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18, i32
> 3} ; [ DW_TAG_subprogram ] [line 3] [D]
> +!18 = metadata !{metadata !19}
> +!19 = metadata !{i32 786468}                      ; [ DW_TAG_base_type ]
> [line 0, size 0, align 0, offset 0]
> +!20 = metadata !{i32 786478, i32 0, metadata !10, metadata !"D", metadata
> !"D", metadata !"", metadata !6, i32 4, metadata !21, i1 false, i1 false,
> i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !25, i32
> 4} ; [ DW_TAG_subprogram ] [line 4] [D]
> +!21 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0,
> i64 0, i64 0, i32 0, null, metadata !22, i32 0, i32 0} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!22 = metadata !{null, metadata !9, metadata !23}
> +!23 = metadata !{i32 786448, null, null, null, i32 0, i64 0, i64 0, i64
> 0, i32 0, metadata !24} ; [ DW_TAG_reference_type ] [line 0, size 0, align
> 0, offset 0] [from ]
> +!24 = metadata !{i32 786470, null, metadata !"", null, i32 0, i64 0, i64
> 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_const_type ] [line 0, size 0,
> align 0, offset 0] [from D]
> +!25 = metadata !{metadata !26}
> +!26 = metadata !{i32 786468}                      ; [ DW_TAG_base_type ]
> [line 0, size 0, align 0, offset 0]
> +!27 = metadata !{metadata !28}
> +!28 = metadata !{metadata !29}
> +!29 = metadata !{i32 786689, metadata !5, metadata !"this", metadata !6,
> i32 16777228, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ]
> [this] [line 12]
> +!30 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64
> 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] [line 0, size 64,
> align 64, offset 0] [from D]
> +!31 = metadata !{i32 786478, i32 0, null, metadata !"D", metadata !"D",
> metadata !"_ZN1DC2ERKS_", metadata !6, i32 19, metadata !21, i1 false, i1
> true, i32 0, i32 0, null, i32 256, i1 true, void (%class.D*, %class.D*)*
> @_ZN1DC2ERKS_, null, metadata !20, metadata !32, i32 19} ; [
> DW_TAG_subprogram ] [line 19] [def] [D]
> +!32 = metadata !{metadata !33}
> +!33 = metadata !{metadata !34, metadata !35}
> +!34 = metadata !{i32 786689, metadata !31, metadata !"this", metadata !6,
> i32 16777235, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ]
> [this] [line 19]
> +!35 = metadata !{i32 786689, metadata !31, metadata !"d", metadata !6,
> i32 33554451, metadata !23, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [d]
> [line 19]
> +!36 = metadata !{i32 12, i32 0, metadata !5, null}
> +!37 = metadata !{i32 13, i32 0, metadata !38, null}
> +!38 = metadata !{i32 786443, metadata !5, i32 12, i32 0, metadata !6, i32
> 0} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/foo.cpp]
> +!39 = metadata !{metadata !"int", metadata !40}
> +!40 = metadata !{metadata !"omnipotent char", metadata !41}
> +!41 = metadata !{metadata !"Simple C/C++ TBAA"}
> +!42 = metadata !{i32 14, i32 0, metadata !38, null}
> +!43 = metadata !{i32 15, i32 0, metadata !38, null}
> +!44 = metadata !{i32 16, i32 0, metadata !38, null}
> +!45 = metadata !{i32 17, i32 0, metadata !38, null}
> +!46 = metadata !{i32 19, i32 0, metadata !31, null}
> +!47 = metadata !{i32 20, i32 0, metadata !48, null}
> +!48 = metadata !{i32 786443, metadata !31, i32 19, i32 0, metadata !6,
> i32 1} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/foo.cpp]
> +!49 = metadata !{i32 21, i32 0, metadata !48, null}
> +!50 = metadata !{i32 22, i32 0, metadata !48, null}
> +!51 = metadata !{i32 23, i32 0, metadata !48, null}
> +!52 = metadata !{i32 24, i32 0, metadata !48, null}
>
> 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=167558&r1=167557&r2=167558&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp (original)
> +++ llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp Wed Nov  7 17:22:07
> 2012
> @@ -15,6 +15,7 @@
>  #include "llvm/ADT/Triple.h"
>  #include "llvm/ADT/STLExtras.h"
>  #include "llvm/Object/ObjectFile.h"
> +#include "llvm/Object/RelocVisitor.h"
>  #include "llvm/DebugInfo/DIContext.h"
>  #include "llvm/Support/CommandLine.h"
>  #include "llvm/Support/Debug.h"
> @@ -28,6 +29,9 @@
>  #include "llvm/Support/system_error.h"
>  #include <algorithm>
>  #include <cstring>
> +#include <list>
> +#include <string>
> +
>  using namespace llvm;
>  using namespace object;
>
> @@ -67,6 +71,7 @@
>    OwningPtr<ObjectFile> Obj(ObjectFile::createObjectFile(Buff.take()));
>
>    StringRef DebugInfoSection;
> +  RelocAddrMap RelocMap;
>    StringRef DebugAbbrevSection;
>    StringRef DebugLineSection;
>    StringRef DebugArangesSection;
> @@ -97,6 +102,57 @@
>        DebugStringSection = data;
>      else if (name == "debug_ranges")
>        DebugRangesSection = data;
> +    // Any more debug info sections go here.
> +    else
> +      continue;
> +
> +    // TODO: For now only handle relocations for the debug_info section.
> +    if (name != "debug_info")
> +      continue;
> +
> +    if (i->begin_relocations() != i->end_relocations()) {
> +      uint64_t SectionSize;
> +      i->getSize(SectionSize);
> +      for (relocation_iterator reloc_i = i->begin_relocations(),
> +                               reloc_e = i->end_relocations();
> +                               reloc_i != reloc_e; reloc_i.increment(ec))
> {
> +        uint64_t Address;
> +        reloc_i->getAddress(Address);
> +        uint64_t Type;
> +        reloc_i->getType(Type);
> +
> +        RelocVisitor V(Obj->getFileFormatName());
> +        // The section address is always 0 for debug sections.
> +        RelocToApply R(V.visit(Type, *reloc_i));
> +        if (V.error()) {
> +          SmallString<32> Name;
> +          error_code ec(reloc_i->getTypeName(Name));
> +          if (ec) {
> +            errs() << "Aaaaaa! Nameless relocation! Aaaaaa!\n";
> +          }
> +          errs() << "error: failed to compute relocation: "
> +                 << Name << "\n";
> +          continue;
> +        }
> +
> +        if (Address + R.Width > SectionSize) {
> +          errs() << "error: " << R.Width << "-byte relocation starting "
> +                 << Address << " bytes into section " << name << " which
> is "
> +                 << SectionSize << " bytes long.\n";
> +          continue;
> +        }
> +        if (R.Width > 8) {
> +          errs() << "error: can't handle a relocation of more than 8
> bytes at "
> +                    "a time.\n";
> +          continue;
> +        }
> +        DEBUG(dbgs() << "Writing " << format("%p", R.Value)
> +                     << " at " << format("%p", Address)
> +                     << " with width " << format("%d", R.Width)
> +                     << "\n");
> +        RelocMap[Address] = std::make_pair(R.Width, R.Value);
> +      }
> +    }
>    }
>
>    OwningPtr<DIContext> dictx(DIContext::getDWARFContext(/*FIXME*/true,
> @@ -105,7 +161,8 @@
>
>  DebugArangesSection,
>                                                          DebugLineSection,
>
>  DebugStringSection,
> -
>  DebugRangesSection));
> +
>  DebugRangesSection,
> +                                                        RelocMap));
>    if (Address == -1ULL) {
>      outs() << Filename
>             << ":\tfile format " << Obj->getFileFormatName() << "\n\n";
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121108/6b2f12d0/attachment.html>


More information about the llvm-commits mailing list