//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

#include "llvm/DebugInfo/DWARF/DWARFExpressionUnit.h"
#include "DWARFExpressionPrinterImpl.h"
#include "llvm/DebugInfo/DWARF/DWARFUnit.h"
#include "llvm/Support/FormatVariadic.h"
#include <cassert>

using namespace llvm;

static void prettyPrintBaseTypeRef(DWARFUnit *U, raw_ostream &OS,
                                   DIDumpOptions DumpOpts,
                                   ArrayRef<uint64_t> Operands,
                                   unsigned Operand) {
  assert(Operand < Operands.size() && "operand out of bounds");
  auto Die = U->getDIEForOffset(U->getOffset() + Operands[Operand]);
  if (Die && Die.getTag() == dwarf::DW_TAG_base_type) {
    OS << " (";
    if (DumpOpts.Verbose)
      OS << formatv("{0:x8} -> ", Operands[Operand]);
    OS << formatv("{0:x8})", U->getOffset() + Operands[Operand]);
    if (auto Name = dwarf::toString(Die.find(dwarf::DW_AT_name)))
      OS << " \"" << *Name << "\"";
  } else {
    OS << formatv(" <invalid base_type ref: {0:x}>", Operands[Operand]);
  }
}

void llvm::printDwarfExpression(const DWARFExpression *E, raw_ostream &OS,
                                DIDumpOptions DumpOpts, DWARFUnit *U,
                                bool IsEH) {
  auto PrintBaseTypeRef = [U](raw_ostream &OS, DIDumpOptions DumpOpts,
                              ArrayRef<uint64_t> Operands, unsigned Operand) {
    prettyPrintBaseTypeRef(U, OS, DumpOpts, Operands, Operand);
  };
  detail::printDwarfExpression(
      E, OS, DumpOpts,
      U ? detail::BaseTypeRefPrinter(PrintBaseTypeRef) : nullptr, IsEH);
}

bool llvm::prettyPrintRegisterOp(DWARFUnit *U, raw_ostream &OS,
                                 DIDumpOptions DumpOpts, uint8_t Opcode,
                                 ArrayRef<uint64_t> Operands) {
  auto PrintBaseTypeRef = [U](raw_ostream &OS, DIDumpOptions DumpOpts,
                              ArrayRef<uint64_t> Operands, unsigned Operand) {
    prettyPrintBaseTypeRef(U, OS, DumpOpts, Operands, Operand);
  };
  return detail::prettyPrintRegisterOp(
      U ? detail::BaseTypeRefPrinter(PrintBaseTypeRef) : nullptr, OS, DumpOpts,
      Opcode, Operands);
}
