Skip to content

Commit

Permalink
fix missing compiler_rt in release modes
Browse files Browse the repository at this point in the history
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
  • Loading branch information
andrewrk committed Oct 25, 2017
1 parent d7e28f9 commit 1828f8e
Show file tree
Hide file tree
Showing 17 changed files with 18 additions and 21 deletions.
4 changes: 2 additions & 2 deletions src/codegen.cpp
Expand Up @@ -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;
}

Expand Down
1 change: 1 addition & 0 deletions src/link.cpp
Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion std/special/compiler_rt/comparetf2.zig
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
6 changes: 1 addition & 5 deletions std/special/compiler_rt/index.zig
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down
2 changes: 1 addition & 1 deletion 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);
Expand Down

0 comments on commit 1828f8e

Please sign in to comment.