aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meissner <meissner@gcc.gnu.org>1996-03-14 16:25:20 +0000
committerMichael Meissner <meissner@gcc.gnu.org>1996-03-14 16:25:20 +0000
commite56bb9ed5131ba747453ff494d236cf97e9d9494 (patch)
treec6d1c392c35dc36df590092f6ca81e1e812a5a50
parent80363f0d97d98a7e02a425ddfbcf1a78b8120d0f (diff)
downloadgcc-e56bb9ed5131ba747453ff494d236cf97e9d9494.zip
gcc-e56bb9ed5131ba747453ff494d236cf97e9d9494.tar.gz
gcc-e56bb9ed5131ba747453ff494d236cf97e9d9494.tar.bz2
Add exception attribute for Windows
From-SVN: r11528
-rw-r--r--gcc/config/rs6000/rs6000.c23
-rw-r--r--gcc/config/rs6000/win-nt.h131
2 files changed, 100 insertions, 54 deletions
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 34fdab7..dcdf568 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -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;
diff --git a/gcc/config/rs6000/win-nt.h b/gcc/config/rs6000/win-nt.h
index 1d3d473..e97a703 100644
--- a/gcc/config/rs6000/win-nt.h
+++ b/gcc/config/rs6000/win-nt.h
@@ -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. */