aboutsummaryrefslogtreecommitdiff
path: root/contrib/gcc/config/darwin-c.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gcc/config/darwin-c.c')
-rw-r--r--contrib/gcc/config/darwin-c.c622
1 files changed, 0 insertions, 622 deletions
diff --git a/contrib/gcc/config/darwin-c.c b/contrib/gcc/config/darwin-c.c
deleted file mode 100644
index 88ce9ef54d59..000000000000
--- a/contrib/gcc/config/darwin-c.c
+++ /dev/null
@@ -1,622 +0,0 @@
-/* Darwin support needed only by C/C++ frontends.
- Copyright (C) 2001, 2003, 2004, 2005 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 2, 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 COPYING. If not, write to
-the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA. */
-
-#include "config.h"
-#include "system.h"
-#include "coretypes.h"
-#include "tm.h"
-#include "cpplib.h"
-#include "tree.h"
-#include "c-pragma.h"
-#include "c-tree.h"
-#include "c-incpath.h"
-#include "c-common.h"
-#include "toplev.h"
-#include "flags.h"
-#include "tm_p.h"
-#include "cppdefault.h"
-#include "prefix.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;
-
-/* Maintain a small stack of alignments. This is similar to pragma
- pack's stack, but simpler. */
-
-static void push_field_alignment (int);
-static void pop_field_alignment (void);
-static const char *find_subframework_file (const char *, const char *);
-static void add_system_framework_path (char *);
-static const char *find_subframework_header (cpp_reader *pfile, const char *header,
- cpp_dir **dirp);
-
-typedef struct align_stack
-{
- int alignment;
- struct align_stack * prev;
-} align_stack;
-
-static struct align_stack * field_align_stack = NULL;
-
-static void
-push_field_alignment (int bit_alignment)
-{
- align_stack *entry = XNEW (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)
- {
- 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;
- 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 {
- 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 = xrealloc (frameworks_in_use,
- max_frameworks*sizeof(*frameworks_in_use));
- }
- 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)
-{
- 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"));
- strncpy (&frname[0], dir->name, dir->len);
- frname_len = dir->len;
- if (frname_len && frname[frname_len-1] != '/')
- frname[frname_len++] = '/';
- strncpy (&frname[frname_len], fname, fname_len);
- frname_len += fname_len;
- strncpy (&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++)
- {
- strncpy (&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/";
- 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;
-
- strncpy (&sfrname[0], pname, sfrname_len);
-
- strncpy (&sfrname[sfrname_len], "Frameworks/", strlen ("Frameworks/"));
- sfrname_len += strlen("Frameworks/");
-
- strncpy (&sfrname[sfrname_len], fname, fname_len);
- sfrname_len += fname_len;
-
- strncpy (&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++)
- {
- strncpy (&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, 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, 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, const char *iprefix,
- int stdinc)
-{
- const char *fname;
- size_t len;
- /* We do not do anything if we do not want the standard includes. */
- if (!stdinc)
- return;
-
- fname = GCC_INCLUDE_DIR "-gnu-runtime";
-
- /* Register the GNU OBJC runtime include path if we are compiling OBJC
- with GNU-runtime. */
-
- if (c_dialect_objc () && !flag_next_runtime)
- {
- char *str;
- /* 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 && !sysroot
- && !strncmp (fname, cpp_GCC_INCLUDE_DIR, len))
- {
- str = concat (iprefix, fname + len, NULL);
- /* FIXME: wrap the headers for C++awareness. */
- add_path (str, SYSTEM, /*c++aware=*/false, false);
- }
-
- /* Should this directory start with the sysroot? */
- if (sysroot)
- str = concat (sysroot, fname, NULL);
- else
- str = update_path (fname, "");
-
- add_path (str, SYSTEM, /*c++aware=*/false, 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<sizeof (framework_defaults)/sizeof(const char *); ++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;
-}
-
-/* Return the value of darwin_macosx_version_min suitable for the
- __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro,
- so '10.4.2' becomes 1042.
- Print a warning if the version number is not known. */
-static const char *
-version_as_macro (void)
-{
- static char result[] = "1000";
-
- if (strncmp (darwin_macosx_version_min, "10.", 3) != 0)
- goto fail;
- if (! ISDIGIT (darwin_macosx_version_min[3]))
- goto fail;
- result[2] = darwin_macosx_version_min[3];
- if (darwin_macosx_version_min[4] != '\0')
- {
- if (darwin_macosx_version_min[4] != '.')
- goto fail;
- if (! ISDIGIT (darwin_macosx_version_min[5]))
- goto fail;
- if (darwin_macosx_version_min[6] != '\0')
- goto fail;
- result[3] = darwin_macosx_version_min[5];
- }
- else
- result[3] = '0';
-
- return result;
-
- 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_macosx_version_min)
- builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",
- version_as_macro(), false);
-}