/* Subroutines for the D front end on the HPPA architecture.
   Copyright (C) 2018-2021 Free Software Foundation, Inc.

GCC 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, or (at your option)
any later version.

GCC 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 GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#define IN_TARGET_CODE 1

#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "target.h"
#include "d/d-target.h"
#include "d/d-target-def.h"

/* Implement TARGET_D_CPU_VERSIONS for HPPA targets.  */

void
pa_d_target_versions (void)
{
  if (TARGET_64BIT)
    d_add_builtin_version ("HPPA64");
  else
    d_add_builtin_version ("HPPA");

  if (TARGET_SOFT_FLOAT)
    d_add_builtin_version ("D_SoftFloat");
  else
    d_add_builtin_version ("D_HardFloat");
}

/* Handle a call to `__traits(getTargetInfo, "floatAbi")'.  */

static tree
pa_d_handle_target_float_abi (void)
{
  const char *abi;

  if (TARGET_SOFT_FLOAT)
    abi = "soft";
  else
    abi = "hard";

  return build_string_literal (strlen (abi) + 1, abi);
}

/* Handle a call to `__traits(getTargetInfo, "objectFormat")'.  */

static tree
pa_d_handle_target_object_format (void)
{
  const char *objfmt = NULL;

  if (TARGET_SOM)
    objfmt = "som";

  if (objfmt == NULL)
    return NULL_TREE;

  return build_string_literal (strlen (objfmt) + 1, objfmt);
}

/* Implement TARGET_D_REGISTER_CPU_TARGET_INFO.  */

void
pa_d_register_target_info (void)
{
  const struct d_target_info_spec handlers[] = {
    { "floatAbi", pa_d_handle_target_float_abi },
    { "objectFormat", pa_d_handle_target_object_format },
    { NULL, NULL },
  };

  d_add_target_info_handlers (handlers);
}
