//===- DWARF.h -----------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===-------------------------------------------------------------------===//

#ifndef LLD_ELF_DWARF_H
#define LLD_ELF_DWARF_H

#include "InputFiles.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
#include "llvm/Object/ELF.h"

namespace lld {
namespace elf {

class InputSection;

struct LLDDWARFSection final : public llvm::DWARFSection {
  InputSectionBase *sec = nullptr;
};

template <class ELFT> class LLDDwarfObj final : public llvm::DWARFObject {
public:
  explicit LLDDwarfObj(ObjFile<ELFT> *obj);

  void forEachInfoSections(
      llvm::function_ref<void(const llvm::DWARFSection &)> f) const override {
    f(infoSection);
  }

  InputSection *getInfoSection() const {
    return cast<InputSection>(infoSection.sec);
  }

  const llvm::DWARFSection &getLoclistsSection() const override {
    return loclistsSection;
  }

  const llvm::DWARFSection &getRangesSection() const override {
    return rangesSection;
  }

  const llvm::DWARFSection &getRnglistsSection() const override {
    return rnglistsSection;
  }

  const llvm::DWARFSection &getStrOffsetsSection() const override {
    return strOffsetsSection;
  }

  const llvm::DWARFSection &getLineSection() const override {
    return lineSection;
  }

  const llvm::DWARFSection &getAddrSection() const override {
    return addrSection;
  }

  const LLDDWARFSection &getGnuPubnamesSection() const override {
    return gnuPubnamesSection;
  }

  const LLDDWARFSection &getGnuPubtypesSection() const override {
    return gnuPubtypesSection;
  }

  StringRef getFileName() const override { return ""; }
  StringRef getAbbrevSection() const override { return abbrevSection; }
  StringRef getStrSection() const override { return strSection; }
  StringRef getLineStrSection() const override { return lineStrSection; }

  bool isLittleEndian() const override {
    return ELFT::TargetEndianness == llvm::support::little;
  }

  llvm::Optional<llvm::RelocAddrEntry> find(const llvm::DWARFSection &sec,
                                            uint64_t pos) const override;

private:
  template <class RelTy>
  llvm::Optional<llvm::RelocAddrEntry> findAux(const InputSectionBase &sec,
                                               uint64_t pos,
                                               ArrayRef<RelTy> rels) const;

  LLDDWARFSection gnuPubnamesSection;
  LLDDWARFSection gnuPubtypesSection;
  LLDDWARFSection infoSection;
  LLDDWARFSection loclistsSection;
  LLDDWARFSection rangesSection;
  LLDDWARFSection rnglistsSection;
  LLDDWARFSection strOffsetsSection;
  LLDDWARFSection lineSection;
  LLDDWARFSection addrSection;
  StringRef abbrevSection;
  StringRef strSection;
  StringRef lineStrSection;
};

} // namespace elf
} // namespace lld

#endif
