authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-15 21:57:26-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2018-04-15 21:57:26-04:00
log88724217dd1e1fe4b20fed27c8a662b66df55088
treeb8f4302f43bfc367736abc8be5820e9e084318fd
parentb9360640cefd1aa30dedf71a0c6b7bddc51a6ae3
parent1bc140964fb394819908d267561103b6c7e5036c
signature Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #925 from alexnask/release_small

Added ReleaseSmall mode.

9 files changed, 52 insertions(+), 15 deletions(-)

doc/docgen.zig+19
...@@ -749,6 +749,10 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var...@@ -749,6 +749,10 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var
749 try build_args.append("--release-fast");749 try build_args.append("--release-fast");
750 try out.print(" --release-fast");750 try out.print(" --release-fast");
751 },751 },
752 builtin.Mode.ReleaseSmall => {
753 try build_args.append("--release-small");
754 try out.print(" --release-small");
755 },
752 }756 }
753 for (code.link_objects) |link_object| {757 for (code.link_objects) |link_object| {
754 const name_with_ext = try std.fmt.allocPrint(allocator, "{}{}", link_object, obj_ext);758 const name_with_ext = try std.fmt.allocPrint(allocator, "{}{}", link_object, obj_ext);
...@@ -810,6 +814,10 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var...@@ -810,6 +814,10 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var
810 try test_args.append("--release-fast");814 try test_args.append("--release-fast");
811 try out.print(" --release-fast");815 try out.print(" --release-fast");
812 },816 },
817 builtin.Mode.ReleaseSmall => {
818 try test_args.append("--release-small");
819 try out.print(" --release-small");
820 },
813 }821 }
814 if (code.target_windows) {822 if (code.target_windows) {
815 try test_args.appendSlice([][]const u8{823 try test_args.appendSlice([][]const u8{
...@@ -840,6 +848,10 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var...@@ -840,6 +848,10 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var
840 try test_args.append("--release-fast");848 try test_args.append("--release-fast");
841 try out.print(" --release-fast");849 try out.print(" --release-fast");
842 },850 },
851 builtin.Mode.ReleaseSmall => {
852 try test_args.append("--release-small");
853 try out.print(" --release-small");
854 },
843 }855 }
844 const result = try os.ChildProcess.exec(allocator, test_args.toSliceConst(), null, null, max_doc_file_size);856 const result = try os.ChildProcess.exec(allocator, test_args.toSliceConst(), null, null, max_doc_file_size);
845 switch (result.term) {857 switch (result.term) {
...@@ -874,6 +886,7 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var...@@ -874,6 +886,7 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var
874 builtin.Mode.Debug => {},886 builtin.Mode.Debug => {},
875 builtin.Mode.ReleaseSafe => try test_args.append("--release-safe"),887 builtin.Mode.ReleaseSafe => try test_args.append("--release-safe"),
876 builtin.Mode.ReleaseFast => try test_args.append("--release-fast"),888 builtin.Mode.ReleaseFast => try test_args.append("--release-fast"),
889 builtin.Mode.ReleaseSmall => try test_args.append("--release-small"),
877 }890 }
878891
879 const result = try os.ChildProcess.exec(allocator, test_args.toSliceConst(), null, null, max_doc_file_size);892 const result = try os.ChildProcess.exec(allocator, test_args.toSliceConst(), null, null, max_doc_file_size);
...@@ -927,6 +940,12 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var...@@ -927,6 +940,12 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var
927 try out.print(" --release-fast");940 try out.print(" --release-fast");
928 }941 }
929 },942 },
943 builtin.Mode.ReleaseSmall => {
944 try build_args.append("--release-small");
945 if (!code.is_inline) {
946 try out.print(" --release-small");
947 }
948 },
930 }949 }
931950
932 if (maybe_error_match) |error_match| {951 if (maybe_error_match) |error_match| {
src/all_types.hpp+1
...@@ -1457,6 +1457,7 @@ enum BuildMode {...@@ -1457,6 +1457,7 @@ enum BuildMode {
1457 BuildModeDebug,1457 BuildModeDebug,
1458 BuildModeFastRelease,1458 BuildModeFastRelease,
1459 BuildModeSafeRelease,1459 BuildModeSafeRelease,
1460 BuildModeSmallRelease,
1460};1461};
14611462
1462enum EmitFileType {1463enum EmitFileType {
src/codegen.cpp+12-6
...@@ -512,7 +512,9 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {...@@ -512,7 +512,9 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
512 }512 }
513513
514 if (fn_table_entry->body_node != nullptr) {514 if (fn_table_entry->body_node != nullptr) {
515 bool want_fn_safety = g->build_mode != BuildModeFastRelease && !fn_table_entry->def_scope->safety_off;515 bool want_fn_safety = g->build_mode != BuildModeFastRelease &&
516 g->build_mode != BuildModeSmallRelease &&
517 !fn_table_entry->def_scope->safety_off;
516 if (want_fn_safety) {518 if (want_fn_safety) {
517 if (g->libc_link_lib != nullptr) {519 if (g->libc_link_lib != nullptr) {
518 addLLVMFnAttr(fn_table_entry->llvm_value, "sspstrong");520 addLLVMFnAttr(fn_table_entry->llvm_value, "sspstrong");
...@@ -817,7 +819,7 @@ static bool ir_want_fast_math(CodeGen *g, IrInstruction *instruction) {...@@ -817,7 +819,7 @@ static bool ir_want_fast_math(CodeGen *g, IrInstruction *instruction) {
817}819}
818820
819static bool ir_want_runtime_safety(CodeGen *g, IrInstruction *instruction) {821static bool ir_want_runtime_safety(CodeGen *g, IrInstruction *instruction) {
820 if (g->build_mode == BuildModeFastRelease)822 if (g->build_mode == BuildModeFastRelease || g->build_mode == BuildModeSmallRelease)
821 return false;823 return false;
822824
823 // TODO memoize825 // TODO memoize
...@@ -5747,10 +5749,12 @@ static void do_code_gen(CodeGen *g) {...@@ -5747,10 +5749,12 @@ static void do_code_gen(CodeGen *g) {
5747 os_path_join(g->cache_dir, o_basename, output_path);5749 os_path_join(g->cache_dir, o_basename, output_path);
5748 ensure_cache_dir(g);5750 ensure_cache_dir(g);
57495751
5752 bool is_small = g->build_mode == BuildModeSmallRelease;
5753
5750 switch (g->emit_file_type) {5754 switch (g->emit_file_type) {
5751 case EmitFileTypeBinary:5755 case EmitFileTypeBinary:
5752 if (ZigLLVMTargetMachineEmitToFile(g->target_machine, g->module, buf_ptr(output_path),5756 if (ZigLLVMTargetMachineEmitToFile(g->target_machine, g->module, buf_ptr(output_path),
5753 ZigLLVM_EmitBinary, &err_msg, g->build_mode == BuildModeDebug))5757 ZigLLVM_EmitBinary, &err_msg, g->build_mode == BuildModeDebug, is_small))
5754 {5758 {
5755 zig_panic("unable to write object file %s: %s", buf_ptr(output_path), err_msg);5759 zig_panic("unable to write object file %s: %s", buf_ptr(output_path), err_msg);
5756 }5760 }
...@@ -5760,7 +5764,7 @@ static void do_code_gen(CodeGen *g) {...@@ -5760,7 +5764,7 @@ static void do_code_gen(CodeGen *g) {
57605764
5761 case EmitFileTypeAssembly:5765 case EmitFileTypeAssembly:
5762 if (ZigLLVMTargetMachineEmitToFile(g->target_machine, g->module, buf_ptr(output_path),5766 if (ZigLLVMTargetMachineEmitToFile(g->target_machine, g->module, buf_ptr(output_path),
5763 ZigLLVM_EmitAssembly, &err_msg, g->build_mode == BuildModeDebug))5767 ZigLLVM_EmitAssembly, &err_msg, g->build_mode == BuildModeDebug, is_small))
5764 {5768 {
5765 zig_panic("unable to write assembly file %s: %s", buf_ptr(output_path), err_msg);5769 zig_panic("unable to write assembly file %s: %s", buf_ptr(output_path), err_msg);
5766 }5770 }
...@@ -5769,7 +5773,7 @@ static void do_code_gen(CodeGen *g) {...@@ -5769,7 +5773,7 @@ static void do_code_gen(CodeGen *g) {
57695773
5770 case EmitFileTypeLLVMIr:5774 case EmitFileTypeLLVMIr:
5771 if (ZigLLVMTargetMachineEmitToFile(g->target_machine, g->module, buf_ptr(output_path),5775 if (ZigLLVMTargetMachineEmitToFile(g->target_machine, g->module, buf_ptr(output_path),
5772 ZigLLVM_EmitLLVMIr, &err_msg, g->build_mode == BuildModeDebug))5776 ZigLLVM_EmitLLVMIr, &err_msg, g->build_mode == BuildModeDebug, is_small))
5773 {5777 {
5774 zig_panic("unable to write llvm-ir file %s: %s", buf_ptr(output_path), err_msg);5778 zig_panic("unable to write llvm-ir file %s: %s", buf_ptr(output_path), err_msg);
5775 }5779 }
...@@ -6160,6 +6164,7 @@ static const char *build_mode_to_str(BuildMode build_mode) {...@@ -6160,6 +6164,7 @@ static const char *build_mode_to_str(BuildMode build_mode) {
6160 case BuildModeDebug: return "Mode.Debug";6164 case BuildModeDebug: return "Mode.Debug";
6161 case BuildModeSafeRelease: return "Mode.ReleaseSafe";6165 case BuildModeSafeRelease: return "Mode.ReleaseSafe";
6162 case BuildModeFastRelease: return "Mode.ReleaseFast";6166 case BuildModeFastRelease: return "Mode.ReleaseFast";
6167 case BuildModeSmallRelease: return "Mode.ReleaseSmall";
6163 }6168 }
6164 zig_unreachable();6169 zig_unreachable();
6165}6170}
...@@ -6300,6 +6305,7 @@ static void define_builtin_compile_vars(CodeGen *g) {...@@ -6300,6 +6305,7 @@ static void define_builtin_compile_vars(CodeGen *g) {
6300 " Debug,\n"6305 " Debug,\n"
6301 " ReleaseSafe,\n"6306 " ReleaseSafe,\n"
6302 " ReleaseFast,\n"6307 " ReleaseFast,\n"
6308 " ReleaseSmall,\n"
6303 "};\n\n");6309 "};\n\n");
6304 }6310 }
6305 {6311 {
...@@ -6471,7 +6477,7 @@ static void init(CodeGen *g) {...@@ -6471,7 +6477,7 @@ static void init(CodeGen *g) {
6471 }6477 }
6472 }6478 }
64736479
6474 g->have_err_ret_tracing = g->build_mode != BuildModeFastRelease;6480 g->have_err_ret_tracing = g->build_mode != BuildModeFastRelease && g->build_mode != BuildModeSmallRelease;
64756481
6476 define_builtin_fns(g);6482 define_builtin_fns(g);
6477 define_builtin_compile_vars(g);6483 define_builtin_compile_vars(g);
src/main.cpp+3
...@@ -43,6 +43,7 @@ static int usage(const char *arg0) {...@@ -43,6 +43,7 @@ static int usage(const char *arg0) {
43 " --pkg-end pop current pkg\n"43 " --pkg-end pop current pkg\n"
44 " --release-fast build with optimizations on and safety off\n"44 " --release-fast build with optimizations on and safety off\n"
45 " --release-safe build with optimizations on and safety on\n"45 " --release-safe build with optimizations on and safety on\n"
46 " --release-small build with size optimizations on and safety off\n"
46 " --static output will be statically linked\n"47 " --static output will be statically linked\n"
47 " --strip exclude debug symbols\n"48 " --strip exclude debug symbols\n"
48 " --target-arch [name] specify target architecture\n"49 " --target-arch [name] specify target architecture\n"
...@@ -482,6 +483,8 @@ int main(int argc, char **argv) {...@@ -482,6 +483,8 @@ int main(int argc, char **argv) {
482 build_mode = BuildModeFastRelease;483 build_mode = BuildModeFastRelease;
483 } else if (strcmp(arg, "--release-safe") == 0) {484 } else if (strcmp(arg, "--release-safe") == 0) {
484 build_mode = BuildModeSafeRelease;485 build_mode = BuildModeSafeRelease;
486 } else if (strcmp(arg, "--release-small") == 0) {
487 build_mode = BuildModeSmallRelease;
485 } else if (strcmp(arg, "--strip") == 0) {488 } else if (strcmp(arg, "--strip") == 0) {
486 strip = true;489 strip = true;
487 } else if (strcmp(arg, "--static") == 0) {490 } else if (strcmp(arg, "--static") == 0) {
src/zig_llvm.cpp+2-2
...@@ -81,7 +81,7 @@ static const bool assertions_on = false;...@@ -81,7 +81,7 @@ static const bool assertions_on = false;
81#endif81#endif
8282
83bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref,83bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref,
84 const char *filename, ZigLLVM_EmitOutputType output_type, char **error_message, bool is_debug)84 const char *filename, ZigLLVM_EmitOutputType output_type, char **error_message, bool is_debug, bool is_small)
85{85{
86 std::error_code EC;86 std::error_code EC;
87 raw_fd_ostream dest(filename, EC, sys::fs::F_None);87 raw_fd_ostream dest(filename, EC, sys::fs::F_None);
...@@ -100,7 +100,7 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM...@@ -100,7 +100,7 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM
100 return true;100 return true;
101 }101 }
102 PMBuilder->OptLevel = target_machine->getOptLevel();102 PMBuilder->OptLevel = target_machine->getOptLevel();
103 PMBuilder->SizeLevel = 0;103 PMBuilder->SizeLevel = is_small ? 2 : 0;
104104
105 PMBuilder->DisableTailCalls = is_debug;105 PMBuilder->DisableTailCalls = is_debug;
106 PMBuilder->DisableUnitAtATime = is_debug;106 PMBuilder->DisableUnitAtATime = is_debug;
src/zig_llvm.h+1-1
...@@ -52,7 +52,7 @@ enum ZigLLVM_EmitOutputType {...@@ -52,7 +52,7 @@ enum ZigLLVM_EmitOutputType {
52};52};
5353
54ZIG_EXTERN_C bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref,54ZIG_EXTERN_C bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref,
55 const char *filename, enum ZigLLVM_EmitOutputType output_type, char **error_message, bool is_debug);55 const char *filename, enum ZigLLVM_EmitOutputType output_type, char **error_message, bool is_debug, bool is_small);
5656
57ZIG_EXTERN_C LLVMTypeRef ZigLLVMTokenTypeInContext(LLVMContextRef context_ref);57ZIG_EXTERN_C LLVMTypeRef ZigLLVMTokenTypeInContext(LLVMContextRef context_ref);
5858
std/build.zig+10-5
...@@ -426,15 +426,18 @@ pub const Builder = struct {...@@ -426,15 +426,18 @@ pub const Builder = struct {
426426
427 const release_safe = self.option(bool, "release-safe", "optimizations on and safety on") ?? false;427 const release_safe = self.option(bool, "release-safe", "optimizations on and safety on") ?? false;
428 const release_fast = self.option(bool, "release-fast", "optimizations on and safety off") ?? false;428 const release_fast = self.option(bool, "release-fast", "optimizations on and safety off") ?? false;
429 const release_small = self.option(bool, "release-small", "size optimizations on and safety off") ?? false;
429430
430 const mode = if (release_safe and !release_fast)431 const mode = if (release_safe and !release_fast and !release_small)
431 builtin.Mode.ReleaseSafe432 builtin.Mode.ReleaseSafe
432 else if (release_fast and !release_safe)433 else if (release_fast and !release_safe and !release_small)
433 builtin.Mode.ReleaseFast434 builtin.Mode.ReleaseFast
434 else if (!release_fast and !release_safe)435 else if (release_small and !release_fast and !release_safe)
436 builtin.Mode.ReleaseSmall
437 else if (!release_fast and !release_safe and !release_small)
435 builtin.Mode.Debug438 builtin.Mode.Debug
436 else x: {439 else x: {
437 warn("Both -Drelease-safe and -Drelease-fast specified");440 warn("Multiple release modes (of -Drelease-safe, -Drelease-fast and -Drelease-small)");
438 self.markInvalidUserInput();441 self.markInvalidUserInput();
439 break :x builtin.Mode.Debug;442 break :x builtin.Mode.Debug;
440 };443 };
...@@ -1229,6 +1232,7 @@ pub const LibExeObjStep = struct {...@@ -1229,6 +1232,7 @@ pub const LibExeObjStep = struct {
1229 builtin.Mode.Debug => {},1232 builtin.Mode.Debug => {},
1230 builtin.Mode.ReleaseSafe => zig_args.append("--release-safe") catch unreachable,1233 builtin.Mode.ReleaseSafe => zig_args.append("--release-safe") catch unreachable,
1231 builtin.Mode.ReleaseFast => zig_args.append("--release-fast") catch unreachable,1234 builtin.Mode.ReleaseFast => zig_args.append("--release-fast") catch unreachable,
1235 builtin.Mode.ReleaseSmall => zig_args.append("--release-small") catch unreachable,
1232 }1236 }
12331237
1234 zig_args.append("--cache-dir") catch unreachable;1238 zig_args.append("--cache-dir") catch unreachable;
...@@ -1369,7 +1373,7 @@ pub const LibExeObjStep = struct {...@@ -1369,7 +1373,7 @@ pub const LibExeObjStep = struct {
1369 args.append("ssp-buffer-size=4") catch unreachable;1373 args.append("ssp-buffer-size=4") catch unreachable;
1370 }1374 }
1371 },1375 },
1372 builtin.Mode.ReleaseFast => {1376 builtin.Mode.ReleaseFast, builtin.Mode.ReleaseSmall => {
1373 args.append("-O2") catch unreachable;1377 args.append("-O2") catch unreachable;
1374 args.append("-fno-stack-protector") catch unreachable;1378 args.append("-fno-stack-protector") catch unreachable;
1375 },1379 },
...@@ -1706,6 +1710,7 @@ pub const TestStep = struct {...@@ -1706,6 +1710,7 @@ pub const TestStep = struct {
1706 builtin.Mode.Debug => {},1710 builtin.Mode.Debug => {},
1707 builtin.Mode.ReleaseSafe => try zig_args.append("--release-safe"),1711 builtin.Mode.ReleaseSafe => try zig_args.append("--release-safe"),
1708 builtin.Mode.ReleaseFast => try zig_args.append("--release-fast"),1712 builtin.Mode.ReleaseFast => try zig_args.append("--release-fast"),
1713 builtin.Mode.ReleaseSmall => try zig_args.append("--release-small"),
1709 }1714 }
17101715
1711 switch (self.target) {1716 switch (self.target) {
std/special/builtin.zig+3-1
...@@ -54,7 +54,9 @@ export fn memmove(dest: ?&u8, src: ?&const u8, n: usize) ?&u8 {...@@ -54,7 +54,9 @@ export fn memmove(dest: ?&u8, src: ?&const u8, n: usize) ?&u8 {
54}54}
5555
56comptime {56comptime {
57 if (builtin.mode != builtin.Mode.ReleaseFast and builtin.os != builtin.Os.windows) {57 if (builtin.mode != builtin.Mode.ReleaseFast and
58 builtin.mode != builtin.Mode.ReleaseSmall and
59 builtin.os != builtin.Os.windows) {
58 @export("__stack_chk_fail", __stack_chk_fail, builtin.GlobalLinkage.Strong);60 @export("__stack_chk_fail", __stack_chk_fail, builtin.GlobalLinkage.Strong);
59 }61 }
60 if (builtin.os == builtin.Os.linux and builtin.arch == builtin.Arch.x86_64) {62 if (builtin.os == builtin.Os.linux and builtin.arch == builtin.Arch.x86_64) {
test/tests.zig+1
...@@ -583,6 +583,7 @@ pub const CompileErrorContext = struct {...@@ -583,6 +583,7 @@ pub const CompileErrorContext = struct {
583 Mode.Debug => {},583 Mode.Debug => {},
584 Mode.ReleaseSafe => zig_args.append("--release-safe") catch unreachable,584 Mode.ReleaseSafe => zig_args.append("--release-safe") catch unreachable,
585 Mode.ReleaseFast => zig_args.append("--release-fast") catch unreachable,585 Mode.ReleaseFast => zig_args.append("--release-fast") catch unreachable,
586 Mode.ReleaseSmall => zig_args.append("--release-small") catch unreachable,
586 }587 }
587588
588 warn("Test {}/{} {}...", self.test_index+1, self.context.test_index, self.name);589 warn("Test {}/{} {}...", self.test_index+1, self.context.test_index, self.name);