* 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.
This commit is contained in:
Andreas Jaeger 2003-05-21 09:25:53 +00:00
parent 479aa8ecb2
commit 5018956927
6 changed files with 100 additions and 3 deletions

View File

@ -1,3 +1,17 @@
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.
2003-05-17 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/x86_64/syscall.S: Revert last patch.

View File

@ -31,6 +31,9 @@
/* Define if weak symbols are available via the `.weakext' directive. */
#undef HAVE_ASM_WEAKEXT_DIRECTIVE
/* Define if CFI directives are available. */
#undef HAVE_ASM_CFI_DIRECTIVES
/* Define to the assembler line separator character for multiple
assembler instructions per line. Default is `;' */
#undef ASM_LINE_SEP

33
configure vendored
View File

@ -5689,6 +5689,39 @@ _ACEOF
;;
esac
echo "$as_me:$LINENO: checking whether CFI directives are supported" >&5
echo $ECHO_N "checking whether CFI directives are supported... $ECHO_C" >&6
if test "${libc_cv_asm_cfi_directives+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat > conftest.s <<EOF
.text
.type func,@function
func:
.cfi_startproc
.cfi_endproc
EOF
if { ac_try='${CC-cc} $ASFLAGS -c conftest.s 1>&5'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
libc_cv_asm_cfi_directives=yes
else
libc_cv_asm_cfi_directives=no
fi
rm -f conftest*
fi
echo "$as_me:$LINENO: result: $libc_cv_asm_cfi_directives" >&5
echo "${ECHO_T}$libc_cv_asm_cfi_directives" >&6
if test $libc_cv_asm_cfi_directives = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_ASM_CFI_DIRECTIVES 1
_ACEOF
fi
echo "$as_me:$LINENO: checking if -g produces usable source locations for assembler-with-cpp" >&5
echo $ECHO_N "checking if -g produces usable source locations for assembler-with-cpp... $ECHO_C" >&6
if test "${libc_cv_cpp_asm_debuginfo+set}" = set; then

View File

@ -1502,6 +1502,24 @@ EOF
;;
esac
AC_CACHE_CHECK(whether CFI directives are supported, libc_cv_asm_cfi_directives, [dnl
cat > conftest.s <<EOF
.text
.type func,@function
func:
.cfi_startproc
.cfi_endproc
EOF
if AC_TRY_COMMAND(${CC-cc} $ASFLAGS -c conftest.s 1>&AS_MESSAGE_LOG_FD); then
libc_cv_asm_cfi_directives=yes
else
libc_cv_asm_cfi_directives=no
fi
rm -f conftest*])
if test $libc_cv_asm_cfi_directives = yes; then
AC_DEFINE(HAVE_ASM_CFI_DIRECTIVES)
fi
AC_CACHE_CHECK(if -g produces usable source locations for assembler-with-cpp,
libc_cv_cpp_asm_debuginfo, [dnl
cat > conftest.S <<EOF

View File

@ -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__ */

View File

@ -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