//===- 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/ADT/StringRef.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/Support/DataExtractor.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"
#include <cstdint>

using namespace llvm;
using namespace 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(raw_ostream &OS) const {
  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 =
            GDBIndexEntryLinkageString(E.Descriptor.Linkage);
        StringRef EntryKind = dwarf::GDBIndexEntryKindString(E.Descriptor.Kind);
        OS << format("%-8s", EntryLinkage.data()) << ' '
           << format("%-8s", EntryKind.data()) << ' ';
      }
      OS << '\"' << E.Name << "\"\n";
    }
  }
}
