authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-09-24 16:44:45-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-09-25 10:50:41-07:00
log513389bc5bd709ee5cccdf93e2881a62aca6eced
tree64c383c5e6bb6d2fff187eca8ba2e5de4f2536db
parentac4d79e3227cf7bc5ec88e1dce6f879b1208bd8e

CLI: exploit std.mem.chompPrefix

fixes a bug in how -fstructured-cfg and -fno-structured-cfg are handled.

1 files changed, 101 insertions(+), 120 deletions(-)

src/main.zig+101-120
......@@ -1037,10 +1037,9 @@ fn buildOutputType(
10371037
10381038 var file_ext: ?Compilation.FileExt = null;
10391039 args_loop: while (args_iter.next()) |arg| {
1040 if (mem.startsWith(u8, arg, "@")) {
1040 if (mem.chompPrefix(u8, arg, "@")) |resp_file_path| {
10411041 // This is a "compiler response file". We must parse the file and treat its
10421042 // contents as command line parameters.
1043 const resp_file_path = arg[1..];
10441043 args_iter.resp_file = initArgIteratorResponseFile(arena, resp_file_path) catch |err| {
10451044 fatal("unable to read response file '{s}': {s}", .{ resp_file_path, @errorName(err) });
10461045 };
......@@ -1077,8 +1076,8 @@ fn buildOutputType(
10771076 .key = key,
10781077 .value = value,
10791078 });
1080 } else if (mem.startsWith(u8, arg, "-M")) {
1081 var it = mem.splitScalar(u8, arg["-M".len..], '=');
1079 } else if (mem.chompPrefix(u8, arg, "-M")) |rest| {
1080 var it = mem.splitScalar(u8, rest, '=');
10821081 const mod_name = it.first();
10831082 const root_src_orig = if (it.peek() != null) it.rest() else null;
10841083 try handleModArg(
......@@ -1111,8 +1110,8 @@ fn buildOutputType(
11111110 }
11121111 } else if (mem.eql(u8, arg, "-rcincludes")) {
11131112 rc_includes = parseRcIncludes(args_iter.nextOrFatal());
1114 } else if (mem.startsWith(u8, arg, "-rcincludes=")) {
1115 rc_includes = parseRcIncludes(arg["-rcincludes=".len..]);
1113 } else if (mem.chompPrefix(u8, arg, "-rcincludes=")) |rest| {
1114 rc_includes = parseRcIncludes(rest);
11161115 } else if (mem.eql(u8, arg, "-rcflags")) {
11171116 extra_rcflags.shrinkRetainingCapacity(0);
11181117 while (true) {
......@@ -1122,9 +1121,9 @@ fn buildOutputType(
11221121 if (mem.eql(u8, next_arg, "--")) break;
11231122 try extra_rcflags.append(arena, next_arg);
11241123 }
1125 } else if (mem.startsWith(u8, arg, "-fstructured-cfg")) {
1124 } else if (mem.eql(u8, arg, "-fstructured-cfg")) {
11261125 mod_opts.structured_cfg = true;
1127 } else if (mem.startsWith(u8, arg, "-fno-structured-cfg")) {
1126 } else if (mem.eql(u8, arg, "-fno-structured-cfg")) {
11281127 mod_opts.structured_cfg = false;
11291128 } else if (mem.eql(u8, arg, "--color")) {
11301129 const next_arg = args_iter.next() orelse {
......@@ -1133,8 +1132,7 @@ fn buildOutputType(
11331132 color = std.meta.stringToEnum(Color, next_arg) orelse {
11341133 fatal("expected [auto|on|off] after --color, found '{s}'", .{next_arg});
11351134 };
1136 } else if (mem.startsWith(u8, arg, "-j")) {
1137 const str = arg["-j".len..];
1135 } else if (mem.chompPrefix(u8, arg, "-j")) |str| {
11381136 const num = std.fmt.parseUnsigned(u32, str, 10) catch |err| {
11391137 fatal("unable to parse jobs count '{s}': {s}", .{
11401138 str, @errorName(err),
......@@ -1148,8 +1146,8 @@ fn buildOutputType(
11481146 subsystem = try parseSubSystem(args_iter.nextOrFatal());
11491147 } else if (mem.eql(u8, arg, "-O")) {
11501148 mod_opts.optimize_mode = parseOptimizeMode(args_iter.nextOrFatal());
1151 } else if (mem.startsWith(u8, arg, "-fentry=")) {
1152 entry = .{ .named = arg["-fentry=".len..] };
1149 } else if (mem.chompPrefix(u8, arg, "-fentry=")) |rest| {
1150 entry = .{ .named = rest };
11531151 } else if (mem.eql(u8, arg, "--force_undefined")) {
11541152 try force_undefined_symbols.put(arena, args_iter.nextOrFatal(), {});
11551153 } else if (mem.eql(u8, arg, "--discard-all")) {
......@@ -1176,8 +1174,7 @@ fn buildOutputType(
11761174 try create_module.frameworks.put(arena, args_iter.nextOrFatal(), .{ .needed = true });
11771175 } else if (mem.eql(u8, arg, "-install_name")) {
11781176 install_name = args_iter.nextOrFatal();
1179 } else if (mem.startsWith(u8, arg, "--compress-debug-sections=")) {
1180 const param = arg["--compress-debug-sections=".len..];
1177 } else if (mem.chompPrefix(u8, arg, "--compress-debug-sections=")) |param| {
11811178 linker_compress_debug_sections = std.meta.stringToEnum(link.File.Lld.Elf.CompressDebugSections, param) orelse {
11821179 fatal("expected --compress-debug-sections=[none|zlib|zstd], found '{s}'", .{param});
11831180 };
......@@ -1275,8 +1272,8 @@ fn buildOutputType(
12751272 try cc_argv.appendSlice(arena, &.{ arg, args_iter.nextOrFatal() });
12761273 } else if (mem.eql(u8, arg, "-I")) {
12771274 try cssan.addIncludePath(arena, &cc_argv, .I, arg, args_iter.nextOrFatal(), false);
1278 } else if (mem.startsWith(u8, arg, "--embed-dir=")) {
1279 try cssan.addIncludePath(arena, &cc_argv, .embed_dir, arg, arg["--embed-dir=".len..], true);
1275 } else if (mem.chompPrefix(u8, arg, "--embed-dir=")) |rest| {
1276 try cssan.addIncludePath(arena, &cc_argv, .embed_dir, arg, rest, true);
12801277 } else if (mem.eql(u8, arg, "-isystem")) {
12811278 try cssan.addIncludePath(arena, &cc_argv, .isystem, arg, args_iter.nextOrFatal(), false);
12821279 } else if (mem.eql(u8, arg, "-iwithsysroot")) {
......@@ -1303,14 +1300,14 @@ fn buildOutputType(
13031300 target_mcpu = args_iter.nextOrFatal();
13041301 } else if (mem.eql(u8, arg, "-mcmodel")) {
13051302 mod_opts.code_model = parseCodeModel(args_iter.nextOrFatal());
1306 } else if (mem.startsWith(u8, arg, "-mcmodel=")) {
1307 mod_opts.code_model = parseCodeModel(arg["-mcmodel=".len..]);
1308 } else if (mem.startsWith(u8, arg, "-ofmt=")) {
1309 create_module.object_format = arg["-ofmt=".len..];
1310 } else if (mem.startsWith(u8, arg, "-mcpu=")) {
1311 target_mcpu = arg["-mcpu=".len..];
1312 } else if (mem.startsWith(u8, arg, "-O")) {
1313 mod_opts.optimize_mode = parseOptimizeMode(arg["-O".len..]);
1303 } else if (mem.chompPrefix(u8, arg, "-mcmodel=")) |rest| {
1304 mod_opts.code_model = parseCodeModel(rest);
1305 } else if (mem.chompPrefix(u8, arg, "-ofmt=")) |rest| {
1306 create_module.object_format = rest;
1307 } else if (mem.chompPrefix(u8, arg, "-mcpu=")) |rest| {
1308 target_mcpu = rest;
1309 } else if (mem.chompPrefix(u8, arg, "-O")) |rest| {
1310 mod_opts.optimize_mode = parseOptimizeMode(rest);
13141311 } else if (mem.eql(u8, arg, "--dynamic-linker")) {
13151312 create_module.dynamic_linker = args_iter.nextOrFatal();
13161313 } else if (mem.eql(u8, arg, "--sysroot")) {
......@@ -1408,8 +1405,7 @@ fn buildOutputType(
14081405 create_module.opts.pie = false;
14091406 } else if (mem.eql(u8, arg, "-flto")) {
14101407 create_module.opts.lto = .full;
1411 } else if (mem.startsWith(u8, arg, "-flto=")) {
1412 const mode = arg["-flto=".len..];
1408 } else if (mem.chompPrefix(u8, arg, "-flto=")) |mode| {
14131409 if (mem.eql(u8, mode, "full")) {
14141410 create_module.opts.lto = .full;
14151411 } else if (mem.eql(u8, mode, "thin")) {
......@@ -1443,8 +1439,7 @@ fn buildOutputType(
14431439 mod_opts.omit_frame_pointer = false;
14441440 } else if (mem.eql(u8, arg, "-fsanitize-c")) {
14451441 mod_opts.sanitize_c = .full;
1446 } else if (mem.startsWith(u8, arg, "-fsanitize-c=")) {
1447 const mode = arg["-fsanitize-c=".len..];
1442 } else if (mem.chompPrefix(u8, arg, "-fsanitize-c=")) |mode| {
14481443 if (mem.eql(u8, mode, "trap")) {
14491444 mod_opts.sanitize_c = .trap;
14501445 } else if (mem.eql(u8, mode, "full")) {
......@@ -1492,8 +1487,7 @@ fn buildOutputType(
14921487 create_module.opts.san_cov_trace_pc_guard = false;
14931488 } else if (mem.eql(u8, arg, "-freference-trace")) {
14941489 reference_trace = 256;
1495 } else if (mem.startsWith(u8, arg, "-freference-trace=")) {
1496 const num = arg["-freference-trace=".len..];
1490 } else if (mem.chompPrefix(u8, arg, "-freference-trace=")) |num| {
14971491 reference_trace = std.fmt.parseUnsigned(u32, num, 10) catch |err| {
14981492 fatal("unable to parse reference_trace count '{s}': {s}", .{ num, @errorName(err) });
14991493 };
......@@ -1507,51 +1501,51 @@ fn buildOutputType(
15071501 create_module.opts.rdynamic = true;
15081502 } else if (mem.eql(u8, arg, "-fsoname")) {
15091503 soname = .yes_default_value;
1510 } else if (mem.startsWith(u8, arg, "-fsoname=")) {
1511 soname = .{ .yes = arg["-fsoname=".len..] };
1504 } else if (mem.chompPrefix(u8, arg, "-fsoname=")) |rest| {
1505 soname = .{ .yes = rest };
15121506 } else if (mem.eql(u8, arg, "-fno-soname")) {
15131507 soname = .no;
15141508 } else if (mem.eql(u8, arg, "-femit-bin")) {
15151509 emit_bin = .yes_default_path;
1516 } else if (mem.startsWith(u8, arg, "-femit-bin=")) {
1517 emit_bin = .{ .yes = arg["-femit-bin=".len..] };
1510 } else if (mem.chompPrefix(u8, arg, "-femit-bin=")) |rest| {
1511 emit_bin = .{ .yes = rest };
15181512 } else if (mem.eql(u8, arg, "-fno-emit-bin")) {
15191513 emit_bin = .no;
15201514 } else if (mem.eql(u8, arg, "-femit-h")) {
15211515 emit_h = .yes_default_path;
1522 } else if (mem.startsWith(u8, arg, "-femit-h=")) {
1523 emit_h = .{ .yes = arg["-femit-h=".len..] };
1516 } else if (mem.chompPrefix(u8, arg, "-femit-h=")) |rest| {
1517 emit_h = .{ .yes = rest };
15241518 } else if (mem.eql(u8, arg, "-fno-emit-h")) {
15251519 emit_h = .no;
15261520 } else if (mem.eql(u8, arg, "-femit-asm")) {
15271521 emit_asm = .yes_default_path;
1528 } else if (mem.startsWith(u8, arg, "-femit-asm=")) {
1529 emit_asm = .{ .yes = arg["-femit-asm=".len..] };
1522 } else if (mem.chompPrefix(u8, arg, "-femit-asm=")) |rest| {
1523 emit_asm = .{ .yes = rest };
15301524 } else if (mem.eql(u8, arg, "-fno-emit-asm")) {
15311525 emit_asm = .no;
15321526 } else if (mem.eql(u8, arg, "-femit-llvm-ir")) {
15331527 emit_llvm_ir = .yes_default_path;
1534 } else if (mem.startsWith(u8, arg, "-femit-llvm-ir=")) {
1535 emit_llvm_ir = .{ .yes = arg["-femit-llvm-ir=".len..] };
1528 } else if (mem.chompPrefix(u8, arg, "-femit-llvm-ir=")) |rest| {
1529 emit_llvm_ir = .{ .yes = rest };
15361530 } else if (mem.eql(u8, arg, "-fno-emit-llvm-ir")) {
15371531 emit_llvm_ir = .no;
15381532 } else if (mem.eql(u8, arg, "-femit-llvm-bc")) {
15391533 emit_llvm_bc = .yes_default_path;
1540 } else if (mem.startsWith(u8, arg, "-femit-llvm-bc=")) {
1541 emit_llvm_bc = .{ .yes = arg["-femit-llvm-bc=".len..] };
1534 } else if (mem.chompPrefix(u8, arg, "-femit-llvm-bc=")) |rest| {
1535 emit_llvm_bc = .{ .yes = rest };
15421536 } else if (mem.eql(u8, arg, "-fno-emit-llvm-bc")) {
15431537 emit_llvm_bc = .no;
15441538 } else if (mem.eql(u8, arg, "-femit-docs")) {
15451539 emit_docs = .yes_default_path;
1546 } else if (mem.startsWith(u8, arg, "-femit-docs=")) {
1547 emit_docs = .{ .yes = arg["-femit-docs=".len..] };
1540 } else if (mem.chompPrefix(u8, arg, "-femit-docs=")) |rest| {
1541 emit_docs = .{ .yes = rest };
15481542 } else if (mem.eql(u8, arg, "-fno-emit-docs")) {
15491543 emit_docs = .no;
15501544 } else if (mem.eql(u8, arg, "-femit-implib")) {
15511545 emit_implib = .yes_default_path;
15521546 emit_implib_arg_provided = true;
1553 } else if (mem.startsWith(u8, arg, "-femit-implib=")) {
1554 emit_implib = .{ .yes = arg["-femit-implib=".len..] };
1547 } else if (mem.chompPrefix(u8, arg, "-femit-implib=")) |rest| {
1548 emit_implib = .{ .yes = rest };
15551549 emit_implib_arg_provided = true;
15561550 } else if (mem.eql(u8, arg, "-fno-emit-implib")) {
15571551 emit_implib = .no;
......@@ -1601,8 +1595,7 @@ fn buildOutputType(
16011595 mod_opts.no_builtin = false;
16021596 } else if (mem.eql(u8, arg, "-fno-builtin")) {
16031597 mod_opts.no_builtin = true;
1604 } else if (mem.startsWith(u8, arg, "-fopt-bisect-limit=")) {
1605 const next_arg = arg["-fopt-bisect-limit=".len..];
1598 } else if (mem.chompPrefix(u8, arg, "-fopt-bisect-limit=")) |next_arg| {
16061599 llvm_opt_bisect_limit = std.fmt.parseInt(c_int, next_arg, 0) catch |err|
16071600 fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
16081601 } else if (mem.eql(u8, arg, "--eh-frame-hdr")) {
......@@ -1645,10 +1638,10 @@ fn buildOutputType(
16451638 linker_z_relro = true;
16461639 } else if (mem.eql(u8, z_arg, "norelro")) {
16471640 linker_z_relro = false;
1648 } else if (mem.startsWith(u8, z_arg, "common-page-size=")) {
1649 linker_z_common_page_size = parseIntSuffix(z_arg, "common-page-size=".len);
1650 } else if (mem.startsWith(u8, z_arg, "max-page-size=")) {
1651 linker_z_max_page_size = parseIntSuffix(z_arg, "max-page-size=".len);
1641 } else if (mem.chompPrefix(u8, z_arg, "common-page-size=")) |rest| {
1642 linker_z_common_page_size = parseIntSuffix(rest, 0);
1643 } else if (mem.chompPrefix(u8, z_arg, "max-page-size=")) |rest| {
1644 linker_z_max_page_size = parseIntSuffix(rest, 0);
16521645 } else {
16531646 fatal("unsupported linker extension flag: -z {s}", .{z_arg});
16541647 }
......@@ -1669,16 +1662,16 @@ fn buildOutputType(
16691662 linker_import_table = true;
16701663 } else if (mem.eql(u8, arg, "--export-table")) {
16711664 linker_export_table = true;
1672 } else if (mem.startsWith(u8, arg, "--initial-memory=")) {
1673 linker_initial_memory = parseIntSuffix(arg, "--initial-memory=".len);
1674 } else if (mem.startsWith(u8, arg, "--max-memory=")) {
1675 linker_max_memory = parseIntSuffix(arg, "--max-memory=".len);
1665 } else if (mem.chompPrefix(u8, arg, "--initial-memory=")) |rest| {
1666 linker_initial_memory = parseIntSuffix(rest, 0);
1667 } else if (mem.chompPrefix(u8, arg, "--max-memory=")) |rest| {
1668 linker_max_memory = parseIntSuffix(rest, 0);
16761669 } else if (mem.eql(u8, arg, "--shared-memory")) {
16771670 create_module.opts.shared_memory = true;
1678 } else if (mem.startsWith(u8, arg, "--global-base=")) {
1679 linker_global_base = parseIntSuffix(arg, "--global-base=".len);
1680 } else if (mem.startsWith(u8, arg, "--export=")) {
1681 try linker_export_symbol_names.append(arena, arg["--export=".len..]);
1671 } else if (mem.chompPrefix(u8, arg, "--global-base=")) |rest| {
1672 linker_global_base = parseIntSuffix(rest, 0);
1673 } else if (mem.chompPrefix(u8, arg, "--export=")) |rest| {
1674 try linker_export_symbol_names.append(arena, rest);
16821675 } else if (mem.eql(u8, arg, "-Bsymbolic")) {
16831676 linker_bind_global_refs_locally = true;
16841677 } else if (mem.eql(u8, arg, "--gc-sections")) {
......@@ -1687,8 +1680,7 @@ fn buildOutputType(
16871680 linker_gc_sections = false;
16881681 } else if (mem.eql(u8, arg, "--build-id")) {
16891682 build_id = .fast;
1690 } else if (mem.startsWith(u8, arg, "--build-id=")) {
1691 const style = arg["--build-id=".len..];
1683 } else if (mem.chompPrefix(u8, arg, "--build-id=")) |style| {
16921684 build_id = std.zig.BuildId.parse(style) catch |err| {
16931685 fatal("unable to parse --build-id style '{s}': {s}", .{
16941686 style, @errorName(err),
......@@ -1712,26 +1704,26 @@ fn buildOutputType(
17121704 verbose_generic_instances = true;
17131705 } else if (mem.eql(u8, arg, "--verbose-llvm-ir")) {
17141706 verbose_llvm_ir = "-";
1715 } else if (mem.startsWith(u8, arg, "--verbose-llvm-ir=")) {
1716 verbose_llvm_ir = arg["--verbose-llvm-ir=".len..];
1717 } else if (mem.startsWith(u8, arg, "--verbose-llvm-bc=")) {
1718 verbose_llvm_bc = arg["--verbose-llvm-bc=".len..];
1707 } else if (mem.chompPrefix(u8, arg, "--verbose-llvm-ir=")) |rest| {
1708 verbose_llvm_ir = rest;
1709 } else if (mem.chompPrefix(u8, arg, "--verbose-llvm-bc=")) |rest| {
1710 verbose_llvm_bc = rest;
17191711 } else if (mem.eql(u8, arg, "--verbose-cimport")) {
17201712 verbose_cimport = true;
17211713 } else if (mem.eql(u8, arg, "--verbose-llvm-cpu-features")) {
17221714 verbose_llvm_cpu_features = true;
1723 } else if (mem.startsWith(u8, arg, "-T")) {
1724 linker_script = arg[2..];
1725 } else if (mem.startsWith(u8, arg, "-L")) {
1726 try create_module.lib_dir_args.append(arena, arg[2..]);
1727 } else if (mem.startsWith(u8, arg, "-F")) {
1728 try create_module.framework_dirs.append(arena, arg[2..]);
1729 } else if (mem.startsWith(u8, arg, "-l")) {
1715 } else if (mem.chompPrefix(u8, arg, "-T")) |rest| {
1716 linker_script = rest;
1717 } else if (mem.chompPrefix(u8, arg, "-L")) |rest| {
1718 try create_module.lib_dir_args.append(arena, rest);
1719 } else if (mem.chompPrefix(u8, arg, "-F")) |rest| {
1720 try create_module.framework_dirs.append(arena, rest);
1721 } else if (mem.chompPrefix(u8, arg, "-l")) |name| {
17301722 // We don't know whether this library is part of libc
17311723 // or libc++ until we resolve the target, so we append
17321724 // to the list for now.
17331725 try create_module.cli_link_inputs.append(arena, .{ .name_query = .{
1734 .name = arg["-l".len..],
1726 .name = name,
17351727 .query = .{
17361728 .needed = false,
17371729 .weak = false,
......@@ -1740,9 +1732,9 @@ fn buildOutputType(
17401732 .allow_so_scripts = allow_so_scripts,
17411733 },
17421734 } });
1743 } else if (mem.startsWith(u8, arg, "-needed-l")) {
1735 } else if (mem.chompPrefix(u8, arg, "-needed-l")) |name| {
17441736 try create_module.cli_link_inputs.append(arena, .{ .name_query = .{
1745 .name = arg["-needed-l".len..],
1737 .name = name,
17461738 .query = .{
17471739 .needed = true,
17481740 .weak = false,
......@@ -1751,9 +1743,9 @@ fn buildOutputType(
17511743 .allow_so_scripts = allow_so_scripts,
17521744 },
17531745 } });
1754 } else if (mem.startsWith(u8, arg, "-weak-l")) {
1746 } else if (mem.chompPrefix(u8, arg, "-weak-l")) |name| {
17551747 try create_module.cli_link_inputs.append(arena, .{ .name_query = .{
1756 .name = arg["-weak-l".len..],
1748 .name = name,
17571749 .query = .{
17581750 .needed = false,
17591751 .weak = true,
......@@ -1764,13 +1756,10 @@ fn buildOutputType(
17641756 } });
17651757 } else if (mem.startsWith(u8, arg, "-D")) {
17661758 try cc_argv.append(arena, arg);
1767 } else if (mem.startsWith(u8, arg, "-I")) {
1768 try cssan.addIncludePath(arena, &cc_argv, .I, arg, arg[2..], true);
1769 } else if (mem.startsWith(u8, arg, "-x")) {
1770 const lang = if (arg.len == "-x".len)
1771 args_iter.nextOrFatal()
1772 else
1773 arg["-x".len..];
1759 } else if (mem.chompPrefix(u8, arg, "-I")) |rest| {
1760 try cssan.addIncludePath(arena, &cc_argv, .I, arg, rest, true);
1761 } else if (mem.chompPrefix(u8, arg, "-x")) |rest| {
1762 const lang = if (rest.len == 0) args_iter.nextOrFatal() else rest;
17741763 if (mem.eql(u8, lang, "none")) {
17751764 file_ext = null;
17761765 } else if (Compilation.LangToExt.get(lang)) |got_ext| {
......@@ -1778,8 +1767,8 @@ fn buildOutputType(
17781767 } else {
17791768 fatal("language not recognized: '{s}'", .{lang});
17801769 }
1781 } else if (mem.startsWith(u8, arg, "-mexec-model=")) {
1782 create_module.opts.wasi_exec_model = parseWasiExecModel(arg["-mexec-model=".len..]);
1770 } else if (mem.chompPrefix(u8, arg, "-mexec-model=")) |rest| {
1771 create_module.opts.wasi_exec_model = parseWasiExecModel(rest);
17831772 } else if (mem.eql(u8, arg, "-municode")) {
17841773 mingw_unicode_entry_point = true;
17851774 } else {
......@@ -2457,8 +2446,8 @@ fn buildOutputType(
24572446 linker_enable_new_dtags = false;
24582447 } else if (mem.eql(u8, arg, "-O")) {
24592448 linker_optimization = linker_args_it.nextOrFatal();
2460 } else if (mem.startsWith(u8, arg, "-O")) {
2461 linker_optimization = arg["-O".len..];
2449 } else if (mem.chompPrefix(u8, arg, "-O")) |rest| {
2450 linker_optimization = rest;
24622451 } else if (mem.eql(u8, arg, "-pagezero_size")) {
24632452 const next_arg = linker_args_it.nextOrFatal();
24642453 pagezero_size = std.fmt.parseUnsigned(u64, eatIntPrefix(next_arg, 16), 16) catch |err| {
......@@ -2540,11 +2529,8 @@ fn buildOutputType(
25402529 linker_compress_debug_sections = std.meta.stringToEnum(link.File.Lld.Elf.CompressDebugSections, arg1) orelse {
25412530 fatal("expected [none|zlib|zstd] after --compress-debug-sections, found '{s}'", .{arg1});
25422531 };
2543 } else if (mem.startsWith(u8, arg, "-z")) {
2544 var z_arg = arg[2..];
2545 if (z_arg.len == 0) {
2546 z_arg = linker_args_it.nextOrFatal();
2547 }
2532 } else if (mem.chompPrefix(u8, arg, "-z")) |z_rest| {
2533 const z_arg = if (z_rest.len == 0) linker_args_it.nextOrFatal() else z_rest;
25482534 if (mem.eql(u8, z_arg, "nodelete")) {
25492535 linker_z_nodelete = true;
25502536 } else if (mem.eql(u8, z_arg, "notext")) {
......@@ -2567,12 +2553,12 @@ fn buildOutputType(
25672553 linker_z_relro = true;
25682554 } else if (mem.eql(u8, z_arg, "norelro")) {
25692555 linker_z_relro = false;
2570 } else if (mem.startsWith(u8, z_arg, "stack-size=")) {
2571 stack_size = parseStackSize(z_arg["stack-size=".len..]);
2572 } else if (mem.startsWith(u8, z_arg, "common-page-size=")) {
2573 linker_z_common_page_size = parseIntSuffix(z_arg, "common-page-size=".len);
2574 } else if (mem.startsWith(u8, z_arg, "max-page-size=")) {
2575 linker_z_max_page_size = parseIntSuffix(z_arg, "max-page-size=".len);
2556 } else if (mem.chompPrefix(u8, z_arg, "stack-size=")) |rest| {
2557 stack_size = parseStackSize(rest);
2558 } else if (mem.chompPrefix(u8, z_arg, "common-page-size=")) |rest| {
2559 linker_z_common_page_size = parseIntSuffix(rest, 0);
2560 } else if (mem.chompPrefix(u8, z_arg, "max-page-size=")) |rest| {
2561 linker_z_max_page_size = parseIntSuffix(rest, 0);
25762562 } else {
25772563 fatal("unsupported linker extension flag: -z {s}", .{z_arg});
25782564 }
......@@ -2686,9 +2672,9 @@ fn buildOutputType(
26862672 .allow_so_scripts = allow_so_scripts,
26872673 },
26882674 } });
2689 } else if (mem.startsWith(u8, arg, "-weak-l")) {
2675 } else if (mem.chompPrefix(u8, arg, "-weak-l")) |rest| {
26902676 try create_module.cli_link_inputs.append(arena, .{ .name_query = .{
2691 .name = arg["-weak-l".len..],
2677 .name = rest,
26922678 .query = .{
26932679 .weak = true,
26942680 .needed = false,
......@@ -3783,8 +3769,7 @@ fn createModule(
37833769 try mcpu_buffer.appendSlice(cli_mod.target_mcpu orelse "baseline");
37843770
37853771 for (create_module.llvm_m_args.items) |llvm_m_arg| {
3786 if (mem.startsWith(u8, llvm_m_arg, "mno-")) {
3787 const llvm_name = llvm_m_arg["mno-".len..];
3772 if (mem.chompPrefix(u8, llvm_m_arg, "mno-")) |llvm_name| {
37883773 const zig_name = llvm_to_zig_name.get(llvm_name) orelse {
37893774 fatal("target architecture {s} has no LLVM CPU feature named '{s}'", .{
37903775 @tagName(cpu_arch), llvm_name,
......@@ -3792,8 +3777,7 @@ fn createModule(
37923777 };
37933778 try mcpu_buffer.append('-');
37943779 try mcpu_buffer.appendSlice(zig_name);
3795 } else if (mem.startsWith(u8, llvm_m_arg, "m")) {
3796 const llvm_name = llvm_m_arg["m".len..];
3780 } else if (mem.chompPrefix(u8, llvm_m_arg, "m")) |llvm_name| {
37973781 const zig_name = llvm_to_zig_name.get(llvm_name) orelse {
37983782 fatal("target architecture {s} has no LLVM CPU feature named '{s}'", .{
37993783 @tagName(cpu_arch), llvm_name,
......@@ -4980,9 +4964,8 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
49804964 reference_trace = 256;
49814965 } else if (mem.eql(u8, arg, "--fetch")) {
49824966 fetch_only = true;
4983 } else if (mem.startsWith(u8, arg, "--fetch=")) {
4967 } else if (mem.chompPrefix(u8, arg, "--fetch=")) |sub_arg| {
49844968 fetch_only = true;
4985 const sub_arg = arg["--fetch=".len..];
49864969 fetch_mode = std.meta.stringToEnum(Package.Fetch.JobQueue.Mode, sub_arg) orelse
49874970 fatal("expected [needed|all] after '--fetch=', found '{s}'", .{
49884971 sub_arg,
......@@ -4993,8 +4976,7 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
49934976 system_pkg_dir_path = args[i];
49944977 try child_argv.append("--system");
49954978 continue;
4996 } else if (mem.startsWith(u8, arg, "-freference-trace=")) {
4997 const num = arg["-freference-trace=".len..];
4979 } else if (mem.chompPrefix(u8, arg, "-freference-trace=")) |num| {
49984980 reference_trace = std.fmt.parseUnsigned(u32, num, 10) catch |err| {
49994981 fatal("unable to parse reference_trace count '{s}': {s}", .{ num, @errorName(err) });
50004982 };
......@@ -5044,10 +5026,10 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
50445026 verbose_generic_instances = true;
50455027 } else if (mem.eql(u8, arg, "--verbose-llvm-ir")) {
50465028 verbose_llvm_ir = "-";
5047 } else if (mem.startsWith(u8, arg, "--verbose-llvm-ir=")) {
5048 verbose_llvm_ir = arg["--verbose-llvm-ir=".len..];
5049 } else if (mem.startsWith(u8, arg, "--verbose-llvm-bc=")) {
5050 verbose_llvm_bc = arg["--verbose-llvm-bc=".len..];
5029 } else if (mem.chompPrefix(u8, arg, "--verbose-llvm-ir=")) |rest| {
5030 verbose_llvm_ir = rest;
5031 } else if (mem.chompPrefix(u8, arg, "--verbose-llvm-bc=")) |rest| {
5032 verbose_llvm_bc = rest;
50515033 } else if (mem.eql(u8, arg, "--verbose-cimport")) {
50525034 verbose_cimport = true;
50535035 } else if (mem.eql(u8, arg, "--verbose-llvm-cpu-features")) {
......@@ -5060,8 +5042,7 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
50605042 };
50615043 try child_argv.appendSlice(&.{ arg, args[i] });
50625044 continue;
5063 } else if (mem.startsWith(u8, arg, "-j")) {
5064 const str = arg["-j".len..];
5045 } else if (mem.chompPrefix(u8, arg, "-j")) |str| {
50655046 const num = std.fmt.parseUnsigned(u32, str, 10) catch |err| {
50665047 fatal("unable to parse jobs count '{s}': {s}", .{
50675048 str, @errorName(err),
......@@ -6966,12 +6947,12 @@ fn cmdFetch(
69666947 debug_hash = true;
69676948 } else if (mem.eql(u8, arg, "--save")) {
69686949 save = .{ .yes = null };
6969 } else if (mem.startsWith(u8, arg, "--save=")) {
6970 save = .{ .yes = arg["--save=".len..] };
6950 } else if (mem.chompPrefix(u8, arg, "--save=")) |rest| {
6951 save = .{ .yes = rest };
69716952 } else if (mem.eql(u8, arg, "--save-exact")) {
69726953 save = .{ .exact = null };
6973 } else if (mem.startsWith(u8, arg, "--save-exact=")) {
6974 save = .{ .exact = arg["--save-exact=".len..] };
6954 } else if (mem.chompPrefix(u8, arg, "--save-exact=")) |rest| {
6955 save = .{ .exact = rest };
69756956 } else {
69766957 fatal("unrecognized parameter: '{s}'", .{arg});
69776958 }