OSDN Git Service

2006-04-27 Eric Christopher <echristo@apple.com>
authorechristo <echristo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Apr 2006 22:53:23 +0000 (22:53 +0000)
committerechristo <echristo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 27 Apr 2006 22:53:23 +0000 (22:53 +0000)
        * 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  Eric Christopher  <echristo@apple.com>

        * gcc.dg/pragma-ms_struct.c: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@113327 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/darwin-c.c
gcc/config/darwin-protos.h
gcc/config/darwin.h
gcc/config/i386/darwin.h
gcc/config/rs6000/rs6000.c
gcc/target-def.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pragma-ms_struct.c [new file with mode: 0644]

index c2f022a..66e8188 100644 (file)
@@ -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
        * 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
index 30de35d..6f263f4 100644 (file)
@@ -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);
index abcb172..14da36d 100644 (file)
@@ -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);
index 21ed7da..c73ff60 100644 (file)
@@ -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
index 7481ea8..63e7bfd 100644 (file)
@@ -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
index 780a44c..0bb6810 100644 (file)
@@ -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
index 3fd22f4..b1630a6 100644 (file)
@@ -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
index 83af8bb..5ae38b0 100644 (file)
@@ -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>
        * 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 (file)
index 0000000..cc71610
--- /dev/null
@@ -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;
+};