diff options
author | Andreas Jaeger <aj@suse.de> | 2003-05-21 09:25:53 +0000 |
---|---|---|
committer | Andreas Jaeger <aj@suse.de> | 2003-05-21 09:25:53 +0000 |
commit | 5018956927ff82b308a8885dcc23dfcddb3ad177 (patch) | |
tree | ac1c69dbe5bec98193689e64c4ab9a5fb5ccdfea /sysdeps | |
parent | 479aa8ecb2e64cb2bd70be3c258d42541d916291 (diff) | |
download | glibc-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.h | 21 | ||||
-rw-r--r-- | sysdeps/x86_64/sysdep.h | 14 |
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 |