]> gcc.gnu.org Git - gcc.git/commitdiff
i386-protos.h (ix86_asm_output_function_label): New prototype.
authorKai Tietz <kai.tietz@onevision.com>
Thu, 8 Jul 2010 17:53:44 +0000 (17:53 +0000)
committerKai Tietz <ktietz@gcc.gnu.org>
Thu, 8 Jul 2010 17:53:44 +0000 (19:53 +0200)
2010-07-08  Kai Tietz  <kai.tietz@onevision.com>

* config/i386/i386-protos.h (ix86_asm_output_function_label):
New prototype.
* config/i386/i386.c (ix86_function_ms_hook_prologue): Check
for NULL fntype argument and allow 64-bit targets.
(ix86_asm_output_function_label): New function.
(ix86_expand_prologue): Handle 64-bit ms hook prologue.
(ix86_handle_fndecl_attribute): Likewise.
* doc/extend.texi (ms_hook_prologue): Adjust documentation.
* doc/doc/tm.texi: Regenerated.
* doc/doc/doc/tm.texi.in (ASM_OUTPUT_FUNCTION_LABEL): New.
(ASM_DECLARE_FUNCTION_NAME): Adjust documentation.
* defaults.h (ASM_OUTPUT_FUNCTION_LABEL): New macro.
* config/darwin.h (ASM_DECLARE_FUNCTION_NAME): Use
ASM_OUTPUT_FUNCTION_LABEL instead of ASM_OUTPUT_LABEL.
* config/elfos.h: Likewise.
* config/i386/cygming.h: Likewise.
* config/netbsd-aout.h: Likewise.
* config/openbsd.h: Likewise.
* config/i386/i386.h (ASM_OUTPUT_FUNCTION_LABEL): Override
by ix86_asm_output_function_label function call.
* varasm.c (assemble_start_function): Use
ASM_OUTPUT_FUNCTION_LABEL instead of ASM_OUTPUT_LABEL.

From-SVN: r161971

14 files changed:
gcc/ChangeLog
gcc/config/darwin.h
gcc/config/elfos.h
gcc/config/i386/cygming.h
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/netbsd-aout.h
gcc/config/openbsd.h
gcc/defaults.h
gcc/doc/extend.texi
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/varasm.c

index 8d5962d2500053f13335f2dc19460b9fca61fa68..531729ce92243be24a24213df1c8eeb0bb81f6ab 100644 (file)
@@ -1,3 +1,28 @@
+2010-07-08  Kai Tietz  <kai.tietz@onevision.com>
+
+       * config/i386/i386-protos.h (ix86_asm_output_function_label):
+       New prototype.
+       * config/i386/i386.c (ix86_function_ms_hook_prologue): Check
+       for NULL fntype argument and allow 64-bit targets.
+       (ix86_asm_output_function_label): New function.
+       (ix86_expand_prologue): Handle 64-bit ms hook prologue.
+       (ix86_handle_fndecl_attribute): Likewise.
+       * doc/extend.texi (ms_hook_prologue): Adjust documentation.
+       * doc/doc/tm.texi: Regenerated.
+       * doc/doc/doc/tm.texi.in (ASM_OUTPUT_FUNCTION_LABEL): New.
+       (ASM_DECLARE_FUNCTION_NAME): Adjust documentation.
+       * defaults.h (ASM_OUTPUT_FUNCTION_LABEL): New macro.
+       * config/darwin.h (ASM_DECLARE_FUNCTION_NAME): Use
+       ASM_OUTPUT_FUNCTION_LABEL instead of ASM_OUTPUT_LABEL.
+       * config/elfos.h: Likewise.
+       * config/i386/cygming.h: Likewise.
+       * config/netbsd-aout.h: Likewise.
+       * config/openbsd.h: Likewise.
+       * config/i386/i386.h (ASM_OUTPUT_FUNCTION_LABEL): Override
+       by ix86_asm_output_function_label function call.
+       * varasm.c (assemble_start_function): Use
+       ASM_OUTPUT_FUNCTION_LABEL instead of ASM_OUTPUT_LABEL.
+
 2010-07-08  Jan Hubicka  <jh@suse.cz>
 
        * cgraph.c (cgraph_will_be_removed_from_program_if_no_direct_calls):
index 6b681ee4509a8339108e50741a2992c396ab2712..99d9928815204b849c5ceaabf3210f15edb40bd7 100644 (file)
@@ -651,7 +651,7 @@ extern GTY(()) int darwin_ms_struct;
         && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))               \
         || DECL_INITIAL (DECL))                                                \
       (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false);  \
-    ASM_OUTPUT_LABEL (FILE, xname);                                    \
+    ASM_OUTPUT_FUNCTION_LABEL (FILE, xname, DECL);                     \
   } while (0)
 
 #undef TARGET_ASM_DECLARE_CONSTANT_NAME
index 6818f6600fe2069dcf7878d357b1513c3eb9cbfb..8c415bad4421717ba6c673c27b90a2f85fbca6e8 100644 (file)
@@ -282,7 +282,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     {                                                          \
       ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");      \
       ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));           \
-      ASM_OUTPUT_LABEL (FILE, NAME);                           \
+      ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL);            \
     }                                                          \
   while (0)
 #endif
index 470637644ff4f1404678725ca1219b2e93439f01..1587af472cc01f908546890fa6e70fc5b8dfd278 100644 (file)
@@ -276,7 +276,7 @@ do {                                                \
       i386_pe_maybe_record_exported_symbol (DECL, NAME, 0);            \
       if (write_symbols != SDB_DEBUG)                                  \
        i386_pe_declare_function_type (FILE, NAME, TREE_PUBLIC (DECL)); \
-      ASM_OUTPUT_LABEL (FILE, NAME);                                   \
+      ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL);                    \
     }                                                                  \
   while (0)
 
index 696bb4a6cdab215e95e1f625dd7ebdd285d2995f..47a0a887d684e3bd3e63e3e78f914ad2b8238a08 100644 (file)
@@ -139,6 +139,7 @@ extern enum machine_mode ix86_fp_compare_mode (enum rtx_code);
 
 extern rtx ix86_libcall_value (enum machine_mode);
 extern bool ix86_function_arg_regno_p (int);
+extern void ix86_asm_output_function_label (FILE *, const char *, tree);
 extern int ix86_function_arg_boundary (enum machine_mode, tree);
 extern bool ix86_sol10_return_in_memory (const_tree,const_tree);
 extern rtx ix86_force_to_memory (enum machine_mode, rtx);
index 83bf4c114f7649707aa6ac838f7566688549929b..99b4cc3e61467792638dd30ddceaca89ff3b8331 100644 (file)
@@ -5099,18 +5099,15 @@ ix86_function_type_abi (const_tree fntype)
 static bool
 ix86_function_ms_hook_prologue (const_tree fntype)
 {
-  if (!TARGET_64BIT)
+  if (fntype && lookup_attribute ("ms_hook_prologue", DECL_ATTRIBUTES (fntype)))
     {
-      if (lookup_attribute ("ms_hook_prologue", DECL_ATTRIBUTES (fntype)))
-        {
-          if (decl_function_context (fntype) != NULL_TREE)
-          {
-            error_at (DECL_SOURCE_LOCATION (fntype),
-                "ms_hook_prologue is not compatible with nested function");
-          }
+      if (decl_function_context (fntype) != NULL_TREE)
+      {
+       error_at (DECL_SOURCE_LOCATION (fntype),
+           "ms_hook_prologue is not compatible with nested function");
+      }
 
-          return true;
-        }
+      return true;
     }
   return false;
 }
@@ -5133,6 +5130,40 @@ ix86_cfun_abi (void)
   return cfun->machine->call_abi;
 }
 
+/* Write the extra assembler code needed to declare a function properly.  */
+
+void
+ix86_asm_output_function_label (FILE *asm_out_file, const char *fname,
+                               tree decl)
+{
+  bool is_ms_hook = ix86_function_ms_hook_prologue (decl);
+
+  if (is_ms_hook)
+    {
+      int i, filler_count = (TARGET_64BIT ? 32 : 16);
+      unsigned int filler_cc = 0xcccccccc;
+
+      for (i = 0; i < filler_count; i += 4)
+        fprintf (asm_out_file, ASM_LONG " 0x%x\n", filler_cc);
+    }
+
+  ASM_OUTPUT_LABEL (asm_out_file, fname);
+
+  /* Output magic byte marker, if hot-patch attribute is set.
+     For x86 case frame-pointer prologue will be emitted in
+     expand_prologue.  */
+  if (is_ms_hook)
+    {
+      if (TARGET_64BIT)
+       /* leaq [%rsp + 0], %rsp  */
+       asm_fprintf (asm_out_file, ASM_BYTE
+                    "0x48, 0x8d, 0xa4, 0x24, 0x00, 0x00, 0x00, 0x00\n");
+      else
+        /* movl.s %edi, %edi.  */
+       asm_fprintf (asm_out_file, ASM_BYTE "0x8b, 0xff\n");
+    }
+}
+
 /* regclass.c  */
 extern void init_regs (void);
 
@@ -9154,12 +9185,12 @@ ix86_expand_prologue (void)
 
   ix86_compute_frame_layout (&frame);
 
-  if (ix86_function_ms_hook_prologue (current_function_decl))
+  if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
     {
       rtx push, mov;
 
       /* Make sure the function starts with
-        8b ff     movl.s %edi,%edi
+        8b ff     movl.s %edi,%edi (emited by ix86_asm_output_function_label)
         55        push   %ebp
         8b ec     movl.s %esp,%ebp
 
@@ -9167,8 +9198,6 @@ ix86_expand_prologue (void)
         functions in Microsoft Windows XP Service Pack 2 and newer.
         Wine uses this to enable Windows apps to hook the Win32 API
         functions provided by Wine.  */
-      insn = emit_insn (gen_vswapmov (gen_rtx_REG (SImode, DI_REG),
-                                     gen_rtx_REG (SImode, DI_REG)));
       push = emit_insn (gen_push (hard_frame_pointer_rtx));
       mov = emit_insn (gen_vswapmov (hard_frame_pointer_rtx,
                                     stack_pointer_rtx));
@@ -26976,15 +27005,9 @@ ix86_handle_fndecl_attribute (tree *node, tree name,
       return NULL_TREE;
     }
 
-  if (TARGET_64BIT)
-    {
-      warning (OPT_Wattributes, "%qE attribute only available for 32-bit",
-               name);
-      return NULL_TREE;
-    }
-
 #ifndef HAVE_AS_IX86_SWAP
-  sorry ("ms_hook_prologue attribute needs assembler swap suffix support");
+  if (!TARGET_64BIT)
+    sorry ("ms_hook_prologue attribute needs assembler swap suffix support");
 #endif
 
     return NULL_TREE;
index d036bf03fec3d52d844f018a23e198dbbcf82711..eb3eb9f69b59e2c69328dc8a21c6e78a24dd1366 100644 (file)
@@ -2082,6 +2082,13 @@ do {                                                                     \
     }
 #endif
 
+/* Write the extra assembler code needed to declare a function
+   properly.  */
+
+#undef ASM_OUTPUT_FUNCTION_LABEL
+#define ASM_OUTPUT_FUNCTION_LABEL(FILE, NAME, DECL) \
+  ix86_asm_output_function_label (FILE, NAME, DECL)
+
 /* Under some conditions we need jump tables in the text section,
    because the assembler cannot handle label differences between
    sections.  This is the case for x86_64 on Mach-O for example.  */
index 99e8c3a9c49d439d7bb662718088ae779344013a..914212b877f0063038089d786448d10c7613ae73 100644 (file)
@@ -141,7 +141,7 @@ along with GCC; see the file COPYING3.  If not see
     {                                                                  \
       ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");              \
       ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));                   \
-      ASM_OUTPUT_LABEL(FILE, NAME);                                    \
+      ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL);                    \
     }                                                                  \
   while (0)
 
index 59728c377d6c6a27f4b79298bc81bf7990fb8399..30e1c252c5a8d60d99f71192f9292798a89db949 100644 (file)
@@ -216,7 +216,7 @@ while (0)
   do {                                                                 \
     ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");                        \
     ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));                     \
-    ASM_OUTPUT_LABEL(FILE, NAME);                                      \
+    ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL);                      \
   } while (0)
 #endif
 
index eb74033657b362cc0822d4a4073476f7f3d7f02d..e7e32c4dd06c6cee8771d6fee68dce455ad49e2b 100644 (file)
@@ -133,13 +133,21 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #endif
 
 /* This is how to output the definition of a user-level label named
-   NAME, such as the label on a static function or variable NAME.  */
+   NAME, such as the label on variable NAME.  */
 
 #ifndef ASM_OUTPUT_LABEL
 #define ASM_OUTPUT_LABEL(FILE,NAME) \
   do { assemble_name ((FILE), (NAME)); fputs (":\n", (FILE)); } while (0)
 #endif
 
+/* This is how to output the definition of a user-level label named
+   NAME, such as the label on a function.  */
+
+#ifndef ASM_OUTPUT_FUNCTION_LABEL
+#define ASM_OUTPUT_FUNCTION_LABEL(FILE, NAME, DECL) \
+  ASM_OUTPUT_LABEL ((FILE), (NAME))
+#endif
+
 /* Output the definition of a compiler-generated label named NAME.  */
 #ifndef ASM_OUTPUT_INTERNAL_LABEL
 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,NAME)   \
index 967be9176efc8a8df4baa0601d1d125f9c749bda..b9b4a44fd39df75c2547ecb8b2633287b09c102f 100644 (file)
@@ -2736,10 +2736,10 @@ the @option{-maccumulate-outgoing-args} option.
 @item ms_hook_prologue
 @cindex @code{ms_hook_prologue} attribute
 
-On 32 bit i[34567]86-*-* targets, you can use this function attribute to make
-gcc generate the "hot-patching" function prologue used in Win32 API
-functions in Microsoft Windows XP Service Pack 2 and newer. This requires
-support for the swap suffix in the assembler. (GNU Binutils 2.19.51 or later)
+On 32 bit i[34567]86-*-* targets and 64 bit x86_64-*-* targets, you can use
+this function attribute to make gcc generate the "hot-patching" function
+prologue used in Win32 API functions in Microsoft Windows XP Service Pack 2
+and newer.
 
 @item naked
 @cindex function without a prologue/epilogue code
index cb878afbe5717554d0d563ded2421efa011800be..d3d9c1e836018887317e98f9f3a7b3d0671885d6 100644 (file)
@@ -7661,6 +7661,19 @@ assembler syntax for defining the name, and a newline.  A default
 definition of this macro is provided which is correct for most systems.
 @end defmac
 
+@defmac ASM_OUTPUT_FUNCTION_LABEL (@var{stream}, @var{name}, @var{decl})
+A C statement (sans semicolon) to output to the stdio stream
+@var{stream} the assembler definition of a label named @var{name} of
+a function.
+Use the expression @code{assemble_name (@var{stream}, @var{name})} to
+output the name itself; before and after that, output the additional
+assembler syntax for defining the name, and a newline.  A default
+definition of this macro is provided which is correct for most systems.
+
+If this macro is not defined, then the function name is defined in the
+usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
+@end defmac
+
 @findex assemble_name_raw
 @defmac ASM_OUTPUT_INTERNAL_LABEL (@var{stream}, @var{name})
 Identical to @code{ASM_OUTPUT_LABEL}, except that @var{name} is known
@@ -7744,11 +7757,11 @@ A C statement (sans semicolon) to output to the stdio stream
 @var{stream} any text necessary for declaring the name @var{name} of a
 function which is being defined.  This macro is responsible for
 outputting the label definition (perhaps using
-@code{ASM_OUTPUT_LABEL}).  The argument @var{decl} is the
+@code{ASM_OUTPUT_FUNCTION_LABEL}).  The argument @var{decl} is the
 @code{FUNCTION_DECL} tree node representing the function.
 
 If this macro is not defined, then the function name is defined in the
-usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
+usual manner as a label (by means of @code{ASM_OUTPUT_FUNCTION_LABEL}).
 
 You may wish to use @code{ASM_OUTPUT_TYPE_DIRECTIVE} in the definition
 of this macro.
index bab073e5ae02dead71fb226e3ed2ee143240c766..51a8e5eaeab59919803a1e7000fac7255ee38d05 100644 (file)
@@ -7660,6 +7660,19 @@ assembler syntax for defining the name, and a newline.  A default
 definition of this macro is provided which is correct for most systems.
 @end defmac
 
+@defmac ASM_OUTPUT_FUNCTION_LABEL (@var{stream}, @var{name}, @var{decl})
+A C statement (sans semicolon) to output to the stdio stream
+@var{stream} the assembler definition of a label named @var{name} of
+a function.
+Use the expression @code{assemble_name (@var{stream}, @var{name})} to
+output the name itself; before and after that, output the additional
+assembler syntax for defining the name, and a newline.  A default
+definition of this macro is provided which is correct for most systems.
+
+If this macro is not defined, then the function name is defined in the
+usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
+@end defmac
+
 @findex assemble_name_raw
 @defmac ASM_OUTPUT_INTERNAL_LABEL (@var{stream}, @var{name})
 Identical to @code{ASM_OUTPUT_LABEL}, except that @var{name} is known
@@ -7743,11 +7756,11 @@ A C statement (sans semicolon) to output to the stdio stream
 @var{stream} any text necessary for declaring the name @var{name} of a
 function which is being defined.  This macro is responsible for
 outputting the label definition (perhaps using
-@code{ASM_OUTPUT_LABEL}).  The argument @var{decl} is the
+@code{ASM_OUTPUT_FUNCTION_LABEL}).  The argument @var{decl} is the
 @code{FUNCTION_DECL} tree node representing the function.
 
 If this macro is not defined, then the function name is defined in the
-usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
+usual manner as a label (by means of @code{ASM_OUTPUT_FUNCTION_LABEL}).
 
 You may wish to use @code{ASM_OUTPUT_TYPE_DIRECTIVE} in the definition
 of this macro.
index 68ae70ac9b807f2bd0bec390f5678f679fbd2a4e..de78bd094c9e33bc217d664be5ba21f1523fd5bc 100644 (file)
@@ -1865,7 +1865,7 @@ assemble_start_function (tree decl, const char *fnname)
   ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
 #else
   /* Standard thing is just output label for the function.  */
-  ASM_OUTPUT_LABEL (asm_out_file, fnname);
+  ASM_OUTPUT_FUNCTION_LABEL (asm_out_file, fnname, current_function_decl);
 #endif /* ASM_DECLARE_FUNCTION_NAME */
 }
 
This page took 0.125056 seconds and 5 git commands to generate.