/* Copyright (C) 2012-2017 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include "server.h"
#include "tdesc.h"
#include "regdef.h"

void
init_target_desc (struct target_desc *tdesc)
{
  int offset = 0;

  for (reg *reg : tdesc->reg_defs)
    {
      reg->offset = offset;
      offset += reg->size;
    }

  tdesc->registers_size = offset / 8;

  /* Make sure PBUFSIZ is large enough to hold a full register
     packet.  */
  gdb_assert (2 * tdesc->registers_size + 32 <= PBUFSIZ);
}

struct target_desc *
allocate_target_description (void)
{
  return new target_desc ();
}

#ifndef IN_PROCESS_AGENT

static const struct target_desc default_description {};

void
copy_target_description (struct target_desc *dest,
			 const struct target_desc *src)
{
  dest->reg_defs = src->reg_defs;
  dest->expedite_regs = src->expedite_regs;
  dest->registers_size = src->registers_size;
  dest->xmltarget = src->xmltarget;
}

const struct target_desc *
current_target_desc (void)
{
  if (current_thread == NULL)
    return &default_description;

  return current_process ()->tdesc;
}

/* See arch/tdesc.h.  */

void
set_tdesc_architecture (struct target_desc *target_desc,
			const char *name)
{
  target_desc->arch = xstrdup (name);
}

/* See arch/tdesc.h.  */

void
set_tdesc_osabi (struct target_desc *target_desc, const char *name)
{
  target_desc->osabi = xstrdup (name);
}

/* Return a string which is of XML format, including XML target
   description to be sent to GDB.  */

const char *
tdesc_get_features_xml (target_desc *tdesc)
{
  /* Either .xmltarget or .features is not NULL.  */
  gdb_assert (tdesc->xmltarget != NULL
	      || (tdesc->features != NULL
		  && tdesc->arch != NULL
		  && tdesc->osabi != NULL));

  if (tdesc->xmltarget == NULL)
    {
      std::string buffer ("@<?xml version=\"1.0\"?>");

      buffer += "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">";
      buffer += "<target>";
      buffer += "<architecture>";
      buffer += tdesc->arch;
      buffer += "</architecture>";

      buffer += "<osabi>";
      buffer += tdesc->osabi;
      buffer += "</osabi>";

      char *xml;

      for (int i = 0; VEC_iterate (char_ptr, tdesc->features, i, xml); i++)
	{
	  buffer += "<xi:include href=\"";
	  buffer += xml;
	  buffer += "\"/>";
	}

      buffer += "</target>";

      tdesc->xmltarget = xstrdup (buffer.c_str ());
    }

  return tdesc->xmltarget;
}
#endif

struct tdesc_type
{};

/* See arch/tdesc.h.  */

struct tdesc_feature *
tdesc_create_feature (struct target_desc *tdesc, const char *name,
		      const char *xml)
{
#ifndef IN_PROCESS_AGENT
  VEC_safe_push (char_ptr, tdesc->features, xstrdup (xml));
#endif
  return tdesc;
}

/* See arch/tdesc.h.  */

struct tdesc_type *
tdesc_create_flags (struct tdesc_feature *feature, const char *name,
		    int size)
{
  return NULL;
}

/* See arch/tdesc.h.  */

void
tdesc_add_flag (struct tdesc_type *type, int start,
		const char *flag_name)
{}

/* See arch/tdesc.h.  */

struct tdesc_type *
tdesc_named_type (const struct tdesc_feature *feature, const char *id)
{
  return NULL;
}

/* See arch/tdesc.h.  */

struct tdesc_type *
tdesc_create_union (struct tdesc_feature *feature, const char *id)
{
  return NULL;
}

/* See arch/tdesc.h.  */

struct tdesc_type *
tdesc_create_struct (struct tdesc_feature *feature, const char *id)
{
  return NULL;
}

/* See arch/tdesc.h.  */

void
tdesc_create_reg (struct tdesc_feature *feature, const char *name,
		  int regnum, int save_restore, const char *group,
		  int bitsize, const char *type)
{
  struct target_desc *tdesc = (struct target_desc *) feature;

  while (tdesc->reg_defs.size () < regnum)
    {
      struct reg *reg = XCNEW (struct reg);

      reg->name = "";
      reg->size = 0;
      tdesc->reg_defs.push_back (reg);
    }

  gdb_assert (regnum == 0
	      || regnum == tdesc->reg_defs.size ());

  struct reg *reg = XCNEW (struct reg);

  reg->name = name;
  reg->size = bitsize;
  tdesc->reg_defs.push_back (reg);
}

/* See arch/tdesc.h.  */

struct tdesc_type *
tdesc_create_vector (struct tdesc_feature *feature, const char *name,
		     struct tdesc_type *field_type, int count)
{
  return NULL;
}

void
tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
		    int start, int end)
{}

/* See arch/tdesc.h.  */

void
tdesc_add_field (struct tdesc_type *type, const char *field_name,
		 struct tdesc_type *field_type)
{}

/* See arch/tdesc.h.  */

void
tdesc_set_struct_size (struct tdesc_type *type, int size)
{
}
