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
This commit is contained in:
parent
5e86e54057
commit
ab33bd5ceb
6 changed files with 45 additions and 71 deletions
|
@ -1,3 +1,18 @@
|
|||
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
|
||||
|
|
|
@ -269,13 +269,14 @@ do { \
|
|||
/* Write the extra assembler code needed to declare a function
|
||||
properly. If we are generating SDB debugging information, this
|
||||
will happen automatically, so we only need to handle other cases. */
|
||||
#undef SUBTARGET_ASM_DECLARE_FUNCTION_NAME
|
||||
#define SUBTARGET_ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
|
||||
#undef ASM_DECLARE_FUNCTION_NAME
|
||||
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
|
||||
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); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
|
|
|
@ -136,7 +136,6 @@ 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_declare_function_name (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);
|
||||
|
|
|
@ -5078,15 +5078,18 @@ ix86_function_type_abi (const_tree fntype)
|
|||
static bool
|
||||
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)
|
||||
{
|
||||
error_at (DECL_SOURCE_LOCATION (fntype),
|
||||
"ms_hook_prologue is not compatible with nested function");
|
||||
}
|
||||
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");
|
||||
}
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -5109,45 +5112,6 @@ ix86_cfun_abi (void)
|
|||
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 */
|
||||
extern void init_regs (void);
|
||||
|
||||
|
@ -8793,24 +8757,21 @@ ix86_expand_prologue (void)
|
|||
|
||||
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;
|
||||
|
||||
/* 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
|
||||
8b ec movl.s %esp,%ebp
|
||||
|
||||
This matches the hookable function prologue in Win32 API
|
||||
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.
|
||||
Remark: Initial nop-move gets emitted by the function
|
||||
ix86_asm_declare_function_name and isn't part of this
|
||||
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. */
|
||||
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));
|
||||
|
@ -26592,9 +26553,15 @@ 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
|
||||
if (!TARGET_64BIT)
|
||||
sorry ("ms_hook_prologue attribute needs assembler swap suffix support");
|
||||
sorry ("ms_hook_prologue attribute needs assembler swap suffix support");
|
||||
#endif
|
||||
|
||||
return NULL_TREE;
|
||||
|
|
|
@ -2082,14 +2082,6 @@ do { \
|
|||
}
|
||||
#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,
|
||||
because the assembler cannot handle label differences between
|
||||
sections. This is the case for x86_64 on Mach-O for example. */
|
||||
|
|
|
@ -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 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.
|
||||
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)
|
||||
|
||||
@item naked
|
||||
@cindex function without a prologue/epilogue code
|
||||
|
|
Loading…
Add table
Reference in a new issue