/* Darwin support needed only by C/C++ frontends.
   Copyright (C) 2001-2022 Free Software Foundation, Inc.
   Contributed by Apple Computer Inc.

This file is part of GCC.

GCC 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.

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

#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "target.h"
#include "c-family/c-target.h"
#include "c-family/c-target-def.h"
#include "memmodel.h"
#include "tm_p.h"
#include "cgraph.h"
#include "incpath.h"
#include "c-family/c-pragma.h"
#include "c-family/c-format.h"
#include "cppdefault.h"
#include "prefix.h"
#include "../../libcpp/internal.h"

/* Pragmas.  */

#define BAD(gmsgid) do { warning (OPT_Wpragmas, gmsgid); return; } while (0)
#define BAD2(msgid, arg) do { warning (OPT_Wpragmas, msgid, arg); return; } while (0)

static bool using_frameworks = false;

static const char *find_subframework_header (cpp_reader *pfile, const char *header,
					     cpp_dir **dirp);

struct fld_align_stack {
  int	alignment;
  struct fld_align_stack * prev;
};

static struct fld_align_stack * field_align_stack;

/* Maintain a small stack of alignments.  This is similar to pragma
   pack's stack, but simpler.  */

static void
push_field_alignment (int bit_alignment)
{
  fld_align_stack *entry = XNEW (fld_align_stack);

  entry->alignment = maximum_field_alignment;
  entry->prev = field_align_stack;
  field_align_stack = entry;

  maximum_field_alignment = bit_alignment;
}

static void
pop_field_alignment (void)
{
  if (field_align_stack)
    {
      fld_align_stack *entry = field_align_stack;

      maximum_field_alignment = entry->alignment;
      field_align_stack = entry->prev;
      free (entry);
    }
  else
    error ("too many %<#pragma options align=reset%>");
}

/* Handlers for Darwin-specific pragmas.  */

void
darwin_pragma_ignore (cpp_reader *pfile ATTRIBUTE_UNUSED)
{
  /* Do nothing.  */
}

/* #pragma options align={mac68k|power|reset} */

void
darwin_pragma_options (cpp_reader *pfile ATTRIBUTE_UNUSED)
{
  const char *arg;
  tree t, x;

  if (pragma_lex (&t) != CPP_NAME)
    BAD ("malformed %<#pragma options%>, ignoring");
  arg = IDENTIFIER_POINTER (t);
  if (strcmp (arg, "align"))
    BAD ("malformed %<#pragma options%>, ignoring");
  if (pragma_lex (&t) != CPP_EQ)
    BAD ("malformed %<#pragma options%>, ignoring");
  if (pragma_lex (&t) != CPP_NAME)
    BAD ("malformed %<#pragma options%>, ignoring");

  if (pragma_lex (&x) != CPP_EOF)
    warning (OPT_Wpragmas, "junk at end of %<#pragma options%>");

  arg = IDENTIFIER_POINTER (t);
  if (!strcmp (arg, "mac68k"))
    push_field_alignment (16);
  else if (!strcmp (arg, "power"))
    push_field_alignment (0);
  else if (!strcmp (arg, "reset"))
    pop_field_alignment ();
  else
    BAD ("malformed %<#pragma options align={mac68k|power|reset}%>, ignoring");
}

/* #pragma unused ([var {, var}*]) */

void
darwin_pragma_unused (cpp_reader *pfile ATTRIBUTE_UNUSED)
{
  tree decl, x;
  int tok;

  if (pragma_lex (&x) != CPP_OPEN_PAREN)
    BAD ("missing %<(%> after %<#pragma unused%>, ignoring");

  while (1)
    {
      tok = pragma_lex (&decl);
      if (tok == CPP_NAME && decl)
	{
	  tree local = lookup_name (decl);
	  if (local && (TREE_CODE (local) == PARM_DECL
			|| TREE_CODE (local) == VAR_DECL))
	    {
	      TREE_USED (local) = 1;
	      DECL_READ_P (local) = 1;
	    }
	  tok = pragma_lex (&x);
	  if (tok != CPP_COMMA)
	    break;
	}
    }

  if (tok != CPP_CLOSE_PAREN)
    BAD ("missing %<)%> after %<#pragma unused%>, ignoring");

  if (pragma_lex (&x) != CPP_EOF)
    BAD ("junk at end of %<#pragma unused%>");
}

/* Parse the ms_struct pragma.  */
void
darwin_pragma_ms_struct (cpp_reader *pfile ATTRIBUTE_UNUSED)
{
  const char *arg;
  tree t;

  if (pragma_lex (&t) != CPP_NAME)
    BAD ("malformed %<#pragma ms_struct%>, ignoring");
  arg = IDENTIFIER_POINTER (t);

  if (!strcmp (arg, "on"))
    darwin_ms_struct = true;
  else if (!strcmp (arg, "off") || !strcmp (arg, "reset"))
    darwin_ms_struct = false;
  else
    BAD ("malformed %<#pragma ms_struct {on|off|reset}%>, ignoring");

  if (pragma_lex (&t) != CPP_EOF)
    BAD ("junk at end of %<#pragma ms_struct%>");
}

static struct frameworks_in_use {
  size_t len;
  const char *name;
  cpp_dir* dir;
} *frameworks_in_use;
static int num_frameworks = 0;
static int max_frameworks = 0;


/* Remember which frameworks have been seen, so that we can ensure
   that all uses of that framework come from the same framework.  DIR
   is the place where the named framework NAME, which is of length
   LEN, was found.  We copy the directory name from NAME, as it will be
   freed by others.  */

static void
add_framework (const char *name, size_t len, cpp_dir *dir)
{
  char *dir_name;
  int i;
  for (i = 0; i < num_frameworks; ++i)
    {
      if (len == frameworks_in_use[i].len
	  && strncmp (name, frameworks_in_use[i].name, len) == 0)
	{
	  return;
	}
    }
  if (i >= max_frameworks)
    {
      max_frameworks = i*2;
      max_frameworks += i == 0;
      frameworks_in_use = XRESIZEVEC (struct frameworks_in_use,
				      frameworks_in_use, max_frameworks);
    }
  dir_name = XNEWVEC (char, len + 1);
  memcpy (dir_name, name, len);
  dir_name[len] = '\0';
  frameworks_in_use[num_frameworks].name = dir_name;
  frameworks_in_use[num_frameworks].len = len;
  frameworks_in_use[num_frameworks].dir = dir;
  ++num_frameworks;
}

/* Recall if we have seen the named framework NAME, before, and where
   we saw it.  NAME is LEN bytes long.  The return value is the place
   where it was seen before.  */

static struct cpp_dir*
find_framework (const char *name, size_t len)
{
  int i;
  for (i = 0; i < num_frameworks; ++i)
    {
      if (len == frameworks_in_use[i].len
	  && strncmp (name, frameworks_in_use[i].name, len) == 0)
	{
	  return frameworks_in_use[i].dir;
	}
    }
  return 0;
}

/* There are two directories in a framework that contain header files,
   Headers and PrivateHeaders.  We search Headers first as it is more
   common to upgrade a header from PrivateHeaders to Headers and when
   that is done, the old one might hang around and be out of data,
   causing grief.  */

struct framework_header {const char * dirName; int dirNameLen; };
static struct framework_header framework_header_dirs[] = {
  { "Headers", 7 },
  { "PrivateHeaders", 14 },
  { NULL, 0 }
};

/* Returns a pointer to a malloced string that contains the real pathname
   to the file, given the base name and the name.  */

static char *
framework_construct_pathname (const char *fname, cpp_dir *dir)
{
  const char *buf;
  size_t fname_len, frname_len;
  cpp_dir *fast_dir;
  char *frname;
  struct stat st;
  int i;

  /* Framework names must have a / in them.  */
  buf = strchr (fname, '/');
  if (buf)
    fname_len = buf - fname;
  else
    return 0;

  fast_dir = find_framework (fname, fname_len);

  /* Framework includes must all come from one framework.  */
  if (fast_dir && dir != fast_dir)
    return 0;

  frname = XNEWVEC (char, strlen (fname) + dir->len + 2
		    + strlen(".framework/") + strlen("PrivateHeaders"));
  memcpy (&frname[0], dir->name, dir->len);
  frname_len = dir->len;
  if (frname_len && frname[frname_len-1] != '/')
    frname[frname_len++] = '/';
  memcpy (&frname[frname_len], fname, fname_len);
  frname_len += fname_len;
  memcpy (&frname[frname_len], ".framework/", strlen (".framework/"));
  frname_len += strlen (".framework/");

  if (fast_dir == 0)
    {
      frname[frname_len-1] = 0;
      if (stat (frname, &st) == 0)
	{
	  /* As soon as we find the first instance of the framework,
	     we stop and never use any later instance of that
	     framework.  */
	  add_framework (fname, fname_len, dir);
	}
      else
	{
	  /* If we can't find the parent directory, no point looking
	     further.  */
	  free (frname);
	  return 0;
	}
      frname[frname_len-1] = '/';
    }

  /* Append framework_header_dirs and header file name */
  for (i = 0; framework_header_dirs[i].dirName; i++)
    {
      memcpy (&frname[frname_len],
	       framework_header_dirs[i].dirName,
	       framework_header_dirs[i].dirNameLen);
      strcpy (&frname[frname_len + framework_header_dirs[i].dirNameLen],
	      &fname[fname_len]);

      if (stat (frname, &st) == 0)
	return frname;
    }

  free (frname);
  return 0;
}

/* Search for FNAME in sub-frameworks.  pname is the context that we
   wish to search in.  Return the path the file was found at,
   otherwise return 0.  */

static const char*
find_subframework_file (const char *fname, const char *pname)
{
  char *sfrname;
  const char *dot_framework = ".framework/";
  const char *bufptr;
  int sfrname_len, i, fname_len;
  struct cpp_dir *fast_dir;
  static struct cpp_dir subframe_dir;
  struct stat st;

  bufptr = strchr (fname, '/');

  /* Subframework files must have / in the name.  */
  if (bufptr == 0)
    return 0;

  fname_len = bufptr - fname;
  fast_dir = find_framework (fname, fname_len);

  /* Sub framework header filename includes parent framework name and
     header name in the "CarbonCore/OSUtils.h" form. If it does not
     include slash it is not a sub framework include.  */
  bufptr = strstr (pname, dot_framework);

  /* If the parent header is not of any framework, then this header
     cannot be part of any subframework.  */
  if (!bufptr)
    return 0;

  /* Now translate. For example,                  +- bufptr
     fname = CarbonCore/OSUtils.h                 |
     pname = /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h
     into
     sfrname = /System/Library/Frameworks/Foundation.framework/Frameworks/CarbonCore.framework/Headers/OSUtils.h */

  sfrname = XNEWVEC (char, strlen (pname) + strlen (fname) + 2 +
			      strlen ("Frameworks/") + strlen (".framework/")
			      + strlen ("PrivateHeaders"));

  bufptr += strlen (dot_framework);

  sfrname_len = bufptr - pname;

  memcpy (&sfrname[0], pname, sfrname_len);

  memcpy (&sfrname[sfrname_len], "Frameworks/", strlen ("Frameworks/"));
  sfrname_len += strlen("Frameworks/");

  memcpy (&sfrname[sfrname_len], fname, fname_len);
  sfrname_len += fname_len;

  memcpy (&sfrname[sfrname_len], ".framework/", strlen (".framework/"));
  sfrname_len += strlen (".framework/");

  /* Append framework_header_dirs and header file name */
  for (i = 0; framework_header_dirs[i].dirName; i++)
    {
      memcpy (&sfrname[sfrname_len],
	      framework_header_dirs[i].dirName,
	      framework_header_dirs[i].dirNameLen);
      strcpy (&sfrname[sfrname_len + framework_header_dirs[i].dirNameLen],
	      &fname[fname_len]);

      if (stat (sfrname, &st) == 0)
	{
	  if (fast_dir != &subframe_dir)
	    {
	      if (fast_dir)
		warning (0, "subframework include %s conflicts with framework include",
			 fname);
	      else
		add_framework (fname, fname_len, &subframe_dir);
	    }

	  return sfrname;
	}
    }
  free (sfrname);

  return 0;
}

/* Add PATH to the system includes. PATH must be malloc-ed and
   NUL-terminated.  System framework paths are C++ aware.  */

static void
add_system_framework_path (char *path)
{
  int cxx_aware = 1;
  cpp_dir *p;

  p = XNEW (cpp_dir);
  p->next = NULL;
  p->name = path;
  p->sysp = 1 + !cxx_aware;
  p->construct = framework_construct_pathname;
  using_frameworks = 1;

  add_cpp_dir_path (p, INC_SYSTEM);
}

/* Add PATH to the bracket includes. PATH must be malloc-ed and
   NUL-terminated.  */

void
add_framework_path (char *path)
{
  cpp_dir *p;

  p = XNEW (cpp_dir);
  p->next = NULL;
  p->name = path;
  p->sysp = 0;
  p->construct = framework_construct_pathname;
  using_frameworks = 1;

  add_cpp_dir_path (p, INC_BRACKET);
}

static const char *framework_defaults [] =
  {
    "/System/Library/Frameworks",
    "/Library/Frameworks",
  };

/* Register the GNU objective-C runtime include path if STDINC.  */

void
darwin_register_objc_includes (const char *sysroot ATTRIBUTE_UNUSED,
			       const char *iprefix, int stdinc)
{
  /* If we want standard includes;  Register the GNU OBJC runtime include
     path if we are compiling OBJC with GNU-runtime.
     This path is compiler-relative, we don't want to prepend the sysroot
     since it's not expected to find the headers there.  */

  if (stdinc && c_dialect_objc () && !flag_next_runtime)
    {
      const char *fname = GCC_INCLUDE_DIR "-gnu-runtime";
      char *str;
      size_t len;

     /* See if our directory starts with the standard prefix.
	 "Translate" them, i.e. replace /usr/local/lib/gcc... with
	 IPREFIX and search them first.  */
      if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0
	  && !strncmp (fname, cpp_GCC_INCLUDE_DIR, len))
	{
	  str = concat (iprefix, fname + len, NULL);
	  add_path (str, INC_SYSTEM, /*c++aware=*/true, false);
	}

      str = update_path (fname, "");
      add_path (str, INC_SYSTEM, /*c++aware=*/true, false);
    }
}


/* Register all the system framework paths if STDINC is true and setup
   the missing_header callback for subframework searching if any
   frameworks had been registered.  */

void
darwin_register_frameworks (const char *sysroot,
			    const char *iprefix ATTRIBUTE_UNUSED, int stdinc)
{
  if (stdinc)
    {
      size_t i;

      /* Setup default search path for frameworks.  */
      for (i = 0; i < ARRAY_SIZE (framework_defaults); ++i)
	{
	  char *str;
	  if (sysroot)
	    str = concat (sysroot, xstrdup (framework_defaults [i]), NULL);
	  else
	    str = xstrdup (framework_defaults[i]);
	  /* System Framework headers are cxx aware.  */
	  add_system_framework_path (str);
	}
    }

  if (using_frameworks)
    cpp_get_callbacks (parse_in)->missing_header = find_subframework_header;
}

/* Search for HEADER in context dependent way.  The return value is
   the malloced name of a header to try and open, if any, or NULL
   otherwise.  This is called after normal header lookup processing
   fails to find a header.  We search each file in the include stack,
   using FUNC, starting from the most deeply nested include and
   finishing with the main input file.  We stop searching when FUNC
   returns nonzero.  */

static const char*
find_subframework_header (cpp_reader *pfile, const char *header, cpp_dir **dirp)
{
  const char *fname = header;
  struct cpp_buffer *b;
  const char *n;

  for (b = cpp_get_buffer (pfile);
       b && cpp_get_file (b) && cpp_get_path (cpp_get_file (b));
       b = cpp_get_prev (b))
    {
      n = find_subframework_file (fname, cpp_get_path (cpp_get_file (b)));
      if (n)
	{
	  /* Logically, the place where we found the subframework is
	     the place where we found the Framework that contains the
	     subframework.  This is useful for tracking wether or not
	     we are in a system header.  */
	  *dirp = cpp_get_dir (cpp_get_file (b));
	  return n;
	}
    }

  return 0;
}

/* Given an OS X version VERSION_STR, return it as a statically-allocated array
   of three integers. If VERSION_STR is invalid, return NULL.

   VERSION_STR must consist of one, two, or three tokens, each separated by
   a single period.  Each token must contain only the characters '0' through
   '9' and is converted to an equivalent non-negative decimal integer. Omitted
   tokens become zeros.  For example:

        "10"              becomes       {10,0,0}
        "10.10"           becomes       {10,10,0}
        "10.10.1"         becomes       {10,10,1}
        "10.000010.1"     becomes       {10,10,1}
        "10.010.001"      becomes       {10,10,1}
        "000010.10.00001" becomes       {10,10,1}
        ".9.1"            is invalid
        "10..9"           is invalid
        "10.10."          is invalid  */

enum version_components { MAJOR, MINOR, TINY };

static const unsigned long *
parse_version (const char *version_str)
{
  size_t version_len;
  char *end;
  static unsigned long version_array[3];

  version_len = strlen (version_str);
  if (version_len < 1)
    return NULL;

  /* Version string must consist of digits and periods only.  */
  if (strspn (version_str, "0123456789.") != version_len)
    return NULL;

  if (!ISDIGIT (version_str[0]) || !ISDIGIT (version_str[version_len - 1]))
    return NULL;

  version_array[MAJOR] = strtoul (version_str, &end, 10);
  version_str = end + ((*end == '.') ? 1 : 0);

  /* Version string must not contain adjacent periods.  */
  if (*version_str == '.')
    return NULL;

  version_array[MINOR] = strtoul (version_str, &end, 10);
  version_str = end + ((*end == '.') ? 1 : 0);

  version_array[TINY] = strtoul (version_str, &end, 10);

  /* Version string must contain no more than three tokens.  */
  if (*end != '\0')
    return NULL;

  return version_array;
}

/* Given VERSION -- a three-component OS X version represented as an array of
   non-negative integers -- return a statically-allocated string suitable for
   the legacy __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro.  If VERSION
   is invalid and cannot be coerced into a valid form, return NULL.

   The legacy format is a four-character string -- two chars for the major
   number and one each for the minor and tiny numbers.  Minor and tiny numbers
   from 10 through 99 are permitted but are clamped to 9 (for example, {10,9,10}
   produces "1099").  If VERSION contains numbers greater than 99, it is
   rejected.  */

static const char *
version_as_legacy_macro (const unsigned long *version)
{
  unsigned long major, minor, tiny;
  static char result[5];

  major = version[MAJOR];
  minor = version[MINOR];
  tiny = version[TINY];

  if (major > 99 || minor > 99 || tiny > 99)
    return NULL;

  minor = ((minor > 9) ? 9 : minor);
  tiny = ((tiny > 9) ? 9 : tiny);

  if (sprintf (result, "%lu%lu%lu", major, minor, tiny) != 4)
    return NULL;

  return result;
}

/* Given VERSION -- a three-component OS X version represented as an array of
   non-negative integers -- return a statically-allocated string suitable for
   the modern __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro.  If VERSION
   is invalid, return NULL.

   The modern format is a six-character string -- two chars for each component,
   with zero-padding if necessary (for example, {10,10,1} produces "101001"). If
   VERSION contains numbers greater than 99, it is rejected.  */

static const char *
version_as_modern_macro (const unsigned long *version)
{
  unsigned long major, minor, tiny;
  static char result[7];

  major = version[MAJOR];
  minor = version[MINOR];
  tiny = version[TINY];

  if (major > 99 || minor > 99 || tiny > 99)
    return NULL;

  if (sprintf (result, "%02lu%02lu%02lu", major, minor, tiny) != 6)
    return NULL;

  return result;
}

/* Return the value of darwin_macosx_version_min, suitably formatted for the
   __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro.  Values representing
   OS X 10.9 and earlier are encoded using the legacy four-character format,
   while 10.10 and later use a modern six-character format.  (For example,
   "10.9" produces "1090", and "10.10.1" produces "101001".)  If
   darwin_macosx_version_min is invalid and cannot be coerced into a valid
   form, print a warning and return "1000".  */

static const char *
macosx_version_as_macro (void)
{
  const unsigned long *version_array;
  const char *version_macro;

  version_array = parse_version (darwin_macosx_version_min);
  if (!version_array)
    goto fail;

  /* System tools accept up to 99 as a major version.  */
  if (version_array[MAJOR] < 10 || version_array[MAJOR] > 99)
    goto fail;

  if (version_array[MAJOR] == 10 && version_array[MINOR] < 10)
    version_macro = version_as_legacy_macro (version_array);
  else
    version_macro = version_as_modern_macro (version_array);

  if (!version_macro)
    goto fail;

  return version_macro;

 fail:
  error ("unknown value %qs of %<-mmacosx-version-min%>",
         darwin_macosx_version_min);
  return "1000";
}

/* Define additional CPP flags for Darwin.   */

#define builtin_define(TXT) cpp_define (pfile, TXT)

void
darwin_cpp_builtins (cpp_reader *pfile)
{
  builtin_define ("__MACH__");
  builtin_define ("__APPLE__");

  /* __APPLE_CC__ is defined as some old Apple include files expect it
     to be defined and won't work if it isn't.  */
  builtin_define_with_value ("__APPLE_CC__", "1", false);

  if (darwin_constant_cfstrings)
    builtin_define ("__CONSTANT_CFSTRINGS__");

  builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",
			     macosx_version_as_macro(), false);

  /* Since we do not (at 4.6) support ObjC gc for the NeXT runtime, the
     following will cause a syntax error if one tries to compile gc attributed
     items.  However, without this, NeXT system headers cannot be parsed 
     properly (on systems >= darwin 9).  */
  if (flag_objc_gc)
    {
      builtin_define ("__strong=__attribute__((objc_gc(strong)))");
      builtin_define ("__weak=__attribute__((objc_gc(weak)))");
      builtin_define ("__OBJC_GC__");
    }
  else
    {
      builtin_define ("__strong=");
      builtin_define ("__weak=");
    }

  if (CPP_OPTION (pfile, objc) && flag_objc_abi == 2)
    builtin_define ("__OBJC2__");
}

/* Handle C family front-end options.  */

static bool
handle_c_option (size_t code,
		 const char *arg,
		 int value ATTRIBUTE_UNUSED)
{
  switch (code)
    {
    default:
      /* Unrecognized options that we said we'd handle turn into
	 errors if not listed here.  */
      return false;

    case OPT_iframework:
      add_system_framework_path (xstrdup (arg));
      break;

    case OPT_fapple_kext:
      ;
    }

  /* We recognized the option.  */
  return true;
}

/* Allow ObjC* access to CFStrings.  */
static tree
darwin_objc_construct_string (tree str)
{
  if (!darwin_constant_cfstrings)
    {
    /* Even though we are not using CFStrings, place our literal
       into the cfstring_htab hash table, so that the
       darwin_constant_cfstring_p() function will see it.  */
      darwin_enter_string_into_cfstring_table (str);
      /* Fall back to NSConstantString.  */
      return NULL_TREE;
    }

  return darwin_build_constant_cfstring (str);
}

/* The string ref type is created as CFStringRef by <CFBase.h> therefore, we
   must match for it explicitly, since it's outside the gcc code.  */

static bool
darwin_cfstring_ref_p (const_tree strp)
{
  tree tn;
  if (!strp || TREE_CODE (strp) != POINTER_TYPE)
    return false;

  tn = TYPE_NAME (strp);
  if (tn) 
    tn = DECL_NAME (tn);
  return (tn 
	  && IDENTIFIER_POINTER (tn)
	  && startswith (IDENTIFIER_POINTER (tn), "CFStringRef"));
}

/* At present the behavior of this is undefined and it does nothing.  */
static void
darwin_check_cfstring_format_arg (tree ARG_UNUSED (format_arg), 
				  tree ARG_UNUSED (args_list))
{
}

/* The extra format types we recognize.  */
EXPORTED_CONST format_kind_info darwin_additional_format_types[] = {
  { "CFString",   NULL,  NULL, NULL, NULL, 
    NULL, NULL, 
    FMT_FLAG_ARG_CONVERT|FMT_FLAG_PARSE_ARG_CONVERT_EXTERNAL, 0, 0, 0, 0, 0, 0,
    NULL, NULL
  }
};


/* Support routines to dump the class references for NeXT ABI v1, aka
   32-bits ObjC-2.0, as top-level asms.
   The following two functions should only be called from
   objc/objc-next-runtime-abi-01.cc.  */

static void
darwin_objc_declare_unresolved_class_reference (const char *name)
{
  const char *lazy_reference = ".lazy_reference\t";
  const char *hard_reference = ".reference\t";
  const char *reference = MACHOPIC_INDIRECT ? lazy_reference : hard_reference;
  size_t len = strlen (reference) + strlen(name) + 2;
  char *buf = (char *) alloca (len);

  gcc_checking_assert (startswith (name, ".objc_class_name_"));

  snprintf (buf, len, "%s%s", reference, name);
  symtab->finalize_toplevel_asm (build_string (strlen (buf), buf));
}

static void
darwin_objc_declare_class_definition (const char *name)
{
  const char *xname = targetm.strip_name_encoding (name);
  size_t len = strlen (xname) + 7 + 5;
  char *buf = (char *) alloca (len);

  gcc_checking_assert (startswith (name, ".objc_class_name_")
		       || startswith (name, "*.objc_category_name_"));

  /* Mimic default_globalize_label.  */
  snprintf (buf, len, ".globl\t%s", xname);
  symtab->finalize_toplevel_asm (build_string (strlen (buf), buf));

  snprintf (buf, len, "%s = 0", xname);
  symtab->finalize_toplevel_asm (build_string (strlen (buf), buf));
}

#undef  TARGET_HANDLE_C_OPTION
#define TARGET_HANDLE_C_OPTION handle_c_option

#undef  TARGET_OBJC_CONSTRUCT_STRING_OBJECT
#define TARGET_OBJC_CONSTRUCT_STRING_OBJECT darwin_objc_construct_string

#undef  TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE
#define TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE \
	darwin_objc_declare_unresolved_class_reference

#undef  TARGET_OBJC_DECLARE_CLASS_DEFINITION
#define TARGET_OBJC_DECLARE_CLASS_DEFINITION \
	darwin_objc_declare_class_definition

#undef  TARGET_STRING_OBJECT_REF_TYPE_P
#define TARGET_STRING_OBJECT_REF_TYPE_P darwin_cfstring_ref_p

#undef TARGET_CHECK_STRING_OBJECT_FORMAT_ARG
#define TARGET_CHECK_STRING_OBJECT_FORMAT_ARG darwin_check_cfstring_format_arg

struct gcc_targetcm targetcm = TARGETCM_INITIALIZER;
