Commit 1828f8eb8e

Andrew Kelley <superjoe30@gmail.com>
2017-10-25 03:28:56
fix missing compiler_rt in release modes
the optimizer was deleting compiler_rt symbols, so I changed the linkage type from LinkOnce to Weak also changed LinkOnce to mean linkonce_odr in llvm and Weak to mean weak_odr in llvm. See #563
1 parent d7e28f9
src/codegen.cpp
@@ -456,10 +456,10 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
             LLVMSetLinkage(fn_table_entry->llvm_value, LLVMExternalLinkage);
             break;
         case GlobalLinkageIdWeak:
-            LLVMSetLinkage(fn_table_entry->llvm_value, LLVMWeakAnyLinkage);
+            LLVMSetLinkage(fn_table_entry->llvm_value, LLVMWeakODRLinkage);
             break;
         case GlobalLinkageIdLinkOnce:
-            LLVMSetLinkage(fn_table_entry->llvm_value, LLVMLinkOnceAnyLinkage);
+            LLVMSetLinkage(fn_table_entry->llvm_value, LLVMLinkOnceODRLinkage);
             break;
     }
 
src/link.cpp
@@ -38,6 +38,7 @@ static Buf *build_o_raw(CodeGen *parent_gen, const char *oname, Buf *full_path)
 
     child_gen->want_h_file = false;
     child_gen->verbose_link = parent_gen->verbose_link;
+    child_gen->verbose_ir = parent_gen->verbose_ir;
 
     codegen_set_cache_dir(child_gen, parent_gen->cache_dir);
 
std/special/compiler_rt/comparetf2.zig
@@ -20,7 +20,7 @@ const infRep = exponentMask;
 
 const builtin = @import("builtin");
 const is_test = builtin.is_test;
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __letf2(a: f128, b: f128) -> c_int {
     @setDebugSafety(this, is_test);
std/special/compiler_rt/fixunsdfdi.zig
@@ -1,6 +1,6 @@
 const fixuint = @import("fixuint.zig").fixuint;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __fixunsdfdi(a: f64) -> u64 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/fixunsdfsi.zig
@@ -1,6 +1,6 @@
 const fixuint = @import("fixuint.zig").fixuint;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __fixunsdfsi(a: f64) -> u32 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/fixunsdfti.zig
@@ -1,6 +1,6 @@
 const fixuint = @import("fixuint.zig").fixuint;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __fixunsdfti(a: f64) -> u128 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/fixunssfdi.zig
@@ -1,6 +1,6 @@
 const fixuint = @import("fixuint.zig").fixuint;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __fixunssfdi(a: f32) -> u64 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/fixunssfsi.zig
@@ -1,6 +1,6 @@
 const fixuint = @import("fixuint.zig").fixuint;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __fixunssfsi(a: f32) -> u32 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/fixunssfti.zig
@@ -1,6 +1,6 @@
 const fixuint = @import("fixuint.zig").fixuint;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __fixunssfti(a: f32) -> u128 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/fixunstfdi.zig
@@ -1,6 +1,6 @@
 const fixuint = @import("fixuint.zig").fixuint;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __fixunstfdi(a: f128) -> u64 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/fixunstfsi.zig
@@ -1,6 +1,6 @@
 const fixuint = @import("fixuint.zig").fixuint;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __fixunstfsi(a: f128) -> u32 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/fixunstfti.zig
@@ -1,6 +1,6 @@
 const fixuint = @import("fixuint.zig").fixuint;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __fixunstfti(a: f128) -> u128 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/index.zig
@@ -26,7 +26,7 @@ const win32 = builtin.os == builtin.Os.windows and builtin.arch == builtin.Arch.
 const win64 = builtin.os == builtin.Os.windows and builtin.arch == builtin.Arch.x86_64;
 const win32_nocrt = win32 and !builtin.link_libc;
 const win64_nocrt = win64 and !builtin.link_libc;
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+pub const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.Weak;
 const strong_linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.Strong;
 
 const __udivmoddi4 = @import("udivmoddi4.zig").__udivmoddi4;
@@ -152,10 +152,6 @@ export nakedcc fn _chkstk() align(4) {
     @setGlobalLinkage(_chkstk, builtin.GlobalLinkage.Internal);
 }
 
-// TODO The implementation from compiler-rt causes crashes and
-// the implementation from disassembled ntdll seems to depend on
-// thread local storage. So we have given up this safety check
-// and simply have `ret`.
 export nakedcc fn __chkstk() align(4) {
     @setDebugSafety(this, false);
 
std/special/compiler_rt/udivmoddi4.zig
@@ -1,6 +1,6 @@
 const udivmod = @import("udivmod.zig").udivmod;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __udivmoddi4(a: u64, b: u64, maybe_rem: ?&u64) -> u64 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/udivmodti4.zig
@@ -1,6 +1,6 @@
 const udivmod = @import("udivmod.zig").udivmod;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __udivmodti4(a: u128, b: u128, maybe_rem: ?&u128) -> u128 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/udivti3.zig
@@ -1,6 +1,6 @@
 const __udivmodti4 = @import("udivmodti4.zig").__udivmodti4;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __udivti3(a: u128, b: u128) -> u128 {
     @setDebugSafety(this, builtin.is_test);
std/special/compiler_rt/umodti3.zig
@@ -1,6 +1,6 @@
 const __udivmodti4 = @import("udivmodti4.zig").__udivmodti4;
 const builtin = @import("builtin");
-const linkage = if (builtin.is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.LinkOnce;
+const linkage = @import("index.zig").linkage;
 
 export fn __umodti3(a: u128, b: u128) -> u128 {
     @setDebugSafety(this, builtin.is_test);