106 lines · c
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-exception6//7//===-------------------------------------------------------------------===//8 9#ifndef LLD_ELF_DWARF_H10#define LLD_ELF_DWARF_H11 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>(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::elf104 105#endif106