about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
authorAndreas Jaeger <aj@suse.de>2003-05-21 09:25:53 +0000
committerAndreas Jaeger <aj@suse.de>2003-05-21 09:25:53 +0000
commit5018956927ff82b308a8885dcc23dfcddb3ad177 (patch)
treeac1c69dbe5bec98193689e64c4ab9a5fb5ccdfea /sysdeps
parent479aa8ecb2e64cb2bd70be3c258d42541d916291 (diff)
downloadglibc-5018956927ff82b308a8885dcc23dfcddb3ad177.tar.gz
glibc-5018956927ff82b308a8885dcc23dfcddb3ad177.tar.xz
glibc-5018956927ff82b308a8885dcc23dfcddb3ad177.zip
* sysdeps/generic/sysdep.h (cfi_offset, cfi_startproc,
cfi_endproc, cfi_def_cfa, cfi_def_ccfa_register, 
cfi_def_cfa_offset, cfi_adjust_cfa_offset, cfi_offset): Define.
	* sysdeps/x86_64/sysdep.h (CALL_MCOUNT): Add cfi directives.
	(ENTRY): Likewise.
	(END): Likewise.

	* configure.in: Test for asm cfi directives.

	* config.h.in: Add HAVE_ASM_CFI_DIRECTIVES.
2003-05-21  Andreas Jaeger  <aj@suse.de>

	* sysdeps/generic/sysdep.h (cfi_offset, cfi_startproc,
	cfi_endproc, cfi_def_cfa, cfi_def_ccfa_register,
	cfi_def_cfa_offset, cfi_adjust_cfa_offset, cfi_offset): Define.

	* sysdeps/x86_64/sysdep.h (CALL_MCOUNT): Add cfi directives.
	(ENTRY): Likewise.
	(END): Likewise.

	* configure.in: Test for asm cfi directives.

	* config.h.in: Add HAVE_ASM_CFI_DIRECTIVES.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/sysdep.h21
-rw-r--r--sysdeps/x86_64/sysdep.h14
2 files changed, 32 insertions, 3 deletions
diff --git a/sysdeps/generic/sysdep.h b/sysdeps/generic/sysdep.h
index 0d69ac6fa8..3223c976e6 100644
--- a/sysdeps/generic/sysdep.h
+++ b/sysdeps/generic/sysdep.h
@@ -46,4 +46,25 @@
 #ifndef JUMPTARGET
 #define JUMPTARGET(sym)		sym
 #endif
+
+/* Makros to generate eh_frame unwind information.  */
+# ifdef HAVE_ASM_CFI_DIRECTIVES
+#  define cfi_startproc	.cfi_startproc
+#  define cfi_endproc	.cfi_endproc
+#  define cfi_def_cfa(reg, off)	.cfi_def_cfa reg, off
+#  define cfi_def_cfa_register(reg)	.cfi_def_cfa_register reg
+#  define cfi_def_cfa_offset(off)	.cfi_def_cfa_offset off
+#  define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off
+#  define cfi_offset(reg, off)	.cfi_offset reg, off
+# else
+#  define cfi_startproc
+#  define cfi_endproc
+#  define cfi_def_cfa(reg, off)
+#  define cfi_def_cfa_register(reg)
+#  define cfi_def_cfa_offset(off)
+#  define cfi_adjust_cfa_offset(off)
+#  define cfi_offset(reg, off)
+# endif
+
+
 #endif /* __ASSEMBLER__ */
diff --git a/sysdeps/x86_64/sysdep.h b/sysdeps/x86_64/sysdep.h
index 99b7e565e9..122270f91b 100644
--- a/sysdeps/x86_64/sysdep.h
+++ b/sysdeps/x86_64/sysdep.h
@@ -50,18 +50,26 @@
   ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
   .align ALIGNARG(4);							      \
   C_LABEL(name)								      \
+  cfi_startproc;							      \
   CALL_MCOUNT
 
 #undef	END
 #define END(name)							      \
-  ASM_SIZE_DIRECTIVE(name)						      \
+  cfi_endproc;								      \
+  ASM_SIZE_DIRECTIVE(name)
 
 /* If compiled for profiling, call `mcount' at the start of each function.  */
 #ifdef	PROF
 /* The mcount code relies on a normal frame pointer being on the stack
    to locate our caller, so push one just for its benefit.  */
-#define CALL_MCOUNT \
-  pushq %rbp; movq %rsp, %rbp; call JUMPTARGET(mcount); popq %rbp;
+#define CALL_MCOUNT                                                          \
+  pushq %rbp;                                                                \
+  cfi_adjust_cfa_offset(8);                                                  \
+  movq %rsp, %rbp;                                                           \
+  cfi_def_cfa_register(%rbp);                                                \
+  call JUMPTARGET(mcount);                                                   \
+  popq %rbp;                                                                 \
+  cfi_def_cfa(rsp,8);
 #else
 #define CALL_MCOUNT		/* Do nothing.  */
 #endif