//===- llvm/CodeGen/DwarfStringPoolEntry.h - String pool entry --*- 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 LLVM_CODEGEN_DWARFSTRINGPOOLENTRY_H
#define LLVM_CODEGEN_DWARFSTRINGPOOLENTRY_H

#include "llvm/ADT/PointerIntPair.h"
#include "llvm/ADT/StringMap.h"

namespace llvm {

class MCSymbol;

/// Data for a string pool entry.
struct DwarfStringPoolEntry {
  static constexpr unsigned NotIndexed = -1;

  MCSymbol *Symbol;
  unsigned Offset;
  unsigned Index;

  bool isIndexed() const { return Index != NotIndexed; }
};

/// String pool entry reference.
class DwarfStringPoolEntryRef {
  PointerIntPair<const StringMapEntry<DwarfStringPoolEntry> *, 1, bool>
      MapEntryAndIndexed;

  const StringMapEntry<DwarfStringPoolEntry> *getMapEntry() const {
    return MapEntryAndIndexed.getPointer();
  }

public:
  DwarfStringPoolEntryRef() = default;
  DwarfStringPoolEntryRef(const StringMapEntry<DwarfStringPoolEntry> &Entry,
                          bool Indexed)
      : MapEntryAndIndexed(&Entry, Indexed) {}

  explicit operator bool() const { return getMapEntry(); }
  MCSymbol *getSymbol() const {
    assert(getMapEntry()->second.Symbol && "No symbol available!");
    return getMapEntry()->second.Symbol;
  }
  unsigned getOffset() const { return getMapEntry()->second.Offset; }
  bool isIndexed() const { return MapEntryAndIndexed.getInt(); }
  unsigned getIndex() const {
    assert(isIndexed());
    assert(getMapEntry()->getValue().isIndexed());
    return getMapEntry()->second.Index;
  }
  StringRef getString() const { return getMapEntry()->first(); }
  /// Return the entire string pool entry for convenience.
  DwarfStringPoolEntry getEntry() const { return getMapEntry()->getValue(); }

  bool operator==(const DwarfStringPoolEntryRef &X) const {
    return getMapEntry() == X.getMapEntry();
  }
  bool operator!=(const DwarfStringPoolEntryRef &X) const {
    return getMapEntry() != X.getMapEntry();
  }
};

} // end namespace llvm

#endif
