mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	Fix math/test-fenv for no-exceptions / no-rounding-modes configurations.
This patch fixes math/test-fenv.c to check EXCEPTION_TESTS and ROUNDING_TESTS to avoid failing in cases where some exceptions or rounding modes are defined but not supported at runtime. Tested for mips64 soft float and for x86_64. * math/test-fenv.c (fe_tests): Skip most tests when exceptions not supported. (feholdexcept_tests): Skip tests requiring exceptions or rounding modes support if not supported.
This commit is contained in:
		@@ -1,5 +1,10 @@
 | 
				
			|||||||
2017-01-09  Joseph Myers  <joseph@codesourcery.com>
 | 
					2017-01-09  Joseph Myers  <joseph@codesourcery.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						* math/test-fenv.c (fe_tests): Skip most tests when exceptions not
 | 
				
			||||||
 | 
						supported.
 | 
				
			||||||
 | 
						(feholdexcept_tests): Skip tests requiring exceptions or rounding
 | 
				
			||||||
 | 
						modes support if not supported.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	* sysdeps/unix/sysv/linux/microblaze/localplt.data (__pread64):
 | 
						* sysdeps/unix/sysv/linux/microblaze/localplt.data (__pread64):
 | 
				
			||||||
	Add libc.so PLT entry.
 | 
						Add libc.so PLT entry.
 | 
				
			||||||
	(__tls_get_addr): Make ld.so PLT entry optional.
 | 
						(__tls_get_addr): Make ld.so PLT entry optional.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -208,6 +208,9 @@ fe_tests (void)
 | 
				
			|||||||
  test_exceptions ("feclearexcept (FE_ALL_EXCEPT) clears all exceptions",
 | 
					  test_exceptions ("feclearexcept (FE_ALL_EXCEPT) clears all exceptions",
 | 
				
			||||||
                   NO_EXC, 0);
 | 
					                   NO_EXC, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Skip further tests here if exceptions not supported.  */
 | 
				
			||||||
 | 
					  if (!EXCEPTION_TESTS (float) && FE_ALL_EXCEPT != 0)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
  /* raise all exceptions and test if all are raised */
 | 
					  /* raise all exceptions and test if all are raised */
 | 
				
			||||||
  feraiseexcept (FE_ALL_EXCEPT);
 | 
					  feraiseexcept (FE_ALL_EXCEPT);
 | 
				
			||||||
  test_exceptions ("feraiseexcept (FE_ALL_EXCEPT) raises all exceptions",
 | 
					  test_exceptions ("feraiseexcept (FE_ALL_EXCEPT) raises all exceptions",
 | 
				
			||||||
@@ -657,8 +660,9 @@ feholdexcept_tests (void)
 | 
				
			|||||||
#ifdef FE_DIVBYZERO
 | 
					#ifdef FE_DIVBYZERO
 | 
				
			||||||
  feraiseexcept (FE_DIVBYZERO);
 | 
					  feraiseexcept (FE_DIVBYZERO);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  test_exceptions ("feholdexcept_tests FE_DIVBYZERO test",
 | 
					  if (EXCEPTION_TESTS (float))
 | 
				
			||||||
		   DIVBYZERO_EXC, 0);
 | 
					    test_exceptions ("feholdexcept_tests FE_DIVBYZERO test",
 | 
				
			||||||
 | 
							     DIVBYZERO_EXC, 0);
 | 
				
			||||||
  res = feholdexcept (&saved);
 | 
					  res = feholdexcept (&saved);
 | 
				
			||||||
  if (res != 0)
 | 
					  if (res != 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -667,7 +671,7 @@ feholdexcept_tests (void)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
#if defined FE_TONEAREST && defined FE_TOWARDZERO
 | 
					#if defined FE_TONEAREST && defined FE_TOWARDZERO
 | 
				
			||||||
  res = fesetround (FE_TOWARDZERO);
 | 
					  res = fesetround (FE_TOWARDZERO);
 | 
				
			||||||
  if (res != 0)
 | 
					  if (res != 0 && ROUNDING_TESTS (float, FE_TOWARDZERO))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      printf ("fesetround failed: %d\n", res);
 | 
					      printf ("fesetround failed: %d\n", res);
 | 
				
			||||||
      ++count_errors;
 | 
					      ++count_errors;
 | 
				
			||||||
@@ -676,8 +680,9 @@ feholdexcept_tests (void)
 | 
				
			|||||||
  test_exceptions ("feholdexcept_tests 0 test", NO_EXC, 0);
 | 
					  test_exceptions ("feholdexcept_tests 0 test", NO_EXC, 0);
 | 
				
			||||||
#ifdef FE_INVALID
 | 
					#ifdef FE_INVALID
 | 
				
			||||||
  feraiseexcept (FE_INVALID);
 | 
					  feraiseexcept (FE_INVALID);
 | 
				
			||||||
  test_exceptions ("feholdexcept_tests FE_INVALID test",
 | 
					  if (EXCEPTION_TESTS (float))
 | 
				
			||||||
		   INVALID_EXC, 0);
 | 
					    test_exceptions ("feholdexcept_tests FE_INVALID test",
 | 
				
			||||||
 | 
							     INVALID_EXC, 0);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  res = feupdateenv (&saved);
 | 
					  res = feupdateenv (&saved);
 | 
				
			||||||
  if (res != 0)
 | 
					  if (res != 0)
 | 
				
			||||||
@@ -693,15 +698,16 @@ feholdexcept_tests (void)
 | 
				
			|||||||
      ++count_errors;
 | 
					      ++count_errors;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  test_exceptions ("feholdexcept_tests FE_DIVBYZERO|FE_INVALID test",
 | 
					  if (EXCEPTION_TESTS (float))
 | 
				
			||||||
		   DIVBYZERO_EXC | INVALID_EXC, 0);
 | 
					    test_exceptions ("feholdexcept_tests FE_DIVBYZERO|FE_INVALID test",
 | 
				
			||||||
 | 
							     DIVBYZERO_EXC | INVALID_EXC, 0);
 | 
				
			||||||
  feclearexcept (FE_ALL_EXCEPT);
 | 
					  feclearexcept (FE_ALL_EXCEPT);
 | 
				
			||||||
#ifdef FE_INVALID
 | 
					#ifdef FE_INVALID
 | 
				
			||||||
  feraiseexcept (FE_INVALID);
 | 
					  feraiseexcept (FE_INVALID);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if defined FE_TONEAREST && defined FE_UPWARD
 | 
					#if defined FE_TONEAREST && defined FE_UPWARD
 | 
				
			||||||
  res = fesetround (FE_UPWARD);
 | 
					  res = fesetround (FE_UPWARD);
 | 
				
			||||||
  if (res != 0)
 | 
					  if (res != 0 && ROUNDING_TESTS (float, FE_UPWARD))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      printf ("fesetround failed: %d\n", res);
 | 
					      printf ("fesetround failed: %d\n", res);
 | 
				
			||||||
      ++count_errors;
 | 
					      ++count_errors;
 | 
				
			||||||
@@ -724,8 +730,9 @@ feholdexcept_tests (void)
 | 
				
			|||||||
  test_exceptions ("feholdexcept_tests 0 2nd test", NO_EXC, 0);
 | 
					  test_exceptions ("feholdexcept_tests 0 2nd test", NO_EXC, 0);
 | 
				
			||||||
#ifdef FE_INEXACT
 | 
					#ifdef FE_INEXACT
 | 
				
			||||||
  feraiseexcept (FE_INEXACT);
 | 
					  feraiseexcept (FE_INEXACT);
 | 
				
			||||||
  test_exceptions ("feholdexcept_tests FE_INEXACT test",
 | 
					  if (EXCEPTION_TESTS (float))
 | 
				
			||||||
		   INEXACT_EXC, 0);
 | 
					    test_exceptions ("feholdexcept_tests FE_INEXACT test",
 | 
				
			||||||
 | 
							     INEXACT_EXC, 0);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  res = feupdateenv (&saved2);
 | 
					  res = feupdateenv (&saved2);
 | 
				
			||||||
  if (res != 0)
 | 
					  if (res != 0)
 | 
				
			||||||
@@ -735,15 +742,16 @@ feholdexcept_tests (void)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
#if defined FE_TONEAREST && defined FE_UPWARD
 | 
					#if defined FE_TONEAREST && defined FE_UPWARD
 | 
				
			||||||
  res = fegetround ();
 | 
					  res = fegetround ();
 | 
				
			||||||
  if (res != FE_UPWARD)
 | 
					  if (res != FE_UPWARD && ROUNDING_TESTS (float, FE_UPWARD))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      printf ("feupdateenv didn't restore rounding mode: %d\n", res);
 | 
					      printf ("feupdateenv didn't restore rounding mode: %d\n", res);
 | 
				
			||||||
      ++count_errors;
 | 
					      ++count_errors;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  fesetround (FE_TONEAREST);
 | 
					  fesetround (FE_TONEAREST);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  test_exceptions ("feholdexcept_tests FE_INEXACT|FE_INVALID test",
 | 
					  if (EXCEPTION_TESTS (float))
 | 
				
			||||||
		   INVALID_EXC | INEXACT_EXC, 0);
 | 
					    test_exceptions ("feholdexcept_tests FE_INEXACT|FE_INVALID test",
 | 
				
			||||||
 | 
							     INVALID_EXC | INEXACT_EXC, 0);
 | 
				
			||||||
  feclearexcept (FE_ALL_EXCEPT);
 | 
					  feclearexcept (FE_ALL_EXCEPT);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user