mirror of
https://github.com/torvalds/linux.git
synced 2024-12-16 16:12:52 +00:00
aeea3592a1
With compilers which follow the C99 standard (like modern versions of gcc and clang), "extern inline" does the wrong thing (emits code for an externally linkable version of the inline function). In this case using static inline and removing the NULL version of return_address in return_address.c does the right thing. Signed-off-by: Behan Webster <behanw@converseincode.com> Reviewed-by: Mark Charlebois <charlebm@gmail.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
60 lines
1.2 KiB
C
60 lines
1.2 KiB
C
#ifndef _ASM_ARM_FTRACE
|
|
#define _ASM_ARM_FTRACE
|
|
|
|
#ifdef CONFIG_FUNCTION_TRACER
|
|
#define MCOUNT_ADDR ((unsigned long)(__gnu_mcount_nc))
|
|
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
|
|
|
#ifndef __ASSEMBLY__
|
|
extern void mcount(void);
|
|
extern void __gnu_mcount_nc(void);
|
|
|
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
|
struct dyn_arch_ftrace {
|
|
#ifdef CONFIG_OLD_MCOUNT
|
|
bool old_mcount;
|
|
#endif
|
|
};
|
|
|
|
static inline unsigned long ftrace_call_adjust(unsigned long addr)
|
|
{
|
|
/* With Thumb-2, the recorded addresses have the lsb set */
|
|
return addr & ~1;
|
|
}
|
|
|
|
extern void ftrace_caller_old(void);
|
|
extern void ftrace_call_old(void);
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND)
|
|
/*
|
|
* return_address uses walk_stackframe to do it's work. If both
|
|
* CONFIG_FRAME_POINTER=y and CONFIG_ARM_UNWIND=y walk_stackframe uses unwind
|
|
* information. For this to work in the function tracer many functions would
|
|
* have to be marked with __notrace. So for now just depend on
|
|
* !CONFIG_ARM_UNWIND.
|
|
*/
|
|
|
|
void *return_address(unsigned int);
|
|
|
|
#else
|
|
|
|
static inline void *return_address(unsigned int level)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
#endif
|
|
|
|
#define ftrace_return_address(n) return_address(n)
|
|
|
|
#endif /* ifndef __ASSEMBLY__ */
|
|
|
|
#endif /* _ASM_ARM_FTRACE */
|