Commit e2ce00f272

Andrew Kelley <andrew@ziglang.org>
2019-03-07 19:04:10
fix regressions on macos
1 parent ffaa4f0
src/codegen.cpp
@@ -240,10 +240,6 @@ void codegen_set_emit_file_type(CodeGen *g, EmitFileType emit_file_type) {
     g->emit_file_type = emit_file_type;
 }
 
-void codegen_set_is_static(CodeGen *g, bool is_static) {
-    g->is_static = is_static;
-}
-
 void codegen_set_each_lib_rpath(CodeGen *g, bool each_lib_rpath) {
     g->each_lib_rpath = each_lib_rpath;
 }
@@ -9265,7 +9261,9 @@ void codegen_build_and_link(CodeGen *g) {
             }
         }
 
-        if (g->emit_file_type == EmitFileTypeBinary && !compilation_is_already_done(g)) {
+        if (g->emit_file_type == EmitFileTypeBinary &&
+            (g->link_objects.length > 1 || g->out_type != OutTypeObj))
+        {
             codegen_link(g);
         }
     }
src/codegen.hpp
@@ -25,7 +25,6 @@ void codegen_set_is_test(CodeGen *codegen, bool is_test);
 void codegen_set_each_lib_rpath(CodeGen *codegen, bool each_lib_rpath);
 
 void codegen_set_emit_file_type(CodeGen *g, EmitFileType emit_file_type);
-void codegen_set_is_static(CodeGen *codegen, bool is_static);
 void codegen_set_strip(CodeGen *codegen, bool strip);
 void codegen_set_errmsg_color(CodeGen *codegen, ErrColor err_color);
 void codegen_set_out_name(CodeGen *codegen, Buf *out_name);
src/link.cpp
@@ -574,7 +574,7 @@ static Buf *build_a_raw(CodeGen *parent_gen, const char *aname, Buf *full_path)
 
     CodeGen *child_gen = create_child_codegen(parent_gen, full_path, child_out_type,
             parent_gen->libc);
-    codegen_set_is_static(child_gen, true);
+    child_gen->is_static = true;
     codegen_set_out_name(child_gen, buf_create_from_str(aname));
 
     // This is so that compiler_rt and builtin libraries know whether they
@@ -699,7 +699,7 @@ static void construct_linker_job_elf(LinkJob *lj) {
     lj->args.append(getLDMOption(g->zig_target));
 
     bool is_lib = g->out_type == OutTypeLib;
-    bool shared = !g->is_static && is_lib;
+    bool is_dyn_lib = !g->is_static && is_lib;
     Buf *soname = nullptr;
     if (g->is_static) {
         if (g->zig_target->arch == ZigLLVM_arm || g->zig_target->arch == ZigLLVM_armeb ||
@@ -709,7 +709,7 @@ static void construct_linker_job_elf(LinkJob *lj) {
         } else {
             lj->args.append("-static");
         }
-    } else if (shared) {
+    } else if (is_dyn_lib) {
         lj->args.append("-shared");
 
         if (buf_len(&g->output_file_path) == 0) {
@@ -780,7 +780,7 @@ static void construct_linker_job_elf(LinkJob *lj) {
 
     }
 
-    if (shared) {
+    if (is_dyn_lib) {
         lj->args.append("-soname");
         lj->args.append(buf_ptr(soname));
     }
@@ -1231,36 +1231,34 @@ static void construct_linker_job_macho(LinkJob *lj) {
     }
 
     bool is_lib = g->out_type == OutTypeLib;
-    bool shared = !g->is_static && is_lib;
+    bool is_dyn_lib = !g->is_static && is_lib;
     if (g->is_static) {
         lj->args.append("-static");
     } else {
         lj->args.append("-dynamic");
     }
 
-    if (is_lib) {
-        if (!g->is_static) {
-            lj->args.append("-dylib");
+    if (is_dyn_lib) {
+        lj->args.append("-dylib");
 
-            Buf *compat_vers = buf_sprintf("%" ZIG_PRI_usize ".0.0", g->version_major);
-            lj->args.append("-compatibility_version");
-            lj->args.append(buf_ptr(compat_vers));
+        Buf *compat_vers = buf_sprintf("%" ZIG_PRI_usize ".0.0", g->version_major);
+        lj->args.append("-compatibility_version");
+        lj->args.append(buf_ptr(compat_vers));
 
-            Buf *cur_vers = buf_sprintf("%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize,
-                g->version_major, g->version_minor, g->version_patch);
-            lj->args.append("-current_version");
-            lj->args.append(buf_ptr(cur_vers));
+        Buf *cur_vers = buf_sprintf("%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize,
+            g->version_major, g->version_minor, g->version_patch);
+        lj->args.append("-current_version");
+        lj->args.append(buf_ptr(cur_vers));
 
-            // TODO getting an error when running an executable when doing this rpath thing
-            //Buf *dylib_install_name = buf_sprintf("@rpath/lib%s.%" ZIG_PRI_usize ".dylib",
-            //    buf_ptr(g->root_out_name), g->version_major);
-            //lj->args.append("-install_name");
-            //lj->args.append(buf_ptr(dylib_install_name));
+        // TODO getting an error when running an executable when doing this rpath thing
+        //Buf *dylib_install_name = buf_sprintf("@rpath/lib%s.%" ZIG_PRI_usize ".dylib",
+        //    buf_ptr(g->root_out_name), g->version_major);
+        //lj->args.append("-install_name");
+        //lj->args.append(buf_ptr(dylib_install_name));
 
-            if (buf_len(&g->output_file_path) == 0) {
-                buf_appendf(&g->output_file_path, "lib%s.%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".dylib",
-                    buf_ptr(g->root_out_name), g->version_major, g->version_minor, g->version_patch);
-            }
+        if (buf_len(&g->output_file_path) == 0) {
+            buf_appendf(&g->output_file_path, "lib%s.%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".dylib",
+                buf_ptr(g->root_out_name), g->version_major, g->version_minor, g->version_patch);
         }
     }
 
@@ -1302,38 +1300,14 @@ static void construct_linker_job_macho(LinkJob *lj) {
         Buf *rpath = g->rpath_list.at(i);
         add_rpath(lj, rpath);
     }
-    add_rpath(lj, &g->output_file_path);
+    if (is_dyn_lib) {
+        add_rpath(lj, &g->output_file_path);
+    }
 
-    if (shared) {
+    if (is_dyn_lib) {
         if (g->system_linker_hack) {
             lj->args.append("-headerpad_max_install_names");
         }
-    } else if (g->is_static) {
-        lj->args.append("-lcrt0.o");
-    } else {
-        switch (platform.kind) {
-            case MacOS:
-                if (darwin_version_lt(&platform, 10, 5)) {
-                    lj->args.append("-lcrt1.o");
-                } else if (darwin_version_lt(&platform, 10, 6)) {
-                    lj->args.append("-lcrt1.10.5.o");
-                } else if (darwin_version_lt(&platform, 10, 8)) {
-                    lj->args.append("-lcrt1.10.6.o");
-                }
-                break;
-            case IPhoneOS:
-                if (g->zig_target->arch == ZigLLVM_aarch64) {
-                    // iOS does not need any crt1 files for arm64
-                } else if (darwin_version_lt(&platform, 3, 1)) {
-                    lj->args.append("-lcrt1.o");
-                } else if (darwin_version_lt(&platform, 6, 0)) {
-                    lj->args.append("-lcrt1.3.1.o");
-                }
-                break;
-            case IPhoneOSSimulator:
-                // no crt1.o needed
-                break;
-        }
     }
 
     for (size_t i = 0; i < g->lib_dirs.length; i += 1) {
@@ -1347,7 +1321,7 @@ static void construct_linker_job_macho(LinkJob *lj) {
     }
 
     // compiler_rt on darwin is missing some stuff, so we still build it and rely on LinkOnce
-    if (g->out_type == OutTypeExe || (g->out_type == OutTypeLib && !g->is_static)) {
+    if (g->out_type == OutTypeExe || is_dyn_lib) {
         Buf *compiler_rt_o_path = build_compiler_rt(g);
         lj->args.append(buf_ptr(compiler_rt_o_path));
     }
@@ -1356,11 +1330,7 @@ static void construct_linker_job_macho(LinkJob *lj) {
         for (size_t lib_i = 0; lib_i < g->link_libs_list.length; lib_i += 1) {
             LinkLib *link_lib = g->link_libs_list.at(lib_i);
             if (buf_eql_str(link_lib->name, "c")) {
-                // on Darwin, libSystem has libc in it, but also you have to use it
-                // to make syscalls because the syscall numbers are not documented
-                // and change between versions.
-                // so we always link against libSystem
-                lj->args.append("-lSystem");
+                continue;
             } else {
                 if (strchr(buf_ptr(link_lib->name), '/') == nullptr) {
                     Buf *arg = buf_sprintf("-l%s", buf_ptr(link_lib->name));
@@ -1370,6 +1340,11 @@ static void construct_linker_job_macho(LinkJob *lj) {
                 }
             }
         }
+        // on Darwin, libSystem has libc in it, but also you have to use it
+        // to make syscalls because the syscall numbers are not documented
+        // and change between versions.
+        // so we always link against libSystem
+        lj->args.append("-lSystem");
     } else {
         lj->args.append("-undefined");
         lj->args.append("dynamic_lookup");
src/main.cpp
@@ -1037,7 +1037,7 @@ int main(int argc, char **argv) {
 
             codegen_set_llvm_argv(g, llvm_argv.items + 1, llvm_argv.length - 2);
             codegen_set_strip(g, strip);
-            codegen_set_is_static(g, is_static);
+            g->is_static = is_static;
             if (dynamic_linker != nullptr)
                 codegen_set_dynamic_linker(g, buf_create_from_str(dynamic_linker));
             g->verbose_tokenize = verbose_tokenize;
src/os.cpp
@@ -1414,13 +1414,17 @@ static void init_rand() {
     if (fd == -1) {
         zig_panic("unable to open /dev/urandom");
     }
-    const char bytes[sizeof(unsigned)];
-    unsigned seed;
-    while (read(fd, bytes, sizeof(unsigned)) == -1) {
+    char bytes[sizeof(unsigned)];
+    size_t amt_read;
+    while ((amt_read = read(fd, bytes, sizeof(unsigned))) == -1) {
         if (errno == EINTR) continue;
         zig_panic("unable to read /dev/urandom");
     }
+    if (amt_read != sizeof(unsigned)) {
+        zig_panic("unable to read enough bytes from /dev/urandom");
+    }
     close(fd);
+    unsigned seed;
     memcpy(&seed, bytes, sizeof(unsigned));
     srand(seed);
 #endif