//===-- DumpRegisterValue.cpp -----------------------------------*- 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
//
//===----------------------------------------------------------------------===//

#include "lldb/Core/DumpRegisterValue.h"
#include "lldb/Core/DumpDataExtractor.h"
#include "lldb/Utility/DataExtractor.h"
#include "lldb/Utility/RegisterValue.h"
#include "lldb/Utility/StreamString.h"
#include "lldb/lldb-private-types.h"

using namespace lldb;

bool lldb_private::DumpRegisterValue(const RegisterValue &reg_val, Stream *s,
                                     const RegisterInfo *reg_info,
                                     bool prefix_with_name,
                                     bool prefix_with_alt_name, Format format,
                                     uint32_t reg_name_right_align_at) {
  DataExtractor data;
  if (reg_val.GetData(data)) {
    bool name_printed = false;
    // For simplicity, alignment of the register name printing applies only in
    // the most common case where:
    //
    //     prefix_with_name^prefix_with_alt_name is true
    //
    StreamString format_string;
    if (reg_name_right_align_at && (prefix_with_name ^ prefix_with_alt_name))
      format_string.Printf("%%%us", reg_name_right_align_at);
    else
      format_string.Printf("%%s");
    std::string fmt = format_string.GetString();
    if (prefix_with_name) {
      if (reg_info->name) {
        s->Printf(fmt.c_str(), reg_info->name);
        name_printed = true;
      } else if (reg_info->alt_name) {
        s->Printf(fmt.c_str(), reg_info->alt_name);
        prefix_with_alt_name = false;
        name_printed = true;
      }
    }
    if (prefix_with_alt_name) {
      if (name_printed)
        s->PutChar('/');
      if (reg_info->alt_name) {
        s->Printf(fmt.c_str(), reg_info->alt_name);
        name_printed = true;
      } else if (!name_printed) {
        // No alternate name but we were asked to display a name, so show the
        // main name
        s->Printf(fmt.c_str(), reg_info->name);
        name_printed = true;
      }
    }
    if (name_printed)
      s->PutCString(" = ");

    if (format == eFormatDefault)
      format = reg_info->format;

    DumpDataExtractor(data, s,
                      0,                    // Offset in "data"
                      format,               // Format to use when dumping
                      reg_info->byte_size,  // item_byte_size
                      1,                    // item_count
                      UINT32_MAX,           // num_per_line
                      LLDB_INVALID_ADDRESS, // base_addr
                      0,                    // item_bit_size
                      0);                   // item_bit_offset
    return true;
  }
  return false;
}
