Commit ab33bd5c by H.J. Lu Committed by H.J. Lu

Revert revision 161876.

2010-07-07  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/44850
	* config/i386/i386.c (ix86_function_ms_hook_prologue): Revert
	revision 161876.
	(ix86_expand_prologue): Likewise.
	(ix86_handle_fndecl_attribute): Likewise.
	(ix86_asm_declare_function_name): Likewise.
	* config/i386/i386.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
	* config/i386/cygming.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
	(SUBTARGET_ASM_DECLARE_FUNCTION_NAME): Likewise.
	* config/i386/i386-protos.h (ix86_asm_declare_function_name):
	Likewise.
	* doc/extend.texi: Likewise.

From-SVN: r161911
parent 5e86e540
2010-07-07 H.J. Lu <hongjiu.lu@intel.com> 2010-07-07 H.J. Lu <hongjiu.lu@intel.com>
PR target/44850
* config/i386/i386.c (ix86_function_ms_hook_prologue): Revert
revision 161876.
(ix86_expand_prologue): Likewise.
(ix86_handle_fndecl_attribute): Likewise.
(ix86_asm_declare_function_name): Likewise.
* config/i386/i386.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
* config/i386/cygming.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
(SUBTARGET_ASM_DECLARE_FUNCTION_NAME): Likewise.
* config/i386/i386-protos.h (ix86_asm_declare_function_name):
Likewise.
* doc/extend.texi: Likewise.
2010-07-07 H.J. Lu <hongjiu.lu@intel.com>
PR target/44844 PR target/44844
* config/i386/i386.md (rdrand<mode>): Changed to expand to * config/i386/i386.md (rdrand<mode>): Changed to expand to
retry if the carry flag isn't valid. retry if the carry flag isn't valid.
......
...@@ -269,13 +269,14 @@ do { \ ...@@ -269,13 +269,14 @@ do { \
/* Write the extra assembler code needed to declare a function /* Write the extra assembler code needed to declare a function
properly. If we are generating SDB debugging information, this properly. If we are generating SDB debugging information, this
will happen automatically, so we only need to handle other cases. */ will happen automatically, so we only need to handle other cases. */
#undef SUBTARGET_ASM_DECLARE_FUNCTION_NAME #undef ASM_DECLARE_FUNCTION_NAME
#define SUBTARGET_ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
do \ do \
{ \ { \
i386_pe_maybe_record_exported_symbol (DECL, NAME, 0); \ i386_pe_maybe_record_exported_symbol (DECL, NAME, 0); \
if (write_symbols != SDB_DEBUG) \ if (write_symbols != SDB_DEBUG) \
i386_pe_declare_function_type (FILE, NAME, TREE_PUBLIC (DECL)); \ i386_pe_declare_function_type (FILE, NAME, TREE_PUBLIC (DECL)); \
ASM_OUTPUT_LABEL (FILE, NAME); \
} \ } \
while (0) while (0)
......
...@@ -136,7 +136,6 @@ extern enum machine_mode ix86_fp_compare_mode (enum rtx_code); ...@@ -136,7 +136,6 @@ extern enum machine_mode ix86_fp_compare_mode (enum rtx_code);
extern rtx ix86_libcall_value (enum machine_mode); extern rtx ix86_libcall_value (enum machine_mode);
extern bool ix86_function_arg_regno_p (int); extern bool ix86_function_arg_regno_p (int);
extern void ix86_asm_declare_function_name (FILE *, const char *, tree);
extern int ix86_function_arg_boundary (enum machine_mode, tree); extern int ix86_function_arg_boundary (enum machine_mode, tree);
extern bool ix86_sol10_return_in_memory (const_tree,const_tree); extern bool ix86_sol10_return_in_memory (const_tree,const_tree);
extern rtx ix86_force_to_memory (enum machine_mode, rtx); extern rtx ix86_force_to_memory (enum machine_mode, rtx);
......
...@@ -5078,15 +5078,18 @@ ix86_function_type_abi (const_tree fntype) ...@@ -5078,15 +5078,18 @@ ix86_function_type_abi (const_tree fntype)
static bool static bool
ix86_function_ms_hook_prologue (const_tree fntype) ix86_function_ms_hook_prologue (const_tree fntype)
{ {
if (lookup_attribute ("ms_hook_prologue", DECL_ATTRIBUTES (fntype))) if (!TARGET_64BIT)
{ {
if (decl_function_context (fntype) != NULL_TREE) if (lookup_attribute ("ms_hook_prologue", DECL_ATTRIBUTES (fntype)))
{ {
error_at (DECL_SOURCE_LOCATION (fntype), if (decl_function_context (fntype) != NULL_TREE)
"ms_hook_prologue is not compatible with nested function"); {
} error_at (DECL_SOURCE_LOCATION (fntype),
"ms_hook_prologue is not compatible with nested function");
}
return true; return true;
}
} }
return false; return false;
} }
...@@ -5109,45 +5112,6 @@ ix86_cfun_abi (void) ...@@ -5109,45 +5112,6 @@ ix86_cfun_abi (void)
return cfun->machine->call_abi; return cfun->machine->call_abi;
} }
/* Write the extra assembler code needed to declare a function properly. */
void
ix86_asm_declare_function_name (FILE *asm_out_file, const char *fname,
tree decl)
{
bool is_ms_hook = ((decl && ix86_function_ms_hook_prologue (decl)) ? true
: false);
#ifdef SUBTARGET_ASM_DECLARE_FUNCTION_NAME
SUBTARGET_ASM_DECLARE_FUNCTION_NAME (asm_out_file, fname, decl);
#endif
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 " %#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 */ /* regclass.c */
extern void init_regs (void); extern void init_regs (void);
...@@ -8793,24 +8757,21 @@ ix86_expand_prologue (void) ...@@ -8793,24 +8757,21 @@ ix86_expand_prologue (void)
ix86_compute_frame_layout (&frame); ix86_compute_frame_layout (&frame);
if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl)) if (ix86_function_ms_hook_prologue (current_function_decl))
{ {
rtx push, mov; rtx push, mov;
/* Make sure the function starts with /* Make sure the function starts with
8b ff movl.s %edi,%edi (see below in text) 8b ff movl.s %edi,%edi
55 push %ebp 55 push %ebp
8b ec movl.s %esp,%ebp 8b ec movl.s %esp,%ebp
This matches the hookable function prologue in Win32 API This matches the hookable function prologue in Win32 API
functions in Microsoft Windows XP Service Pack 2 and newer. functions in Microsoft Windows XP Service Pack 2 and newer.
Wine uses this to enable Windows apps to hook the Win32 API Wine uses this to enable Windows apps to hook the Win32 API
functions provided by Wine. functions provided by Wine. */
Remark: Initial nop-move gets emitted by the function insn = emit_insn (gen_vswapmov (gen_rtx_REG (SImode, DI_REG),
ix86_asm_declare_function_name and isn't part of this gen_rtx_REG (SImode, DI_REG)));
function. The following instruction don't get hard-coded
in ix86_asm_declare_function_name too, as here notes
for those instructions are necessary for unwinder/debug. */
push = emit_insn (gen_push (hard_frame_pointer_rtx)); push = emit_insn (gen_push (hard_frame_pointer_rtx));
mov = emit_insn (gen_vswapmov (hard_frame_pointer_rtx, mov = emit_insn (gen_vswapmov (hard_frame_pointer_rtx,
stack_pointer_rtx)); stack_pointer_rtx));
...@@ -26592,9 +26553,15 @@ ix86_handle_fndecl_attribute (tree *node, tree name, ...@@ -26592,9 +26553,15 @@ ix86_handle_fndecl_attribute (tree *node, tree name,
return NULL_TREE; 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 #ifndef HAVE_AS_IX86_SWAP
if (!TARGET_64BIT) sorry ("ms_hook_prologue attribute needs assembler swap suffix support");
sorry ("ms_hook_prologue attribute needs assembler swap suffix support");
#endif #endif
return NULL_TREE; return NULL_TREE;
......
...@@ -2082,14 +2082,6 @@ do { \ ...@@ -2082,14 +2082,6 @@ do { \
} }
#endif #endif
/* Write the extra assembler code needed to declare a function
properly. Target can add additional code by the sub-target
macro SUBTARGET_ASM_DECLARE_FUNCTION_NAME. */
#undef ASM_DECLARE_FUNCTION_NAME
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
ix86_asm_declare_function_name (FILE, NAME, DECL)
/* Under some conditions we need jump tables in the text section, /* Under some conditions we need jump tables in the text section,
because the assembler cannot handle label differences between because the assembler cannot handle label differences between
sections. This is the case for x86_64 on Mach-O for example. */ sections. This is the case for x86_64 on Mach-O for example. */
......
...@@ -2736,10 +2736,10 @@ the @option{-maccumulate-outgoing-args} option. ...@@ -2736,10 +2736,10 @@ the @option{-maccumulate-outgoing-args} option.
@item ms_hook_prologue @item ms_hook_prologue
@cindex @code{ms_hook_prologue} attribute @cindex @code{ms_hook_prologue} attribute
On 32 bit i[34567]86-*-* targets and 64 bit x86_64-*-* targets, you can use On 32 bit i[34567]86-*-* targets, you can use this function attribute to make
this function attribute to make gcc generate the "hot-patching" function gcc generate the "hot-patching" function prologue used in Win32 API
prologue used in Win32 API functions in Microsoft Windows XP Service Pack 2 functions in Microsoft Windows XP Service Pack 2 and newer. This requires
and newer. support for the swap suffix in the assembler. (GNU Binutils 2.19.51 or later)
@item naked @item naked
@cindex function without a prologue/epilogue code @cindex function without a prologue/epilogue code
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment