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

Provided by KDAB

Privacy Policy
Learn to use CMake with our Intro Training
Find out more

source code of lld/ELF/DWARF.h