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) {...@@ -2704,6 +2704,32 @@ static bool skip_fn_codegen(CodeGen *g, FnTableEntry *fn_entry) {
2704 return fn_entry->ref_count == 0;2704 return fn_entry->ref_count == 0;
2705}2705}
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
2707static void do_code_gen(CodeGen *g) {2733static void do_code_gen(CodeGen *g) {
2708 assert(!g->errors.length);2734 assert(!g->errors.length);
27092735
...@@ -2817,7 +2843,7 @@ static void do_code_gen(CodeGen *g) {...@@ -2817,7 +2843,7 @@ static void do_code_gen(CodeGen *g) {
2817 }2843 }
28182844
2819 if (fn_table_entry->is_test) {2845 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);
2821 next_test_index += 1;2847 next_test_index += 1;
2822 }2848 }
2823 }2849 }
...@@ -2827,27 +2853,28 @@ static void do_code_gen(CodeGen *g) {...@@ -2827,27 +2853,28 @@ static void do_code_gen(CodeGen *g) {
2827 assert(g->test_fn_count > 0);2853 assert(g->test_fn_count > 0);
2828 assert(next_test_index == g->test_fn_count);2854 assert(next_test_index == g->test_fn_count);
28292855
2830 {2856 LLVMValueRef test_fn_array_init = LLVMConstArray(LLVMTypeOf(test_fn_vals[0]),
2831 LLVMValueRef test_fn_array_val = LLVMConstArray(LLVMTypeOf(test_fn_vals[0]),2857 test_fn_vals, g->test_fn_count);
2832 test_fn_vals, g->test_fn_count);2858 LLVMValueRef test_fn_array_val = LLVMAddGlobal(g->module,
2833 LLVMValueRef global_value = LLVMAddGlobal(g->module,2859 LLVMTypeOf(test_fn_array_init), "");
2834 LLVMTypeOf(test_fn_array_val), "zig_test_fn_list");2860 LLVMSetInitializer(test_fn_array_val, test_fn_array_init);
2835 LLVMSetInitializer(global_value, test_fn_array_val);2861 LLVMSetLinkage(test_fn_array_val, LLVMInternalLinkage);
2836 LLVMSetLinkage(global_value, LLVMExternalLinkage);2862 LLVMSetGlobalConstant(test_fn_array_val, true);
2837 LLVMSetGlobalConstant(global_value, true);2863 LLVMSetUnnamedAddr(test_fn_array_val, true);
2838 LLVMSetUnnamedAddr(global_value, true);2864
2839 }2865 LLVMValueRef len_val = LLVMConstInt(g->builtin_types.entry_isize->type_ref, g->test_fn_count, false);
28402866 LLVMTypeRef ptr_type = LLVMPointerType(LLVMTypeOf(test_fn_vals[0]), 0);
2841 {2867 LLVMValueRef fields[] = {
2842 LLVMValueRef test_fn_count_val = LLVMConstInt(g->builtin_types.entry_isize->type_ref,2868 LLVMConstBitCast(test_fn_array_val, ptr_type),
2843 g->test_fn_count, false);2869 len_val,
2844 LLVMValueRef global_value = LLVMAddGlobal(g->module,2870 };
2845 LLVMTypeOf(test_fn_count_val), "zig_test_fn_count");2871 LLVMValueRef test_fn_slice_init = LLVMConstStruct(fields, 2, false);
2846 LLVMSetInitializer(global_value, test_fn_count_val);2872 LLVMValueRef test_fn_slice_val = LLVMAddGlobal(g->module,
2847 LLVMSetLinkage(global_value, LLVMExternalLinkage);2873 LLVMTypeOf(test_fn_slice_init), "zig_test_fn_list");
2848 LLVMSetGlobalConstant(global_value, true);2874 LLVMSetInitializer(test_fn_slice_val, test_fn_slice_init);
2849 LLVMSetUnnamedAddr(global_value, true);2875 LLVMSetLinkage(test_fn_slice_val, LLVMExternalLinkage);
2850 }2876 LLVMSetGlobalConstant(test_fn_slice_val, true);
2877 LLVMSetUnnamedAddr(test_fn_slice_val, true);
2851 }2878 }
28522879
2853 // Generate function definitions.2880 // Generate function definitions.
std/test_runner.zig+3-19
...@@ -1,45 +1,29 @@...@@ -1,45 +1,29 @@
1import "std.zig";1import "std.zig";
22
3/*
4struct TestFn {3struct TestFn {
5 name: []u8,4 name: []u8,
6 func: extern fn(),5 func: extern fn(),
7}6}
87
9extern var test_fn_list: []TestFn;8extern var zig_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();
169
17pub fn main(args: [][]u8) -> %void {10pub fn main(args: [][]u8) -> %void {
18 var i : isize = 0;11 for (test_fn, zig_test_fn_list, i) {
19 while (i < zig_test_fn_count) {
20 %%stderr.print_str("Test ");12 %%stderr.print_str("Test ");
21 // TODO get rid of the isize13 // TODO get rid of the isize
22 %%stderr.print_i64(i + isize(1));14 %%stderr.print_i64(i + isize(1));
23 %%stderr.print_str("/");15 %%stderr.print_str("/");
24 %%stderr.print_i64(zig_test_fn_count);16 %%stderr.print_i64(zig_test_fn_list.len);
25 %%stderr.print_str(" ");17 %%stderr.print_str(" ");
26 /*
27 %%stderr.print_str(test_fn.name);18 %%stderr.print_str(test_fn.name);
28 */
29 %%stderr.print_str("...");19 %%stderr.print_str("...");
3020
31/*
32 // TODO support calling function pointers as fields directly21 // TODO support calling function pointers as fields directly
33 const fn_ptr = test_fn.func;22 const fn_ptr = test_fn.func;
34 fn_ptr();23 fn_ptr();
35 */
3624
37 const test_fn = zig_test_fn_list[i];
38 test_fn();
3925
40 %%stderr.print_str("OK\n");26 %%stderr.print_str("OK\n");
41 %%stderr.flush();27 %%stderr.flush();
42
43 i += 1;
44 }28 }
45}29}