mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 21:40:12 +00:00
support: Fix TEST_COMPARE for uintptr_t.
TEST_COMPARE should allow comparison between two capability values.
This commit is contained in:
parent
3be82efc58
commit
f4fe4afdf0
@ -98,7 +98,8 @@ void support_record_failure (void);
|
||||
|
||||
/* Compare the two integers LEFT and RIGHT and report failure if they
|
||||
are different. */
|
||||
#define TEST_COMPARE(left, right) \
|
||||
#ifndef __CHERI_PURE_CAPABILITY__
|
||||
# define TEST_COMPARE(left, right) \
|
||||
({ \
|
||||
/* + applies the integer promotions, for bitfield support. */ \
|
||||
typedef __typeof__ (+ (left)) __left_type; \
|
||||
@ -126,6 +127,32 @@ void support_record_failure (void);
|
||||
#left, __left_value, __left_is_positive, sizeof (__left_type), \
|
||||
#right, __right_value, __right_is_positive, sizeof (__right_type)); \
|
||||
})
|
||||
#else
|
||||
# define TEST_COMPARE(left, right) \
|
||||
({ \
|
||||
/* + applies the integer promotions, for bitfield support. */ \
|
||||
typedef __typeof__ (+ (left)) __left_type; \
|
||||
typedef __typeof__ (+ (right)) __right_type; \
|
||||
__left_type __left_value = (left); \
|
||||
__right_type __right_value = (right); \
|
||||
int __left_is_positive = __left_value > 0; \
|
||||
int __right_is_positive = __right_value > 0; \
|
||||
/* Prevent use with floating-point types. */ \
|
||||
support_static_assert ((__left_type) 1.0 == (__left_type) 1.5, \
|
||||
"left value has floating-point type"); \
|
||||
support_static_assert ((__right_type) 1.0 == (__right_type) 1.5, \
|
||||
"right value has floating-point type"); \
|
||||
/* Compare the value. */ \
|
||||
if (__left_value != __right_value \
|
||||
|| __left_is_positive != __right_is_positive) \
|
||||
/* Pass the sign for printing the correct value. */ \
|
||||
support_test_compare_failure \
|
||||
(__FILE__, __LINE__, \
|
||||
#left, __left_value, __left_is_positive, sizeof (__left_type), \
|
||||
#right, __right_value, __right_is_positive, sizeof (__right_type)); \
|
||||
})
|
||||
#endif
|
||||
|
||||
|
||||
/* Internal implementation of TEST_COMPARE. LEFT_POSITIVE and
|
||||
RIGHT_POSITIVE are used to store the sign separately, so that both
|
||||
@ -133,6 +160,7 @@ void support_record_failure (void);
|
||||
RIGHT_VALUE, and the function can still print the original value.
|
||||
LEFT_SIZE and RIGHT_SIZE specify the size of the argument in bytes,
|
||||
for hexadecimal formatting. */
|
||||
#ifndef __CHERI_PURE_CAPABILITY__
|
||||
void support_test_compare_failure (const char *file, int line,
|
||||
const char *left_expr,
|
||||
long long left_value,
|
||||
@ -142,7 +170,17 @@ void support_test_compare_failure (const char *file, int line,
|
||||
long long right_value,
|
||||
int right_positive,
|
||||
int right_size);
|
||||
|
||||
#else
|
||||
void support_test_compare_failure (const char *file, int line,
|
||||
const char *left_expr,
|
||||
__uintcap_t left_value,
|
||||
int left_positive,
|
||||
int left_size,
|
||||
const char *right_expr,
|
||||
__uintcap_t right_value,
|
||||
int right_positive,
|
||||
int right_size);
|
||||
#endif
|
||||
|
||||
/* Compare [LEFT, LEFT + LEFT_LENGTH) with [RIGHT, RIGHT +
|
||||
RIGHT_LENGTH) and report a test failure if the arrays are
|
||||
|
@ -34,6 +34,7 @@ report (const char *which, const char *expr, long long value, int positive,
|
||||
printf (" (0x%llx); from: %s\n", (unsigned long long) value & mask, expr);
|
||||
}
|
||||
|
||||
#ifndef __CHERI_PURE_CAPABILITY__
|
||||
void
|
||||
support_test_compare_failure (const char *file, int line,
|
||||
const char *left_expr,
|
||||
@ -56,3 +57,27 @@ support_test_compare_failure (const char *file, int line,
|
||||
report ("right", right_expr, right_value, right_positive, right_size);
|
||||
errno = saved_errno;
|
||||
}
|
||||
#else
|
||||
void
|
||||
support_test_compare_failure (const char *file, int line,
|
||||
const char *left_expr,
|
||||
__uintcap_t left_value,
|
||||
int left_positive,
|
||||
int left_size,
|
||||
const char *right_expr,
|
||||
__uintcap_t right_value,
|
||||
int right_positive,
|
||||
int right_size)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
support_record_failure ();
|
||||
if (left_size != right_size)
|
||||
printf ("%s:%d: numeric comparison failure (widths %d and %d)\n",
|
||||
file, line, left_size * 8, right_size * 8);
|
||||
else
|
||||
printf ("%s:%d: numeric comparison failure\n", file, line);
|
||||
report (" left", left_expr, left_value, left_positive, left_size);
|
||||
report ("right", right_expr, right_value, right_positive, right_size);
|
||||
errno = saved_errno;
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user