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

DEFHOOK
(option_default_params,
"Set target-dependent default values for @option{--param} settings, using\
 calls to @code{set_default_param_value}.",
 void, (void),
 hook_void_void)

DEFHOOK
(option_validate_param,
"Validate target-dependent value for @option{--param} settings, using\
 calls to @code{set_param_value}.",
 bool, (int, int),
 default_option_validate_param)

/* 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\
 described in @var{opts} have been passed.  This is called\
 after options have been parsed, so the target may reject splitting\
 the stack in some configurations.  The default version of this hook\
 returns false.  If @var{report} is true, this function may issue a warning\
 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\
 possible option values.  OPTION_CODE is option code of opt_code\
 enum type.  PREFIX is used for bash completion and allows an implementation\
 to return more specific completion based on the prefix.  All string values\
 should be allocated from heap memory and consumers should release them. \
 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\
 computed relative to GCC's internal directories, false (default) if such\
 components should be preserved and directory names containing them passed\
 to other tools such as the linker.",
 bool, false)
 
HOOK_VECTOR_END (C90_EMPTY_HACK)

#undef HOOK_PREFIX
