xref: /freebsd/contrib/llvm-project/lld/ELF/DWARF.h (revision 6419bb52)
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
98