76 lines
2.9 KiB
Diff
76 lines
2.9 KiB
Diff
From 37d4262a7a35886cf8ac856457bbad8c0498c8d6 Mon Sep 17 00:00:00 2001
|
|
From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com>
|
|
Date: Tue, 22 Aug 2017 14:01:07 -0300
|
|
Subject: [PATCH 40] Fix remaining return type of ifunc resolver declaration
|
|
|
|
Since Martin Sebor's commit
|
|
|
|
commit ee4e992ebe5f9712faedeefe8958b67d61eaa0f2
|
|
Author: Martin Sebor <msebor@redhat.com>
|
|
Date: Tue Aug 22 09:35:23 2017 -0600
|
|
|
|
Declare ifunc resolver to return a pointer to the same type as the target
|
|
function to help GCC detect incompatibilities between the two when it's
|
|
enhanced to do so.
|
|
|
|
builds for powerpc64le fail in the declaration of some ifunc resolvers,
|
|
because the ifunc is declared with unmatching return types. One of the
|
|
declarations comes from the __ifunc_resolver macro, which was patched by
|
|
the aforementioned commit:
|
|
|
|
/* Helper / base macros for indirect function symbols. */
|
|
#define __ifunc_resolver(type_name, name, expr, arg, init, classifier) \
|
|
classifier inhibit_stack_protector \
|
|
__typeof (type_name) *name##_ifunc (arg) \
|
|
|
|
whereas the other comes from the unpatched __ifunc macro when
|
|
HAVE_GCC_IFUNC is not defined:
|
|
|
|
# define __ifunc(type_name, name, expr, arg, init) \
|
|
extern __typeof (type_name) name; \
|
|
void *name##_ifunc (arg) __asm__ (#name); \
|
|
|
|
This patch changes the return type of the ifunc resolver in the __ifunc
|
|
macro, so that it matches the return type of the target function,
|
|
similarly to what the aforementioned commit does.
|
|
|
|
Tested for powerpc64le and s390x with unpatched GCC.
|
|
|
|
* include/libc-symbols.h: [!defined HAVE_GCC_IFUNC] (__ifunc):
|
|
Change the return type of the ifunc resolver to match the return
|
|
type of the target function.
|
|
|
|
(cherry picked from commit b513da7e80febbbfb8e58282075018652b6f7273)
|
|
---
|
|
ChangeLog | 6 ++++++
|
|
include/libc-symbols.h | 2 +-
|
|
2 files changed, 7 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/ChangeLog b/ChangeLog
|
|
index ec9b9f5edb..6b09c61d5a 100644
|
|
--- a/ChangeLog
|
|
+++ b/ChangeLog
|
|
@@ -1,3 +1,9 @@
|
|
+2017-08-22 Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
|
|
+
|
|
+ * include/libc-symbols.h: [!defined HAVE_GCC_IFUNC] (__ifunc):
|
|
+ Change the return type of the ifunc resolver to match the return
|
|
+ type of the target function.
|
|
+
|
|
2017-08-22 Martin Sebor <msebor@redhat.com>
|
|
|
|
* include/libc-symbols.h (__ifunc_resolver): Declare resolver
|
|
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
|
|
index c50f9adec2..5bf57703a9 100644
|
|
--- a/include/libc-symbols.h
|
|
+++ b/include/libc-symbols.h
|
|
@@ -810,7 +810,7 @@ for linking")
|
|
|
|
# define __ifunc(type_name, name, expr, arg, init) \
|
|
extern __typeof (type_name) name; \
|
|
- void *name##_ifunc (arg) __asm__ (#name); \
|
|
+ __typeof (type_name) *name##_ifunc (arg) __asm__ (#name); \
|
|
__ifunc_resolver (type_name, name, expr, arg, init,) \
|
|
__asm__ (".type " #name ", %gnu_indirect_function");
|
|
|
|
|