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

/* 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)

/* 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
