Commit c0b4121ff2

Andrew Kelley <andrew@ziglang.org>
2019-07-17 03:38:18
libc headers before C language headers, and disable libunwind on arm32
1 parent ec92739
src/codegen.cpp
@@ -8390,15 +8390,16 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa
         }
     }
 
-    args.append("-isystem");
-    args.append(buf_ptr(g->zig_c_headers_dir));
-
     for (size_t i = 0; i < g->libc_include_dir_len; i += 1) {
         Buf *include_dir = g->libc_include_dir_list[i];
         args.append("-isystem");
         args.append(buf_ptr(include_dir));
     }
 
+    // According to Rich Felker libc headers are supposed to go before C language headers.
+    args.append("-isystem");
+    args.append(buf_ptr(g->zig_c_headers_dir));
+
     if (g->zig_target->is_native) {
         args.append("-march=native");
     } else {
src/link.cpp
@@ -1775,11 +1775,15 @@ static void construct_linker_job_elf(LinkJob *lj) {
                 lj->args.append("--no-as-needed");
             }
         } else if (target_is_glibc(g->zig_target)) {
-            lj->args.append(build_libunwind(g));
+            if (target_supports_libunwind(g->zig_target)) {
+                lj->args.append(build_libunwind(g));
+            }
             add_glibc_libs(lj);
             lj->args.append(get_libc_crt_file(g, "libc_nonshared.a"));
         } else if (target_is_musl(g->zig_target)) {
-            lj->args.append(build_libunwind(g));
+            if (target_supports_libunwind(g->zig_target)) {
+                lj->args.append(build_libunwind(g));
+            }
             lj->args.append(build_musl(g));
         } else {
             zig_unreachable();
src/target.cpp
@@ -1687,3 +1687,9 @@ const char *target_arch_musl_name(ZigLLVM_ArchType arch) {
     }
 }
 
+bool target_supports_libunwind(const ZigTarget *target) {
+    if (target->arch == ZigLLVM_arm || target->arch == ZigLLVM_armeb) {
+        return false;
+    }
+    return true;
+}
src/target.hpp
@@ -189,6 +189,7 @@ bool target_is_single_threaded(const ZigTarget *target);
 bool target_supports_stack_probing(const ZigTarget *target);
 bool target_has_debug_info(const ZigTarget *target);
 const char *target_arch_musl_name(ZigLLVM_ArchType arch);
+bool target_supports_libunwind(const ZigTarget *target);
 
 uint32_t target_arch_pointer_bit_width(ZigLLVM_ArchType arch);