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
749749 try build_args.append("--release-fast");
750750 try out.print(" --release-fast");
751751 },
752 builtin.Mode.ReleaseSmall => {
753 try build_args.append("--release-small");
754 try out.print(" --release-small");
755 },
752756 }
753757 for (code.link_objects) |link_object| {
754758 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
810814 try test_args.append("--release-fast");
811815 try out.print(" --release-fast");
812816 },
817 builtin.Mode.ReleaseSmall => {
818 try test_args.append("--release-small");
819 try out.print(" --release-small");
820 },
813821 }
814822 if (code.target_windows) {
815823 try test_args.appendSlice([][]const u8{
......@@ -840,6 +848,10 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var
840848 try test_args.append("--release-fast");
841849 try out.print(" --release-fast");
842850 },
851 builtin.Mode.ReleaseSmall => {
852 try test_args.append("--release-small");
853 try out.print(" --release-small");
854 },
843855 }
844856 const result = try os.ChildProcess.exec(allocator, test_args.toSliceConst(), null, null, max_doc_file_size);
845857 switch (result.term) {
......@@ -874,6 +886,7 @@ fn genHtml(allocator: &mem.Allocator, tokenizer: &Tokenizer, toc: &Toc, out: var
874886 builtin.Mode.Debug => {},
875887 builtin.Mode.ReleaseSafe => try test_args.append("--release-safe"),
876888 builtin.Mode.ReleaseFast => try test_args.append("--release-fast"),
889 builtin.Mode.ReleaseSmall => try test_args.append("--release-small"),
877890 }
878891
879892 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
927940 try out.print(" --release-fast");
928941 }
929942 },
943 builtin.Mode.ReleaseSmall => {
944 try build_args.append("--release-small");
945 if (!code.is_inline) {
946 try out.print(" --release-small");
947 }
948 },
930949 }
931950
932951 if (maybe_error_match) |error_match| {
src/all_types.hpp+1
......@@ -1457,6 +1457,7 @@ enum BuildMode {
14571457 BuildModeDebug,
14581458 BuildModeFastRelease,
14591459 BuildModeSafeRelease,
1460 BuildModeSmallRelease,
14601461};
14611462
14621463enum EmitFileType {
src/codegen.cpp+12-6
......@@ -512,7 +512,9 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
512512 }
513513
514514 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;
516518 if (want_fn_safety) {
517519 if (g->libc_link_lib != nullptr) {
518520 addLLVMFnAttr(fn_table_entry->llvm_value, "sspstrong");
......@@ -817,7 +819,7 @@ static bool ir_want_fast_math(CodeGen *g, IrInstruction *instruction) {
817819}
818820
819821static 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)
821823 return false;
822824
823825 // TODO memoize
......@@ -5747,10 +5749,12 @@ static void do_code_gen(CodeGen *g) {
57475749 os_path_join(g->cache_dir, o_basename, output_path);
57485750 ensure_cache_dir(g);
57495751
5752 bool is_small = g->build_mode == BuildModeSmallRelease;
5753
57505754 switch (g->emit_file_type) {
57515755 case EmitFileTypeBinary:
57525756 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))
57545758 {
57555759 zig_panic("unable to write object file %s: %s", buf_ptr(output_path), err_msg);
57565760 }
......@@ -5760,7 +5764,7 @@ static void do_code_gen(CodeGen *g) {
57605764
57615765 case EmitFileTypeAssembly:
57625766 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))
57645768 {
57655769 zig_panic("unable to write assembly file %s: %s", buf_ptr(output_path), err_msg);
57665770 }
......@@ -5769,7 +5773,7 @@ static void do_code_gen(CodeGen *g) {
57695773
57705774 case EmitFileTypeLLVMIr:
57715775 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))
57735777 {
57745778 zig_panic("unable to write llvm-ir file %s: %s", buf_ptr(output_path), err_msg);
57755779 }
......@@ -6160,6 +6164,7 @@ static const char *build_mode_to_str(BuildMode build_mode) {
61606164 case BuildModeDebug: return "Mode.Debug";
61616165 case BuildModeSafeRelease: return "Mode.ReleaseSafe";
61626166 case BuildModeFastRelease: return "Mode.ReleaseFast";
6167 case BuildModeSmallRelease: return "Mode.ReleaseSmall";
61636168 }
61646169 zig_unreachable();
61656170}
......@@ -6300,6 +6305,7 @@ static void define_builtin_compile_vars(CodeGen *g) {
63006305 " Debug,\n"
63016306 " ReleaseSafe,\n"
63026307 " ReleaseFast,\n"
6308 " ReleaseSmall,\n"
63036309 "};\n\n");
63046310 }
63056311 {
......@@ -6471,7 +6477,7 @@ static void init(CodeGen *g) {
64716477 }
64726478 }
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
64766482 define_builtin_fns(g);
64776483 define_builtin_compile_vars(g);
src/main.cpp+3
......@@ -43,6 +43,7 @@ static int usage(const char *arg0) {
4343 " --pkg-end pop current pkg\n"
4444 " --release-fast build with optimizations on and safety off\n"
4545 " --release-safe build with optimizations on and safety on\n"
46 " --release-small build with size optimizations on and safety off\n"
4647 " --static output will be statically linked\n"
4748 " --strip exclude debug symbols\n"
4849 " --target-arch [name] specify target architecture\n"
......@@ -482,6 +483,8 @@ int main(int argc, char **argv) {
482483 build_mode = BuildModeFastRelease;
483484 } else if (strcmp(arg, "--release-safe") == 0) {
484485 build_mode = BuildModeSafeRelease;
486 } else if (strcmp(arg, "--release-small") == 0) {
487 build_mode = BuildModeSmallRelease;
485488 } else if (strcmp(arg, "--strip") == 0) {
486489 strip = true;
487490 } else if (strcmp(arg, "--static") == 0) {
src/zig_llvm.cpp+2-2
......@@ -81,7 +81,7 @@ static const bool assertions_on = false;
8181#endif
8282
8383bool 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)
8585{
8686 std::error_code EC;
8787 raw_fd_ostream dest(filename, EC, sys::fs::F_None);
......@@ -100,7 +100,7 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM
100100 return true;
101101 }
102102 PMBuilder->OptLevel = target_machine->getOptLevel();
103 PMBuilder->SizeLevel = 0;
103 PMBuilder->SizeLevel = is_small ? 2 : 0;
104104
105105 PMBuilder->DisableTailCalls = is_debug;
106106 PMBuilder->DisableUnitAtATime = is_debug;
src/zig_llvm.h+1-1
......@@ -52,7 +52,7 @@ enum ZigLLVM_EmitOutputType {
5252};
5353
5454ZIG_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
5757ZIG_EXTERN_C LLVMTypeRef ZigLLVMTokenTypeInContext(LLVMContextRef context_ref);
5858
std/build.zig+10-5
......@@ -426,15 +426,18 @@ pub const Builder = struct {
426426
427427 const release_safe = self.option(bool, "release-safe", "optimizations on and safety on") ?? false;
428428 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)
431432 builtin.Mode.ReleaseSafe
432 else if (release_fast and !release_safe)
433 else if (release_fast and !release_safe and !release_small)
433434 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)
435438 builtin.Mode.Debug
436439 else x: {
437 warn("Both -Drelease-safe and -Drelease-fast specified");
440 warn("Multiple release modes (of -Drelease-safe, -Drelease-fast and -Drelease-small)");
438441 self.markInvalidUserInput();
439442 break :x builtin.Mode.Debug;
440443 };
......@@ -1229,6 +1232,7 @@ pub const LibExeObjStep = struct {
12291232 builtin.Mode.Debug => {},
12301233 builtin.Mode.ReleaseSafe => zig_args.append("--release-safe") catch unreachable,
12311234 builtin.Mode.ReleaseFast => zig_args.append("--release-fast") catch unreachable,
1235 builtin.Mode.ReleaseSmall => zig_args.append("--release-small") catch unreachable,
12321236 }
12331237
12341238 zig_args.append("--cache-dir") catch unreachable;
......@@ -1369,7 +1373,7 @@ pub const LibExeObjStep = struct {
13691373 args.append("ssp-buffer-size=4") catch unreachable;
13701374 }
13711375 },
1372 builtin.Mode.ReleaseFast => {
1376 builtin.Mode.ReleaseFast, builtin.Mode.ReleaseSmall => {
13731377 args.append("-O2") catch unreachable;
13741378 args.append("-fno-stack-protector") catch unreachable;
13751379 },
......@@ -1706,6 +1710,7 @@ pub const TestStep = struct {
17061710 builtin.Mode.Debug => {},
17071711 builtin.Mode.ReleaseSafe => try zig_args.append("--release-safe"),
17081712 builtin.Mode.ReleaseFast => try zig_args.append("--release-fast"),
1713 builtin.Mode.ReleaseSmall => try zig_args.append("--release-small"),
17091714 }
17101715
17111716 switch (self.target) {
std/special/builtin.zig+3-1
......@@ -54,7 +54,9 @@ export fn memmove(dest: ?&u8, src: ?&const u8, n: usize) ?&u8 {
5454}
5555
5656comptime {
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) {
5860 @export("__stack_chk_fail", __stack_chk_fail, builtin.GlobalLinkage.Strong);
5961 }
6062 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 {
583583 Mode.Debug => {},
584584 Mode.ReleaseSafe => zig_args.append("--release-safe") catch unreachable,
585585 Mode.ReleaseFast => zig_args.append("--release-fast") catch unreachable,
586 Mode.ReleaseSmall => zig_args.append("--release-small") catch unreachable,
586587 }
587588
588589 warn("Test {}/{} {}...", self.test_index+1, self.context.test_index, self.name);