//===-- lldb-private-types.h ------------------------------------*- 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 liblldb_lldb_private_types_h_
#define liblldb_lldb_private_types_h_

#if defined(__cplusplus)

#include "lldb/lldb-private.h"

#include "llvm/ADT/ArrayRef.h"

namespace llvm {
namespace sys {
class DynamicLibrary;
}
}

namespace lldb_private {
class Platform;
class ExecutionContext;

typedef llvm::sys::DynamicLibrary (*LoadPluginCallbackType)(
    const lldb::DebuggerSP &debugger_sp, const FileSpec &spec, Status &error);

// Every register is described in detail including its name, alternate name
// (optional), encoding, size in bytes and the default display format.
struct RegisterInfo {
  const char *name;     // Name of this register, can't be NULL
  const char *alt_name; // Alternate name of this register, can be NULL
  uint32_t byte_size;   // Size in bytes of the register
  uint32_t byte_offset; // The byte offset in the register context data where
                        // this register's value is found.
  // This is optional, and can be 0 if a particular RegisterContext does not
  // need to address its registers by byte offset.
  lldb::Encoding encoding;                 // Encoding of the register bits
  lldb::Format format;                     // Default display format
  uint32_t kinds[lldb::kNumRegisterKinds]; // Holds all of the various register
                                           // numbers for all register kinds
  uint32_t *value_regs;                    // List of registers (terminated with
                        // LLDB_INVALID_REGNUM).  If this value is not null,
                        // all registers in this list will be read first, at
                        // which point the value for this register will be
                        // valid.  For example, the value list for ah would be
                        // eax (x86) or rax (x64).
  uint32_t *invalidate_regs; // List of registers (terminated with
                             // LLDB_INVALID_REGNUM).  If this value is not
                             // null, all registers in this list will be
                             // invalidated when the value of this register
                             // changes.  For example, the invalidate list for
                             // eax would be rax ax, ah, and al.
  const uint8_t *dynamic_size_dwarf_expr_bytes; // A DWARF expression that when
                                                // evaluated gives
  // the byte size of this register.
  size_t dynamic_size_dwarf_len; // The length of the DWARF expression in bytes
                                 // in the dynamic_size_dwarf_expr_bytes
                                 // member.

  llvm::ArrayRef<uint8_t> data(const uint8_t *context_base) const {
    return llvm::ArrayRef<uint8_t>(context_base + byte_offset, byte_size);
  }

  llvm::MutableArrayRef<uint8_t> mutable_data(uint8_t *context_base) const {
    return llvm::MutableArrayRef<uint8_t>(context_base + byte_offset,
                                          byte_size);
  }
};

// Registers are grouped into register sets
struct RegisterSet {
  const char *name;          // Name of this register set
  const char *short_name;    // A short name for this register set
  size_t num_registers;      // The number of registers in REGISTERS array below
  const uint32_t *registers; // An array of register indices in this set.  The
                             // values in this array are
  // *indices* (not register numbers) into a particular RegisterContext's
  // register array.  For example, if eax is defined at index 4 for a
  // particular RegisterContext, eax would be included in this RegisterSet by
  // adding the value 4.  Not by adding the value lldb_eax_i386.
};

struct OptionEnumValueElement {
  int64_t value;
  const char *string_value;
  const char *usage;
};

using OptionEnumValues = llvm::ArrayRef<OptionEnumValueElement>;

struct OptionValidator {
  virtual ~OptionValidator() {}
  virtual bool IsValid(Platform &platform,
                       const ExecutionContext &target) const = 0;
  virtual const char *ShortConditionString() const = 0;
  virtual const char *LongConditionString() const = 0;
};

struct OptionDefinition {
  uint32_t usage_mask; // Used to mark options that can be used together.  If (1
                       // << n & usage_mask) != 0
                       // then this option belongs to option set n.
  bool required;       // This option is required (in the current usage level)
  const char *long_option; // Full name for this option.
  int short_option;        // Single character for this option.
  int option_has_arg; // no_argument, required_argument or optional_argument
  OptionValidator *validator; // If non-NULL, option is valid iff
                              // |validator->IsValid()|, otherwise always valid.
  OptionEnumValues enum_values; // If not empty, an array of enum values.
  uint32_t completion_type; // Cookie the option class can use to do define the
                            // argument completion.
  lldb::CommandArgumentType argument_type; // Type of argument this option takes
  const char *usage_text; // Full text explaining what this options does and
                          // what (if any) argument to
                          // pass it.
};

typedef struct type128 { uint64_t x[2]; } type128;
typedef struct type256 { uint64_t x[4]; } type256;

} // namespace lldb_private

#endif // #if defined(__cplusplus)

#endif // liblldb_lldb_private_types_h_
