xref: /freebsd/contrib/llvm-project/lld/ELF/DWARF.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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/ADT/STLFunctionalExtras.h"
15 #include "llvm/DebugInfo/DWARF/DWARFContext.h"
16 #include "llvm/Object/ELF.h"
17 #include <optional>
18 
19 namespace lld::elf {
20 
21 class InputSection;
22 
23 struct LLDDWARFSection final : public llvm::DWARFSection {
24   InputSectionBase *sec = nullptr;
25 };
26 
27 template <class ELFT> class LLDDwarfObj final : public llvm::DWARFObject {
28 public:
29   explicit LLDDwarfObj(ObjFile<ELFT> *obj);
30 
forEachInfoSections(llvm::function_ref<void (const llvm::DWARFSection &)> f)31   void forEachInfoSections(
32       llvm::function_ref<void(const llvm::DWARFSection &)> f) const override {
33     f(infoSection);
34   }
35 
getInfoSection()36   InputSection *getInfoSection() const {
37     return cast<InputSection>(infoSection.sec);
38   }
39 
getAddrSection()40   const llvm::DWARFSection &getAddrSection() const override {
41     return addrSection;
42   }
getLineSection()43   const llvm::DWARFSection &getLineSection() const override {
44     return lineSection;
45   }
getLoclistsSection()46   const llvm::DWARFSection &getLoclistsSection() const override {
47     return loclistsSection;
48   }
getRangesSection()49   const llvm::DWARFSection &getRangesSection() const override {
50     return rangesSection;
51   }
getRnglistsSection()52   const llvm::DWARFSection &getRnglistsSection() const override {
53     return rnglistsSection;
54   }
getStrOffsetsSection()55   const llvm::DWARFSection &getStrOffsetsSection() const override {
56     return strOffsetsSection;
57   }
58 
getGnuPubnamesSection()59   const LLDDWARFSection &getGnuPubnamesSection() const override {
60     return gnuPubnamesSection;
61   }
getGnuPubtypesSection()62   const LLDDWARFSection &getGnuPubtypesSection() const override {
63     return gnuPubtypesSection;
64   }
getNamesSection()65   const LLDDWARFSection &getNamesSection() const override {
66     return namesSection;
67   }
68 
getFileName()69   StringRef getFileName() const override { return ""; }
getAbbrevSection()70   StringRef getAbbrevSection() const override { return abbrevSection; }
getStrSection()71   StringRef getStrSection() const override { return strSection; }
getLineStrSection()72   StringRef getLineStrSection() const override { return lineStrSection; }
73 
isLittleEndian()74   bool isLittleEndian() const override {
75     return ELFT::Endianness == llvm::endianness::little;
76   }
77 
78   std::optional<llvm::RelocAddrEntry> find(const llvm::DWARFSection &sec,
79                                            uint64_t pos) const override;
80 
81 private:
82   template <class RelTy>
83   std::optional<llvm::RelocAddrEntry> findAux(const InputSectionBase &sec,
84                                               uint64_t pos,
85                                               ArrayRef<RelTy> rels) const;
86 
87   LLDDWARFSection addrSection;
88   LLDDWARFSection gnuPubnamesSection;
89   LLDDWARFSection gnuPubtypesSection;
90   LLDDWARFSection infoSection;
91   LLDDWARFSection lineSection;
92   LLDDWARFSection loclistsSection;
93   LLDDWARFSection namesSection;
94   LLDDWARFSection rangesSection;
95   LLDDWARFSection rnglistsSection;
96   LLDDWARFSection strOffsetsSection;
97   StringRef abbrevSection;
98   StringRef lineStrSection;
99   StringRef strSection;
100 };
101 
102 } // namespace lld::elf
103 
104 #endif
105