Viewing file: test-constants.c (10.08 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#include <limits.h> #include <float.h>
#include "libgccjit.h"
#include "harness.h"
static void make_test_of_constant (gcc_jit_context *ctxt, gcc_jit_type *type, gcc_jit_rvalue *rvalue, const char *funcname) { /* Make a test function of the form: T funcname (void) { return VALUE; } and return a debug dump of VALUE so that the caller can sanity-check the debug dump implementation. */ gcc_jit_function *test_fn = gcc_jit_context_new_function (ctxt, NULL, GCC_JIT_FUNCTION_EXPORTED, type, funcname, 0, NULL, 0); gcc_jit_block *initial = gcc_jit_function_new_block (test_fn, "initial"); gcc_jit_block_end_with_return (initial, NULL, rvalue); }
/********************************************************************** Tests of gcc_jit_context_new_rvalue_from_int. **********************************************************************/
static const char * make_test_of_int_constant (gcc_jit_context *ctxt, gcc_jit_type *type, int value, const char *funcname) { /* Make a test function of the form: int funcname (void) { return VALUE; } and return a debug dump of VALUE so that the caller can sanity-check the debug dump implementation. */ gcc_jit_rvalue *rvalue = gcc_jit_context_new_rvalue_from_int (ctxt, type, value); make_test_of_constant (ctxt, type, rvalue, funcname); return gcc_jit_object_get_debug_string ( gcc_jit_rvalue_as_object (rvalue)); }
static void make_tests_of_int_constants (gcc_jit_context *ctxt) { gcc_jit_type *int_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
CHECK_STRING_VALUE ( make_test_of_int_constant (ctxt, int_type, 0, "test_int_constant_0"), "(int)0"); make_test_of_int_constant (ctxt, int_type, INT_MAX, "test_int_constant_INT_MAX"); make_test_of_int_constant (ctxt, int_type, INT_MIN, "test_int_constant_INT_MIN"); }
static void verify_int_constants (gcc_jit_result *result) { typedef int (*test_fn) (void);
test_fn test_int_constant_0 = (test_fn)gcc_jit_result_get_code (result, "test_int_constant_0"); CHECK_NON_NULL (test_int_constant_0); CHECK_VALUE (test_int_constant_0 (), 0);
test_fn test_int_constant_INT_MAX = (test_fn)gcc_jit_result_get_code (result, "test_int_constant_INT_MAX"); CHECK_NON_NULL (test_int_constant_INT_MAX); CHECK_VALUE (test_int_constant_INT_MAX (), INT_MAX);
test_fn test_int_constant_INT_MIN = (test_fn)gcc_jit_result_get_code (result, "test_int_constant_INT_MIN"); CHECK_NON_NULL (test_int_constant_INT_MIN); CHECK_VALUE (test_int_constant_INT_MIN (), INT_MIN); }
/********************************************************************** Tests of gcc_jit_context_new_rvalue_from_long. **********************************************************************/
static const char * make_test_of_long_constant (gcc_jit_context *ctxt, gcc_jit_type *type, long value, const char *funcname) { /* Make a test function of the form: long funcname (void) { return VALUE; } and return a debug dump of VALUE so that the caller can sanity-check the debug dump implementation. */ gcc_jit_rvalue *rvalue = gcc_jit_context_new_rvalue_from_long (ctxt, type, value); make_test_of_constant (ctxt, type, rvalue, funcname); return gcc_jit_object_get_debug_string ( gcc_jit_rvalue_as_object (rvalue)); }
static void make_tests_of_long_constants (gcc_jit_context *ctxt) { gcc_jit_type *long_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG);
CHECK_STRING_VALUE ( make_test_of_long_constant (ctxt, long_type, 0, "test_long_constant_0"), "(long)0"); make_test_of_long_constant (ctxt, long_type, LONG_MAX, "test_long_constant_LONG_MAX"); make_test_of_long_constant (ctxt, long_type, LONG_MIN, "test_long_constant_LONG_MIN"); }
static void verify_long_constants (gcc_jit_result *result) { typedef long (*test_fn) (void);
test_fn test_long_constant_0 = (test_fn)gcc_jit_result_get_code (result, "test_long_constant_0"); CHECK_NON_NULL (test_long_constant_0); CHECK_VALUE (test_long_constant_0 (), 0);
test_fn test_long_constant_LONG_MAX = (test_fn)gcc_jit_result_get_code (result, "test_long_constant_LONG_MAX"); CHECK_NON_NULL (test_long_constant_LONG_MAX); CHECK_VALUE (test_long_constant_LONG_MAX (), LONG_MAX);
test_fn test_long_constant_LONG_MIN = (test_fn)gcc_jit_result_get_code (result, "test_long_constant_LONG_MIN"); CHECK_NON_NULL (test_long_constant_LONG_MIN); CHECK_VALUE (test_long_constant_LONG_MIN (), LONG_MIN); }
/********************************************************************** Tests of gcc_jit_context_new_rvalue_from_double. **********************************************************************/
static const char * make_test_of_double_constant (gcc_jit_context *ctxt, gcc_jit_type *type, double value, const char *funcname) { /* Make a test function of the form: double funcname (void) { return VALUE; } and return a debug dump of VALUE so that the caller can sanity-check the debug dump implementation. */ gcc_jit_rvalue *rvalue = gcc_jit_context_new_rvalue_from_double (ctxt, type, value); make_test_of_constant (ctxt, type, rvalue, funcname); return gcc_jit_object_get_debug_string ( gcc_jit_rvalue_as_object (rvalue)); }
static void make_tests_of_double_constants (gcc_jit_context *ctxt) { gcc_jit_type *double_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_DOUBLE);
make_test_of_double_constant (ctxt, double_type, 0.5, "test_double_constant_0_5"); make_test_of_double_constant (ctxt, double_type, 1e100, "test_double_constant_1e100"); make_test_of_double_constant (ctxt, double_type, DBL_MIN, "test_double_constant_DBL_MIN"); make_test_of_double_constant (ctxt, double_type, DBL_MAX, "test_double_constant_DBL_MAX"); }
static void verify_double_constants (gcc_jit_result *result) { typedef double (*test_fn) (void);
test_fn test_double_constant_0_5 = (test_fn)gcc_jit_result_get_code (result, "test_double_constant_0_5"); CHECK_NON_NULL (test_double_constant_0_5); CHECK_VALUE (test_double_constant_0_5 (), 0.5);
test_fn test_double_constant_1e100 = (test_fn)gcc_jit_result_get_code (result, "test_double_constant_1e100"); CHECK_NON_NULL (test_double_constant_1e100); CHECK_VALUE (test_double_constant_1e100 (), 1e100);
test_fn test_double_constant_DBL_MIN = (test_fn)gcc_jit_result_get_code (result, "test_double_constant_DBL_MIN"); CHECK_NON_NULL (test_double_constant_DBL_MIN); CHECK_VALUE (test_double_constant_DBL_MIN (), DBL_MIN);
test_fn test_double_constant_DBL_MAX = (test_fn)gcc_jit_result_get_code (result, "test_double_constant_DBL_MAX"); CHECK_NON_NULL (test_double_constant_DBL_MAX); CHECK_VALUE (test_double_constant_DBL_MAX (), DBL_MAX); }
/********************************************************************** Tests of gcc_jit_context_new_rvalue_from_ptr. **********************************************************************/
static const char * make_test_of_ptr_constant (gcc_jit_context *ctxt, gcc_jit_type *type, void *value, const char *funcname) { /* Make a test function of the form: void *funcname (void) { return VALUE; } and return a debug dump of VALUE so that the caller can sanity-check the debug dump implementation. */ gcc_jit_rvalue *rvalue = gcc_jit_context_new_rvalue_from_ptr (ctxt, type, value); make_test_of_constant (ctxt, type, rvalue, funcname); return gcc_jit_object_get_debug_string ( gcc_jit_rvalue_as_object (rvalue)); }
static void make_tests_of_ptr_constants (gcc_jit_context *ctxt) { gcc_jit_type *ptr_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID_PTR);
CHECK_STRING_VALUE ( make_test_of_ptr_constant (ctxt, ptr_type, 0, "test_ptr_constant_0"), "(void *)NULL"); CHECK_STRING_VALUE ( make_test_of_ptr_constant (ctxt, ptr_type, (void *)0xdeadbeef, "test_ptr_constant_0xdeadbeef"), "(void *)0xdeadbeef"); }
static void verify_ptr_constants (gcc_jit_result *result) { typedef void *(*test_fn) (void);
test_fn test_ptr_constant_0 = (test_fn)gcc_jit_result_get_code (result, "test_ptr_constant_0"); CHECK_NON_NULL (test_ptr_constant_0); CHECK_VALUE (test_ptr_constant_0 (), 0);
test_fn test_ptr_constant_0xdeadbeef = (test_fn)gcc_jit_result_get_code (result, "test_ptr_constant_0xdeadbeef"); CHECK_NON_NULL (test_ptr_constant_0xdeadbeef); CHECK_VALUE (test_ptr_constant_0xdeadbeef (), (void *)0xdeadbeef); }
/********************************************************************** Code for harness **********************************************************************/
void create_code (gcc_jit_context *ctxt, void *user_data) { make_tests_of_int_constants (ctxt); make_tests_of_long_constants (ctxt); make_tests_of_double_constants (ctxt); make_tests_of_ptr_constants (ctxt); }
void verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) { CHECK_NON_NULL (result);
verify_int_constants (result); verify_long_constants (result); verify_double_constants (result); verify_ptr_constants (result); }
|