aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-03-24 21:44:48 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2010-03-24 21:44:48 +0100
commit6d217c3249d527bb15f4e6153f39ce7e82b01778 (patch)
tree38ab18bcefc3a4d40156011bab09d1a86a4a0d59
parent81ef7e2403b3d6025205e253c87fc3f50828b941 (diff)
downloadgcc-6d217c3249d527bb15f4e6153f39ce7e82b01778.zip
gcc-6d217c3249d527bb15f4e6153f39ce7e82b01778.tar.gz
gcc-6d217c3249d527bb15f4e6153f39ce7e82b01778.tar.bz2
re PR debug/43293 (Invalid unwind info for i?86 -fpic)
PR debug/43293 * target.h (struct gcc_target): Add code_end hook. * target-def.h (TARGET_ASM_CODE_END): Define to hook_void_void if not yet defined. (TARGET_ASM_OUT): Add TARGET_ASM_CODE_END. * toplev.c (compile_file): Call targetm.asm_out.code_end hook before unwind info/debug info output. * config/i386/winnt.c (i386_pe_file_end): Don't call ix86_file_end. * config/i386/linux.h (NEED_INDICATE_EXEC_STACK): Don't define. (TARGET_ASM_FILE_END): Define to file_end_indicate_exec_stack. * config/i386/linux64.h (NEED_INDICATE_EXEC_STACK): Don't define. (TARGET_ASM_FILE_END): Define to file_end_indicate_exec_stack. * config/i386/i386.c (ix86_file_end): Renamed to... (ix86_code_end): ... this. Make static. Don't call file_end_indicate_exec_stack. Emit unwind info using final_start_function/final_end_function. (darwin_x86_file_end): Remove. (TARGET_ASM_CODE_END): Define. * config/i386/i386.h (TARGET_ASM_FILE_END, NEED_INDICATE_EXEC_STACK): Don't define. * config/i386/darwin.h (darwin_x86_file_end): Remove prototype. (TARGET_ASM_FILE_END): Define to darwin_file_end. * config/i386/i386-protos.h (ix86_file_end): Remove prototype. * doc/tm.texi (TARGET_ASM_CODE_END): Document. From-SVN: r157707
-rw-r--r--gcc/ChangeLog25
-rw-r--r--gcc/config/i386/darwin.h5
-rw-r--r--gcc/config/i386/i386-protos.h3
-rw-r--r--gcc/config/i386/i386.c56
-rw-r--r--gcc/config/i386/i386.h3
-rw-r--r--gcc/config/i386/linux.h5
-rw-r--r--gcc/config/i386/linux64.h5
-rw-r--r--gcc/config/i386/winnt.c4
-rw-r--r--gcc/doc/tm.texi8
-rw-r--r--gcc/target-def.h7
-rw-r--r--gcc/target.h6
-rw-r--r--gcc/toplev.c4
12 files changed, 81 insertions, 50 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 02441b7..e6d05fe 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,30 @@
2010-03-24 Jakub Jelinek <jakub@redhat.com>
+ PR debug/43293
+ * target.h (struct gcc_target): Add code_end hook.
+ * target-def.h (TARGET_ASM_CODE_END): Define to hook_void_void
+ if not yet defined.
+ (TARGET_ASM_OUT): Add TARGET_ASM_CODE_END.
+ * toplev.c (compile_file): Call targetm.asm_out.code_end
+ hook before unwind info/debug info output.
+ * config/i386/winnt.c (i386_pe_file_end): Don't call ix86_file_end.
+ * config/i386/linux.h (NEED_INDICATE_EXEC_STACK): Don't define.
+ (TARGET_ASM_FILE_END): Define to file_end_indicate_exec_stack.
+ * config/i386/linux64.h (NEED_INDICATE_EXEC_STACK): Don't define.
+ (TARGET_ASM_FILE_END): Define to file_end_indicate_exec_stack.
+ * config/i386/i386.c (ix86_file_end): Renamed to...
+ (ix86_code_end): ... this. Make static. Don't call
+ file_end_indicate_exec_stack. Emit unwind info using
+ final_start_function/final_end_function.
+ (darwin_x86_file_end): Remove.
+ (TARGET_ASM_CODE_END): Define.
+ * config/i386/i386.h (TARGET_ASM_FILE_END,
+ NEED_INDICATE_EXEC_STACK): Don't define.
+ * config/i386/darwin.h (darwin_x86_file_end): Remove prototype.
+ (TARGET_ASM_FILE_END): Define to darwin_file_end.
+ * config/i386/i386-protos.h (ix86_file_end): Remove prototype.
+ * doc/tm.texi (TARGET_ASM_CODE_END): Document.
+
PR target/43498
* config/i386/i386.c (x86_output_mi_thunk): Call final_start_function
at the beginning and final_end_function at the end.
diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h
index 21ffbc1..f95d9c9 100644
--- a/gcc/config/i386/darwin.h
+++ b/gcc/config/i386/darwin.h
@@ -1,5 +1,5 @@
/* Target definitions for x86 running Darwin.
- Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008
+ Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2010
Free Software Foundation, Inc.
Contributed by Apple Computer Inc.
@@ -141,9 +141,8 @@ along with GCC; see the file COPYING3. If not see
#define SHIFT_DOUBLE_OMITS_COUNT 0
-extern void darwin_x86_file_end (void);
#undef TARGET_ASM_FILE_END
-#define TARGET_ASM_FILE_END darwin_x86_file_end
+#define TARGET_ASM_FILE_END darwin_file_end
/* Define the syntax of pseudo-ops, labels and comments. */
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index aa2ccd7..d0dd8ca 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -1,6 +1,6 @@
/* Definitions of target machine for GCC for IA-32.
Copyright (C) 1988, 1992, 1994, 1995, 1996, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This file is part of GCC.
@@ -27,7 +27,6 @@ extern void ix86_conditional_register_usage (void);
extern int ix86_can_use_return_insn_p (void);
extern void ix86_setup_frame_addresses (void);
-extern void ix86_file_end (void);
extern HOST_WIDE_INT ix86_initial_elimination_offset (int, int);
extern void ix86_expand_prologue (void);
extern void ix86_expand_epilogue (int);
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 2a6d674..da2a981 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -7580,8 +7580,8 @@ get_pc_thunk_name (char name[32], unsigned int regno)
/* This function generates code for -fpic that loads %ebx with
the return address of the caller and then returns. */
-void
-ix86_file_end (void)
+static void
+ix86_code_end (void)
{
rtx xops[2];
int regno;
@@ -7589,15 +7589,21 @@ ix86_file_end (void)
for (regno = 0; regno < 8; ++regno)
{
char name[32];
-#ifdef DWARF2_UNWIND_INFO
- bool do_cfi;
-#endif
+ tree decl;
if (! ((pic_labels_used >> regno) & 1))
continue;
get_pc_thunk_name (name, regno);
+ decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
+ get_identifier (name),
+ build_function_type (void_type_node, void_list_node));
+ DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
+ NULL_TREE, void_type_node);
+ TREE_PUBLIC (decl) = 1;
+ TREE_STATIC (decl) = 1;
+
#if TARGET_MACHO
if (TARGET_MACHO)
{
@@ -7613,13 +7619,6 @@ ix86_file_end (void)
#endif
if (USE_HIDDEN_LINKONCE)
{
- tree decl;
-
- decl = build_decl (BUILTINS_LOCATION,
- FUNCTION_DECL, get_identifier (name),
- error_mark_node);
- TREE_PUBLIC (decl) = 1;
- TREE_STATIC (decl) = 1;
DECL_COMDAT_GROUP (decl) = DECL_ASSEMBLER_NAME (decl);
(*targetm.asm_out.unique_section) (decl, 0);
@@ -7637,23 +7636,22 @@ ix86_file_end (void)
ASM_OUTPUT_LABEL (asm_out_file, name);
}
-#ifdef DWARF2_UNWIND_INFO
- do_cfi = dwarf2out_do_cfi_asm ();
- if (do_cfi)
- fprintf (asm_out_file, "\t.cfi_startproc\n");
-#endif
+ DECL_INITIAL (decl) = make_node (BLOCK);
+ current_function_decl = decl;
+ init_function_start (decl);
+ /* Make sure unwind info is emitted for the thunk if needed. */
+ final_start_function (emit_barrier (), asm_out_file, 1);
+
xops[0] = gen_rtx_REG (Pmode, regno);
xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
output_asm_insn ("ret", xops);
-#ifdef DWARF2_UNWIND_INFO
- if (do_cfi)
- fprintf (asm_out_file, "\t.cfi_endproc\n");
-#endif
+ final_end_function ();
+ init_insn_lengths ();
+ free_after_compilation (cfun);
+ set_cfun (NULL);
+ current_function_decl = NULL;
}
-
- if (NEED_INDICATE_EXEC_STACK)
- file_end_indicate_exec_stack ();
}
/* Emit code for the SET_GOT patterns. */
@@ -25938,13 +25936,6 @@ machopic_output_stub (FILE *file, const char *symb, const char *stub)
fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
fprintf (file, ASM_LONG "%s\n", binder_name);
}
-
-void
-darwin_x86_file_end (void)
-{
- darwin_file_end ();
- ix86_file_end ();
-}
#endif /* TARGET_MACHO */
/* Order the registers for register allocator. */
@@ -30550,6 +30541,9 @@ ix86_enum_va_list (int idx, const char **pname, tree *ptree)
#undef TARGET_CAN_ELIMINATE
#define TARGET_CAN_ELIMINATE ix86_can_eliminate
+#undef TARGET_ASM_CODE_END
+#define TARGET_ASM_CODE_END ix86_code_end
+
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-i386.h"
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 521e2fe..0f13359 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -1627,9 +1627,6 @@ typedef struct ix86_args {
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
function_arg (&(CUM), (MODE), (TYPE), (NAMED))
-#define TARGET_ASM_FILE_END ix86_file_end
-#define NEED_INDICATE_EXEC_STACK 0
-
/* Output assembler code to FILE to increment profiler label # LABELNO
for profiling a function entry. */
diff --git a/gcc/config/i386/linux.h b/gcc/config/i386/linux.h
index 5d8e5ad..2a31880 100644
--- a/gcc/config/i386/linux.h
+++ b/gcc/config/i386/linux.h
@@ -1,6 +1,6 @@
/* Definitions for Intel 386 running Linux-based GNU systems with ELF format.
Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2004, 2005,
- 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+ 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
Contributed by Eric Youngdale.
Modified for stabs-in-ELF by H.J. Lu.
@@ -202,8 +202,7 @@ along with GCC; see the file COPYING3. If not see
#define LIBGCC2_TF_CEXT q
#define TF_SIZE 113
-#undef NEED_INDICATE_EXEC_STACK
-#define NEED_INDICATE_EXEC_STACK 1
+#define TARGET_ASM_FILE_END file_end_indicate_exec_stack
#define MD_UNWIND_SUPPORT "config/i386/linux-unwind.h"
diff --git a/gcc/config/i386/linux64.h b/gcc/config/i386/linux64.h
index 8075df7..867de59 100644
--- a/gcc/config/i386/linux64.h
+++ b/gcc/config/i386/linux64.h
@@ -1,5 +1,5 @@
/* Definitions for AMD x86-64 running Linux-based GNU systems with ELF format.
- Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009
+ Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Contributed by Jan Hubicka <jh@suse.cz>, based on linux.h.
@@ -105,8 +105,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define LIBGCC2_TF_CEXT q
#define TF_SIZE 113
-#undef NEED_INDICATE_EXEC_STACK
-#define NEED_INDICATE_EXEC_STACK 1
+#define TARGET_ASM_FILE_END file_end_indicate_exec_stack
#define MD_UNWIND_SUPPORT "config/i386/linux-unwind.h"
diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c
index a6bd1e4..725f3a1 100644
--- a/gcc/config/i386/winnt.c
+++ b/gcc/config/i386/winnt.c
@@ -1,7 +1,7 @@
/* Subroutines for insn-output.c for Windows NT.
Contributed by Douglas Rupp (drupp@cs.washington.edu)
Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
- 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+ 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GCC.
@@ -670,8 +670,6 @@ i386_pe_file_end (void)
{
struct extern_list *p;
- ix86_file_end ();
-
for (p = extern_head; p != NULL; p = p->next)
{
tree decl;
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 2ad07f7..a9822ab 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -7137,6 +7137,14 @@ need to do other things in that hook, have your hook function call
this function.
@end deftypefun
+@deftypefn {Target Hook} void TARGET_ASM_CODE_END (void)
+Output to @code{asm_out_file} any text which is needed before emitting
+unwind info and debug info at the end of a file. Some targets emit
+here PIC setup thunks that cannot be emitted at the end of file,
+because they couldn't have unwind info then. The default is to output
+nothing.
+@end deftypefn
+
@defmac ASM_COMMENT_START
A C string constant describing how to begin a comment in the target
assembler language. The compiler assumes that the comment will end at
diff --git a/gcc/target-def.h b/gcc/target-def.h
index 0fe5d13..a3c0b2c 100644
--- a/gcc/target-def.h
+++ b/gcc/target-def.h
@@ -1,5 +1,5 @@
/* Default initializers for a generic GCC target.
- Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
@@ -204,6 +204,10 @@
#define TARGET_ASM_FILE_END hook_void_void
#endif
+#ifndef TARGET_ASM_CODE_END
+#define TARGET_ASM_CODE_END hook_void_void
+#endif
+
#ifndef TARGET_EXTRA_LIVE_ON_ENTRY
#define TARGET_EXTRA_LIVE_ON_ENTRY hook_void_bitmap
#endif
@@ -292,6 +296,7 @@
TARGET_ASM_CAN_OUTPUT_MI_THUNK, \
TARGET_ASM_FILE_START, \
TARGET_ASM_FILE_END, \
+ TARGET_ASM_CODE_END, \
TARGET_ASM_EXTERNAL_LIBCALL, \
TARGET_ASM_MARK_DECL_PRESERVED, \
TARGET_ASM_RECORD_GCC_SWITCHES, \
diff --git a/gcc/target.h b/gcc/target.h
index ae3b352..645bd0a 100644
--- a/gcc/target.h
+++ b/gcc/target.h
@@ -1,5 +1,5 @@
/* Data structure definitions for a generic GCC target.
- Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
@@ -235,6 +235,10 @@ struct gcc_target
translation unit. */
void (*file_end) (void);
+ /* Output any boilerplace text needed at the end of a
+ translation unit before debug and unwind info is emitted. */
+ void (*code_end) (void);
+
/* Output an assembler pseudo-op to declare a library function name
external. */
void (*external_libcall) (rtx);
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 385d5e1..fb3c4b2 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -1084,6 +1084,10 @@ compile_file (void)
/* Write out any pending weak symbol declarations. */
weak_finish ();
+ /* This must be at the end before unwind and debug info.
+ Some target ports emit PIC setup thunks here. */
+ targetm.asm_out.code_end ();
+
/* Do dbx symbols. */
timevar_push (TV_SYMOUT);