summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog21
-rw-r--r--gcc/config/darwin-c.c72
-rw-r--r--gcc/config/darwin-protos.h2
-rw-r--r--gcc/config/darwin.h3
-rw-r--r--gcc/config/i386/darwin.h6
-rw-r--r--gcc/config/rs6000/rs6000.c4
-rw-r--r--gcc/target-def.h2
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/pragma-ms_struct.c21
9 files changed, 115 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c2f022ac445..66e81881f40 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,18 @@
+2006-04-27 Eric Christopher <echristo@apple.com>
+
+ * target-def.h (TARGET_SET_DEFAULT_TYPE_ATTRIBUTES): Bracket
+ with #ifndef/#endif.
+ * config/darwin-c.c (darwin_ms_struct): New.
+ (darwin_pragma_ms_struct): Ditto.
+ (darwin_set_default_type_attributes): Ditto.
+ * config/darwin-protos.h (darwin_pragma_ms_struct): Declare.
+ * config/darwin.h (DARWIN_REGISTER_TARGET_PRAGMAS):
+ Register ms_struct pragma.
+ * config/i386/darwin.h (REGISTER_TARGET_PRAGMAS): Declare.
+ (TARGET_SET_DEFAULT_TYPE_ATTRIBUTES): Ditto.
+ * config/rs6000/rs6000.c (rs6000_set_default_type_attributes): Call
+ darwin_set_default_type_attributes if TARGET_MACHO.
+
2006-04-27 Andrew MacLeod <amacleod@redhat.com>
PR tree-optimization/26854
@@ -19,12 +34,12 @@
* tree-ssa-forwprop.c (forward_propagate_addr_expr): Use new iterator.
* lambda-code.c (lambda_loopnest_to_gcc_loopnest): Use new iterator.
(perfect_nestify): Use new iterator.
- * tree-vect-transform.c (vect_create_epilog_for_reduction): Use new
+ * tree-vect-transform.c (vect_create_epilog_for_reduction): Use new
iterator.
* tree-flow.h (struct immediate_use_iterator_d): Add comments.
(next_imm_name): New field in struct immediate_use_iterator_d.
(FOR_EACH_IMM_USE_SAFE, BREAK_FROM_SAFE_IMM_USE): Remove.
- (FOR_EACH_IMM_USE_STMT, BREAK_FROM_IMM_USE_STMT,
+ (FOR_EACH_IMM_USE_STMT, BREAK_FROM_IMM_USE_STMT,
FOR_EACH_IMM_USE_ON_STMT): New immediate use iterator macros.
* tree-cfg.c (replace_uses_by): Use new iterator.
* tree-ssa-threadedge.c (lhs_of_dominating_assert): Use new iterator.
@@ -41,7 +56,7 @@
call_nonlocal_sysv, call_value_indirect_nonlocal_sysv,
call_value_nonlocal_sysv): Suffix with the "P" macro for 32/64
support.
-
+
2006-04-27 Roger Sayle <roger@eyesopen.com>
* expmed.c (store_fixed_bit_field): If we're not optimizing for
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);
diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h
index abcb172b926..14da36d4da9 100644
--- a/gcc/config/darwin-protos.h
+++ b/gcc/config/darwin-protos.h
@@ -46,6 +46,7 @@ extern void machopic_asm_out_destructor (rtx, int);
extern void machopic_define_symbol (rtx);
extern void darwin_encode_section_info (tree, rtx, int);
+extern void darwin_set_default_type_attributes (tree);
#endif /* TREE_CODE */
@@ -65,6 +66,7 @@ extern void darwin_emit_except_table_label (FILE *);
extern void darwin_pragma_ignore (struct cpp_reader *);
extern void darwin_pragma_options (struct cpp_reader *);
extern void darwin_pragma_unused (struct cpp_reader *);
+extern void darwin_pragma_ms_struct (struct cpp_reader *);
extern void darwin_file_start (void);
extern void darwin_file_end (void);
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index 21ed7da0b9e..c73ff60da41 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -439,7 +439,7 @@ Boston, MA 02110-1301, USA. */
#define TARGET_USES_WEAK_UNWIND_INFO 1
/* We need to use a nonlocal label for the start of an EH frame: the
- Darwin linker requires that a coalesced section start with a label.
+ Darwin linker requires that a coalesced section start with a label.
Unfortunately, it also requires that 'debug' sections don't contain
labels. */
#undef FRAME_BEGIN_LABEL
@@ -830,6 +830,7 @@ enum machopic_addr_class {
c_register_pragma (0, "options", darwin_pragma_options); \
c_register_pragma (0, "segment", darwin_pragma_ignore); \
c_register_pragma (0, "unused", darwin_pragma_unused); \
+ c_register_pragma (0, "ms_struct", darwin_pragma_ms_struct); \
} while (0)
#undef ASM_APP_ON
diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h
index 7481ea886e4..63e7bfde542 100644
--- a/gcc/config/i386/darwin.h
+++ b/gcc/config/i386/darwin.h
@@ -217,3 +217,9 @@ __enable_execute_stack (void *addr) \
/* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */ \
(void) mprotect (page, end - page, 7); \
}
+
+#undef REGISTER_TARGET_PRAGMAS
+#define REGISTER_TARGET_PRAGMAS() DARWIN_REGISTER_TARGET_PRAGMAS()
+
+#undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
+#define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES darwin_set_default_type_attributes
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 780a44cfcca..0bb68109efa 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -17527,6 +17527,10 @@ rs6000_set_default_type_attributes (tree type)
TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
NULL_TREE,
TYPE_ATTRIBUTES (type));
+
+#if TARGET_MACHO
+ darwin_set_default_type_attributes (type);
+#endif
}
/* Return a reference suitable for calling a function with the
diff --git a/gcc/target-def.h b/gcc/target-def.h
index 3fd22f495ee..b1630a67d66 100644
--- a/gcc/target-def.h
+++ b/gcc/target-def.h
@@ -411,7 +411,9 @@ Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define TARGET_USE_ANCHORS_FOR_SYMBOL_P default_use_anchors_for_symbol_p
#define TARGET_FUNCTION_OK_FOR_SIBCALL hook_bool_tree_tree_false
#define TARGET_COMP_TYPE_ATTRIBUTES hook_int_tree_tree_1
+#ifndef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
#define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES hook_void_tree
+#endif
#define TARGET_INSERT_ATTRIBUTES hook_void_tree_treeptr
#define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_tree_false
#define TARGET_MS_BITFIELD_LAYOUT_P hook_bool_tree_false
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 83af8bb0ec3..5ae38b0e723 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2006-04-27 Eric Christopher <echristo@apple.com>
+
+ * gcc.dg/pragma-ms_struct.c: New.
+
2006-04-27 Mark Mitchell <mark@codesourcery.com>
PR c++/27102
@@ -34,7 +38,7 @@
2006-04-25 Richard Guenther <rguenther@suse.de>
- * gcc.dg/tree-prof/val-prof-2.c: Check for n + ffff rather
+ * gcc.dg/tree-prof/val-prof-2.c: Check for n + ffff rather
than n + -1.
2006-04-25 Andreas Krebbel <krebbel1@de.ibm.com>
@@ -312,7 +316,7 @@
* gcc.dg/tree-ssa/vrp14.c: Require >=32 bit integers.
* gcc.dg/tree-ssa/vrp21.c: Require >=32 bit integers.
* gcc.dg/tree-ssa/vrp22.c: Require >=32 bit integers.
-
+
* gcc.c-torture/execute/20040629-1.x: New. Require >16 bit integers.
* gcc.c-torture/execute/20040703-1.x: Likewise.
* gcc.c-torture/execute/20040705-1.x: Likewise.
diff --git a/gcc/testsuite/gcc.dg/pragma-ms_struct.c b/gcc/testsuite/gcc.dg/pragma-ms_struct.c
new file mode 100644
index 00000000000..cc71610146a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pragma-ms_struct.c
@@ -0,0 +1,21 @@
+/* Darwin pragma for __attribute__ ((ms_struct)). */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-Wall" } */
+
+#pragma ms_struct on
+
+#pragma ms_struct off
+
+#pragma ms_struct reset
+
+#pragma ms_struct /* { dg-warning "malformed" } */
+
+#pragma ms_struct on top of spaghetti /* { dg-warning "junk" } */
+
+struct foo
+{
+ int a;
+ int b;
+ char c;
+};
OpenPOWER on IntegriCloud