authorgravatar for alex_naskos@hotmail.comAlexandros Naskos <alex_naskos@hotmail.com> 2018-04-16 03:26:10+03:00
committergravatar for alex_naskos@hotmail.comAlexandros Naskos <alex_naskos@hotmail.com> 2018-04-16 03:26:10+03:00
log253ecd5c11747f49575b8425a506c2fecfe26ee2
tree4f8bb099e72c9f246278bf8cef827607955404e7
parentb9360640cefd1aa30dedf71a0c6b7bddc51a6ae3

Added ReleaseSmall mode


7 files changed, 32 insertions(+), 15 deletions(-)

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 ? 1 : 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) {