/* Target hook definitions for C-family front ends.
   Copyright (C) 2001-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 "C Target Hook"

HOOK_VECTOR (TARGETCM_INITIALIZER, gcc_targetcm)

#undef HOOK_PREFIX
#define HOOK_PREFIX "TARGET_"

/* Handle target switch CODE (an OPT_* value).  ARG is the argument
   passed to the switch; it is NULL if no argument was.  VALUE is the
   value of ARG if CODE specifies a UInteger option, otherwise it is
   1 if the positive form of the switch was used and 0 if the negative
   form was.  Return true if the switch was valid.  */
DEFHOOK
(handle_c_option,
 "",
 bool, (size_t code, const char *arg, int value),
 default_handle_c_option)

/* Targets may provide a string object type that can be used within
   and between C, C++, and Objective-C dialects.  */

DEFHOOK
(objc_construct_string_object,
 "Targets may provide a string object type that can be used within\
 and between C, C++ and their respective Objective-C dialects.\
 A string object might, for example, embed encoding and length information.\
 These objects are considered opaque to the compiler and handled as references.\
 An ideal implementation makes the composition of the string object\
 match that of the Objective-C @code{NSString} (@code{NXString} for GNUStep),\
 allowing efficient interworking between C-only and Objective-C code.\
 If a target implements string objects then this hook should return a\
 reference to such an object constructed from the normal `C' string\
 representation provided in @var{string}.\
 At present, the hook is used by Objective-C only, to obtain a\
 common-format string object when the target provides one.",
 tree, (tree string),
 NULL)

DEFHOOK
(objc_declare_unresolved_class_reference,
 "Declare that Objective C class @var{classname} is referenced\
  by the current TU.",
 void, (const char *classname),
 NULL)

DEFHOOK
(objc_declare_class_definition,
 "Declare that Objective C class @var{classname} is defined\
  by the current TU.",
 void, (const char *classname),
 NULL)

DEFHOOK
(string_object_ref_type_p,
 "If a target implements string objects then this hook should return\
 @code{true} if @var{stringref} is a valid reference to such an object.",
 bool, (const_tree stringref),
 hook_bool_const_tree_false)

DEFHOOK
(check_string_object_format_arg,
 "If a target implements string objects then this hook should should\
  provide a facility to check the function arguments in @var{args_list}\
  against the format specifiers in @var{format_arg} where the type of\
  @var{format_arg} is one recognized as a valid string reference type.",
 void, (tree format_arg, tree args_list),
 NULL)

DEFHOOK
(c_preinclude,
 "Define this hook to return the name of a header file to be included at\
 the start of all compilations, as if it had been included with\
 @code{#include <@var{file}>}.  If this hook returns @code{NULL}, or is\
 not defined, or the header is not found, or if the user specifies\
 @option{-ffreestanding} or @option{-nostdinc}, no header is included.\n\
\n\
 This hook can be used together with a header provided by the system C\
 library to implement ISO C requirements for certain macros to be\
 predefined that describe properties of the whole implementation rather\
 than just the compiler.",
 const char *, (void),
 hook_constcharptr_void_null)

DEFHOOK
(cxx_implicit_extern_c,
 "Define this hook to add target-specific C++ implicit extern C functions.\
 If this function returns true for the name of a file-scope function, that\
 function implicitly gets extern \"C\" linkage rather than whatever language\
 linkage the declaration would normally have.  An example of such function\
 is WinMain on Win32 targets.",
 bool, (const char*),
 NULL)
 
HOOK_VECTOR_END (C90_EMPTY_HACK)
