aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C
diff options
context:
space:
mode:
authorBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
committerBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
commit1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch)
treec607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C
parent283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff)
downloadtoolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C')
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C138
1 files changed, 138 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C
new file mode 100644
index 000000000..6633e834d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C
@@ -0,0 +1,138 @@
+// Try to check that registers are preserved when the stack is unwound.
+// { dg-do run }
+// { dg-options -O2 }
+
+extern "C" void exit(int);
+extern "C" void abort();
+
+// This test case triggers up to DEPTH recursive calls to function
+// foo(), These calls are numbered so that 0 is the innermost, 1 the
+// second innermost, and so on. Each call caches NUM_VARS elements of
+// both DOUBLE_SRC and INT_SRC and applies a trivial operation to each
+// cached value. The innermost foo() call will throw an integer call
+// number. The specified call should store its cached values in
+// DOUBLE_DEST and INT_DEST, which main() will check.
+const int num_vars = 16;
+const int depth = 3;
+
+float float_src[num_vars * depth];
+float float_dest[num_vars];
+
+int int_src[num_vars * depth];
+int int_dest[num_vars];
+
+void foo (int level, int throw_to)
+{
+ float *fsrc = &float_src[level * num_vars];
+ float f00 = *fsrc++ + 1.0f;
+ float f01 = *fsrc++ + 1.0f;
+ float f02 = *fsrc++ + 1.0f;
+ float f03 = *fsrc++ + 1.0f;
+ float f04 = *fsrc++ + 1.0f;
+ float f05 = *fsrc++ + 1.0f;
+ float f06 = *fsrc++ + 1.0f;
+ float f07 = *fsrc++ + 1.0f;
+ float f08 = *fsrc++ + 1.0f;
+ float f09 = *fsrc++ + 1.0f;
+ float f10 = *fsrc++ + 1.0f;
+ float f11 = *fsrc++ + 1.0f;
+ float f12 = *fsrc++ + 1.0f;
+ float f13 = *fsrc++ + 1.0f;
+ float f14 = *fsrc++ + 1.0f;
+ float f15 = *fsrc++ + 1.0f;
+
+ int *isrc = &int_src[level * num_vars];
+ int i00 = *isrc++ + 1;
+ int i01 = *isrc++ + 1;
+ int i02 = *isrc++ + 1;
+ int i03 = *isrc++ + 1;
+ int i04 = *isrc++ + 1;
+ int i05 = *isrc++ + 1;
+ int i06 = *isrc++ + 1;
+ int i07 = *isrc++ + 1;
+ int i08 = *isrc++ + 1;
+ int i09 = *isrc++ + 1;
+ int i10 = *isrc++ + 1;
+ int i11 = *isrc++ + 1;
+ int i12 = *isrc++ + 1;
+ int i13 = *isrc++ + 1;
+ int i14 = *isrc++ + 1;
+ int i15 = *isrc++ + 1;
+
+ try
+ {
+ if (level == 0)
+ throw throw_to;
+ else
+ foo (level - 1, throw_to);
+ }
+ catch (int i)
+ {
+ if (i == level)
+ {
+ float *fdest = float_dest;
+ *fdest++ = f00;
+ *fdest++ = f01;
+ *fdest++ = f02;
+ *fdest++ = f03;
+ *fdest++ = f04;
+ *fdest++ = f05;
+ *fdest++ = f06;
+ *fdest++ = f07;
+ *fdest++ = f08;
+ *fdest++ = f09;
+ *fdest++ = f10;
+ *fdest++ = f11;
+ *fdest++ = f12;
+ *fdest++ = f13;
+ *fdest++ = f14;
+ *fdest++ = f15;
+
+ int *idest = int_dest;
+ *idest++ = i00;
+ *idest++ = i01;
+ *idest++ = i02;
+ *idest++ = i03;
+ *idest++ = i04;
+ *idest++ = i05;
+ *idest++ = i06;
+ *idest++ = i07;
+ *idest++ = i08;
+ *idest++ = i09;
+ *idest++ = i10;
+ *idest++ = i11;
+ *idest++ = i12;
+ *idest++ = i13;
+ *idest++ = i14;
+ *idest++ = i15;
+ }
+ else
+ {
+ throw;
+ }
+ }
+}
+
+int main ()
+{
+ for (int i = 0; i < depth * num_vars; i++)
+ {
+ int_src[i] = i * i;
+ float_src[i] = i * 2.0f;
+ }
+ for (int level = 0; level < depth; level++)
+ for (int throw_to = 0; throw_to <= level; throw_to++)
+ {
+ foo (level, throw_to);
+ float *fsrc = &float_src[throw_to * num_vars];
+ int *isrc = &int_src[throw_to * num_vars];
+ for (int i = 0; i < num_vars; i++)
+ {
+ if (int_dest[i] != isrc[i] + 1)
+ abort ();
+ if (float_dest[i] != fsrc[i] + 1.0f)
+ abort ();
+ }
+ }
+ exit (0);
+}