Always load function pointer into a stack variable
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 20 Nov 2014 19:29:45 +0000 (11:29 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 20 Nov 2014 19:29:45 +0000 (11:29 -0800)
This patch makes sure that compiler won't optimize out loading function
into a stack variable.

* ld-ifunc/ifunc-main.c (get_bar): New function.
(main): Use it.

ld/testsuite/ChangeLog
ld/testsuite/ld-ifunc/ifunc-main.c

index 555d6bf6741f42c97c3f0855144f8d440184ae09..63f145eafdca6fbc84c7bc68c0869100714edc4a 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-20  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * ld-ifunc/ifunc-main.c (get_bar): New function.
+       (main): Use it.
+
 2014-11-20  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ld-ifunc/ifunc.exp: Run ifunc-main.
index a320cfbddaa12e5eef5ba56da9805fc3fcab1424..61e9934ae5dc836ff770747d2cce7d8453582c17 100644 (file)
@@ -3,12 +3,21 @@
 extern int foo(void);
 extern int bar(void);
 
-int (*foo_ptr)(void) = foo;
+typedef int (*func_p) (void);
+
+func_p foo_ptr = foo;
+
+func_p
+__attribute__((noinline))
+get_bar (void)
+{
+  return bar;
+}
 
 int
 main (void)
 {
-  int (*bar_ptr)(void) = bar;
+  func_p bar_ptr = get_bar ();
   if (bar_ptr != bar)
     __builtin_abort ();
   if (bar_ptr() != -1)