//===- lib/ReaderWriter/MachO/File.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_READER_WRITER_MACHO_DEBUGINFO_H
#define LLD_READER_WRITER_MACHO_DEBUGINFO_H

#include "lld/Core/Atom.h"
#include <vector>

#include "llvm/Support/Allocator.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"


namespace lld {
namespace mach_o {

class DebugInfo {
public:
  enum class Kind {
    Dwarf,
    Stabs
  };

  Kind kind() const { return _kind; }

  void setAllocator(std::unique_ptr<llvm::BumpPtrAllocator> allocator) {
    _allocator = std::move(allocator);
  }

protected:
  DebugInfo(Kind kind) : _kind(kind) {}

private:
  std::unique_ptr<llvm::BumpPtrAllocator> _allocator;
  Kind _kind;
};

struct TranslationUnitSource {
  StringRef name;
  StringRef path;
};

class DwarfDebugInfo : public DebugInfo {
public:
  DwarfDebugInfo(TranslationUnitSource tu)
    : DebugInfo(Kind::Dwarf), _tu(std::move(tu)) {}

  static inline bool classof(const DebugInfo *di) {
    return di->kind() == Kind::Dwarf;
  }

  const TranslationUnitSource &translationUnitSource() const { return _tu; }

private:
  TranslationUnitSource _tu;
};

struct Stab {
  Stab(const Atom* atom, uint8_t type, uint8_t other, uint16_t desc,
       uint32_t value, StringRef str)
    : atom(atom), type(type), other(other), desc(desc), value(value),
      str(str) {}

  const class Atom*   atom;
  uint8_t             type;
  uint8_t             other;
  uint16_t            desc;
  uint32_t            value;
  StringRef           str;
};

inline raw_ostream& operator<<(raw_ostream &os, Stab &s) {
  os << "Stab -- atom: " << llvm::format("%p", s.atom) << ", type: " << (uint32_t)s.type
     << ", other: " << (uint32_t)s.other << ", desc: " << s.desc << ", value: " << s.value
     << ", str: '" << s.str << "'";
  return os;
}

class StabsDebugInfo : public DebugInfo {
public:

  typedef std::vector<Stab> StabsList;

  StabsDebugInfo(StabsList stabs)
    : DebugInfo(Kind::Stabs), _stabs(std::move(stabs)) {}

  static inline bool classof(const DebugInfo *di) {
    return di->kind() == Kind::Stabs;
  }

  const StabsList& stabs() const { return _stabs; }

public:
  StabsList _stabs;
};

} // end namespace mach_o
} // end namespace lld

#endif // LLD_READER_WRITER_MACHO_DEBUGINFO_H
