summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.exelib/uprobes_lib.c
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2009-06-15 13:37:39 +0200
committerMark Wielaard <mjw@redhat.com>2009-06-15 13:37:39 +0200
commit5e3d7f3a3aa8d11b67e74de0c3d9187c323cbff2 (patch)
treea481a29f183527a00f32f752818abc912699eb39 /testsuite/systemtap.exelib/uprobes_lib.c
parentf07c3b680a722e27ed55bb5c9719fa5827ebfc75 (diff)
downloadsystemtap-steved-5e3d7f3a3aa8d11b67e74de0c3d9187c323cbff2.tar.gz
systemtap-steved-5e3d7f3a3aa8d11b67e74de0c3d9187c323cbff2.tar.xz
systemtap-steved-5e3d7f3a3aa8d11b67e74de0c3d9187c323cbff2.zip
PR10274 Fix exelib -O3 testcase.
The testcase now uses noinline, an empty asm statement and a volatile variable to prevent the function getting inlined, being totally unrolled or the recursive call being replaced with an inner-iteration. This does defeat part of the testcase though, which was testing unwinding through an optimized recursive function. But it seems the best we can do. * testsuite/systemtap.exelib/exelib.exp: Add -O3 to the mix. * testsuite/systemtap.exelib/uprobes_exe.c: Use volatile bar and mark main_func noinline. * testsuite/systemtap.exelib/uprobes_lib.c: Use volatile foo and mark lib_func noinline.
Diffstat (limited to 'testsuite/systemtap.exelib/uprobes_lib.c')
-rw-r--r--testsuite/systemtap.exelib/uprobes_lib.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/testsuite/systemtap.exelib/uprobes_lib.c b/testsuite/systemtap.exelib/uprobes_lib.c
index 25297b6b..072a1d61 100644
--- a/testsuite/systemtap.exelib/uprobes_lib.c
+++ b/testsuite/systemtap.exelib/uprobes_lib.c
@@ -7,15 +7,24 @@
* later version.
*/
-void
+// volatile static variable to prevent folding of lib_func
+static volatile int foo;
+
+// Marked noinline and has an empty asm statement to prevent inlining
+// or optimizing away totally.
+int
+__attribute__((noinline))
lib_func (int bar)
{
- if (bar > 1)
- lib_func (bar - 1);
+ asm ("");
+ if (bar - foo > 0)
+ foo = lib_func (bar - foo);
+ return foo;
}
void
lib_main ()
{
- lib_func (3);
+ foo = 1;
+ foo = lib_func (3);
}