| author | |
| committer | |
| log | 253ecd5c11747f49575b8425a506c2fecfe26ee2 |
| tree | 4f8bb099e72c9f246278bf8cef827607955404e7 |
| parent | b9360640cefd1aa30dedf71a0c6b7bddc51a6ae3 |
7 files changed, 32 insertions(+), 15 deletions(-)
src/all_types.hpp+1| ... | ... | @@ -1457,6 +1457,7 @@ enum BuildMode { |
| 1457 | 1457 | BuildModeDebug, |
| 1458 | 1458 | BuildModeFastRelease, |
| 1459 | 1459 | BuildModeSafeRelease, |
| 1460 | BuildModeSmallRelease, | |
| 1460 | 1461 | }; |
| 1461 | 1462 | |
| 1462 | 1463 | enum EmitFileType { |
src/codegen.cpp+12-6| ... | ... | @@ -512,7 +512,9 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) { |
| 512 | 512 | } |
| 513 | 513 | |
| 514 | 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 | 518 | if (want_fn_safety) { |
| 517 | 519 | if (g->libc_link_lib != nullptr) { |
| 518 | 520 | addLLVMFnAttr(fn_table_entry->llvm_value, "sspstrong"); |
| ... | ... | @@ -817,7 +819,7 @@ static bool ir_want_fast_math(CodeGen *g, IrInstruction *instruction) { |
| 817 | 819 | } |
| 818 | 820 | |
| 819 | 821 | static 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 | 823 | return false; |
| 822 | 824 | |
| 823 | 825 | // TODO memoize |
| ... | ... | @@ -5747,10 +5749,12 @@ static void do_code_gen(CodeGen *g) { |
| 5747 | 5749 | os_path_join(g->cache_dir, o_basename, output_path); |
| 5748 | 5750 | ensure_cache_dir(g); |
| 5749 | 5751 | |
| 5752 | bool is_small = g->build_mode == BuildModeSmallRelease; | |
| 5753 | ||
| 5750 | 5754 | switch (g->emit_file_type) { |
| 5751 | 5755 | case EmitFileTypeBinary: |
| 5752 | 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 | 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 | 5764 | |
| 5761 | 5765 | case EmitFileTypeAssembly: |
| 5762 | 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 | 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 | 5773 | |
| 5770 | 5774 | case EmitFileTypeLLVMIr: |
| 5771 | 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 | 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 | 6164 | case BuildModeDebug: return "Mode.Debug"; |
| 6161 | 6165 | case BuildModeSafeRelease: return "Mode.ReleaseSafe"; |
| 6162 | 6166 | case BuildModeFastRelease: return "Mode.ReleaseFast"; |
| 6167 | case BuildModeSmallRelease: return "Mode.ReleaseSmall"; | |
| 6163 | 6168 | } |
| 6164 | 6169 | zig_unreachable(); |
| 6165 | 6170 | } |
| ... | ... | @@ -6300,6 +6305,7 @@ static void define_builtin_compile_vars(CodeGen *g) { |
| 6300 | 6305 | " Debug,\n" |
| 6301 | 6306 | " ReleaseSafe,\n" |
| 6302 | 6307 | " ReleaseFast,\n" |
| 6308 | " ReleaseSmall,\n" | |
| 6303 | 6309 | "};\n\n"); |
| 6304 | 6310 | } |
| 6305 | 6311 | { |
| ... | ... | @@ -6471,7 +6477,7 @@ static void init(CodeGen *g) { |
| 6471 | 6477 | } |
| 6472 | 6478 | } |
| 6473 | 6479 | |
| 6474 | g->have_err_ret_tracing = g->build_mode != BuildModeFastRelease; | |
| 6480 | g->have_err_ret_tracing = g->build_mode != BuildModeFastRelease && g->build_mode != BuildModeSmallRelease; | |
| 6475 | 6481 | |
| 6476 | 6482 | define_builtin_fns(g); |
| 6477 | 6483 | define_builtin_compile_vars(g); |
src/main.cpp+3| ... | ... | @@ -43,6 +43,7 @@ static int usage(const char *arg0) { |
| 43 | 43 | " --pkg-end pop current pkg\n" |
| 44 | 44 | " --release-fast build with optimizations on and safety off\n" |
| 45 | 45 | " --release-safe build with optimizations on and safety on\n" |
| 46 | " --release-small build with size optimizations on and safety off\n" | |
| 46 | 47 | " --static output will be statically linked\n" |
| 47 | 48 | " --strip exclude debug symbols\n" |
| 48 | 49 | " --target-arch [name] specify target architecture\n" |
| ... | ... | @@ -482,6 +483,8 @@ int main(int argc, char **argv) { |
| 482 | 483 | build_mode = BuildModeFastRelease; |
| 483 | 484 | } else if (strcmp(arg, "--release-safe") == 0) { |
| 484 | 485 | build_mode = BuildModeSafeRelease; |
| 486 | } else if (strcmp(arg, "--release-small") == 0) { | |
| 487 | build_mode = BuildModeSmallRelease; | |
| 485 | 488 | } else if (strcmp(arg, "--strip") == 0) { |
| 486 | 489 | strip = true; |
| 487 | 490 | } else if (strcmp(arg, "--static") == 0) { |
src/zig_llvm.cpp+2-2| ... | ... | @@ -81,7 +81,7 @@ static const bool assertions_on = false; |
| 81 | 81 | #endif |
| 82 | 82 | |
| 83 | 83 | bool 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 | 86 | std::error_code EC; |
| 87 | 87 | raw_fd_ostream dest(filename, EC, sys::fs::F_None); |
| ... | ... | @@ -100,7 +100,7 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM |
| 100 | 100 | return true; |
| 101 | 101 | } |
| 102 | 102 | PMBuilder->OptLevel = target_machine->getOptLevel(); |
| 103 | PMBuilder->SizeLevel = 0; | |
| 103 | PMBuilder->SizeLevel = is_small ? 1 : 0; | |
| 104 | 104 | |
| 105 | 105 | PMBuilder->DisableTailCalls = is_debug; |
| 106 | 106 | PMBuilder->DisableUnitAtATime = is_debug; |
src/zig_llvm.h+1-1| ... | ... | @@ -52,7 +52,7 @@ enum ZigLLVM_EmitOutputType { |
| 52 | 52 | }; |
| 53 | 53 | |
| 54 | 54 | ZIG_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); | |
| 56 | 56 | |
| 57 | 57 | ZIG_EXTERN_C LLVMTypeRef ZigLLVMTokenTypeInContext(LLVMContextRef context_ref); |
| 58 | 58 |
std/build.zig+10-5| ... | ... | @@ -426,15 +426,18 @@ pub const Builder = struct { |
| 426 | 426 | |
| 427 | 427 | const release_safe = self.option(bool, "release-safe", "optimizations on and safety on") ?? false; |
| 428 | 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; | |
| 429 | 430 | |
| 430 | const mode = if (release_safe and !release_fast) | |
| 431 | const mode = if (release_safe and !release_fast and !release_small) | |
| 431 | 432 | builtin.Mode.ReleaseSafe |
| 432 | else if (release_fast and !release_safe) | |
| 433 | else if (release_fast and !release_safe and !release_small) | |
| 433 | 434 | 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 | 438 | builtin.Mode.Debug |
| 436 | 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 | 441 | self.markInvalidUserInput(); |
| 439 | 442 | break :x builtin.Mode.Debug; |
| 440 | 443 | }; |
| ... | ... | @@ -1229,6 +1232,7 @@ pub const LibExeObjStep = struct { |
| 1229 | 1232 | builtin.Mode.Debug => {}, |
| 1230 | 1233 | builtin.Mode.ReleaseSafe => zig_args.append("--release-safe") catch unreachable, |
| 1231 | 1234 | builtin.Mode.ReleaseFast => zig_args.append("--release-fast") catch unreachable, |
| 1235 | builtin.Mode.ReleaseSmall => zig_args.append("--release-small") catch unreachable, | |
| 1232 | 1236 | } |
| 1233 | 1237 | |
| 1234 | 1238 | zig_args.append("--cache-dir") catch unreachable; |
| ... | ... | @@ -1369,7 +1373,7 @@ pub const LibExeObjStep = struct { |
| 1369 | 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 | 1377 | args.append("-O2") catch unreachable; |
| 1374 | 1378 | args.append("-fno-stack-protector") catch unreachable; |
| 1375 | 1379 | }, |
| ... | ... | @@ -1706,6 +1710,7 @@ pub const TestStep = struct { |
| 1706 | 1710 | builtin.Mode.Debug => {}, |
| 1707 | 1711 | builtin.Mode.ReleaseSafe => try zig_args.append("--release-safe"), |
| 1708 | 1712 | builtin.Mode.ReleaseFast => try zig_args.append("--release-fast"), |
| 1713 | builtin.Mode.ReleaseSmall => try zig_args.append("--release-small"), | |
| 1709 | 1714 | } |
| 1710 | 1715 | |
| 1711 | 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 | 54 | } |
| 55 | 55 | |
| 56 | 56 | comptime { |
| 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 | 60 | @export("__stack_chk_fail", __stack_chk_fail, builtin.GlobalLinkage.Strong); |
| 59 | 61 | } |
| 60 | 62 | if (builtin.os == builtin.Os.linux and builtin.arch == builtin.Arch.x86_64) { |