/* Target hook definitions for common hooks.
   Copyright (C) 2011-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/>.  */

/* See target-hooks-macros.h for details of macros that should be
   provided by the including file, and how to use them here.  */
#include "target-hooks-macros.h"

#undef HOOK_TYPE
#define HOOK_TYPE "Common Target Hook"

HOOK_VECTOR (TARGETM_COMMON_INITIALIZER, gcc_targetm_common)

#undef HOOK_PREFIX
#define HOOK_PREFIX "TARGET_"

/* Handle target switch DECODED for options structures OPTS and
   OPTS_SET, at location LOC.  Return true if the switch was valid.  */
DEFHOOK
(handle_option,
 "",
 bool, (struct gcc_options *opts, struct gcc_options *opts_set,
	const struct cl_decoded_option *decoded,
	location_t loc),
 default_target_handle_option)

DEFHOOK
(option_init_struct,
"Set target-dependent initial values of fields in @var{opts}.",
 void, (struct gcc_options *opts),
 hook_void_gcc_optionsp)

/* Set default optimizations for the target.  */
DEFHOOKPOD
(option_optimization_table,
 "",
 const struct default_options *, empty_optimization_table)

/* The initial value of target_flags.  */
DEFHOOKPOD
(default_target_flags,
 "",
 int, 0)

/* Determine the type of unwind info to emit for exceptions.  */
DEFHOOK
(except_unwind_info,
 "",
 enum unwind_info_type, (struct gcc_options *opts),
 default_except_unwind_info)

DEFHOOK
(supports_split_stack,
 "Whether this target supports splitting the stack when the options\n\
described in @var{opts} have been passed.  This is called\n\
after options have been parsed, so the target may reject splitting\n\
the stack in some configurations.  The default version of this hook\n\
returns false.  If @var{report} is true, this function may issue a warning\n\
or error; if @var{report} is false, it must simply return a value",
 bool, (bool report, struct gcc_options *opts),
 hook_bool_bool_gcc_optionsp_false)

DEFHOOK
(get_valid_option_values,
"The hook is used for options that have a non-trivial list of\n\
possible option values.  OPTION_CODE is option code of opt_code\n\
enum type.  PREFIX is used for bash completion and allows an implementation\n\
to return more specific completion based on the prefix.  All string values\n\
should be allocated from heap memory and consumers should release them.\n\
The result will be pruned to cases with PREFIX if not NULL.",
 vec<const char *>, (int option_code, const char *prefix),
 default_get_valid_option_values)

/* Leave the boolean fields at the end.  */

/* True if unwinding tables should be generated by default.  */
DEFHOOKPOD
(unwind_tables_default,
 "",
 bool, false)

/* True if arbitrary sections are supported.  */
DEFHOOKPOD
(have_named_sections,
 "",
 bool, true)

DEFHOOKPOD
(always_strip_dotdot,
 "True if @file{..} components should always be removed from directory names\n\
computed relative to GCC's internal directories, false (default) if such\n\
components should be preserved and directory names containing them passed\n\
to other tools such as the linker.",
 bool, false)
 
HOOK_VECTOR_END (C90_EMPTY_HACK)

#undef HOOK_PREFIX
