Print this page
saveargs: Implement as libsaveargs

*** 22,64 **** extern int name##_end #define SIZE_OF(name) ((caddr_t)&name##_end - (caddr_t)&name) #define TEST_GOOD(name, argc) \ ! if (saveargs_has_args(name, SIZE_OF(name), argc, 0) != 0) \ printf("Pass: %s\n", #name); \ else \ printf("FAIL: %s\n", #name); #define TEST_GOOD_STRUCT(name, argc) \ ! if (saveargs_has_args(name, SIZE_OF(name), argc, 1) != 0) \ printf("Pass: %s\n", #name); \ else \ printf("FAIL: %s\n", #name); #define TEST_BAD(name, argc) \ ! if (saveargs_has_args(name, SIZE_OF(name), argc, 0) == 0) \ printf("Pass: %s\n", #name); \ else \ printf("FAIL: %s\n", #name); #define TEST_BAD_STRUCT(name, argc) \ ! if (saveargs_has_args(name, SIZE_OF(name), argc, 1) == 0) \ printf("Pass: %s\n", #name); \ else \ printf("FAIL: %s\n", #name); DEF_TEST(gcc_mov_align); DEF_TEST(gcc_mov_basic); DEF_TEST(gcc_mov_big_struct_ret); DEF_TEST(gcc_mov_big_struct_ret_and_spill); DEF_TEST(gcc_mov_small_struct_ret); DEF_TEST(gcc_mov_small_struct_ret_and_spill); DEF_TEST(gcc_mov_stack_spill); DEF_TEST(gcc_push_align); DEF_TEST(gcc_push_basic); DEF_TEST(gcc_push_big_struct_ret); DEF_TEST(gcc_push_big_struct_ret_and_spill); DEF_TEST(gcc_push_small_struct_ret); DEF_TEST(gcc_push_small_struct_ret_and_spill); DEF_TEST(gcc_push_stack_spill); --- 22,90 ---- extern int name##_end #define SIZE_OF(name) ((caddr_t)&name##_end - (caddr_t)&name) #define TEST_GOOD(name, argc) \ ! if (saveargs_has_args(name, SIZE_OF(name), argc, 0) == \ ! SAVEARGS_TRAD_ARGS) \ printf("Pass: %s\n", #name); \ else \ printf("FAIL: %s\n", #name); #define TEST_GOOD_STRUCT(name, argc) \ ! if (saveargs_has_args(name, SIZE_OF(name), argc, 1) == \ ! SAVEARGS_STRUCT_ARGS) \ ! printf("Pass: %s\n", #name); \ ! else \ ! printf("FAIL: %s\n", #name); ! ! /* ! * GCC deals with structures differently, so TRAD args is actually correct for ! * this ! */ ! #define TEST_GOOD_GSTRUCT(name, argc) \ ! if (saveargs_has_args(name, SIZE_OF(name), argc, 1) == \ ! SAVEARGS_TRAD_ARGS) \ printf("Pass: %s\n", #name); \ else \ printf("FAIL: %s\n", #name); #define TEST_BAD(name, argc) \ ! if (saveargs_has_args(name, SIZE_OF(name), argc, 0) == \ ! SAVEARGS_NO_ARGS) \ printf("Pass: %s\n", #name); \ else \ printf("FAIL: %s\n", #name); #define TEST_BAD_STRUCT(name, argc) \ ! if (saveargs_has_args(name, SIZE_OF(name), argc, 1) == \ ! SAVEARGS_NO_ARGS) \ ! printf("Pass: %s\n", #name); \ ! else \ ! printf("FAIL: %s\n", #name); ! ! #define TEST_BAD_GSTRUCT(name, argc) \ ! if (saveargs_has_args(name, SIZE_OF(name), argc, 1) == \ ! SAVEARGS_NO_ARGS) \ printf("Pass: %s\n", #name); \ else \ printf("FAIL: %s\n", #name); DEF_TEST(gcc_mov_align); DEF_TEST(gcc_mov_basic); + DEF_TEST(gcc_mov_noorder); + DEF_TEST(gcc_mov_struct_noorder); DEF_TEST(gcc_mov_big_struct_ret); DEF_TEST(gcc_mov_big_struct_ret_and_spill); DEF_TEST(gcc_mov_small_struct_ret); DEF_TEST(gcc_mov_small_struct_ret_and_spill); DEF_TEST(gcc_mov_stack_spill); DEF_TEST(gcc_push_align); DEF_TEST(gcc_push_basic); + DEF_TEST(gcc_push_noorder); + DEF_TEST(gcc_push_struct_noorder); DEF_TEST(gcc_push_big_struct_ret); DEF_TEST(gcc_push_big_struct_ret_and_spill); DEF_TEST(gcc_push_small_struct_ret); DEF_TEST(gcc_push_small_struct_ret_and_spill); DEF_TEST(gcc_push_stack_spill);
*** 77,86 **** --- 103,114 ---- DEF_TEST(av1394_ic_bitreverse); DEF_TEST(small_struct_ret_w_float); DEF_TEST(big_struct_ret_w_float); + DEF_TEST(interleaved_argument_saves); + /* * Functions which should not match * * no_fp -- valid save-args sequence with no saved FP * big_struct_arg_by_value -- function with big struct passed by value
*** 95,121 **** { TEST_GOOD(kmem_alloc, 2); TEST_GOOD(uts_kill, 2); TEST_GOOD(av1394_ic_bitreverse, 1); TEST_GOOD(dtrace_instrumented, 4); ! TEST_GOOD_STRUCT(big_struct_ret_w_float, 1); TEST_BAD(no_fp, 5); TEST_GOOD(gcc_mov_align, 5); TEST_GOOD(gcc_push_align, 5); TEST_GOOD(ss_mov_align, 5); TEST_GOOD(gcc_mov_basic, 4); TEST_GOOD(gcc_push_basic, 4); TEST_GOOD(ss_mov_basic, 4); ! TEST_GOOD_STRUCT(gcc_mov_big_struct_ret, 4); ! TEST_GOOD_STRUCT(gcc_push_big_struct_ret, 4); TEST_GOOD_STRUCT(ss_mov_big_struct_ret, 4); ! TEST_GOOD_STRUCT(gcc_mov_big_struct_ret_and_spill, 8); ! TEST_GOOD_STRUCT(gcc_push_big_struct_ret_and_spill, 8); TEST_GOOD_STRUCT(ss_mov_big_struct_ret_and_spill, 8); TEST_GOOD(gcc_mov_small_struct_ret, 4); TEST_GOOD(gcc_push_small_struct_ret, 4); TEST_GOOD(ss_mov_small_struct_ret, 4); --- 123,155 ---- { TEST_GOOD(kmem_alloc, 2); TEST_GOOD(uts_kill, 2); TEST_GOOD(av1394_ic_bitreverse, 1); TEST_GOOD(dtrace_instrumented, 4); ! TEST_GOOD_GSTRUCT(big_struct_ret_w_float, 1); TEST_BAD(no_fp, 5); TEST_GOOD(gcc_mov_align, 5); TEST_GOOD(gcc_push_align, 5); TEST_GOOD(ss_mov_align, 5); TEST_GOOD(gcc_mov_basic, 4); TEST_GOOD(gcc_push_basic, 4); TEST_GOOD(ss_mov_basic, 4); ! TEST_GOOD(gcc_mov_noorder, 4); ! TEST_GOOD(gcc_push_noorder, 4); ! ! TEST_GOOD_GSTRUCT(gcc_mov_big_struct_ret, 4); ! TEST_GOOD_GSTRUCT(gcc_push_big_struct_ret, 4); TEST_GOOD_STRUCT(ss_mov_big_struct_ret, 4); ! TEST_GOOD_GSTRUCT(gcc_mov_struct_noorder, 4); ! TEST_GOOD_GSTRUCT(gcc_push_struct_noorder, 4); ! ! TEST_GOOD_GSTRUCT(gcc_mov_big_struct_ret_and_spill, 8); ! TEST_GOOD_GSTRUCT(gcc_push_big_struct_ret_and_spill, 8); TEST_GOOD_STRUCT(ss_mov_big_struct_ret_and_spill, 8); TEST_GOOD(gcc_mov_small_struct_ret, 4); TEST_GOOD(gcc_push_small_struct_ret, 4); TEST_GOOD(ss_mov_small_struct_ret, 4);
*** 131,137 **** --- 165,173 ---- TEST_BAD(big_struct_arg_by_value, 2); TEST_BAD(small_struct_arg_by_value, 2); TEST_BAD(small_struct_ret_w_float, 1); + TEST_GOOD(interleaved_argument_saves, 4); + return (0); }