Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #ifndef __TMO_TEST_DEFS_H__ #define __TMO_TEST_DEFS_H__ #include <stdint.h> // Real TMO typedef void *test_voidpointer_t; #define TMO_TEST_STRUCTS_L1(action, block, f1, f2, f3, f4, f5, f6, f7) \ action(block, f1, f2, f3, f4, f5, f6, f7, uint64_t) \ action(block, f1, f2, f3, f4, f5, f6, f7, test_voidpointer_t) #define TMO_TEST_STRUCTS_L2(action, block, f1, f2, f3, f4, f5, f6) \ TMO_TEST_STRUCTS_L1(action, block, f1, f2, f3, f4, f5, f6, uint64_t) \ TMO_TEST_STRUCTS_L1(action, block, f1, f2, f3, f4, f5, f6, test_voidpointer_t) #define TMO_TEST_STRUCTS_L3(action, block, f1, f2, f3, f4, f5) \ TMO_TEST_STRUCTS_L2(action, block, f1, f2, f3, f4, f5, uint64_t) \ TMO_TEST_STRUCTS_L2(action, block, f1, f2, f3, f4, f5, test_voidpointer_t) #define TMO_TEST_STRUCTS_L4(action, block, f1, f2, f3, f4) \ TMO_TEST_STRUCTS_L3(action, block, f1, f2, f3, f4, uint64_t) \ TMO_TEST_STRUCTS_L3(action, block, f1, f2, f3, f4, test_voidpointer_t) #define TMO_TEST_STRUCTS_L5(action, block, f1, f2, f3) \ TMO_TEST_STRUCTS_L4(action, block, f1, f2, f3, uint64_t) \ TMO_TEST_STRUCTS_L4(action, block, f1, f2, f3, test_voidpointer_t) #define TMO_TEST_STRUCTS_L6(action, block, f1, f2) \ TMO_TEST_STRUCTS_L5(action, block, f1, f2, uint64_t) \ TMO_TEST_STRUCTS_L5(action, block, f1, f2, test_voidpointer_t) #define TMO_TEST_STRUCTS_L7(action, block, f1) \ TMO_TEST_STRUCTS_L6(action, block, f1, uint64_t) \ TMO_TEST_STRUCTS_L6(action, block, f1, test_voidpointer_t) #define FOREACH_TMO_TEST_STRUCT(action, block) \ TMO_TEST_STRUCTS_L7(action, block, uint64_t) \ TMO_TEST_STRUCTS_L7(action, block, test_voidpointer_t) #define DEFINE_TMO_TEST_STRUCT_TYPE(block, f1, f2, f3, f4, f5, f6, f7, f8) \ struct tmo_test_##f1##_##f2##_##_##f3##_##f4##_##f5##_##f6##_##f7##_##f8 { \ f1 m1; \ f2 m2; \ f3 m3; \ f4 m4; \ f5 m5; \ f6 m6; \ f7 m7; \ f8 m8; \ test_voidpointer_t p; \ uint8_t pad[440]; \ }; FOREACH_TMO_TEST_STRUCT(DEFINE_TMO_TEST_STRUCT_TYPE, "") #define INVOKE_FOR_TMO_TEST_STRUCT_TYPE(block, f1, f2, f3, f4, f5, f6, f7, f8) \ block(struct tmo_test_##f1##_##f2##_##_##f3##_##f4##_##f5##_##f6##_##f7##_##f8); #define INVOKE_FOR_TMO_TEST_STRUCT_CPP_TYPE(block, f1, f2, f3, f4, f5, f6, f7, f8) \ block(tmo_test_##f1##_##f2##_##_##f3##_##f4##_##f5##_##f6##_##f7##_##f8); #define N_TMO_TEST_STRUCTS 256 // Callsite TMO static volatile int dummy; // The dummy stores are to prevent all of the callsites from being the same // number of instructions apart, as that can make it through our scrambling of // the type descriptor and cause us to fail to distribute across the buckets as // intended #define _CALL_10(expr) \ (expr); \ (expr); \ dummy = 42; \ (expr); \ dummy = 42; \ dummy = 42; \ (expr); \ (expr); \ (expr); \ dummy = 42; \ (expr); \ (expr); \ (expr); \ (expr) #define CALL_100(expr) \ _CALL_10(expr); \ _CALL_10(expr); \ _CALL_10(expr); \ _CALL_10(expr); \ _CALL_10(expr); \ _CALL_10(expr); \ _CALL_10(expr); \ _CALL_10(expr); \ _CALL_10(expr); \ _CALL_10(expr) #define N_UNIQUE_CALLSITES 200 // must match constant above #define CALL_N_CALLSITES(expr) \ CALL_100(expr); \ CALL_100(expr) // Swift TMO #define N_TEST_SWIFT_CLASSES 200 #endif // __TMO_TEST_DEFS_H__ |