From: Michael Meissner Date: Thu, 14 Mar 1996 16:25:20 +0000 (+0000) Subject: Add exception attribute for Windows X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e56bb9ed5131ba747453ff494d236cf97e9d9494;p=gcc.git Add exception attribute for Windows From-SVN: r11528 --- diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 34fdab7b239..dcdf56852c8 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 1d3d473dd04..e97a7033d5b 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: \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. */