authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-03 18:38:09-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-03 18:38:09-07:00
log39223c1847af19622db237d92e31c7be3cb805a2
tree2f43fb18f14f932c50e4d93442e3939bf31010ac
parent11a06443659154ec53e4deb00956b2f025cd71ca

test runner prints test names


2 files changed, 52 insertions(+), 41 deletions(-)

src/codegen.cpp+49-22
......@@ -2704,6 +2704,32 @@ static bool skip_fn_codegen(CodeGen *g, FnTableEntry *fn_entry) {
27042704 return fn_entry->ref_count == 0;
27052705}
27062706
2707static LLVMValueRef gen_test_fn_val(CodeGen *g, FnTableEntry *fn_entry) {
2708 // Must match TestFn struct from test_runner.zig
2709 Buf *fn_name = &fn_entry->symbol_name;
2710 LLVMValueRef str_init = LLVMConstString(buf_ptr(fn_name), buf_len(fn_name), true);
2711 LLVMValueRef str_global_val = LLVMAddGlobal(g->module, LLVMTypeOf(str_init), "");
2712 LLVMSetInitializer(str_global_val, str_init);
2713 LLVMSetLinkage(str_global_val, LLVMPrivateLinkage);
2714 LLVMSetGlobalConstant(str_global_val, true);
2715 LLVMSetUnnamedAddr(str_global_val, true);
2716
2717 LLVMValueRef len_val = LLVMConstInt(g->builtin_types.entry_isize->type_ref, buf_len(fn_name), false);
2718
2719 LLVMTypeRef ptr_type = LLVMPointerType(g->builtin_types.entry_u8->type_ref, 0);
2720 LLVMValueRef name_fields[] = {
2721 LLVMConstBitCast(str_global_val, ptr_type),
2722 len_val,
2723 };
2724
2725 LLVMValueRef name_val = LLVMConstStruct(name_fields, 2, false);
2726 LLVMValueRef fields[] = {
2727 name_val,
2728 fn_entry->fn_value,
2729 };
2730 return LLVMConstStruct(fields, 2, false);
2731}
2732
27072733static void do_code_gen(CodeGen *g) {
27082734 assert(!g->errors.length);
27092735
......@@ -2817,7 +2843,7 @@ static void do_code_gen(CodeGen *g) {
28172843 }
28182844
28192845 if (fn_table_entry->is_test) {
2820 test_fn_vals[next_test_index] = fn_table_entry->fn_value;
2846 test_fn_vals[next_test_index] = gen_test_fn_val(g, fn_table_entry);
28212847 next_test_index += 1;
28222848 }
28232849 }
......@@ -2827,27 +2853,28 @@ static void do_code_gen(CodeGen *g) {
28272853 assert(g->test_fn_count > 0);
28282854 assert(next_test_index == g->test_fn_count);
28292855
2830 {
2831 LLVMValueRef test_fn_array_val = LLVMConstArray(LLVMTypeOf(test_fn_vals[0]),
2832 test_fn_vals, g->test_fn_count);
2833 LLVMValueRef global_value = LLVMAddGlobal(g->module,
2834 LLVMTypeOf(test_fn_array_val), "zig_test_fn_list");
2835 LLVMSetInitializer(global_value, test_fn_array_val);
2836 LLVMSetLinkage(global_value, LLVMExternalLinkage);
2837 LLVMSetGlobalConstant(global_value, true);
2838 LLVMSetUnnamedAddr(global_value, true);
2839 }
2840
2841 {
2842 LLVMValueRef test_fn_count_val = LLVMConstInt(g->builtin_types.entry_isize->type_ref,
2843 g->test_fn_count, false);
2844 LLVMValueRef global_value = LLVMAddGlobal(g->module,
2845 LLVMTypeOf(test_fn_count_val), "zig_test_fn_count");
2846 LLVMSetInitializer(global_value, test_fn_count_val);
2847 LLVMSetLinkage(global_value, LLVMExternalLinkage);
2848 LLVMSetGlobalConstant(global_value, true);
2849 LLVMSetUnnamedAddr(global_value, true);
2850 }
2856 LLVMValueRef test_fn_array_init = LLVMConstArray(LLVMTypeOf(test_fn_vals[0]),
2857 test_fn_vals, g->test_fn_count);
2858 LLVMValueRef test_fn_array_val = LLVMAddGlobal(g->module,
2859 LLVMTypeOf(test_fn_array_init), "");
2860 LLVMSetInitializer(test_fn_array_val, test_fn_array_init);
2861 LLVMSetLinkage(test_fn_array_val, LLVMInternalLinkage);
2862 LLVMSetGlobalConstant(test_fn_array_val, true);
2863 LLVMSetUnnamedAddr(test_fn_array_val, true);
2864
2865 LLVMValueRef len_val = LLVMConstInt(g->builtin_types.entry_isize->type_ref, g->test_fn_count, false);
2866 LLVMTypeRef ptr_type = LLVMPointerType(LLVMTypeOf(test_fn_vals[0]), 0);
2867 LLVMValueRef fields[] = {
2868 LLVMConstBitCast(test_fn_array_val, ptr_type),
2869 len_val,
2870 };
2871 LLVMValueRef test_fn_slice_init = LLVMConstStruct(fields, 2, false);
2872 LLVMValueRef test_fn_slice_val = LLVMAddGlobal(g->module,
2873 LLVMTypeOf(test_fn_slice_init), "zig_test_fn_list");
2874 LLVMSetInitializer(test_fn_slice_val, test_fn_slice_init);
2875 LLVMSetLinkage(test_fn_slice_val, LLVMExternalLinkage);
2876 LLVMSetGlobalConstant(test_fn_slice_val, true);
2877 LLVMSetUnnamedAddr(test_fn_slice_val, true);
28512878 }
28522879
28532880 // Generate function definitions.
std/test_runner.zig+3-19
......@@ -1,45 +1,29 @@
11import "std.zig";
22
3/*
43struct TestFn {
54 name: []u8,
65 func: extern fn(),
76}
87
9extern var test_fn_list: []TestFn;
10*/
11
12extern var zig_test_fn_count: isize;
13
14// TODO make this a slice of structs
15extern var zig_test_fn_list: [99999999]extern fn();
8extern var zig_test_fn_list: []TestFn;
169
1710pub fn main(args: [][]u8) -> %void {
18 var i : isize = 0;
19 while (i < zig_test_fn_count) {
11 for (test_fn, zig_test_fn_list, i) {
2012 %%stderr.print_str("Test ");
2113 // TODO get rid of the isize
2214 %%stderr.print_i64(i + isize(1));
2315 %%stderr.print_str("/");
24 %%stderr.print_i64(zig_test_fn_count);
16 %%stderr.print_i64(zig_test_fn_list.len);
2517 %%stderr.print_str(" ");
26 /*
2718 %%stderr.print_str(test_fn.name);
28 */
2919 %%stderr.print_str("...");
3020
31/*
3221 // TODO support calling function pointers as fields directly
3322 const fn_ptr = test_fn.func;
3423 fn_ptr();
35 */
3624
37 const test_fn = zig_test_fn_list[i];
38 test_fn();
3925
4026 %%stderr.print_str("OK\n");
4127 %%stderr.flush();
42
43 i += 1;
4428 }
4529}