[libcxxabi] r207481 - Add unwind test case that checks restoring of float registers (such as on AArch64)

Hal Finkel hfinkel at anl.gov
Thu May 1 14:06:31 PDT 2014


----- Original Message -----
> From: "Nick Kledzik" <kledzik at apple.com>
> To: cfe-commits at cs.uiuc.edu
> Sent: Monday, April 28, 2014 8:08:23 PM
> Subject: [libcxxabi] r207481 - Add unwind test case that checks restoring of	float registers (such as on AArch64)
> 
> Author: kledzik
> Date: Mon Apr 28 20:08:23 2014
> New Revision: 207481
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=207481&view=rev
> Log:
> Add unwind test case that checks restoring of float registers (such
> as on AArch64)
> 
> Added:
>     libcxxabi/trunk/test/unwind_06.cpp
> 
> Added: libcxxabi/trunk/test/unwind_06.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/unwind_06.cpp?rev=207481&view=auto
> ==============================================================================
> --- libcxxabi/trunk/test/unwind_06.cpp (added)
> +++ libcxxabi/trunk/test/unwind_06.cpp Mon Apr 28 20:08:23 2014
> @@ -0,0 +1,239 @@
> +//===------------------------- unwind_06.cpp
> ------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include <exception>
> +#include <stdlib.h>
> +#include <assert.h>
> +#include <stdio.h>
> +
> +// Compile with -Os to get compiler uses float registers to hold
> float variables
> +
> +__attribute__((noinline))
> +double get(int x) { return (double)x; }
> +
> +
> +double try1(bool v) {
> +  double a = get(0);
> +  double b = get(0);
> +  if (v) throw 10;
> +  return get(0)+a+b;
> +}
> +
> +double try2(bool v) {
> +  double a = get(0);
> +  double b = get(0);
> +  double c = get(0);
> +  if (v) throw 10;
> +  return get(0)+a+b+c;
> +}
> +
> +double try3(bool v) {
> +  double a = get(0);
> +  double b = get(0);
> +  double c = get(0);
> +  double d = get(0);
> +  if (v) throw 10;
> +  return get(0)+a+b+c+d;
> +}
> +
> +double try4(bool v) {
> +  double a = get(0);
> +  double b = get(0);
> +  double c = get(0);
> +  double d = get(0);
> +  double e = get(0);
> +  if (v) throw 10;
> +  return get(0)+a+b+c+d+e;
> +}
> +
> +double try5(bool v) {
> +  double a = get(0);
> +  double b = get(0);
> +  double c = get(0);
> +  double d = get(0);
> +  double e = get(0);
> +  double f = get(0);
> +  if (v) throw 10;
> +  return get(0)+a+b+c+d+e+f;
> +}
> +
> +double try6(bool v) {
> +  double a = get(0);
> +  double b = get(0);
> +  double c = get(0);
> +  double d = get(0);
> +  double e = get(0);
> +  double f = get(0);
> +  double g = get(0);
> +  if (v) throw 10;
> +  return get(0)+a+b+c+d+e+f+g;
> +}
> +
> +double try7(bool v) {
> +  double a = get(0);
> +  double b = get(0);
> +  double c = get(0);
> +  double d = get(0);
> +  double e = get(0);
> +  double f = get(0);
> +  double g = get(0);
> +  double h = get(0);
> +  if (v) throw 10;
> +  return get(0)+a+b+c+d+e+f+g;
> +}
> +
> +double try8(bool v) {
> +  double a = get(0);
> +  double b = get(0);
> +  double c = get(0);
> +  double d = get(0);
> +  double e = get(0);
> +  double f = get(0);
> +  double g = get(0);
> +  double h = get(0);
> +  double i = get(0);
> +  if (v) throw 10;
> +  return get(0)+a+b+c+d+e+f+g+i;
> +}
> +
> +
> +
> +
> +
> +double foo()
> +{
> +  double a = get(1);
> +  double b = get(2);
> +  double c = get(3);
> +  double d = get(4);
> +  double e = get(5);
> +  double f = get(6);
> +  double g = get(7);
> +  double h = get(8);
> +  try {
> +    try1(true);
> +  }
> +  catch (int e) {
> +  }
> +  assert(a == get(1));
> +  assert(b == get(2));
> +  assert(c == get(3));
> +  assert(d == get(4));
> +  assert(e == get(5));
> +  assert(f == get(6));
> +  assert(g == get(7));
> +  assert(h == get(8));
> +
> +  try {
> +    try2(true);
> +  }
> +  catch (int e) {
> +  }
> +  assert(a == get(1));
> +  assert(b == get(2));
> +  assert(c == get(3));
> +  assert(d == get(4));
> +  assert(e == get(5));
> +  assert(f == get(6));
> +  assert(g == get(7));
> +  assert(h == get(8));
> +
> +  try {
> +    try3(true);
> +  }
> +  catch (int e) {
> +  }
> +  assert(a == get(1));
> +  assert(b == get(2));
> +  assert(c == get(3));
> +  assert(d == get(4));
> +  assert(e == get(5));
> +  assert(f == get(6));
> +  assert(g == get(7));
> +  assert(h == get(8));
> +
> +  try {
> +    try4(true);
> +  }
> +  catch (int e) {
> +  }
> +  assert(a == get(1));
> +  assert(b == get(2));
> +  assert(c == get(3));
> +  assert(d == get(4));
> +  assert(e == get(5));
> +  assert(f == get(6));
> +  assert(g == get(7));
> +  assert(h == get(8));
> +
> +  try {
> +    try5(true);
> +  }
> +  catch (int e) {
> +  }
> +  assert(a == get(1));
> +  assert(b == get(2));
> +  assert(c == get(3));
> +  assert(d == get(4));
> +  assert(e == get(5));
> +  assert(f == get(6));
> +  assert(g == get(7));
> +  assert(h == get(8));
> +
> +  try {
> +    try6(true);
> +  }
> +  catch (int e) {
> +  }
> +  assert(a == get(1));
> +  assert(b == get(2));
> +  assert(c == get(3));
> +  assert(d == get(4));
> +  assert(e == get(5));
> +  assert(f == get(6));
> +  assert(g == get(7));
> +  assert(h == get(8));
> +
> +  try {
> +    try7(true);
> +  }
> +  catch (int e) {
> +  }
> +  assert(a == get(1));
> +  assert(b == get(2));
> +  assert(c == get(3));
> +  assert(d == get(4));
> +  assert(e == get(5));
> +  assert(f == get(6));
> +  assert(g == get(7));
> +  assert(h == get(8));
> +
> +  try {
> +    try8(true);
> +  }
> +  catch (int e) {
> +  }
> +  assert(a == get(1));
> +  assert(b == get(2));
> +  assert(c == get(3));
> +  assert(d == get(4));
> +  assert(e == get(5));
> +  assert(f == get(6));
> +  assert(g == get(7));
> +  assert(h == get(8));
> +
> +  return a+b+c+d+e+f+g+h;
> +}
> +
> +
> +
> +int main()
> +{
> +  foo();

Are we missing a 'return 0;' here?

 -Hal


> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory



More information about the cfe-commits mailing list