diff --git a/src/cache_hash.cpp b/src/cache_hash.cpp index 2a0810eced..cd0cc5324d 100644 --- a/src/cache_hash.cpp +++ b/src/cache_hash.cpp @@ -470,6 +470,8 @@ Error cache_add_dep_file(CacheHash *ch, Buf *dep_file_path, bool verbose) { Error err; Buf *contents = buf_alloc(); if ((err = os_fetch_file_path(dep_file_path, contents))) { + if (err == ErrorFileNotFound) + return err; if (verbose) { fprintf(stderr, "unable to read .d file: %s\n", err_str(err)); } diff --git a/src/codegen.cpp b/src/codegen.cpp index d21ada1b23..4529abcc83 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -8334,8 +8334,6 @@ void add_cc_args(CodeGen *g, ZigList &args, const char *out_dep_pa for (size_t arg_i = 0; arg_i < g->clang_argv_len; arg_i += 1) { args.append(g->clang_argv[arg_i]); } - - } void codegen_translate_c(CodeGen *g, Buf *full_path, FILE *out_file, bool use_userland_implementation) { @@ -8582,24 +8580,6 @@ static void gen_root_source(CodeGen *g) { } -void codegen_add_assembly(CodeGen *g, Buf *path) { - g->assembly_files.append(path); -} - -static void gen_global_asm(CodeGen *g) { - Buf contents = BUF_INIT; - Error err; - for (size_t i = 0; i < g->assembly_files.length; i += 1) { - Buf *asm_file = g->assembly_files.at(i); - // No need to use the caching system for these fetches because they - // are handled separately. - if ((err = os_fetch_file_path(asm_file, &contents))) { - zig_panic("Unable to read %s: %s", buf_ptr(asm_file), err_str(err)); - } - buf_append_buf(&g->global_asm, &contents); - } -} - static void print_zig_cc_cmd(const char *zig_exe, ZigList *args) { fprintf(stderr, "%s", zig_exe); for (size_t arg_i = 0; arg_i < args->length; arg_i += 1) { @@ -8750,10 +8730,16 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { // add the files depended on to the cache system if ((err = cache_add_dep_file(cache_hash, out_dep_path, true))) { - fprintf(stderr, "Failed to add C source dependencies to cache: %s\n", err_str(err)); - exit(1); + // Don't treat the absence of the .d file as a fatal error, the + // compiler may not produce one eg. when compiling .s files + if (err != ErrorFileNotFound) { + fprintf(stderr, "Failed to add C source dependencies to cache: %s\n", err_str(err)); + exit(1); + } + } + if (err != ErrorFileNotFound) { + os_delete_file(out_dep_path); } - os_delete_file(out_dep_path); if ((err = cache_final(cache_hash, &digest))) { fprintf(stderr, "Unable to finalize cache hash: %s\n", err_str(err)); @@ -9330,8 +9316,6 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) { cache_list_of_buf(ch, g->darwin_frameworks.items, g->darwin_frameworks.length); cache_list_of_buf(ch, g->rpath_list.items, g->rpath_list.length); cache_list_of_buf(ch, g->forbidden_libs.items, g->forbidden_libs.length); - cache_list_of_file(ch, g->assembly_files.items, g->assembly_files.length); - cache_int(ch, g->emit_file_type); cache_int(ch, g->build_mode); cache_int(ch, g->out_type); cache_bool(ch, g->zig_target->is_native); @@ -9392,7 +9376,7 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) { } static bool need_llvm_module(CodeGen *g) { - return g->assembly_files.length != 0 || buf_len(&g->root_package->root_src_path) != 0; + return buf_len(&g->root_package->root_src_path) != 0; } static void resolve_out_paths(CodeGen *g) { @@ -9499,7 +9483,6 @@ void codegen_build_and_link(CodeGen *g) { codegen_add_time_event(g, "Semantic Analysis"); - gen_global_asm(g); gen_root_source(g); } diff --git a/src/link.cpp b/src/link.cpp index 8900d0351b..dc73796247 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -59,14 +59,6 @@ static const char *build_libc_object(CodeGen *parent_gen, const char *name, CFil return buf_ptr(&child_gen->output_file_path); } -static const char *build_asm_object(CodeGen *parent_gen, const char *name, Buf *file) { - CodeGen *child_gen = create_child_codegen(parent_gen, nullptr, OutTypeObj, nullptr); - codegen_set_out_name(child_gen, buf_create_from_str(name)); - codegen_add_assembly(child_gen, file); - codegen_build_and_link(child_gen); - return buf_ptr(&child_gen->output_file_path); -} - static const char *path_from_zig_lib(CodeGen *g, const char *dir, const char *subpath) { Buf *dir1 = buf_alloc(); os_path_join(g->zig_lib_dir, buf_create_from_str(dir), dir1); @@ -140,6 +132,7 @@ static const char *build_libunwind(CodeGen *parent) { c_file->args.append(path_from_libunwind(parent, "include")); c_file->args.append("-fPIC"); c_file->args.append("-D_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS"); + c_file->args.append("-Wa,--noexecstack"); if (parent->zig_target->is_native) { c_file->args.append("-D_LIBUNWIND_IS_NATIVE_ONLY"); } @@ -406,12 +399,13 @@ static const char *musl_arch_name(const ZigTarget *target) { } } -static Buf *musl_start_asm_path(CodeGen *parent, const char *file) { - return buf_sprintf("%s" OS_SEP "libc" OS_SEP "musl" OS_SEP "crt" OS_SEP "%s" OS_SEP "%s", - buf_ptr(parent->zig_lib_dir), musl_arch_name(parent->zig_target), file); +static const char *musl_start_asm_path(CodeGen *parent, const char *file) { + Buf *result = buf_sprintf("%s" OS_SEP "libc" OS_SEP "musl" OS_SEP "crt" OS_SEP "%s" OS_SEP "%s", + buf_ptr(parent->zig_lib_dir), musl_arch_name(parent->zig_target), file); + return buf_ptr(result); } -static void musl_add_cc_args(CodeGen *parent, CFile *c_file) { +static void musl_add_cc_args(CodeGen *parent, CFile *c_file, bool want_O3) { c_file->args.append("-std=c99"); c_file->args.append("-ffreestanding"); // Musl adds these args to builds with gcc but clang does not support them. @@ -448,7 +442,11 @@ static void musl_add_cc_args(CodeGen *parent, CFile *c_file) { c_file->args.append(buf_ptr(buf_sprintf("%s" OS_SEP "libc" OS_SEP "include" OS_SEP "generic-musl", buf_ptr(parent->zig_lib_dir)))); - c_file->args.append("-Os"); + if (want_O3) + c_file->args.append("-O3"); + else + c_file->args.append("-Os"); + c_file->args.append("-fomit-frame-pointer"); c_file->args.append("-fno-unwind-tables"); c_file->args.append("-fno-asynchronous-unwind-tables"); @@ -574,19 +572,14 @@ static const char *build_musl(CodeGen *parent) { Buf *full_path = buf_sprintf("%s" OS_SEP "libc" OS_SEP "%s", buf_ptr(parent->zig_lib_dir), buf_ptr(src_file)); - if (src_kind == MuslSrcAsm) { - codegen_add_assembly(child_gen, full_path); - } else { - CFile *c_file = allocate(1); - c_file->source_path = buf_ptr(full_path); - musl_add_cc_args(parent, c_file); - c_file->args.append("-Qunused-arguments"); - c_file->args.append("-w"); // disable all warnings - if (src_kind == MuslSrcO3) { - c_file->args.append("-O3"); - } - c_source_files.append(c_file); - } + CFile *c_file = allocate(1); + c_file->source_path = buf_ptr(full_path); + + musl_add_cc_args(parent, c_file, src_kind == MuslSrcO3); + c_file->args.append("-Qunused-arguments"); + c_file->args.append("-w"); // disable all warnings + + c_source_files.append(c_file); } child_gen->c_source_files = c_source_files; @@ -744,20 +737,28 @@ static const char *get_libc_crt_file(CodeGen *parent, const char *file) { } } else if (parent->libc == nullptr && target_is_musl(parent->zig_target)) { if (strcmp(file, "crti.o") == 0) { - return build_asm_object(parent, "crti", musl_start_asm_path(parent, "crti.s")); + CFile *c_file = allocate(1); + c_file->source_path = musl_start_asm_path(parent, "crti.s"); + musl_add_cc_args(parent, c_file, false); + c_file->args.append("-Qunused-arguments"); + return build_libc_object(parent, "crti", c_file); } else if (strcmp(file, "crtn.o") == 0) { - return build_asm_object(parent, "crtn", musl_start_asm_path(parent, "crtn.s")); + CFile *c_file = allocate(1); + c_file->source_path = musl_start_asm_path(parent, "crtn.s"); + c_file->args.append("-Qunused-arguments"); + musl_add_cc_args(parent, c_file, false); + return build_libc_object(parent, "crtn", c_file); } else if (strcmp(file, "crt1.o") == 0) { CFile *c_file = allocate(1); c_file->source_path = path_from_libc(parent, "musl" OS_SEP "crt" OS_SEP "crt1.c"); - musl_add_cc_args(parent, c_file); + musl_add_cc_args(parent, c_file, false); c_file->args.append("-fno-stack-protector"); c_file->args.append("-DCRT"); return build_libc_object(parent, "crt1", c_file); } else if (strcmp(file, "Scrt1.o") == 0) { CFile *c_file = allocate(1); c_file->source_path = path_from_libc(parent, "musl" OS_SEP "crt" OS_SEP "Scrt1.c"); - musl_add_cc_args(parent, c_file); + musl_add_cc_args(parent, c_file, false); c_file->args.append("-fPIC"); c_file->args.append("-fno-stack-protector"); c_file->args.append("-DCRT"); diff --git a/src/main.cpp b/src/main.cpp index 5659624cb7..934c998435 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,7 +48,6 @@ static int print_full_usage(const char *arg0, FILE *file, int return_code) { " zen print zen of zig and exit\n" "\n" "Compile Options:\n" - " --assembly [source] add assembly file to build\n" " --c-source [options] [file] compile C source code\n" " --cache-dir [path] override the local cache directory\n" " --cache [auto|off|on] build in cache, print output path to stdout\n" @@ -428,7 +427,6 @@ int main(int argc, char **argv) { bool each_lib_rpath = false; ZigList objects = {0}; ZigList c_source_files = {0}; - ZigList asm_files = {0}; const char *test_filter = nullptr; const char *test_name_prefix = nullptr; size_t ver_major = 0; @@ -774,8 +772,6 @@ int main(int argc, char **argv) { break; } } - } else if (strcmp(arg, "--assembly") == 0) { - asm_files.append(argv[i]); } else if (strcmp(arg, "--cache-dir") == 0) { cache_dir = argv[i]; } else if (strcmp(arg, "-target") == 0) { @@ -971,14 +967,13 @@ int main(int argc, char **argv) { case CmdTranslateCUserland: case CmdTest: { - if (cmd == CmdBuild && !in_file && objects.length == 0 && asm_files.length == 0 && + if (cmd == CmdBuild && !in_file && objects.length == 0 && c_source_files.length == 0) { fprintf(stderr, "Expected at least one of these things:\n" " * Zig root source file argument\n" " * --object argument\n" - " * --assembly argument\n" " * --c-source argument\n"); return print_error_usage(arg0); } else if ((cmd == CmdTranslateC || cmd == CmdTranslateCUserland || @@ -1130,9 +1125,6 @@ int main(int argc, char **argv) { for (size_t i = 0; i < objects.length; i += 1) { codegen_add_object(g, buf_create_from_str(objects.at(i))); } - for (size_t i = 0; i < asm_files.length; i += 1) { - codegen_add_assembly(g, buf_create_from_str(asm_files.at(i))); - } } diff --git a/std/build.zig b/std/build.zig index b5ec97ab5f..ff64c6cb93 100644 --- a/std/build.zig +++ b/std/build.zig @@ -1376,7 +1376,7 @@ pub const LibExeObjStep = struct { try zig_args.append(name); }, LinkObject.AssemblyFile => |asm_file| { - try zig_args.append("--assembly"); + try zig_args.append("--c-source"); try zig_args.append(builder.pathFromRoot(asm_file)); }, LinkObject.CSourceFile => |c_source_file| {