authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-01-11 22:01:16-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-01-11 22:07:21-07:00
log5b2a79848ced20db80f3f4ce46b3ef7f4a051d53
treedfdd8caf259e2d03ba89d4c0211d9cafb45c6064
parent8932c2d7456fc86b9e92c7976cedcce798caef1a

stage2: cleanups regarding red zone CLI flags

* CLI: change to -mred-zone and -mno-red-zone to match gcc/clang. * build.zig: remove the double negative and make it an optional bool. This follows precedent from other flags, allowing the compiler CLI to be the decider of what is default instead of duplicating the default value into the build system code. * Compilation: make it an optional `want_red_zone` instead of a `no_red_zone` bool. The default is decided by a call to `target_util.hasRedZone`. * When creating a Clang command line, put -mred-zone on the command line if we are forcing it to be enabled. * Update update_clang_options.zig with respect to the recent {s}/{} format changes. * `zig cc` integration with red zone preference.

16 files changed, 114 insertions(+), 62 deletions(-)

lib/std/build.zig+8-3
...@@ -1262,7 +1262,6 @@ pub const LibExeObjStep = struct {...@@ -1262,7 +1262,6 @@ pub const LibExeObjStep = struct {
1262 disable_stack_probing: bool,1262 disable_stack_probing: bool,
1263 disable_sanitize_c: bool,1263 disable_sanitize_c: bool,
1264 sanitize_thread: bool,1264 sanitize_thread: bool,
1265 no_red_zone: bool = false,
1266 rdynamic: bool,1265 rdynamic: bool,
1267 c_std: Builder.CStd,1266 c_std: Builder.CStd,
1268 override_lib_dir: ?[]const u8,1267 override_lib_dir: ?[]const u8,
...@@ -1333,6 +1332,8 @@ pub const LibExeObjStep = struct {...@@ -1333,6 +1332,8 @@ pub const LibExeObjStep = struct {
1333 /// Position Independent Executable1332 /// Position Independent Executable
1334 pie: ?bool = null,1333 pie: ?bool = null,
13351334
1335 red_zone: ?bool = null,
1336
1336 subsystem: ?builtin.SubSystem = null,1337 subsystem: ?builtin.SubSystem = null,
13371338
1338 /// Overrides the default stack size1339 /// Overrides the default stack size
...@@ -2261,8 +2262,12 @@ pub const LibExeObjStep = struct {...@@ -2261,8 +2262,12 @@ pub const LibExeObjStep = struct {
2261 if (self.disable_stack_probing) {2262 if (self.disable_stack_probing) {
2262 try zig_args.append("-fno-stack-check");2263 try zig_args.append("-fno-stack-check");
2263 }2264 }
2264 if (self.no_red_zone) {2265 if (self.red_zone) |red_zone| {
2265 try zig_args.append("-fno-red-zone");2266 if (red_zone) {
2267 try zig_args.append("-mred-zone");
2268 } else {
2269 try zig_args.append("-mno-red-zone");
2270 }
2266 }2271 }
2267 if (self.disable_sanitize_c) {2272 if (self.disable_sanitize_c) {
2268 try zig_args.append("-fno-sanitize-c");2273 try zig_args.append("-fno-sanitize-c");
src/Compilation.zig+12-9
...@@ -392,7 +392,7 @@ pub const InitOptions = struct {...@@ -392,7 +392,7 @@ pub const InitOptions = struct {
392 want_pie: ?bool = null,392 want_pie: ?bool = null,
393 want_sanitize_c: ?bool = null,393 want_sanitize_c: ?bool = null,
394 want_stack_check: ?bool = null,394 want_stack_check: ?bool = null,
395 no_red_zone: bool = false,395 want_red_zone: ?bool = null,
396 want_valgrind: ?bool = null,396 want_valgrind: ?bool = null,
397 want_tsan: ?bool = null,397 want_tsan: ?bool = null,
398 want_compiler_rt: ?bool = null,398 want_compiler_rt: ?bool = null,
...@@ -744,6 +744,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {...@@ -744,6 +744,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
744 } else null;744 } else null;
745745
746 const strip = options.strip or !target_util.hasDebugInfo(options.target);746 const strip = options.strip or !target_util.hasDebugInfo(options.target);
747 const red_zone = options.want_red_zone orelse target_util.hasRedZone(options.target);
747748
748 // We put everything into the cache hash that *cannot be modified during an incremental update*.749 // We put everything into the cache hash that *cannot be modified during an incremental update*.
749 // For example, one cannot change the target between updates, but one can change source files,750 // For example, one cannot change the target between updates, but one can change source files,
...@@ -774,7 +775,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {...@@ -774,7 +775,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
774 cache.hash.add(pie);775 cache.hash.add(pie);
775 cache.hash.add(tsan);776 cache.hash.add(tsan);
776 cache.hash.add(stack_check);777 cache.hash.add(stack_check);
777 cache.hash.add(options.no_red_zone);778 cache.hash.add(red_zone);
778 cache.hash.add(link_mode);779 cache.hash.add(link_mode);
779 cache.hash.add(options.function_sections);780 cache.hash.add(options.function_sections);
780 cache.hash.add(strip);781 cache.hash.add(strip);
...@@ -984,7 +985,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {...@@ -984,7 +985,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
984 .valgrind = valgrind,985 .valgrind = valgrind,
985 .tsan = tsan,986 .tsan = tsan,
986 .stack_check = stack_check,987 .stack_check = stack_check,
987 .no_red_zone = options.no_red_zone,988 .red_zone = red_zone,
988 .single_threaded = single_threaded,989 .single_threaded = single_threaded,
989 .verbose_link = options.verbose_link,990 .verbose_link = options.verbose_link,
990 .machine_code_model = options.machine_code_model,991 .machine_code_model = options.machine_code_model,
...@@ -2258,11 +2259,13 @@ pub fn addCCArgs(...@@ -2258,11 +2259,13 @@ pub fn addCCArgs(
2258 } else if (!comp.sanitize_c and comp.bin_file.options.tsan) {2259 } else if (!comp.sanitize_c and comp.bin_file.options.tsan) {
2259 try argv.append("-fsanitize=thread");2260 try argv.append("-fsanitize=thread");
2260 }2261 }
2261 2262
2262 if (comp.bin_file.options.no_red_zone) {2263 if (comp.bin_file.options.red_zone) {
2264 try argv.append("-mred-zone");
2265 } else if (target_util.hasRedZone(target)) {
2263 try argv.append("-mno-red-zone");2266 try argv.append("-mno-red-zone");
2264 }2267 }
2265 2268
2266 switch (comp.bin_file.options.optimize_mode) {2269 switch (comp.bin_file.options.optimize_mode) {
2267 .Debug => {2270 .Debug => {
2268 // windows c runtime requires -D_DEBUG if using debug libraries2271 // windows c runtime requires -D_DEBUG if using debug libraries
...@@ -2967,7 +2970,7 @@ fn buildOutputFromZig(...@@ -2967,7 +2970,7 @@ fn buildOutputFromZig(
2967 .function_sections = true,2970 .function_sections = true,
2968 .want_sanitize_c = false,2971 .want_sanitize_c = false,
2969 .want_stack_check = false,2972 .want_stack_check = false,
2970 .no_red_zone = comp.bin_file.options.no_red_zone,2973 .want_red_zone = comp.bin_file.options.red_zone,
2971 .want_valgrind = false,2974 .want_valgrind = false,
2972 .want_tsan = false,2975 .want_tsan = false,
2973 .want_pic = comp.bin_file.options.pic,2976 .want_pic = comp.bin_file.options.pic,
...@@ -3206,7 +3209,7 @@ fn updateStage1Module(comp: *Compilation, main_progress_node: *std.Progress.Node...@@ -3206,7 +3209,7 @@ fn updateStage1Module(comp: *Compilation, main_progress_node: *std.Progress.Node
3206 .tsan_enabled = comp.bin_file.options.tsan,3209 .tsan_enabled = comp.bin_file.options.tsan,
3207 .function_sections = comp.bin_file.options.function_sections,3210 .function_sections = comp.bin_file.options.function_sections,
3208 .enable_stack_probing = comp.bin_file.options.stack_check,3211 .enable_stack_probing = comp.bin_file.options.stack_check,
3209 .no_red_zone = comp.bin_file.options.no_red_zone,3212 .red_zone = comp.bin_file.options.red_zone,
3210 .enable_time_report = comp.time_report,3213 .enable_time_report = comp.time_report,
3211 .enable_stack_report = comp.stack_report,3214 .enable_stack_report = comp.stack_report,
3212 .test_is_evented = comp.test_evented_io,3215 .test_is_evented = comp.test_evented_io,
...@@ -3351,7 +3354,7 @@ pub fn build_crt_file(...@@ -3351,7 +3354,7 @@ pub fn build_crt_file(
3351 .optimize_mode = comp.compilerRtOptMode(),3354 .optimize_mode = comp.compilerRtOptMode(),
3352 .want_sanitize_c = false,3355 .want_sanitize_c = false,
3353 .want_stack_check = false,3356 .want_stack_check = false,
3354 .no_red_zone = comp.bin_file.options.no_red_zone,3357 .want_red_zone = comp.bin_file.options.red_zone,
3355 .want_valgrind = false,3358 .want_valgrind = false,
3356 .want_tsan = false,3359 .want_tsan = false,
3357 .want_pic = comp.bin_file.options.pic,3360 .want_pic = comp.bin_file.options.pic,
src/clang_options_data.zig+16-2
...@@ -3803,7 +3803,14 @@ flagpd1("mno-qpx"),...@@ -3803,7 +3803,14 @@ flagpd1("mno-qpx"),
3803flagpd1("mno-rdpid"),3803flagpd1("mno-rdpid"),
3804flagpd1("mno-rdrnd"),3804flagpd1("mno-rdrnd"),
3805flagpd1("mno-rdseed"),3805flagpd1("mno-rdseed"),
3806flagpd1("mno-red-zone"),3806.{
3807 .name = "mno-red-zone",
3808 .syntax = .flag,
3809 .zig_equivalent = .no_red_zone,
3810 .pd1 = true,
3811 .pd2 = false,
3812 .psl = false,
3813},
3807flagpd1("mno-reference-types"),3814flagpd1("mno-reference-types"),
3808flagpd1("mno-relax"),3815flagpd1("mno-relax"),
3809flagpd1("mno-relax-all"),3816flagpd1("mno-relax-all"),
...@@ -3901,7 +3908,14 @@ flagpd1("mrdseed"),...@@ -3901,7 +3908,14 @@ flagpd1("mrdseed"),
3901flagpd1("mreassociate"),3908flagpd1("mreassociate"),
3902flagpd1("mrecip"),3909flagpd1("mrecip"),
3903flagpd1("mrecord-mcount"),3910flagpd1("mrecord-mcount"),
3904flagpd1("mred-zone"),3911.{
3912 .name = "mred-zone",
3913 .syntax = .flag,
3914 .zig_equivalent = .red_zone,
3915 .pd1 = true,
3916 .pd2 = false,
3917 .psl = false,
3918},
3905flagpd1("mreference-types"),3919flagpd1("mreference-types"),
3906sepd1("mregparm"),3920sepd1("mregparm"),
3907flagpd1("mrelax"),3921flagpd1("mrelax"),
src/glibc.zig+1-1
...@@ -934,7 +934,7 @@ fn buildSharedLib(...@@ -934,7 +934,7 @@ fn buildSharedLib(
934 .optimize_mode = comp.compilerRtOptMode(),934 .optimize_mode = comp.compilerRtOptMode(),
935 .want_sanitize_c = false,935 .want_sanitize_c = false,
936 .want_stack_check = false,936 .want_stack_check = false,
937 .no_red_zone = comp.bin_file.options.no_red_zone,937 .want_red_zone = comp.bin_file.options.red_zone,
938 .want_valgrind = false,938 .want_valgrind = false,
939 .want_tsan = false,939 .want_tsan = false,
940 .emit_h = null,940 .emit_h = null,
src/libcxx.zig+2-2
...@@ -167,7 +167,7 @@ pub fn buildLibCXX(comp: *Compilation) !void {...@@ -167,7 +167,7 @@ pub fn buildLibCXX(comp: *Compilation) !void {
167 .link_mode = link_mode,167 .link_mode = link_mode,
168 .want_sanitize_c = false,168 .want_sanitize_c = false,
169 .want_stack_check = false,169 .want_stack_check = false,
170 .no_red_zone = comp.bin_file.options.no_red_zone,170 .want_red_zone = comp.bin_file.options.red_zone,
171 .want_valgrind = false,171 .want_valgrind = false,
172 .want_tsan = comp.bin_file.options.tsan,172 .want_tsan = comp.bin_file.options.tsan,
173 .want_pic = comp.bin_file.options.pic,173 .want_pic = comp.bin_file.options.pic,
...@@ -285,7 +285,7 @@ pub fn buildLibCXXABI(comp: *Compilation) !void {...@@ -285,7 +285,7 @@ pub fn buildLibCXXABI(comp: *Compilation) !void {
285 .link_mode = link_mode,285 .link_mode = link_mode,
286 .want_sanitize_c = false,286 .want_sanitize_c = false,
287 .want_stack_check = false,287 .want_stack_check = false,
288 .no_red_zone = comp.bin_file.options.no_red_zone,288 .want_red_zone = comp.bin_file.options.red_zone,
289 .want_valgrind = false,289 .want_valgrind = false,
290 .want_tsan = comp.bin_file.options.tsan,290 .want_tsan = comp.bin_file.options.tsan,
291 .want_pic = comp.bin_file.options.pic,291 .want_pic = comp.bin_file.options.pic,
src/libunwind.zig+1-1
...@@ -108,7 +108,7 @@ pub fn buildStaticLib(comp: *Compilation) !void {...@@ -108,7 +108,7 @@ pub fn buildStaticLib(comp: *Compilation) !void {
108 .link_mode = link_mode,108 .link_mode = link_mode,
109 .want_sanitize_c = false,109 .want_sanitize_c = false,
110 .want_stack_check = false,110 .want_stack_check = false,
111 .no_red_zone = comp.bin_file.options.no_red_zone,111 .want_red_zone = comp.bin_file.options.red_zone,
112 .want_valgrind = false,112 .want_valgrind = false,
113 .want_tsan = false,113 .want_tsan = false,
114 .want_pic = comp.bin_file.options.pic,114 .want_pic = comp.bin_file.options.pic,
src/link.zig+1-1
...@@ -77,7 +77,7 @@ pub const Options = struct {...@@ -77,7 +77,7 @@ pub const Options = struct {
77 valgrind: bool,77 valgrind: bool,
78 tsan: bool,78 tsan: bool,
79 stack_check: bool,79 stack_check: bool,
80 no_red_zone: bool,80 red_zone: bool,
81 single_threaded: bool,81 single_threaded: bool,
82 verbose_link: bool,82 verbose_link: bool,
83 dll_export_fns: bool,83 dll_export_fns: bool,
src/main.zig+12-8
...@@ -267,6 +267,8 @@ const usage_build_generic =...@@ -267,6 +267,8 @@ const usage_build_generic =
267 \\ -mcmodel=[default|tiny| Limit range of code and data virtual addresses267 \\ -mcmodel=[default|tiny| Limit range of code and data virtual addresses
268 \\ small|kernel|268 \\ small|kernel|
269 \\ medium|large]269 \\ medium|large]
270 \\ -mred-zone Force-enable the "red-zone"
271 \\ -mno-red-zone Force-disable the "red-zone"
270 \\ --name [name] Override root name (not a file path)272 \\ --name [name] Override root name (not a file path)
271 \\ -O [mode] Choose what to optimize for273 \\ -O [mode] Choose what to optimize for
272 \\ Debug (default) Optimizations off, safety on274 \\ Debug (default) Optimizations off, safety on
...@@ -282,8 +284,6 @@ const usage_build_generic =...@@ -282,8 +284,6 @@ const usage_build_generic =
282 \\ -fno-PIE Force-disable Position Independent Executable284 \\ -fno-PIE Force-disable Position Independent Executable
283 \\ -fstack-check Enable stack probing in unsafe builds285 \\ -fstack-check Enable stack probing in unsafe builds
284 \\ -fno-stack-check Disable stack probing in safe builds286 \\ -fno-stack-check Disable stack probing in safe builds
285 \\ -fred-zone Enable the "red-zone"
286 \\ -fno-red-zone Disable the "red-zone"
287 \\ -fsanitize-c Enable C undefined behavior detection in unsafe builds287 \\ -fsanitize-c Enable C undefined behavior detection in unsafe builds
288 \\ -fno-sanitize-c Disable C undefined behavior detection in safe builds288 \\ -fno-sanitize-c Disable C undefined behavior detection in safe builds
289 \\ -fvalgrind Include valgrind client requests in release builds289 \\ -fvalgrind Include valgrind client requests in release builds
...@@ -507,7 +507,7 @@ fn buildOutputType(...@@ -507,7 +507,7 @@ fn buildOutputType(
507 var want_pie: ?bool = null;507 var want_pie: ?bool = null;
508 var want_sanitize_c: ?bool = null;508 var want_sanitize_c: ?bool = null;
509 var want_stack_check: ?bool = null;509 var want_stack_check: ?bool = null;
510 var no_red_zone: bool = false;510 var want_red_zone: ?bool = null;
511 var want_valgrind: ?bool = null;511 var want_valgrind: ?bool = null;
512 var want_tsan: ?bool = null;512 var want_tsan: ?bool = null;
513 var want_compiler_rt: ?bool = null;513 var want_compiler_rt: ?bool = null;
...@@ -846,10 +846,10 @@ fn buildOutputType(...@@ -846,10 +846,10 @@ fn buildOutputType(
846 want_stack_check = true;846 want_stack_check = true;
847 } else if (mem.eql(u8, arg, "-fno-stack-check")) {847 } else if (mem.eql(u8, arg, "-fno-stack-check")) {
848 want_stack_check = false;848 want_stack_check = false;
849 } else if (mem.eql(u8, arg, "-fred-zone")) {849 } else if (mem.eql(u8, arg, "-mred-zone")) {
850 no_red_zone = false;850 want_red_zone = true;
851 } else if (mem.eql(u8, arg, "-fno-red-zone")) {851 } else if (mem.eql(u8, arg, "-mno-red-zone")) {
852 no_red_zone = true;852 want_red_zone = false;
853 } else if (mem.eql(u8, arg, "-fsanitize-c")) {853 } else if (mem.eql(u8, arg, "-fsanitize-c")) {
854 want_sanitize_c = true;854 want_sanitize_c = true;
855 } else if (mem.eql(u8, arg, "-fno-sanitize-c")) {855 } else if (mem.eql(u8, arg, "-fno-sanitize-c")) {
...@@ -1075,6 +1075,8 @@ fn buildOutputType(...@@ -1075,6 +1075,8 @@ fn buildOutputType(
1075 .no_pic => want_pic = false,1075 .no_pic => want_pic = false,
1076 .pie => want_pie = true,1076 .pie => want_pie = true,
1077 .no_pie => want_pie = false,1077 .no_pie => want_pie = false,
1078 .red_zone => want_red_zone = true,
1079 .no_red_zone => want_red_zone = false,
1078 .nostdlib => ensure_libc_on_non_freestanding = false,1080 .nostdlib => ensure_libc_on_non_freestanding = false,
1079 .nostdlib_cpp => ensure_libcpp_on_non_freestanding = false,1081 .nostdlib_cpp => ensure_libcpp_on_non_freestanding = false,
1080 .shared => {1082 .shared => {
...@@ -1767,7 +1769,7 @@ fn buildOutputType(...@@ -1767,7 +1769,7 @@ fn buildOutputType(
1767 .want_pie = want_pie,1769 .want_pie = want_pie,
1768 .want_sanitize_c = want_sanitize_c,1770 .want_sanitize_c = want_sanitize_c,
1769 .want_stack_check = want_stack_check,1771 .want_stack_check = want_stack_check,
1770 .no_red_zone = no_red_zone,1772 .want_red_zone = want_red_zone,
1771 .want_valgrind = want_valgrind,1773 .want_valgrind = want_valgrind,
1772 .want_tsan = want_tsan,1774 .want_tsan = want_tsan,
1773 .want_compiler_rt = want_compiler_rt,1775 .want_compiler_rt = want_compiler_rt,
...@@ -2977,6 +2979,8 @@ pub const ClangArgIterator = struct {...@@ -2977,6 +2979,8 @@ pub const ClangArgIterator = struct {
2977 framework_dir,2979 framework_dir,
2978 framework,2980 framework,
2979 nostdlibinc,2981 nostdlibinc,
2982 red_zone,
2983 no_red_zone,
2980 };2984 };
29812985
2982 const Args = struct {2986 const Args = struct {
src/musl.zig+1-1
...@@ -206,7 +206,7 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void {...@@ -206,7 +206,7 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void {
206 .optimize_mode = comp.compilerRtOptMode(),206 .optimize_mode = comp.compilerRtOptMode(),
207 .want_sanitize_c = false,207 .want_sanitize_c = false,
208 .want_stack_check = false,208 .want_stack_check = false,
209 .no_red_zone = comp.bin_file.options.no_red_zone,209 .want_red_zone = comp.bin_file.options.red_zone,
210 .want_valgrind = false,210 .want_valgrind = false,
211 .want_tsan = false,211 .want_tsan = false,
212 .emit_h = null,212 .emit_h = null,
src/stage1.zig+1-1
...@@ -119,7 +119,7 @@ pub const Module = extern struct {...@@ -119,7 +119,7 @@ pub const Module = extern struct {
119 tsan_enabled: bool,119 tsan_enabled: bool,
120 function_sections: bool,120 function_sections: bool,
121 enable_stack_probing: bool,121 enable_stack_probing: bool,
122 no_red_zone: bool,122 red_zone: bool,
123 enable_time_report: bool,123 enable_time_report: bool,
124 enable_stack_report: bool,124 enable_stack_report: bool,
125 test_is_evented: bool,125 test_is_evented: bool,
src/stage1/all_types.hpp+1-1
...@@ -2195,7 +2195,7 @@ struct CodeGen {...@@ -2195,7 +2195,7 @@ struct CodeGen {
2195 bool link_mode_dynamic;2195 bool link_mode_dynamic;
2196 bool dll_export_fns;2196 bool dll_export_fns;
2197 bool have_stack_probing;2197 bool have_stack_probing;
2198 bool no_red_zone;2198 bool red_zone;
2199 bool function_sections;2199 bool function_sections;
2200 bool test_is_evented;2200 bool test_is_evented;
2201 bool valgrind_enabled;2201 bool valgrind_enabled;
src/stage1/codegen.cpp+2-2
...@@ -513,8 +513,8 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {...@@ -513,8 +513,8 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {
513 } else {513 } else {
514 maybe_import_dll(g, llvm_fn, linkage);514 maybe_import_dll(g, llvm_fn, linkage);
515 }515 }
516 516
517 if (g->no_red_zone) {517 if (!g->red_zone) {
518 addLLVMFnAttr(llvm_fn, "noredzone");518 addLLVMFnAttr(llvm_fn, "noredzone");
519 }519 }
520520
src/stage1/stage1.cpp+1-1
...@@ -91,7 +91,7 @@ void zig_stage1_build_object(struct ZigStage1 *stage1) {...@@ -91,7 +91,7 @@ void zig_stage1_build_object(struct ZigStage1 *stage1) {
91 g->have_pic = stage1->pic;91 g->have_pic = stage1->pic;
92 g->have_pie = stage1->pie;92 g->have_pie = stage1->pie;
93 g->have_stack_probing = stage1->enable_stack_probing;93 g->have_stack_probing = stage1->enable_stack_probing;
94 g->no_red_zone = stage1->no_red_zone;94 g->red_zone = stage1->red_zone;
95 g->is_single_threaded = stage1->is_single_threaded;95 g->is_single_threaded = stage1->is_single_threaded;
96 g->valgrind_enabled = stage1->valgrind_enabled;96 g->valgrind_enabled = stage1->valgrind_enabled;
97 g->tsan_enabled = stage1->tsan_enabled;97 g->tsan_enabled = stage1->tsan_enabled;
src/stage1/stage1.h+1-1
...@@ -188,7 +188,7 @@ struct ZigStage1 {...@@ -188,7 +188,7 @@ struct ZigStage1 {
188 bool tsan_enabled;188 bool tsan_enabled;
189 bool function_sections;189 bool function_sections;
190 bool enable_stack_probing;190 bool enable_stack_probing;
191 bool no_red_zone;191 bool red_zone;
192 bool enable_time_report;192 bool enable_time_report;
193 bool enable_stack_report;193 bool enable_stack_report;
194 bool test_is_evented;194 bool test_is_evented;
src/target.zig+18
...@@ -349,3 +349,21 @@ pub fn defaultCompilerRtOptimizeMode(target: std.Target) std.builtin.Mode {...@@ -349,3 +349,21 @@ pub fn defaultCompilerRtOptimizeMode(target: std.Target) std.builtin.Mode {
349 return .ReleaseFast;349 return .ReleaseFast;
350 }350 }
351}351}
352
353pub fn hasRedZone(target: std.Target) bool {
354 return switch (target.cpu.arch) {
355 .x86_64,
356 .i386,
357 .wasm32,
358 .wasm64,
359 .powerpc,
360 .powerpc64,
361 .powerpc64le,
362 .aarch64,
363 .aarch64_be,
364 .aarch64_32,
365 => true,
366
367 else => false,
368 };
369}
tools/update_clang_options.zig+36-28
...@@ -248,6 +248,14 @@ const known_options = [_]KnownOpt{...@@ -248,6 +248,14 @@ const known_options = [_]KnownOpt{
248 .name = "mtune",248 .name = "mtune",
249 .ident = "mcpu",249 .ident = "mcpu",
250 },250 },
251 .{
252 .name = "mred-zone",
253 .ident = "red_zone",
254 },
255 .{
256 .name = "mno-red-zone",
257 .ident = "no_red_zone",
258 },
251 .{259 .{
252 .name = "MD",260 .name = "MD",
253 .ident = "dep_file",261 .ident = "dep_file",
...@@ -340,9 +348,9 @@ pub fn main() anyerror!void {...@@ -340,9 +348,9 @@ pub fn main() anyerror!void {
340 const child_args = [_][]const u8{348 const child_args = [_][]const u8{
341 llvm_tblgen_exe,349 llvm_tblgen_exe,
342 "--dump-json",350 "--dump-json",
343 try std.fmt.allocPrint(allocator, "{}/clang/include/clang/Driver/Options.td", .{llvm_src_root}),351 try std.fmt.allocPrint(allocator, "{s}/clang/include/clang/Driver/Options.td", .{llvm_src_root}),
344 try std.fmt.allocPrint(allocator, "-I={}/llvm/include", .{llvm_src_root}),352 try std.fmt.allocPrint(allocator, "-I={s}/llvm/include", .{llvm_src_root}),
345 try std.fmt.allocPrint(allocator, "-I={}/clang/include/clang/Driver", .{llvm_src_root}),353 try std.fmt.allocPrint(allocator, "-I={s}/clang/include/clang/Driver", .{llvm_src_root}),
346 };354 };
347355
348 const child_result = try std.ChildProcess.exec(.{356 const child_result = try std.ChildProcess.exec(.{
...@@ -351,11 +359,11 @@ pub fn main() anyerror!void {...@@ -351,11 +359,11 @@ pub fn main() anyerror!void {
351 .max_output_bytes = 100 * 1024 * 1024,359 .max_output_bytes = 100 * 1024 * 1024,
352 });360 });
353361
354 std.debug.warn("{}\n", .{child_result.stderr});362 std.debug.warn("{s}\n", .{child_result.stderr});
355363
356 const json_text = switch (child_result.term) {364 const json_text = switch (child_result.term) {
357 .Exited => |code| if (code == 0) child_result.stdout else {365 .Exited => |code| if (code == 0) child_result.stdout else {
358 std.debug.warn("llvm-tblgen exited with code {}\n", .{code});366 std.debug.warn("llvm-tblgen exited with code {d}\n", .{code});
359 std.process.exit(1);367 std.process.exit(1);
360 },368 },
361 else => {369 else => {
...@@ -412,7 +420,7 @@ pub fn main() anyerror!void {...@@ -412,7 +420,7 @@ pub fn main() anyerror!void {
412 } else if (std.mem.eql(u8, prefix, "/")) {420 } else if (std.mem.eql(u8, prefix, "/")) {
413 pslash = true;421 pslash = true;
414 } else {422 } else {
415 std.debug.warn("{} has unrecognized prefix '{}'\n", .{ name, prefix });423 std.debug.warn("{s} has unrecognized prefix '{s}'\n", .{ name, prefix });
416 std.process.exit(1);424 std.process.exit(1);
417 }425 }
418 }426 }
...@@ -422,7 +430,7 @@ pub fn main() anyerror!void {...@@ -422,7 +430,7 @@ pub fn main() anyerror!void {
422 // `-MT foo` is ambiguous because there is also an -MT flag430 // `-MT foo` is ambiguous because there is also an -MT flag
423 // The canonical way to specify the flag is with `/MT` and so we make this431 // The canonical way to specify the flag is with `/MT` and so we make this
424 // the only way.432 // the only way.
425 try stdout.print("flagpsl(\"{}\"),\n", .{name});433 try stdout.print("flagpsl(\"{s}\"),\n", .{name});
426 } else if (knownOption(name)) |ident| {434 } else if (knownOption(name)) |ident| {
427435
428 // Workaround the fact that in 'Options.td' -Ofast is listed as 'joined'436 // Workaround the fact that in 'Options.td' -Ofast is listed as 'joined'
...@@ -430,34 +438,34 @@ pub fn main() anyerror!void {...@@ -430,34 +438,34 @@ pub fn main() anyerror!void {
430438
431 try stdout.print(439 try stdout.print(
432 \\.{{440 \\.{{
433 \\ .name = "{}",441 \\ .name = "{s}",
434 \\ .syntax = {},442 \\ .syntax = {s},
435 \\ .zig_equivalent = .{},443 \\ .zig_equivalent = .{s},
436 \\ .pd1 = {},444 \\ .pd1 = {s},
437 \\ .pd2 = {},445 \\ .pd2 = {s},
438 \\ .psl = {},446 \\ .psl = {s},
439 \\}},447 \\}},
440 \\448 \\
441 , .{ name, final_syntax, ident, pd1, pd2, pslash });449 , .{ name, final_syntax, ident, pd1, pd2, pslash });
442 } else if (pd1 and !pd2 and !pslash and syntax == .flag) {450 } else if (pd1 and !pd2 and !pslash and syntax == .flag) {
443 try stdout.print("flagpd1(\"{}\"),\n", .{name});451 try stdout.print("flagpd1(\"{s}\"),\n", .{name});
444 } else if (!pd1 and !pd2 and pslash and syntax == .flag) {452 } else if (!pd1 and !pd2 and pslash and syntax == .flag) {
445 try stdout.print("flagpsl(\"{}\"),\n", .{name});453 try stdout.print("flagpsl(\"{s}\"),\n", .{name});
446 } else if (pd1 and !pd2 and !pslash and syntax == .joined) {454 } else if (pd1 and !pd2 and !pslash and syntax == .joined) {
447 try stdout.print("joinpd1(\"{}\"),\n", .{name});455 try stdout.print("joinpd1(\"{s}\"),\n", .{name});
448 } else if (pd1 and !pd2 and !pslash and syntax == .joined_or_separate) {456 } else if (pd1 and !pd2 and !pslash and syntax == .joined_or_separate) {
449 try stdout.print("jspd1(\"{}\"),\n", .{name});457 try stdout.print("jspd1(\"{s}\"),\n", .{name});
450 } else if (pd1 and !pd2 and !pslash and syntax == .separate) {458 } else if (pd1 and !pd2 and !pslash and syntax == .separate) {
451 try stdout.print("sepd1(\"{}\"),\n", .{name});459 try stdout.print("sepd1(\"{s}\"),\n", .{name});
452 } else {460 } else {
453 try stdout.print(461 try stdout.print(
454 \\.{{462 \\.{{
455 \\ .name = "{}",463 \\ .name = "{s}",
456 \\ .syntax = {},464 \\ .syntax = {s},
457 \\ .zig_equivalent = .other,465 \\ .zig_equivalent = .other,
458 \\ .pd1 = {},466 \\ .pd1 = {s},
459 \\ .pd2 = {},467 \\ .pd2 = {s},
460 \\ .psl = {},468 \\ .psl = {s},
461 \\}},469 \\}},
462 \\470 \\
463 , .{ name, syntax, pd1, pd2, pslash });471 , .{ name, syntax, pd1, pd2, pslash });
...@@ -506,8 +514,8 @@ const Syntax = union(enum) {...@@ -506,8 +514,8 @@ const Syntax = union(enum) {
506 out_stream: anytype,514 out_stream: anytype,
507 ) !void {515 ) !void {
508 switch (self) {516 switch (self) {
509 .multi_arg => |n| return out_stream.print(".{{.{}={}}}", .{ @tagName(self), n }),517 .multi_arg => |n| return out_stream.print(".{{.{s}={}}}", .{ @tagName(self), n }),
510 else => return out_stream.print(".{}", .{@tagName(self)}),518 else => return out_stream.print(".{s}", .{@tagName(self)}),
511 }519 }
512 }520 }
513};521};
...@@ -559,9 +567,9 @@ fn objSyntax(obj: *json.ObjectMap) Syntax {...@@ -559,9 +567,9 @@ fn objSyntax(obj: *json.ObjectMap) Syntax {
559 return .flag;567 return .flag;
560 }568 }
561 const key = obj.get("!name").?.String;569 const key = obj.get("!name").?.String;
562 std.debug.warn("{} (key {}) has unrecognized superclasses:\n", .{ name, key });570 std.debug.warn("{s} (key {s}) has unrecognized superclasses:\n", .{ name, key });
563 for (obj.get("!superclasses").?.Array.items) |superclass_json| {571 for (obj.get("!superclasses").?.Array.items) |superclass_json| {
564 std.debug.warn(" {}\n", .{superclass_json.String});572 std.debug.warn(" {s}\n", .{superclass_json.String});
565 }573 }
566 std.process.exit(1);574 std.process.exit(1);
567}575}
...@@ -612,7 +620,7 @@ fn objectLessThan(context: void, a: *json.ObjectMap, b: *json.ObjectMap) bool {...@@ -612,7 +620,7 @@ fn objectLessThan(context: void, a: *json.ObjectMap, b: *json.ObjectMap) bool {
612620
613fn usageAndExit(file: fs.File, arg0: []const u8, code: u8) noreturn {621fn usageAndExit(file: fs.File, arg0: []const u8, code: u8) noreturn {
614 file.writer().print(622 file.writer().print(
615 \\Usage: {} /path/to/llvm-tblgen /path/to/git/llvm/llvm-project623 \\Usage: {s} /path/to/llvm-tblgen /path/to/git/llvm/llvm-project
616 \\Alternative Usage: zig run /path/to/git/zig/tools/update_clang_options.zig -- /path/to/llvm-tblgen /path/to/git/llvm/llvm-project624 \\Alternative Usage: zig run /path/to/git/zig/tools/update_clang_options.zig -- /path/to/llvm-tblgen /path/to/git/llvm/llvm-project
617 \\625 \\
618 \\Prints to stdout Zig code which you can use to replace the file src/clang_options_data.zig.626 \\Prints to stdout Zig code which you can use to replace the file src/clang_options_data.zig.