/* General-purpose hooks.
   Copyright (C) 2002-2021 Free Software Foundation, Inc.

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

   In other words, you are welcome to use, share and improve this program.
   You are forbidden to forbid anyone else to use, share and improve
   what you give them.   Help stamp out software-hoarding!  */

/* This file contains generic hooks that can be used as defaults for
   target or language-dependent hook initializers.  */

#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "hooks.h"

/* Generic hook that does absolutely zappo.  */
void
hook_void_void (void)
{
}

/* Generic hook that takes no arguments and returns false.  */
bool
hook_bool_void_false (void)
{
  return false;
}

/* Generic hook that takes no arguments and returns true.  */
bool
hook_bool_void_true (void)
{
  return true;
}

/* Generic hook that takes (bool) and returns false.  */
bool
hook_bool_bool_false (bool)
{
  return false;
}

/* Generic hook that takes (bool, struct gcc_options *) and returns false.  */
bool
hook_bool_bool_gcc_optionsp_false (bool, struct gcc_options *)
{
  return false;
}

/* Generic hook that takes const int, const int) and returns true.  */
bool hook_bool_const_int_const_int_true (const int, const int)
{
  return true;
}

/* Generic hook that takes (machine_mode) and returns false.  */
bool
hook_bool_mode_false (machine_mode)
{
  return false;
}

/* Generic hook that takes (machine_mode) and returns true.  */
bool
hook_bool_mode_true (machine_mode)
{
  return true;
}

/* Generic hook that takes (machine_mode, machine_mode) and returns true.  */
bool
hook_bool_mode_mode_true (machine_mode, machine_mode)
{
  return true;
}

/* Generic hook that takes (machine_mode, const_rtx) and returns false.  */
bool
hook_bool_mode_const_rtx_false (machine_mode, const_rtx)
{
  return false;
}

/* Generic hook that takes (machine_mode, const_rtx) and returns true.  */
bool
hook_bool_mode_const_rtx_true (machine_mode, const_rtx)
{
  return true;
}

/* Generic hook that takes (machine_mode, rtx) and returns false.  */
bool
hook_bool_mode_rtx_false (machine_mode, rtx)
{
  return false;
}

/* Generic hook that takes (machine_mode, rtx) and returns true.  */
bool
hook_bool_mode_rtx_true (machine_mode, rtx)
{
  return true;
}

/* Generic hook that takes (const rtx_insn *, const rtx_insn *) and returns true.  */
bool
hook_bool_const_rtx_insn_const_rtx_insn_true (const rtx_insn *,
					      const rtx_insn *)
{
  return true;
}

/* Generic hook that takes (machine_mode, unsigned HOST_WIDE_INT)
   and returns false.  */
bool
hook_bool_mode_uhwi_false (machine_mode, unsigned HOST_WIDE_INT)
{
  return false;
}

/* Generic hook that takes (poly_uint64, poly_uint64) and returns true.  */
bool
hook_bool_puint64_puint64_true (poly_uint64, poly_uint64)
{
  return true;
}

bool
hook_bool_uint_uint_mode_false (unsigned int, unsigned int, machine_mode)
{
  return false;
}

/* Generic hook that takes (unsigned int, machine_mode) and returns true.  */
bool
hook_bool_uint_mode_true (unsigned int, machine_mode)
{
  return true;
}

/* Generic hook that takes (FILE *, const char *) and does nothing.  */
void
hook_void_FILEptr_constcharptr (FILE *, const char *)
{
}

/* Generic hook that takes (FILE *, const char *, constr_tree *) and does
   nothing.  */
void
hook_void_FILEptr_constcharptr_const_tree (FILE *, const char *, const_tree)
{
}

/* Generic hook that takes (FILE *, rtx) and returns false.  */
bool
hook_bool_FILEptr_rtx_false (FILE *, rtx)
{
  return false;
}

/* Generic hook that takes (gimple_stmt_iterator *) and returns
   false.  */
bool
hook_bool_gsiptr_false (gimple_stmt_iterator *)
{
  return false;
}

/* Used for the TARGET_ASM_CAN_OUTPUT_MI_THUNK hook.  */
bool
hook_bool_const_tree_hwi_hwi_const_tree_false (const_tree, HOST_WIDE_INT,
					       HOST_WIDE_INT, const_tree)
{
  return false;
}

bool
hook_bool_const_tree_hwi_hwi_const_tree_true (const_tree, HOST_WIDE_INT,
					      HOST_WIDE_INT, const_tree)
{
  return true;
}

bool
default_can_output_mi_thunk_no_vcall (const_tree, HOST_WIDE_INT,
				      HOST_WIDE_INT c, const_tree)
{
  return c == 0;
}

int
hook_int_uint_mode_1 (unsigned int, machine_mode)
{
  return 1;
}

int
hook_int_const_tree_0 (const_tree)
{
  return 0;
}

/* ??? Used for comp_type_attributes, which ought to return bool.  */
int
hook_int_const_tree_const_tree_1 (const_tree, const_tree)
{
  return 1;
}

int
hook_int_rtx_0 (rtx)
{
  return 0;
}

int
hook_int_rtx_1 (rtx)
{
  return 1;
}

int
hook_int_rtx_insn_0 (rtx_insn *)
{
  return 0;
}

int
hook_int_rtx_insn_unreachable (rtx_insn *)
{
  gcc_unreachable ();
}

int
hook_int_rtx_bool_0 (rtx, bool)
{
  return 0;
}

int
hook_int_rtx_mode_as_bool_0 (rtx, machine_mode, addr_space_t, bool)
{
  return 0;
}

unsigned int
hook_uint_void_0 (void)
{
  return 0;
}

HOST_WIDE_INT
hook_hwi_void_0 (void)
{
  return 0;
}

void
hook_void_tree (tree)
{
}

void
hook_void_FILEptr_tree (FILE *, tree)
{
}

void
hook_void_rtx_tree (rtx, tree)
{
}

void
hook_void_constcharptr (const char *)
{
}

void
hook_void_tree_treeptr (tree, tree *)
{
}

void
hook_void_int_int (int, int)
{
}

bool
hook_bool_tree_false (tree)
{
  return false;
}

bool
hook_bool_const_tree_false (const_tree)
{
  return false;
}

bool
hook_bool_const_tree_const_tree_true (const_tree, const_tree)
{
  return true;
}

bool
hook_bool_tree_true (tree)
{
  return true;
}

bool
hook_bool_const_tree_true (const_tree)
{
  return true;
}

bool
hook_bool_tree_tree_false (tree, tree)
{
  return false;
}

bool
hook_bool_tree_tree_true (tree, tree)
{
  return true;
}

bool
hook_bool_tree_bool_false (tree, bool)
{
  return false;
}

bool
hook_bool_rtx_insn_true (rtx_insn *)
{
  return true;
}

bool
hook_bool_rtx_false (rtx)
{
  return false;
}

bool
hook_bool_uintp_uintp_false (unsigned int *, unsigned int *)
{
  return false;
}

bool
hook_bool_rtx_mode_int_int_intp_bool_false (rtx, machine_mode, int, int,
					    int *, bool)
{
  return false;
}

bool
hook_bool_wint_wint_uint_bool_true (const widest_int &, const widest_int &,
				    unsigned int, bool)
{
  return true;
}

/* Generic hook that takes an rtx and returns it.  */
rtx
hook_rtx_rtx_identity (rtx x)
{
  return x;
}

/* Generic hook that takes an rtx and returns NULL_RTX.  */
rtx
hook_rtx_rtx_null (rtx)
{
  return NULL;
}

/* Generic hook that takes a tree and an int and returns NULL_RTX.  */
rtx
hook_rtx_tree_int_null (tree, int)
{
  return NULL;
}

/* Generic hook that takes a machine mode and returns an unsigned int 0.  */
unsigned int
hook_uint_mode_0 (machine_mode)
{
  return 0;
}

/* Generic hook that takes no arguments and returns a NULL const string.  */
const char *
hook_constcharptr_void_null (void)
{
  return NULL;
}

/* Generic hook that takes no arguments and returns a NULL string.  */
char *
hook_charptr_void_null (void)
{
  return NULL;
}

/* Generic hook that takes a tree and returns a NULL string.  */
const char *
hook_constcharptr_const_tree_null (const_tree)
{
  return NULL;
}

tree
hook_tree_tree_int_treep_bool_null (tree, int, tree *, bool)
{
  return NULL;
}

tree
hook_tree_tree_bool_null (tree, bool)
{
  return NULL;
}

tree
hook_tree_tree_tree_null (tree, tree)
{
  return NULL;
}

tree
hook_tree_tree_tree_tree_null (tree, tree, tree)
{
  return NULL;
}

tree
hook_tree_treeptr_tree_tree_int_boolptr_null (tree *, tree, tree, int, bool *)
{
  return NULL;
}

/* Generic hook that takes an rtx_insn *and returns a NULL string.  */
const char *
hook_constcharptr_const_rtx_insn_null (const rtx_insn *)
{
  return NULL;
}

const char *
hook_constcharptr_const_tree_const_tree_null (const_tree, const_tree)
{
  return NULL;
}

const char *
hook_constcharptr_int_const_tree_null (int, const_tree)
{
  return NULL;
}

const char *
hook_constcharptr_int_const_tree_const_tree_null (int, const_tree, const_tree)
{
  return NULL;
}

/* Generic hook that takes a const_tree and returns NULL_TREE.  */
tree
hook_tree_const_tree_null (const_tree)
{
  return NULL;
}

/* Generic hook that takes no arguments and returns a NULL_TREE.  */
tree
hook_tree_void_null (void)
{
  return NULL;
}

/* Generic hook that takes a rtx_insn * and an int and returns a bool.  */

bool
hook_bool_rtx_insn_int_false (rtx_insn *, int)
{
  return false;
}

/* Generic hook that takes a rtx_insn * and an int and returns void.  */

void
hook_void_rtx_insn_int (rtx_insn *, int)
{
}

/* Generic hook that takes a struct gcc_options * and returns void.  */

void
hook_void_gcc_optionsp (struct gcc_options *)
{
}

/* Generic hook that takes an unsigned int and returns true.  */

bool
hook_bool_uint_true (unsigned int)
{
  return true;
}

/* Generic hook that takes an unsigned int, an unsigned int pointer and
   returns false.  */

bool
hook_bool_uint_uintp_false (unsigned int, unsigned int *)
{
  return false;
}

/* Generic hook that takes a register class and returns false.  */
bool
hook_bool_reg_class_t_false (reg_class_t regclass ATTRIBUTE_UNUSED)
{
  return false;
}

/* Generic hook that takes 2 machine_modes and a register class and
   returns true.  */
bool
hook_bool_mode_mode_reg_class_t_true (machine_mode, machine_mode, reg_class_t)
{
  return true;
}

/* Generic hook that takes a machine_mode and 2 register classes
   and returns false.  */
bool
hook_bool_mode_reg_class_t_reg_class_t_false (machine_mode, reg_class_t,
					      reg_class_t)
{
  return false;
}

/* Generic hook that takes a mode and an unsigned HOST_WIDE_INT and
   returns no mode.  */

opt_machine_mode
hook_optmode_mode_uhwi_none (machine_mode, unsigned HOST_WIDE_INT)
{
  return opt_machine_mode ();
}
