Jelajahi Sumber

tile: support FRAME_POINTER

Allow enabling frame pointer support; this makes it easier to hook
into the various kernel features that claim they require it without
having to add Kconfig conditionals everywhere (a la mips, ppc, s390,
and microblaze).  When enabled, it basically eliminates leaf functions
as such, and stops optimizing tail and sibling calls.  It adds around
3% to the size of the kernel when enabled.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Chris Metcalf 12 tahun lalu
induk
melakukan
49cf78ef7b
4 mengubah file dengan 12 tambahan dan 9 penghapusan
  1. 1 0
      arch/tile/Kconfig
  2. 7 7
      arch/tile/lib/Makefile
  3. 2 1
      arch/tile/lib/cacheflush.c
  4. 2 1
      arch/tile/lib/memcpy_64.c

+ 1 - 0
arch/tile/Kconfig

@@ -26,6 +26,7 @@ config TILE
 	select HAVE_SYSCALL_TRACEPOINTS
 	select HAVE_SYSCALL_TRACEPOINTS
 	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
 	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
 	select HAVE_DEBUG_STACKOVERFLOW
 	select HAVE_DEBUG_STACKOVERFLOW
+	select ARCH_WANT_FRAME_POINTERS
 
 
 # FIXME: investigate whether we need/want these options.
 # FIXME: investigate whether we need/want these options.
 #	select HAVE_IOREMAP_PROT
 #	select HAVE_IOREMAP_PROT

+ 7 - 7
arch/tile/lib/Makefile

@@ -6,13 +6,13 @@ lib-y = cacheflush.o checksum.o cpumask.o delay.o uaccess.o \
 	memmove.o memcpy_$(BITS).o memchr_$(BITS).o memset_$(BITS).o \
 	memmove.o memcpy_$(BITS).o memchr_$(BITS).o memset_$(BITS).o \
 	strchr_$(BITS).o strlen_$(BITS).o strnlen_$(BITS).o
 	strchr_$(BITS).o strlen_$(BITS).o strnlen_$(BITS).o
 
 
-ifeq ($(CONFIG_TILEGX),y)
-CFLAGS_REMOVE_memcpy_user_64.o = -fno-omit-frame-pointer
-lib-y += memcpy_user_64.o
-else
-lib-y += atomic_32.o atomic_asm_32.o memcpy_tile64.o
-endif
-
+lib-$(CONFIG_TILEGX) += memcpy_user_64.o
+lib-$(CONFIG_TILEPRO) += atomic_32.o atomic_asm_32.o memcpy_tile64.o
 lib-$(CONFIG_SMP) += spinlock_$(BITS).o usercopy_$(BITS).o
 lib-$(CONFIG_SMP) += spinlock_$(BITS).o usercopy_$(BITS).o
 
 
 obj-$(CONFIG_MODULES) += exports.o
 obj-$(CONFIG_MODULES) += exports.o
+
+# The finv_buffer_remote() and copy_{to,from}_user() routines can't
+# have -pg added, since they both rely on being leaf functions.
+CFLAGS_REMOVE_cacheflush.o = -pg
+CFLAGS_REMOVE_memcpy_user_64.o = -pg

+ 2 - 1
arch/tile/lib/cacheflush.c

@@ -36,7 +36,8 @@ static inline void force_load(char *p)
  * core (if "!hfh") or homed via hash-for-home (if "hfh"), waiting
  * core (if "!hfh") or homed via hash-for-home (if "hfh"), waiting
  * until the memory controller holds the flushed values.
  * until the memory controller holds the flushed values.
  */
  */
-void finv_buffer_remote(void *buffer, size_t size, int hfh)
+void __attribute__((optimize("omit-frame-pointer")))
+finv_buffer_remote(void *buffer, size_t size, int hfh)
 {
 {
 	char *p, *base;
 	char *p, *base;
 	size_t step_size, load_count;
 	size_t step_size, load_count;

+ 2 - 1
arch/tile/lib/memcpy_64.c

@@ -54,7 +54,8 @@ void *memcpy(void *__restrict dstv, const void *__restrict srcv, size_t n)
  * macros to return a count of uncopied bytes due to mm fault.
  * macros to return a count of uncopied bytes due to mm fault.
  */
  */
 #define RETVAL 0
 #define RETVAL 0
-int USERCOPY_FUNC(void *__restrict dstv, const void *__restrict srcv, size_t n)
+int __attribute__((optimize("omit-frame-pointer")))
+USERCOPY_FUNC(void *__restrict dstv, const void *__restrict srcv, size_t n)
 #endif
 #endif
 {
 {
 	char *__restrict dst1 = (char *)dstv;
 	char *__restrict dst1 = (char *)dstv;