//===-- DWARFDebugPubTable.cpp ---------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"

using namespace llvm;
using namespace llvm::dwarf;

DWARFDebugPubTable::DWARFDebugPubTable(StringRef Data, bool LittleEndian,
                                       bool GnuStyle)
    : GnuStyle(GnuStyle) {
  DataExtractor PubNames(Data, LittleEndian, 0);
  uint32_t Offset = 0;
  while (PubNames.isValidOffset(Offset)) {
    Sets.push_back({});
    Set &SetData = Sets.back();

    SetData.Length = PubNames.getU32(&Offset);
    SetData.Version = PubNames.getU16(&Offset);
    SetData.Offset = PubNames.getU32(&Offset);
    SetData.Size = PubNames.getU32(&Offset);

    while (Offset < Data.size()) {
      uint32_t DieRef = PubNames.getU32(&Offset);
      if (DieRef == 0)
        break;
      uint8_t IndexEntryValue = GnuStyle ? PubNames.getU8(&Offset) : 0;
      const char *Name = PubNames.getCStr(&Offset);
      SetData.Entries.push_back(
          {DieRef, PubIndexEntryDescriptor(IndexEntryValue), Name});
    }
  }
}

void DWARFDebugPubTable::dump(StringRef Name, raw_ostream &OS) const {
  OS << "\n." << Name << " contents: a\n";
  for (const Set &S : Sets) {
    OS << "length = " << format("0x%08x", S.Length);
    OS << " version = " << format("0x%04x", S.Version);
    OS << " unit_offset = " << format("0x%08x", S.Offset);
    OS << " unit_size = " << format("0x%08x", S.Size) << '\n';
    OS << (GnuStyle ? "Offset     Linkage  Kind     Name\n"
                    : "Offset     Name\n");

    for (const Entry &E : S.Entries) {
      OS << format("0x%8.8x ", E.SecOffset);
      if (GnuStyle) {
        StringRef EntryLinkage =
            dwarf::GDBIndexEntryLinkageString(E.Descriptor.Linkage);
        StringRef EntryKind = dwarf::GDBIndexEntryKindString(E.Descriptor.Kind);
        OS << format("%-8s", EntryLinkage.data()) << ' '
           << format("%-8s", EntryKind.data()) << ' ';
      }
      OS << '\"' << E.Name << "\"\n";
    }
  }
}
