//===- lib/ReaderWriter/MachO/File.h ----------------------------*- C++ -*-===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLD_READER_WRITER_MACHO_DEBUGINFO_H #define LLD_READER_WRITER_MACHO_DEBUGINFO_H #include "lld/Core/Atom.h" #include #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 allocator) { _allocator = std::move(allocator); } protected: DebugInfo(Kind kind) : _kind(kind) {} private: std::unique_ptr _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 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