vmcore.ml revision 8ef426baa36639458f6777309db25c1768dc9c8a
18ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen(* RUN: %ocamlc llvm.cma llvm_bitwriter.cma %s -o %t 28ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen * RUN: ./%t %t.bc 38ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen * RUN: llvm-dis < %t.bc > %t.ll 48ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 58ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 68ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen(* Note: It takes several seconds for ocamlc to link an executable with 78ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen libLLVMCore.a, so it's better to write a big test than a bunch of 88ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen little ones. *) 98ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenopen Llvm 118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenopen Llvm_bitwriter 128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen(* Tiny unit test framework *) 158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet exit_status = ref 0 168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet case_num = ref 0 178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet all_done () = 198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen prerr_endline ""; 208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen exit !exit_status 218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet group name = 238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen prerr_endline ""; 248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen case_num := 0; 258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen prerr_string (" " ^ name ^ "... ") 268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet insist cond = 288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen incr case_num; 298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen prerr_char ' '; 308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen if not cond then begin 318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen exit_status := 10; 328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen prerr_char '!' 338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen end; 348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen prerr_int !case_num 358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet suite name f = 378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen prerr_endline (name ^ ":"); 388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen f () 398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen(*===-- Fixture -----------------------------------------------------------===*) 428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet filename = Sys.argv.(1) 448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet m = create_module filename 458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen(*===-- Types -------------------------------------------------------------===*) 488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet test_types () = 508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty01.*void} < %t.ll 518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "void"; 538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty01" void_type m); 548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (Void_type == classify_type void_type); 558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty02.*i1} < %t.ll 578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "i1"; 598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty02" i1_type m); 608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (Integer_type == classify_type i1_type); 618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty03.*i32} < %t.ll 638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "i32"; 658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty03" i32_type m); 668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty04.*i42} < %t.ll 688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "i42"; 708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let ty = make_integer_type 42 in 718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty04" ty m); 728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty05.*float} < %t.ll 748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "float"; 768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty05" float_type m); 778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (Float_type == classify_type float_type); 788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty06.*double} < %t.ll 808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "double"; 828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty06" double_type m); 838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (Double_type == classify_type double_type); 848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty07.*i32.*i1, double} < %t.ll 868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "function"; 888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let ty = make_function_type i32_type [| i1_type; double_type |] false in 898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty07" ty m); 908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (Function_type = classify_type ty); 918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (not (is_var_arg ty)); 928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (i32_type == return_type ty); 938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (double_type == (param_types ty).(1)); 948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty08.*\.\.\.} < %t.ll 968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "vararg"; 988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let ty = make_function_type void_type [| i32_type |] true in 998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty08" ty m); 1008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (is_var_arg ty); 1018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty09.*\\\[7 x i8\\\]} < %t.ll 1038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "array"; 1058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let ty = make_array_type i8_type 7 in 1068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty09" ty m); 1078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (7 = array_length ty); 1088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (i8_type == element_type ty); 1098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (Array_type == classify_type ty); 1108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty10.*float\*} < %t.ll 1128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "pointer"; 1148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let ty = make_pointer_type float_type in 1158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty10" ty m); 1168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (float_type == element_type ty); 1178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (Pointer_type == classify_type ty); 1188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty11.*\<4 x i16\>} < %t.ll 1208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "vector"; 1228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let ty = make_vector_type i16_type 4 in 1238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty11" ty m); 1248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (i16_type == element_type ty); 1258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (4 = vector_size ty); 1268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {Ty12.*opaque} < %t.ll 1288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "opaque"; 1308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let ty = make_opaque_type () in 1318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (add_type_name "Ty12" ty m); 1328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (ty == ty); 1338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (ty <> make_opaque_type ()) 1348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen(*===-- Global Values -----------------------------------------------------===*) 1378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet test_global_values () = 1398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let (++) x f = f x; x in 1408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let zero32 = make_null i32_type in 1418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {GVal01} < %t.ll 1438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "naming"; 1458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let g = define_global "TEMPORARY" zero32 m in 1468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen prerr_endline ""; 1478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen prerr_endline (value_name g); 1488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist ("TEMPORARY" = value_name g); 1498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen set_value_name "GVal01" g; 1508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist ("GVal01" = value_name g); 1518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {GVal02.*linkonce} < %t.ll 1538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "linkage"; 1558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let g = define_global "GVal02" zero32 m ++ 1568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen set_linkage Link_once_linkage in 1578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (Link_once_linkage = linkage g); 1588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {GVal03.*Hanalei} < %t.ll 1608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "section"; 1628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let g = define_global "GVal03" zero32 m ++ 1638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen set_section "Hanalei" in 1648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist ("Hanalei" = section g); 1658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {GVal04.*hidden} < %t.ll 1678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "visibility"; 1698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let g = define_global "GVal04" zero32 m ++ 1708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen set_visibility Hidden_visibility in 1718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (Hidden_visibility = visibility g); 1728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {GVal05.*align 128} < %t.ll 1748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "alignment"; 1768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let g = define_global "GVal05" zero32 m ++ 1778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen set_alignment 128 in 1788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (128 = alignment g) 1798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen(*===-- Global Variables --------------------------------------------------===*) 1828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet test_global_variables () = 1848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let (++) x f = f x; x in 1858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let fourty_two32 = make_int_constant i32_type 42 false in 1868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {GVar01.*external} < %t.ll 1888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "declarations"; 1908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let g = declare_global i32_type "GVar01" m in 1918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (is_declaration g); 1928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {GVar02.*42} < %t.ll 1948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen * RUN: grep {GVar03.*42} < %t.ll 1958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 1968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "definitions"; 1978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let g = define_global "GVar02" fourty_two32 m in 1988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let g2 = declare_global i32_type "GVar03" m ++ 1998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen set_initializer fourty_two32 in 2008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (not (is_declaration g)); 2018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (not (is_declaration g2)); 2028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist ((global_initializer g) == (global_initializer g2)); 2038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep {GVar04.*thread_local} < %t.ll 2058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 2068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "threadlocal"; 2078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let g = define_global "GVar04" fourty_two32 m ++ 2088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen set_thread_local true in 2098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (is_thread_local g); 2108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (* RUN: grep -v {GVar05} < %t.ll 2128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen *) 2138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen let g = define_global "GVar05" fourty_two32 m in 2148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen delete_global g 2158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen(*===-- Writer ------------------------------------------------------------===*) 2188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet test_writer () = 2208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen group "writer"; 2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen insist (write_bitcode_file m filename); 2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen dispose_module m 2248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen(*===-- Driver ------------------------------------------------------------===*) 2278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenlet _ = 2298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen suite "types" test_types; 2308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen suite "global values" test_global_values; 2318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen suite "global variables" test_global_variables; 2328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen suite "writer" test_writer; 2338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen all_done () 234