summaryrefslogtreecommitdiffstats
path: root/gcc/config/darwin-c.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/darwin-c.c')
-rw-r--r--gcc/config/darwin-c.c72
1 files changed, 54 insertions, 18 deletions
diff --git a/gcc/config/darwin-c.c b/gcc/config/darwin-c.c
index 30de35d47a6..6f263f4eeba 100644
--- a/gcc/config/darwin-c.c
+++ b/gcc/config/darwin-c.c
@@ -41,6 +41,9 @@ Boston, MA 02110-1301, USA. */
static bool using_frameworks = false;
+/* True if we're setting __attribute__ ((ms_struct)). */
+static bool darwin_ms_struct = false;
+
/* Maintain a small stack of alignments. This is similar to pragma
pack's stack, but simpler. */
@@ -159,6 +162,39 @@ darwin_pragma_unused (cpp_reader *pfile ATTRIBUTE_UNUSED)
warning (0, "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
+ warning (OPT_Wpragmas, "malformed '#pragma ms_struct {on|off|reset}', ignoring");
+
+ if (pragma_lex (&t) != CPP_EOF)
+ warning (OPT_Wpragmas, "junk at end of '#pragma ms_struct'");
+}
+
+/* Set the darwin specific attributes on TYPE. */
+void
+darwin_set_default_type_attributes (tree type)
+{
+ if (darwin_ms_struct
+ && TREE_CODE (type) == RECORD_TYPE)
+ TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("ms_struct"),
+ NULL_TREE,
+ TYPE_ATTRIBUTES (type));
+}
+
static struct {
size_t len;
const char *name;
@@ -295,7 +331,7 @@ framework_construct_pathname (const char *fname, cpp_dir *dir)
/* Append framework_header_dirs and header file name */
for (i = 0; framework_header_dirs[i].dirName; i++)
{
- strncpy (&frname[frname_len],
+ strncpy (&frname[frname_len],
framework_header_dirs[i].dirName,
framework_header_dirs[i].dirNameLen);
strcpy (&frname[frname_len + framework_header_dirs[i].dirNameLen],
@@ -318,8 +354,8 @@ find_subframework_file (const char *fname, const char *pname)
{
char *sfrname;
const char *dot_framework = ".framework/";
- char *bufptr;
- int sfrname_len, i, fname_len;
+ char *bufptr;
+ int sfrname_len, i, fname_len;
struct cpp_dir *fast_dir;
static struct cpp_dir subframe_dir;
struct stat st;
@@ -329,7 +365,7 @@ find_subframework_file (const char *fname, const char *pname)
/* Subframework files must have / in the name. */
if (bufptr == 0)
return 0;
-
+
fname_len = bufptr - fname;
fast_dir = find_framework (fname, fname_len);
@@ -344,7 +380,7 @@ find_subframework_file (const char *fname, const char *pname)
return 0;
/* Now translate. For example, +- bufptr
- fname = CarbonCore/OSUtils.h |
+ 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 */
@@ -352,10 +388,10 @@ find_subframework_file (const char *fname, const char *pname)
sfrname = XNEWVEC (char, strlen (pname) + strlen (fname) + 2 +
strlen ("Frameworks/") + strlen (".framework/")
+ strlen ("PrivateHeaders"));
-
+
bufptr += strlen (dot_framework);
- sfrname_len = bufptr - pname;
+ sfrname_len = bufptr - pname;
strncpy (&sfrname[0], pname, sfrname_len);
@@ -371,12 +407,12 @@ find_subframework_file (const char *fname, const char *pname)
/* Append framework_header_dirs and header file name */
for (i = 0; framework_header_dirs[i].dirName; i++)
{
- strncpy (&sfrname[sfrname_len],
+ 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)
@@ -433,7 +469,7 @@ add_framework_path (char *path)
add_cpp_dir_path (p, BRACKET);
}
-static const char *framework_defaults [] =
+static const char *framework_defaults [] =
{
"/System/Library/Frameworks",
"/Library/Frameworks",
@@ -450,9 +486,9 @@ darwin_register_objc_includes (const char *sysroot, const char *iprefix,
/* 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. */
@@ -469,13 +505,13 @@ darwin_register_objc_includes (const char *sysroot, const char *iprefix,
/* 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);
}
}
@@ -546,13 +582,13 @@ find_subframework_header (cpp_reader *pfile, const char *header, cpp_dir **dirp)
/* 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.
+ 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]))
@@ -570,9 +606,9 @@ version_as_macro (void)
}
else
result[3] = '0';
-
+
return result;
-
+
fail:
error ("Unknown value %qs of -mmacosx-version-min",
darwin_macosx_version_min);
OpenPOWER on IntegriCloud