authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-08-02 15:33:30-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-08-03 09:52:15-07:00
logea0e6e737bb658bb6353ad6d3ab3c8cff61e051a
tree976371251fe6a651c82d8fbf5663a21b7c0be252
parent469af6780408cf3f2d7ce0c16e2d3b797dd525f1

CLI: reduce code size bloat

Make a bunch of ArrayList objects use arena instead of gpa, eliminating the `defer` expressions, which reduces code size of zig1.wasm by 1%

1 files changed, 24 insertions(+), 44 deletions(-)

src/main.zig+24-44
......@@ -746,6 +746,18 @@ const SystemLib = struct {
746746 }
747747};
748748
749const CliModule = struct {
750 mod: *Package,
751 /// still in CLI arg format
752 deps_str: []const u8,
753};
754
755fn cleanupModules(modules: *std.StringArrayHashMap(CliModule)) void {
756 var it = modules.iterator();
757 while (it.next()) |kv| kv.value_ptr.mod.destroy(modules.allocator);
758 modules.deinit();
759}
760
749761fn buildOutputType(
750762 gpa: Allocator,
751763 arena: Allocator,
......@@ -893,62 +905,30 @@ fn buildOutputType(
893905 var error_tracing: ?bool = null;
894906 var pdb_out_path: ?[]const u8 = null;
895907 var dwarf_format: ?std.dwarf.Format = null;
896
897908 // e.g. -m3dnow or -mno-outline-atomics. They correspond to std.Target llvm cpu feature names.
898909 // This array is populated by zig cc frontend and then has to be converted to zig-style
899910 // CPU features.
900 var llvm_m_args = std.ArrayList([]const u8).init(gpa);
901 defer llvm_m_args.deinit();
902
911 var llvm_m_args = std.ArrayList([]const u8).init(arena);
903912 var system_libs = std.StringArrayHashMap(SystemLib).init(arena);
904
905 var wasi_emulated_libs = std.ArrayList(wasi_libc.CRTFile).init(gpa);
906 defer wasi_emulated_libs.deinit();
907
908 var clang_argv = std.ArrayList([]const u8).init(gpa);
909 defer clang_argv.deinit();
910
911 var extra_cflags = std.ArrayList([]const u8).init(gpa);
912 defer extra_cflags.deinit();
913
913 var wasi_emulated_libs = std.ArrayList(wasi_libc.CRTFile).init(arena);
914 var clang_argv = std.ArrayList([]const u8).init(arena);
915 var extra_cflags = std.ArrayList([]const u8).init(arena);
914916 // These are before resolving sysroot.
915917 var lib_dir_args = std.ArrayList([]const u8).init(arena);
916
917 var rpath_list = std.ArrayList([]const u8).init(gpa);
918 defer rpath_list.deinit();
919
918 var rpath_list = std.ArrayList([]const u8).init(arena);
920919 var symbol_wrap_set: std.StringArrayHashMapUnmanaged(void) = .{};
921
922 var c_source_files = std.ArrayList(Compilation.CSourceFile).init(gpa);
923 defer c_source_files.deinit();
924
925 var link_objects = std.ArrayList(Compilation.LinkObject).init(gpa);
926 defer link_objects.deinit();
927
928 var framework_dirs = std.ArrayList([]const u8).init(gpa);
929 defer framework_dirs.deinit();
930
920 var c_source_files = std.ArrayList(Compilation.CSourceFile).init(arena);
921 var link_objects = std.ArrayList(Compilation.LinkObject).init(arena);
922 var framework_dirs = std.ArrayList([]const u8).init(arena);
931923 var frameworks: std.StringArrayHashMapUnmanaged(Compilation.Framework) = .{};
932
933924 // null means replace with the test executable binary
934 var test_exec_args = std.ArrayList(?[]const u8).init(gpa);
935 defer test_exec_args.deinit();
936
937 var linker_export_symbol_names = std.ArrayList([]const u8).init(gpa);
938 defer linker_export_symbol_names.deinit();
939
925 var test_exec_args = std.ArrayList(?[]const u8).init(arena);
926 var linker_export_symbol_names = std.ArrayList([]const u8).init(arena);
940927 // Contains every module specified via --mod. The dependencies are added
941928 // after argument parsing is completed. We use a StringArrayHashMap to make
942929 // error output consistent.
943 var modules = std.StringArrayHashMap(struct {
944 mod: *Package,
945 deps_str: []const u8, // still in CLI arg format
946 }).init(gpa);
947 defer {
948 var it = modules.iterator();
949 while (it.next()) |kv| kv.value_ptr.mod.destroy(gpa);
950 modules.deinit();
951 }
930 var modules = std.StringArrayHashMap(CliModule).init(gpa);
931 defer cleanupModules(&modules);
952932
953933 // The dependency string for the root package
954934 var root_deps_str: ?[]const u8 = null;