Coverage Report

Created: 2018-09-14 21:34

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/lld/ELF/GdbIndex.cpp
Line
Count
Source
1
//===- GdbIndex.cpp -------------------------------------------------------===//
2
//
3
//                             The LLVM Linker
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
//
10
// The -gdb-index option instructs the linker to emit a .gdb_index section.
11
// The section contains information to make gdb startup faster.
12
// The format of the section is described at
13
// https://sourceware.org/gdb/onlinedocs/gdb/Index-Section-Format.html.
14
//
15
//===----------------------------------------------------------------------===//
16
17
#include "GdbIndex.h"
18
#include "Symbols.h"
19
#include "lld/Common/Memory.h"
20
#include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h"
21
#include "llvm/Object/ELFObjectFile.h"
22
23
using namespace llvm;
24
using namespace llvm::object;
25
using namespace lld;
26
using namespace lld::elf;
27
28
181
template <class ELFT> LLDDwarfObj<ELFT>::LLDDwarfObj(ObjFile<ELFT> *Obj) {
29
1.14k
  for (InputSectionBase *Sec : Obj->getSections()) {
30
1.14k
    if (!Sec)
31
742
      continue;
32
406
    if (LLDDWARFSection *M = StringSwitch<LLDDWARFSection *>(Sec->Name)
33
61
                                 .Case(".debug_info", &InfoSection)
34
61
                                 .Case(".debug_ranges", &RangeSection)
35
61
                                 .Case(".debug_line", &LineSection)
36
61
                                 .Default(nullptr)) {
37
61
      Sec->maybeDecompress();
38
61
      M->Data = toStringRef(Sec->Data);
39
61
      M->Sec = Sec;
40
61
      continue;
41
61
    }
42
345
    if (Sec->Name == ".debug_abbrev")
43
31
      AbbrevSection = toStringRef(Sec->Data);
44
314
    else if (Sec->Name == ".debug_gnu_pubnames")
45
4
      GnuPubNamesSection = toStringRef(Sec->Data);
46
310
    else if (Sec->Name == ".debug_gnu_pubtypes")
47
4
      GnuPubTypesSection = toStringRef(Sec->Data);
48
306
    else if (Sec->Name == ".debug_str")
49
9
      StrSection = toStringRef(Sec->Data);
50
345
  }
51
181
}
lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, false> >::LLDDwarfObj(lld::elf::ObjFile<llvm::object::ELFType<(llvm::support::endianness)1, false> >*)
Line
Count
Source
28
13
template <class ELFT> LLDDwarfObj<ELFT>::LLDDwarfObj(ObjFile<ELFT> *Obj) {
29
81
  for (InputSectionBase *Sec : Obj->getSections()) {
30
81
    if (!Sec)
31
57
      continue;
32
24
    if (LLDDWARFSection *M = StringSwitch<LLDDWARFSection *>(Sec->Name)
33
6
                                 .Case(".debug_info", &InfoSection)
34
6
                                 .Case(".debug_ranges", &RangeSection)
35
6
                                 .Case(".debug_line", &LineSection)
36
6
                                 .Default(nullptr)) {
37
6
      Sec->maybeDecompress();
38
6
      M->Data = toStringRef(Sec->Data);
39
6
      M->Sec = Sec;
40
6
      continue;
41
6
    }
42
18
    if (Sec->Name == ".debug_abbrev")
43
2
      AbbrevSection = toStringRef(Sec->Data);
44
16
    else if (Sec->Name == ".debug_gnu_pubnames")
45
0
      GnuPubNamesSection = toStringRef(Sec->Data);
46
16
    else if (Sec->Name == ".debug_gnu_pubtypes")
47
0
      GnuPubTypesSection = toStringRef(Sec->Data);
48
16
    else if (Sec->Name == ".debug_str")
49
0
      StrSection = toStringRef(Sec->Data);
50
18
  }
51
13
}
lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, false> >::LLDDwarfObj(lld::elf::ObjFile<llvm::object::ELFType<(llvm::support::endianness)0, false> >*)
Line
Count
Source
28
1
template <class ELFT> LLDDwarfObj<ELFT>::LLDDwarfObj(ObjFile<ELFT> *Obj) {
29
9
  for (InputSectionBase *Sec : Obj->getSections()) {
30
9
    if (!Sec)
31
4
      continue;
32
5
    if (LLDDWARFSection *M = StringSwitch<LLDDWARFSection *>(Sec->Name)
33
0
                                 .Case(".debug_info", &InfoSection)
34
0
                                 .Case(".debug_ranges", &RangeSection)
35
0
                                 .Case(".debug_line", &LineSection)
36
0
                                 .Default(nullptr)) {
37
0
      Sec->maybeDecompress();
38
0
      M->Data = toStringRef(Sec->Data);
39
0
      M->Sec = Sec;
40
0
      continue;
41
0
    }
42
5
    if (Sec->Name == ".debug_abbrev")
43
0
      AbbrevSection = toStringRef(Sec->Data);
44
5
    else if (Sec->Name == ".debug_gnu_pubnames")
45
0
      GnuPubNamesSection = toStringRef(Sec->Data);
46
5
    else if (Sec->Name == ".debug_gnu_pubtypes")
47
0
      GnuPubTypesSection = toStringRef(Sec->Data);
48
5
    else if (Sec->Name == ".debug_str")
49
0
      StrSection = toStringRef(Sec->Data);
50
5
  }
51
1
}
lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, true> >::LLDDwarfObj(lld::elf::ObjFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >*)
Line
Count
Source
28
161
template <class ELFT> LLDDwarfObj<ELFT>::LLDDwarfObj(ObjFile<ELFT> *Obj) {
29
1.02k
  for (InputSectionBase *Sec : Obj->getSections()) {
30
1.02k
    if (!Sec)
31
657
      continue;
32
367
    if (LLDDWARFSection *M = StringSwitch<LLDDWARFSection *>(Sec->Name)
33
55
                                 .Case(".debug_info", &InfoSection)
34
55
                                 .Case(".debug_ranges", &RangeSection)
35
55
                                 .Case(".debug_line", &LineSection)
36
55
                                 .Default(nullptr)) {
37
55
      Sec->maybeDecompress();
38
55
      M->Data = toStringRef(Sec->Data);
39
55
      M->Sec = Sec;
40
55
      continue;
41
55
    }
42
312
    if (Sec->Name == ".debug_abbrev")
43
29
      AbbrevSection = toStringRef(Sec->Data);
44
283
    else if (Sec->Name == ".debug_gnu_pubnames")
45
4
      GnuPubNamesSection = toStringRef(Sec->Data);
46
279
    else if (Sec->Name == ".debug_gnu_pubtypes")
47
4
      GnuPubTypesSection = toStringRef(Sec->Data);
48
275
    else if (Sec->Name == ".debug_str")
49
9
      StrSection = toStringRef(Sec->Data);
50
312
  }
51
161
}
lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, true> >::LLDDwarfObj(lld::elf::ObjFile<llvm::object::ELFType<(llvm::support::endianness)0, true> >*)
Line
Count
Source
28
6
template <class ELFT> LLDDwarfObj<ELFT>::LLDDwarfObj(ObjFile<ELFT> *Obj) {
29
34
  for (InputSectionBase *Sec : Obj->getSections()) {
30
34
    if (!Sec)
31
24
      continue;
32
10
    if (LLDDWARFSection *M = StringSwitch<LLDDWARFSection *>(Sec->Name)
33
0
                                 .Case(".debug_info", &InfoSection)
34
0
                                 .Case(".debug_ranges", &RangeSection)
35
0
                                 .Case(".debug_line", &LineSection)
36
0
                                 .Default(nullptr)) {
37
0
      Sec->maybeDecompress();
38
0
      M->Data = toStringRef(Sec->Data);
39
0
      M->Sec = Sec;
40
0
      continue;
41
0
    }
42
10
    if (Sec->Name == ".debug_abbrev")
43
0
      AbbrevSection = toStringRef(Sec->Data);
44
10
    else if (Sec->Name == ".debug_gnu_pubnames")
45
0
      GnuPubNamesSection = toStringRef(Sec->Data);
46
10
    else if (Sec->Name == ".debug_gnu_pubtypes")
47
0
      GnuPubTypesSection = toStringRef(Sec->Data);
48
10
    else if (Sec->Name == ".debug_str")
49
0
      StrSection = toStringRef(Sec->Data);
50
10
  }
51
6
}
52
53
// Find if there is a relocation at Pos in Sec.  The code is a bit
54
// more complicated than usual because we need to pass a section index
55
// to llvm since it has no idea about InputSection.
56
template <class ELFT>
57
template <class RelTy>
58
Optional<RelocAddrEntry>
59
LLDDwarfObj<ELFT>::findAux(const InputSectionBase &Sec, uint64_t Pos,
60
137
                           ArrayRef<RelTy> Rels) const {
61
137
  auto It = std::lower_bound(
62
137
      Rels.begin(), Rels.end(), Pos,
63
296
      [](const RelTy &A, uint64_t B) { return A.r_offset < B; });
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, false> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, true> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, true> >) const::'lambda'(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, true> const&, unsigned long long)::operator()(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, true> const&, unsigned long long) const
llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, false> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, false> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, false> >) const::'lambda'(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, false> const&, unsigned long long)::operator()(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, false> const&, unsigned long long) const
Line
Count
Source
63
16
      [](const RelTy &A, uint64_t B) { return A.r_offset < B; });
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, false> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, true> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, true> >) const::'lambda'(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, true> const&, unsigned long long)::operator()(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, true> const&, unsigned long long) const
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, false> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, false> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, false> >) const::'lambda'(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, false> const&, unsigned long long)::operator()(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, false> const&, unsigned long long) const
llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, true> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, true> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, true> >) const::'lambda'(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, true> const&, unsigned long long)::operator()(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, true> const&, unsigned long long) const
Line
Count
Source
63
280
      [](const RelTy &A, uint64_t B) { return A.r_offset < B; });
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, true> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, false> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, false> >) const::'lambda'(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, false> const&, unsigned long long)::operator()(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, false> const&, unsigned long long) const
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, true> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, true> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, true> >) const::'lambda'(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, true> const&, unsigned long long)::operator()(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, true> const&, unsigned long long) const
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, true> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, false> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, false> >) const::'lambda'(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, false> const&, unsigned long long)::operator()(llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, false> const&, unsigned long long) const
64
137
  if (It == Rels.end() || 
It->r_offset != Pos116
)
65
50
    return None;
66
87
  const RelTy &Rel = *It;
67
87
68
87
  const ObjFile<ELFT> *File = Sec.getFile<ELFT>();
69
87
  uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL);
70
87
  const typename ELFT::Sym &Sym = File->getELFSyms()[SymIndex];
71
87
  uint32_t SecIndex = File->getSectionIndex(Sym);
72
87
73
87
  // Broken debug info can point to a non-Defined symbol.
74
87
  auto *DR = dyn_cast<Defined>(&File->getRelocTargetSym(Rel));
75
87
  if (!DR) {
76
3
    error("unsupported relocation target while parsing debug info");
77
3
    return None;
78
3
  }
79
84
  uint64_t Val = DR->Value + getAddend<ELFT>(Rel);
80
84
81
84
  // FIXME: We should be consistent about always adding the file
82
84
  // offset or not.
83
84
  if (DR->Section->Flags & ELF::SHF_ALLOC)
84
30
    Val += cast<InputSection>(DR->Section)->getOffsetInFile();
85
84
86
84
  return RelocAddrEntry{SecIndex, Val};
87
84
}
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, false> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, true> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, true> >) const
llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, false> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, false> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, false> >) const
Line
Count
Source
60
9
                           ArrayRef<RelTy> Rels) const {
61
9
  auto It = std::lower_bound(
62
9
      Rels.begin(), Rels.end(), Pos,
63
9
      [](const RelTy &A, uint64_t B) { return A.r_offset < B; });
64
9
  if (It == Rels.end() || It->r_offset != Pos)
65
3
    return None;
66
6
  const RelTy &Rel = *It;
67
6
68
6
  const ObjFile<ELFT> *File = Sec.getFile<ELFT>();
69
6
  uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL);
70
6
  const typename ELFT::Sym &Sym = File->getELFSyms()[SymIndex];
71
6
  uint32_t SecIndex = File->getSectionIndex(Sym);
72
6
73
6
  // Broken debug info can point to a non-Defined symbol.
74
6
  auto *DR = dyn_cast<Defined>(&File->getRelocTargetSym(Rel));
75
6
  if (!DR) {
76
0
    error("unsupported relocation target while parsing debug info");
77
0
    return None;
78
0
  }
79
6
  uint64_t Val = DR->Value + getAddend<ELFT>(Rel);
80
6
81
6
  // FIXME: We should be consistent about always adding the file
82
6
  // offset or not.
83
6
  if (DR->Section->Flags & ELF::SHF_ALLOC)
84
2
    Val += cast<InputSection>(DR->Section)->getOffsetInFile();
85
6
86
6
  return RelocAddrEntry{SecIndex, Val};
87
6
}
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, false> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, true> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, true> >) const
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, false> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, false> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, false>, false> >) const
llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, true> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, true> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, true> >) const
Line
Count
Source
60
122
                           ArrayRef<RelTy> Rels) const {
61
122
  auto It = std::lower_bound(
62
122
      Rels.begin(), Rels.end(), Pos,
63
122
      [](const RelTy &A, uint64_t B) { return A.r_offset < B; });
64
122
  if (It == Rels.end() || 
It->r_offset != Pos107
)
65
41
    return None;
66
81
  const RelTy &Rel = *It;
67
81
68
81
  const ObjFile<ELFT> *File = Sec.getFile<ELFT>();
69
81
  uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL);
70
81
  const typename ELFT::Sym &Sym = File->getELFSyms()[SymIndex];
71
81
  uint32_t SecIndex = File->getSectionIndex(Sym);
72
81
73
81
  // Broken debug info can point to a non-Defined symbol.
74
81
  auto *DR = dyn_cast<Defined>(&File->getRelocTargetSym(Rel));
75
81
  if (!DR) {
76
3
    error("unsupported relocation target while parsing debug info");
77
3
    return None;
78
3
  }
79
78
  uint64_t Val = DR->Value + getAddend<ELFT>(Rel);
80
78
81
78
  // FIXME: We should be consistent about always adding the file
82
78
  // offset or not.
83
78
  if (DR->Section->Flags & ELF::SHF_ALLOC)
84
28
    Val += cast<InputSection>(DR->Section)->getOffsetInFile();
85
78
86
78
  return RelocAddrEntry{SecIndex, Val};
87
78
}
llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, true> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, false> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, true>, false> >) const
Line
Count
Source
60
6
                           ArrayRef<RelTy> Rels) const {
61
6
  auto It = std::lower_bound(
62
6
      Rels.begin(), Rels.end(), Pos,
63
6
      [](const RelTy &A, uint64_t B) { return A.r_offset < B; });
64
6
  if (It == Rels.end() || 
It->r_offset != Pos0
)
65
6
    return None;
66
0
  const RelTy &Rel = *It;
67
0
68
0
  const ObjFile<ELFT> *File = Sec.getFile<ELFT>();
69
0
  uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL);
70
0
  const typename ELFT::Sym &Sym = File->getELFSyms()[SymIndex];
71
0
  uint32_t SecIndex = File->getSectionIndex(Sym);
72
0
73
0
  // Broken debug info can point to a non-Defined symbol.
74
0
  auto *DR = dyn_cast<Defined>(&File->getRelocTargetSym(Rel));
75
0
  if (!DR) {
76
0
    error("unsupported relocation target while parsing debug info");
77
0
    return None;
78
0
  }
79
0
  uint64_t Val = DR->Value + getAddend<ELFT>(Rel);
80
0
81
0
  // FIXME: We should be consistent about always adding the file
82
0
  // offset or not.
83
0
  if (DR->Section->Flags & ELF::SHF_ALLOC)
84
0
    Val += cast<InputSection>(DR->Section)->getOffsetInFile();
85
0
86
0
  return RelocAddrEntry{SecIndex, Val};
87
0
}
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, true> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, true> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, true> >) const
Unexecuted instantiation: llvm::Optional<llvm::RelocAddrEntry> lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, true> >::findAux<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, false> >(lld::elf::InputSectionBase const&, unsigned long long, llvm::ArrayRef<llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)0, true>, false> >) const
88
89
template <class ELFT>
90
Optional<RelocAddrEntry> LLDDwarfObj<ELFT>::find(const llvm::DWARFSection &S,
91
137
                                                 uint64_t Pos) const {
92
137
  auto &Sec = static_cast<const LLDDWARFSection &>(S);
93
137
  if (Sec.Sec->AreRelocsRela)
94
123
    return findAux(*Sec.Sec, Pos, Sec.Sec->template relas<ELFT>());
95
14
  return findAux(*Sec.Sec, Pos, Sec.Sec->template rels<ELFT>());
96
14
}
lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, false> >::find(llvm::DWARFSection const&, unsigned long long) const
Line
Count
Source
91
9
                                                 uint64_t Pos) const {
92
9
  auto &Sec = static_cast<const LLDDWARFSection &>(S);
93
9
  if (Sec.Sec->AreRelocsRela)
94
0
    return findAux(*Sec.Sec, Pos, Sec.Sec->template relas<ELFT>());
95
9
  return findAux(*Sec.Sec, Pos, Sec.Sec->template rels<ELFT>());
96
9
}
Unexecuted instantiation: lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, false> >::find(llvm::DWARFSection const&, unsigned long long) const
lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)1, true> >::find(llvm::DWARFSection const&, unsigned long long) const
Line
Count
Source
91
128
                                                 uint64_t Pos) const {
92
128
  auto &Sec = static_cast<const LLDDWARFSection &>(S);
93
128
  if (Sec.Sec->AreRelocsRela)
94
123
    return findAux(*Sec.Sec, Pos, Sec.Sec->template relas<ELFT>());
95
5
  return findAux(*Sec.Sec, Pos, Sec.Sec->template rels<ELFT>());
96
5
}
Unexecuted instantiation: lld::elf::LLDDwarfObj<llvm::object::ELFType<(llvm::support::endianness)0, true> >::find(llvm::DWARFSection const&, unsigned long long) const
97
98
template class elf::LLDDwarfObj<ELF32LE>;
99
template class elf::LLDDwarfObj<ELF32BE>;
100
template class elf::LLDDwarfObj<ELF64LE>;
101
template class elf::LLDDwarfObj<ELF64BE>;