]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/lld/ELF/DWARF.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[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 &getLoclistsSection() const override {
36     return loclistsSection;
37   }
38
39   const llvm::DWARFSection &getRangesSection() const override {
40     return rangesSection;
41   }
42
43   const llvm::DWARFSection &getRnglistsSection() const override {
44     return rnglistsSection;
45   }
46
47   const llvm::DWARFSection &getStrOffsetsSection() const override {
48     return strOffsetsSection;
49   }
50
51   const llvm::DWARFSection &getLineSection() const override {
52     return lineSection;
53   }
54
55   const llvm::DWARFSection &getAddrSection() const override {
56     return addrSection;
57   }
58
59   const LLDDWARFSection &getGnuPubnamesSection() const override {
60     return gnuPubnamesSection;
61   }
62
63   const LLDDWARFSection &getGnuPubtypesSection() const override {
64     return gnuPubtypesSection;
65   }
66
67   StringRef getFileName() const override { return ""; }
68   StringRef getAbbrevSection() const override { return abbrevSection; }
69   StringRef getStrSection() const override { return strSection; }
70   StringRef getLineStrSection() const override { return lineStrSection; }
71
72   bool isLittleEndian() const override {
73     return ELFT::TargetEndianness == llvm::support::little;
74   }
75
76   llvm::Optional<llvm::RelocAddrEntry> find(const llvm::DWARFSection &sec,
77                                             uint64_t pos) const override;
78
79 private:
80   template <class RelTy>
81   llvm::Optional<llvm::RelocAddrEntry> findAux(const InputSectionBase &sec,
82                                                uint64_t pos,
83                                                ArrayRef<RelTy> rels) const;
84
85   LLDDWARFSection gnuPubnamesSection;
86   LLDDWARFSection gnuPubtypesSection;
87   LLDDWARFSection infoSection;
88   LLDDWARFSection loclistsSection;
89   LLDDWARFSection rangesSection;
90   LLDDWARFSection rnglistsSection;
91   LLDDWARFSection strOffsetsSection;
92   LLDDWARFSection lineSection;
93   LLDDWARFSection addrSection;
94   StringRef abbrevSection;
95   StringRef strSection;
96   StringRef lineStrSection;
97 };
98
99 } // namespace elf
100 } // namespace lld
101
102 #endif