]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/lld/ELF/DWARF.h
MFV: r361597
[FreeBSD/FreeBSD.git] / contrib / llvm-project / lld / ELF / DWARF.h
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
17 namespace lld {
18 namespace elf {
19
20 class InputSection;
21
22 struct LLDDWARFSection final : public llvm::DWARFSection {
23   InputSectionBase *sec = nullptr;
24 };
25
26 template <class ELFT> class LLDDwarfObj final : public llvm::DWARFObject {
27 public:
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
75 private:
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