Add exception attribute for Windows
authorMichael Meissner <meissner@gcc.gnu.org>
Thu, 14 Mar 1996 16:25:20 +0000 (16:25 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Thu, 14 Mar 1996 16:25:20 +0000 (16:25 +0000)
From-SVN: r11528

gcc/config/rs6000/rs6000.c
gcc/config/rs6000/win-nt.h

index 34fdab7b23993b1515686550e834b115a7c6af82..dcdf56852c829b0fb4dce7a5025a95ceaffc26a6 100644 (file)
@@ -4368,6 +4368,29 @@ rs6000_valid_type_attribute_p (type, attributes, identifier, args)
         pointer.  */
       if (is_attribute_p ("dllexport", identifier))
        return (args == NULL_TREE);
+
+      /* Exception attribute allows the user to specify 1-2 strings or identifiers
+        that will fill in the 3rd and 4th fields of the structured exception
+        table.  */
+      if (is_attribute_p ("exception", identifier))
+       {
+         int i;
+
+         if (args == NULL_TREE)
+           return 0;
+
+         for (i = 0; i < 2 && args != NULL_TREE; i++)
+           {
+             tree this_arg = TREE_VALUE (args);
+             args = TREE_PURPOSE (args);
+
+             if (TREE_CODE (this_arg) != STRING_CST
+                 && TREE_CODE (this_arg) != IDENTIFIER_NODE)
+               return 0;
+           }
+
+         return (args == NULL_TREE);
+       }
     }
 
   return 0;
index 1d3d473dd046d56ca2abbef1482ff8116d6170e4..e97a7033d5b93e179de843861069fbee2c64eaab 100644 (file)
@@ -202,61 +202,84 @@ do {                                                                      \
 
 #undef ASM_FILE_END
 
-#undef  ASM_OUTPUT_FUNCTION_PREFIX
-#define ASM_OUTPUT_FUNCTION_PREFIX(FILE,NAME)                   \
-{                                                               \
-  fprintf (FILE, "\n#\tFunction: '..");                         \
-  assemble_name (FILE, NAME);                                  \
-  fprintf (FILE, "'\n");                                        \
-  fprintf (FILE, "#\tText in section: <%s>\n\n","default");     \
-  fprintf (FILE, "#\tSetup MS Structured-Exception-Handling\n"); \
-  fprintf (FILE, "\t.pdata\n");                                        \
-  fprintf (FILE, "\t.align 2\n");                              \
-  fprintf (FILE, "\t.ualong ..");                               \
-  assemble_name (FILE, NAME);                                  \
-  fprintf (FILE, ",");                                          \
-  assemble_name (FILE, NAME);                                  \
-  fprintf (FILE, ".e,0,0,");                                    \
-  assemble_name (FILE, NAME);                                  \
-  fprintf (FILE, ".b\n\n");                                     \
-  fprintf (FILE, "#\tSwitch to the relocation section\n");      \
-  fprintf (FILE, "\t.reldata\n");                               \
-}
-
-
 #undef ASM_DECLARE_FUNCTION_NAME
-#define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL)              \
-{                                                               \
-  if (TREE_PUBLIC (DECL))                                      \
-    {                                                          \
-      fprintf (FILE, "\t.globl ..");                           \
-      assemble_name (FILE, NAME);                              \
-      fprintf (FILE, "\n");                                    \
-    }                                                          \
-  assemble_name (FILE, NAME);                                  \
-  fprintf (FILE, ":\n");                                       \
-  fprintf (FILE, "\t.ualong ..");                              \
-  assemble_name (FILE, NAME);                                  \
-  fprintf (FILE, ",.toc\n");                                   \
-                                                               \
-  if (lookup_attribute ("dllexport",                           \
-                       TYPE_ATTRIBUTES (TREE_TYPE (DECL))))    \
-    {                                                          \
-      fprintf (FILE, "\t.globl __imp_");                       \
-      assemble_name (FILE, NAME);                              \
-      fprintf (FILE, "\n__imp_");                              \
-      assemble_name (FILE, NAME);                              \
-      fprintf (FILE, ":\n\t.ulong ");                          \
-      assemble_name (FILE, NAME);                              \
-      fprintf (FILE, "\n");                                    \
-    }                                                          \
-                                                               \
-  fprintf (FILE, "\t.section .text\n\t.align 2\n..");          \
-  assemble_name (FILE, NAME);                                  \
-  fprintf (FILE, ":\n");                                       \
-  fprintf (FILE, "\t.function\t..");                            \
-  assemble_name (FILE, NAME);                                  \
-  fprintf (FILE, "\n");                                                \
+#define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL)                      \
+{                                                                      \
+  tree exception_args;                                                 \
+  int i;                                                               \
+                                                                       \
+  if (TREE_PUBLIC (DECL))                                              \
+    {                                                                  \
+      fprintf (FILE, "\t.globl ..");                                   \
+      assemble_name (FILE, NAME);                                      \
+      fprintf (FILE, "\n");                                            \
+    }                                                                  \
+  assemble_name (FILE, NAME);                                          \
+  fprintf (FILE, ":\n");                                               \
+  fprintf (FILE, "\t.ualong ..");                                      \
+  assemble_name (FILE, NAME);                                          \
+  fprintf (FILE, ",.toc\n");                                           \
+                                                                       \
+  fprintf (FILE, "\n#\tFunction: '..");                                        \
+  assemble_name (FILE, NAME);                                          \
+  fputs ("'\n", FILE);                                                 \
+  fputs ("#\tText in section: <default>\n\n", FILE);                   \
+  fputs ("#\tSetup MS Structured-Exception-Handling\n", FILE);         \
+  fputs ("\t.pdata\n", FILE);                                          \
+  fputs ("\t.align 2\n", FILE);                                                \
+  fputs ("\t.ualong ..", FILE);                                                \
+  assemble_name (FILE, NAME);                                          \
+  fputs (",", FILE);                                                   \
+  assemble_name (FILE, NAME);                                          \
+  fputs (".e,", FILE);                                                 \
+  exception_args = lookup_attribute ("exception",                      \
+                                    TYPE_ATTRIBUTES (TREE_TYPE (DECL))); \
+                                                                       \
+  if (exception_args)                                                  \
+    exception_args = TREE_VALUE (exception_args);                      \
+                                                                       \
+  for (i = 0; i < 2; i++)                                              \
+    {                                                                  \
+      if (!exception_args)                                             \
+       fputs ("0,", FILE);                                             \
+      else                                                             \
+       {                                                               \
+         tree field = TREE_VALUE (exception_args);                     \
+         exception_args = TREE_PURPOSE (exception_args);               \
+         if (TREE_CODE (field) == STRING_CST)                          \
+           fprintf (FILE, "%.*s,", TREE_STRING_LENGTH (field),         \
+                    TREE_STRING_POINTER (field));                      \
+         else if (TREE_CODE (field) == IDENTIFIER_NODE)                \
+           fprintf (FILE, "%.*s,", IDENTIFIER_LENGTH (field),          \
+                    IDENTIFIER_POINTER (field));                       \
+         else                                                          \
+           abort ();                                                   \
+       }                                                               \
+    }                                                                  \
+                                                                       \
+  assemble_name (FILE, NAME);                                          \
+  fprintf (FILE, ".b\n\n");                                            \
+  fprintf (FILE, "#\tSwitch to the relocation section\n");             \
+  fprintf (FILE, "\t.reldata\n");                                      \
+                                                                       \
+  if (lookup_attribute ("dllexport",                                   \
+                       TYPE_ATTRIBUTES (TREE_TYPE (DECL))))            \
+    {                                                                  \
+      fprintf (FILE, "\t.globl __imp_");                               \
+      assemble_name (FILE, NAME);                                      \
+      fprintf (FILE, "\n__imp_");                                      \
+      assemble_name (FILE, NAME);                                      \
+      fprintf (FILE, ":\n\t.ulong ");                                  \
+      assemble_name (FILE, NAME);                                      \
+      fprintf (FILE, "\n");                                            \
+    }                                                                  \
+                                                                       \
+  fprintf (FILE, "\t.section .text\n\t.align 2\n..");                  \
+  assemble_name (FILE, NAME);                                          \
+  fprintf (FILE, ":\n");                                               \
+  fprintf (FILE, "\t.function\t..");                                   \
+  assemble_name (FILE, NAME);                                          \
+  fprintf (FILE, "\n");                                                        \
 }
 
 /* This is how to output an assembler line defining a `double' constant.  */