1//===- DWARF.h -----------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===-------------------------------------------------------------------===//
8
9#ifndef LLD_ELF_DWARF_H
10#define LLD_ELF_DWARF_H
11
12#include "InputFiles.h"
13#include "llvm/ADT/STLExtras.h"
14#include "llvm/DebugInfo/DWARF/DWARFContext.h"
15#include "llvm/Object/ELF.h"
16
17namespace lld {
18namespace elf {
19
20class InputSection;
21
22struct LLDDWARFSection final : public llvm::DWARFSection {
23  InputSectionBase *sec = nullptr;
24};
25
26template <class ELFT> class LLDDwarfObj final : public llvm::DWARFObject {
27public:
28  explicit LLDDwarfObj(ObjFile<ELFT> *obj);
29
30  void forEachInfoSections(
31      llvm::function_ref<void(const llvm::DWARFSection &)> f) const override {
32    f(infoSection);
33  }
34
35  const llvm::DWARFSection &getRangesSection() const override {
36    return rangesSection;
37  }
38
39  const llvm::DWARFSection &getRnglistsSection() const override {
40    return rnglistsSection;
41  }
42
43  const llvm::DWARFSection &getStrOffsetsSection() const override {
44    return strOffsetsSection;
45  }
46
47  const llvm::DWARFSection &getLineSection() const override {
48    return lineSection;
49  }
50
51  const llvm::DWARFSection &getAddrSection() const override {
52    return addrSection;
53  }
54
55  const llvm::DWARFSection &getGnuPubnamesSection() const override {
56    return gnuPubnamesSection;
57  }
58
59  const llvm::DWARFSection &getGnuPubtypesSection() const override {
60    return gnuPubtypesSection;
61  }
62
63  StringRef getFileName() const override { return ""; }
64  StringRef getAbbrevSection() const override { return abbrevSection; }
65  StringRef getStrSection() const override { return strSection; }
66  StringRef getLineStrSection() const override { return lineStrSection; }
67
68  bool isLittleEndian() const override {
69    return ELFT::TargetEndianness == llvm::support::little;
70  }
71
72  llvm::Optional<llvm::RelocAddrEntry> find(const llvm::DWARFSection &sec,
73                                            uint64_t pos) const override;
74
75private:
76  template <class RelTy>
77  llvm::Optional<llvm::RelocAddrEntry> findAux(const InputSectionBase &sec,
78                                               uint64_t pos,
79                                               ArrayRef<RelTy> rels) const;
80
81  LLDDWARFSection gnuPubnamesSection;
82  LLDDWARFSection gnuPubtypesSection;
83  LLDDWARFSection infoSection;
84  LLDDWARFSection rangesSection;
85  LLDDWARFSection rnglistsSection;
86  LLDDWARFSection strOffsetsSection;
87  LLDDWARFSection lineSection;
88  LLDDWARFSection addrSection;
89  StringRef abbrevSection;
90  StringRef strSection;
91  StringRef lineStrSection;
92};
93
94} // namespace elf
95} // namespace lld
96
97#endif
98