| author | |
| committer | |
| log | 4b0ddb817bb5d4effd8cd2dd0844ac278e35e1d5 |
| tree | ea0112fc930bf6a51b62136f10a60560c3c96bd9 |
| parent | 28ad78cb7f4a567ce6a595b8ff466e90b311f3e4 |
| signature |
9 files changed, 115 insertions(+), 14 deletions(-)
src-self-hosted/clang_options_data.zig+4-4| ... | ... | @@ -7,7 +7,7 @@ flagpd1("CC"), |
| 7 | 7 | .{ |
| 8 | 8 | .name = "E", |
| 9 | 9 | .syntax = .flag, |
| 10 | .zig_equivalent = .driver_punt, | |
| 10 | .zig_equivalent = .preprocess, | |
| 11 | 11 | .pd1 = true, |
| 12 | 12 | .pd2 = false, |
| 13 | 13 | .psl = false, |
| ... | ... | @@ -133,7 +133,7 @@ flagpd1("###"), |
| 133 | 133 | .{ |
| 134 | 134 | .name = "E", |
| 135 | 135 | .syntax = .flag, |
| 136 | .zig_equivalent = .driver_punt, | |
| 136 | .zig_equivalent = .preprocess, | |
| 137 | 137 | .pd1 = true, |
| 138 | 138 | .pd2 = false, |
| 139 | 139 | .psl = true, |
| ... | ... | @@ -1421,7 +1421,7 @@ flagpd1("###"), |
| 1421 | 1421 | .{ |
| 1422 | 1422 | .name = "assemble", |
| 1423 | 1423 | .syntax = .flag, |
| 1424 | .zig_equivalent = .other, | |
| 1424 | .zig_equivalent = .driver_punt, | |
| 1425 | 1425 | .pd1 = false, |
| 1426 | 1426 | .pd2 = true, |
| 1427 | 1427 | .psl = false, |
| ... | ... | @@ -1749,7 +1749,7 @@ flagpd1("###"), |
| 1749 | 1749 | .{ |
| 1750 | 1750 | .name = "preprocess", |
| 1751 | 1751 | .syntax = .flag, |
| 1752 | .zig_equivalent = .other, | |
| 1752 | .zig_equivalent = .preprocess, | |
| 1753 | 1753 | .pd1 = false, |
| 1754 | 1754 | .pd2 = true, |
| 1755 | 1755 | .psl = false, |
src-self-hosted/stage2.zig+1| ... | ... | @@ -1247,6 +1247,7 @@ pub const ClangArgIterator = extern struct { |
| 1247 | 1247 | shared, |
| 1248 | 1248 | rdynamic, |
| 1249 | 1249 | wl, |
| 1250 | preprocess, | |
| 1250 | 1251 | }; |
| 1251 | 1252 | |
| 1252 | 1253 | fn init(argv: []const [*:0]const u8) ClangArgIterator { |
src/all_types.hpp+2| ... | ... | @@ -2003,6 +2003,7 @@ enum WantCSanitize { |
| 2003 | 2003 | struct CFile { |
| 2004 | 2004 | ZigList<const char *> args; |
| 2005 | 2005 | const char *source_path; |
| 2006 | const char *preprocessor_only_basename; | |
| 2006 | 2007 | }; |
| 2007 | 2008 | |
| 2008 | 2009 | // When adding fields, check if they should be added to the hash computation in build_with_cache |
| ... | ... | @@ -2147,6 +2148,7 @@ struct CodeGen { |
| 2147 | 2148 | // As an input parameter, mutually exclusive with enable_cache. But it gets |
| 2148 | 2149 | // populated in codegen_build_and_link. |
| 2149 | 2150 | Buf *output_dir; |
| 2151 | Buf *c_artifact_dir; | |
| 2150 | 2152 | const char **libc_include_dir_list; |
| 2151 | 2153 | size_t libc_include_dir_len; |
| 2152 | 2154 |
src/codegen.cpp+16-6| ... | ... | @@ -9723,13 +9723,17 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { |
| 9723 | 9723 | buf_len(c_source_basename), 0); |
| 9724 | 9724 | |
| 9725 | 9725 | Buf *final_o_basename = buf_alloc(); |
| 9726 | // We special case when doing build-obj for just one C file | |
| 9727 | if (main_output_dir_is_just_one_c_object_pre(g)) { | |
| 9728 | buf_init_from_buf(final_o_basename, g->root_out_name); | |
| 9726 | if (c_file->preprocessor_only_basename == nullptr) { | |
| 9727 | // We special case when doing build-obj for just one C file | |
| 9728 | if (main_output_dir_is_just_one_c_object_pre(g)) { | |
| 9729 | buf_init_from_buf(final_o_basename, g->root_out_name); | |
| 9730 | } else { | |
| 9731 | os_path_extname(c_source_basename, final_o_basename, nullptr); | |
| 9732 | } | |
| 9733 | buf_append_str(final_o_basename, target_o_file_ext(g->zig_target)); | |
| 9729 | 9734 | } else { |
| 9730 | os_path_extname(c_source_basename, final_o_basename, nullptr); | |
| 9735 | buf_init_from_str(final_o_basename, c_file->preprocessor_only_basename); | |
| 9731 | 9736 | } |
| 9732 | buf_append_str(final_o_basename, target_o_file_ext(g->zig_target)); | |
| 9733 | 9737 | |
| 9734 | 9738 | CacheHash *cache_hash; |
| 9735 | 9739 | if ((err = create_c_object_cache(g, &cache_hash, true))) { |
| ... | ... | @@ -9780,13 +9784,18 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { |
| 9780 | 9784 | args.append(buf_ptr(self_exe_path)); |
| 9781 | 9785 | args.append("clang"); |
| 9782 | 9786 | |
| 9787 | if (c_file->preprocessor_only_basename != nullptr) { | |
| 9788 | args.append("-E"); | |
| 9789 | } else { | |
| 9790 | args.append("-c"); | |
| 9791 | } | |
| 9792 | ||
| 9783 | 9793 | Buf *out_dep_path = buf_sprintf("%s.d", buf_ptr(out_obj_path)); |
| 9784 | 9794 | add_cc_args(g, args, buf_ptr(out_dep_path), false); |
| 9785 | 9795 | |
| 9786 | 9796 | args.append("-o"); |
| 9787 | 9797 | args.append(buf_ptr(out_obj_path)); |
| 9788 | 9798 | |
| 9789 | args.append("-c"); | |
| 9790 | 9799 | args.append(buf_ptr(c_source_file)); |
| 9791 | 9800 | |
| 9792 | 9801 | for (size_t arg_i = 0; arg_i < c_file->args.length; arg_i += 1) { |
| ... | ... | @@ -9841,6 +9850,7 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { |
| 9841 | 9850 | os_path_join(artifact_dir, final_o_basename, o_final_path); |
| 9842 | 9851 | } |
| 9843 | 9852 | |
| 9853 | g->c_artifact_dir = artifact_dir; | |
| 9844 | 9854 | g->link_objects.append(o_final_path); |
| 9845 | 9855 | g->caches_to_release.append(cache_hash); |
| 9846 | 9856 |
src/main.cpp+57-3| ... | ... | @@ -453,6 +453,7 @@ static int main0(int argc, char **argv) { |
| 453 | 453 | const char *mcpu = nullptr; |
| 454 | 454 | CodeModel code_model = CodeModelDefault; |
| 455 | 455 | const char *override_soname = nullptr; |
| 456 | bool only_preprocess = false; | |
| 456 | 457 | |
| 457 | 458 | ZigList<const char *> llvm_argv = {0}; |
| 458 | 459 | llvm_argv.append("zig (LLVM option parsing)"); |
| ... | ... | @@ -660,6 +661,9 @@ static int main0(int argc, char **argv) { |
| 660 | 661 | } |
| 661 | 662 | break; |
| 662 | 663 | } |
| 664 | case Stage2ClangArgPreprocess: | |
| 665 | only_preprocess = true; | |
| 666 | break; | |
| 663 | 667 | } |
| 664 | 668 | } |
| 665 | 669 | // Parse linker args |
| ... | ... | @@ -715,7 +719,28 @@ static int main0(int argc, char **argv) { |
| 715 | 719 | have_libc = true; |
| 716 | 720 | link_libs.append("c"); |
| 717 | 721 | } |
| 718 | if (!c_arg) { | |
| 722 | if (only_preprocess) { | |
| 723 | cmd = CmdBuild; | |
| 724 | out_type = OutTypeObj; | |
| 725 | emit_bin = false; | |
| 726 | // Transfer "objects" into c_source_files | |
| 727 | for (size_t i = 0; i < objects.length; i += 1) { | |
| 728 | CFile *c_file = heap::c_allocator.create<CFile>(); | |
| 729 | c_file->source_path = objects.at(i); | |
| 730 | c_source_files.append(c_file); | |
| 731 | } | |
| 732 | for (size_t i = 0; i < c_source_files.length; i += 1) { | |
| 733 | Buf *src_path; | |
| 734 | if (emit_bin_override_path != nullptr) { | |
| 735 | src_path = buf_create_from_str(emit_bin_override_path); | |
| 736 | } else { | |
| 737 | src_path = buf_create_from_str(c_source_files.at(i)->source_path); | |
| 738 | } | |
| 739 | Buf basename = BUF_INIT; | |
| 740 | os_path_split(src_path, nullptr, &basename); | |
| 741 | c_source_files.at(i)->preprocessor_only_basename = buf_ptr(&basename); | |
| 742 | } | |
| 743 | } else if (!c_arg) { | |
| 719 | 744 | cmd = CmdBuild; |
| 720 | 745 | if (is_shared_lib) { |
| 721 | 746 | out_type = OutTypeLib; |
| ... | ... | @@ -1464,12 +1489,41 @@ static int main0(int argc, char **argv) { |
| 1464 | 1489 | return term.code; |
| 1465 | 1490 | } else if (cmd == CmdBuild) { |
| 1466 | 1491 | if (emit_bin_override_path != nullptr) { |
| 1492 | #if defined(ZIG_OS_WINDOWS) | |
| 1493 | buf_replace(g->output_dir, '/', '\\'); | |
| 1494 | #endif | |
| 1467 | 1495 | Buf *dest_path = buf_create_from_str(emit_bin_override_path); |
| 1468 | if ((err = os_update_file(&g->bin_file_output_path, dest_path))) { | |
| 1469 | fprintf(stderr, "unable to copy %s to %s: %s\n", buf_ptr(&g->bin_file_output_path), | |
| 1496 | Buf *source_path; | |
| 1497 | if (only_preprocess) { | |
| 1498 | source_path = buf_alloc(); | |
| 1499 | Buf *pp_only_basename = buf_create_from_str( | |
| 1500 | c_source_files.at(0)->preprocessor_only_basename); | |
| 1501 | os_path_join(g->output_dir, pp_only_basename, source_path); | |
| 1502 | ||
| 1503 | } else { | |
| 1504 | source_path = &g->bin_file_output_path; | |
| 1505 | } | |
| 1506 | if ((err = os_update_file(source_path, dest_path))) { | |
| 1507 | fprintf(stderr, "unable to copy %s to %s: %s\n", buf_ptr(source_path), | |
| 1470 | 1508 | buf_ptr(dest_path), err_str(err)); |
| 1471 | 1509 | return main_exit(root_progress_node, EXIT_FAILURE); |
| 1472 | 1510 | } |
| 1511 | } else if (only_preprocess) { | |
| 1512 | #if defined(ZIG_OS_WINDOWS) | |
| 1513 | buf_replace(g->c_artifact_dir, '/', '\\'); | |
| 1514 | #endif | |
| 1515 | // dump the preprocessed output to stdout | |
| 1516 | for (size_t i = 0; i < c_source_files.length; i += 1) { | |
| 1517 | Buf *source_path = buf_alloc(); | |
| 1518 | Buf *pp_only_basename = buf_create_from_str( | |
| 1519 | c_source_files.at(i)->preprocessor_only_basename); | |
| 1520 | os_path_join(g->c_artifact_dir, pp_only_basename, source_path); | |
| 1521 | if ((err = os_dump_file(source_path, stdout))) { | |
| 1522 | fprintf(stderr, "unable to read %s: %s\n", buf_ptr(source_path), | |
| 1523 | err_str(err)); | |
| 1524 | return main_exit(root_progress_node, EXIT_FAILURE); | |
| 1525 | } | |
| 1526 | } | |
| 1473 | 1527 | } else if (g->enable_cache) { |
| 1474 | 1528 | #if defined(ZIG_OS_WINDOWS) |
| 1475 | 1529 | buf_replace(&g->bin_file_output_path, '/', '\\'); |
src/os.cpp+24| ... | ... | @@ -1051,6 +1051,30 @@ static Error copy_open_files(FILE *src_f, FILE *dest_f) { |
| 1051 | 1051 | } |
| 1052 | 1052 | } |
| 1053 | 1053 | |
| 1054 | Error os_dump_file(Buf *src_path, FILE *dest_file) { | |
| 1055 | Error err; | |
| 1056 | ||
| 1057 | FILE *src_f = fopen(buf_ptr(src_path), "rb"); | |
| 1058 | if (!src_f) { | |
| 1059 | int err = errno; | |
| 1060 | if (err == ENOENT) { | |
| 1061 | return ErrorFileNotFound; | |
| 1062 | } else if (err == EACCES || err == EPERM) { | |
| 1063 | return ErrorAccess; | |
| 1064 | } else { | |
| 1065 | return ErrorFileSystem; | |
| 1066 | } | |
| 1067 | } | |
| 1068 | copy_open_files(src_f, dest_file); | |
| 1069 | if ((err = copy_open_files(src_f, dest_file))) { | |
| 1070 | fclose(src_f); | |
| 1071 | return err; | |
| 1072 | } | |
| 1073 | ||
| 1074 | fclose(src_f); | |
| 1075 | return ErrorNone; | |
| 1076 | } | |
| 1077 | ||
| 1054 | 1078 | #if defined(ZIG_OS_WINDOWS) |
| 1055 | 1079 | static void windows_filetime_to_os_timestamp(FILETIME *ft, OsTimeStamp *mtime) { |
| 1056 | 1080 | mtime->sec = (((ULONGLONG) ft->dwHighDateTime) << 32) + ft->dwLowDateTime; |
src/os.hpp+1| ... | ... | @@ -129,6 +129,7 @@ void os_file_close(OsFile *file); |
| 129 | 129 | Error ATTRIBUTE_MUST_USE os_write_file(Buf *full_path, Buf *contents); |
| 130 | 130 | Error ATTRIBUTE_MUST_USE os_copy_file(Buf *src_path, Buf *dest_path); |
| 131 | 131 | Error ATTRIBUTE_MUST_USE os_update_file(Buf *src_path, Buf *dest_path); |
| 132 | Error ATTRIBUTE_MUST_USE os_dump_file(Buf *src_path, FILE *dest_file); | |
| 132 | 133 | |
| 133 | 134 | Error ATTRIBUTE_MUST_USE os_fetch_file(FILE *file, Buf *out_contents); |
| 134 | 135 | Error ATTRIBUTE_MUST_USE os_fetch_file_path(Buf *full_path, Buf *out_contents); |
src/stage2.h+1| ... | ... | @@ -333,6 +333,7 @@ enum Stage2ClangArg { |
| 333 | 333 | Stage2ClangArgShared, |
| 334 | 334 | Stage2ClangArgRDynamic, |
| 335 | 335 | Stage2ClangArgWL, |
| 336 | Stage2ClangArgPreprocess, | |
| 336 | 337 | }; |
| 337 | 338 | |
| 338 | 339 | // ABI warning |
tools/update_clang_options.zig+9-1| ... | ... | @@ -76,12 +76,20 @@ const known_options = [_]KnownOpt{ |
| 76 | 76 | }, |
| 77 | 77 | .{ |
| 78 | 78 | .name = "E", |
| 79 | .ident = "driver_punt", | |
| 79 | .ident = "preprocess", | |
| 80 | }, | |
| 81 | .{ | |
| 82 | .name = "preprocess", | |
| 83 | .ident = "preprocess", | |
| 80 | 84 | }, |
| 81 | 85 | .{ |
| 82 | 86 | .name = "S", |
| 83 | 87 | .ident = "driver_punt", |
| 84 | 88 | }, |
| 89 | .{ | |
| 90 | .name = "assemble", | |
| 91 | .ident = "driver_punt", | |
| 92 | }, | |
| 85 | 93 | }; |
| 86 | 94 | |
| 87 | 95 | const blacklisted_options = [_][]const u8{}; |