-
Notifications
You must be signed in to change notification settings - Fork 11.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ThinLTO] Fix import of multiply defined global variables
Currently, if there is a module that contains a strong definition of a global variable and a module that has both a weak definition for the same global and a reference to it, it may result in an undefined symbol error while linking with ThinLTO. It happens because: * the strong definition become internal because it is read-only and can be imported; * the weak definition gets replaced by a declaration because it's non-prevailing; * the strong definition failed to be imported because the destination module already contains another definition of the global yet this def is non-prevailing. The patch adds a check to computeImportForReferencedGlobals() that allows considering a global variable for being imported even if the module contains a definition of it in the case this def has an interposable linkage type. Note that currently the check is based only on the linkage type (and this seems to be enough at the moment), but it might be worth to account the information whether the def is prevailing or not. Reviewed By: tejohnson Differential Revision: https://reviews.llvm.org/D95943
- Loading branch information
1 parent
38ab47c
commit e97aab8
Showing
2 changed files
with
60 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
; RUN: split-file %s %t.dir | ||
|
||
; RUN: opt -module-summary %t.dir/1.ll -o %t1.bc | ||
; RUN: opt -module-summary %t.dir/2.ll -o %t2.bc | ||
|
||
; RUN: llvm-lto2 run -save-temps %t1.bc %t2.bc -o %t.out \ | ||
; RUN: -r=%t1.bc,main,plx \ | ||
; RUN: -r=%t1.bc,G \ | ||
; RUN: -r=%t2.bc,G,pl | ||
; RUN: llvm-dis %t.out.1.3.import.bc -o - | FileCheck %s | ||
; RUN: llvm-dis %t.out.2.3.import.bc -o - | FileCheck %s | ||
|
||
; Test that a non-prevailing def with interposable linkage doesn't prevent | ||
; importing a suitable definition from a prevailing module. | ||
|
||
; CHECK: @G = internal local_unnamed_addr global i32 42 | ||
|
||
;--- 1.ll | ||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
@G = weak dso_local local_unnamed_addr global i32 0, align 4 | ||
|
||
define dso_local i32 @main() local_unnamed_addr { | ||
%1 = load i32, i32* @G, align 4 | ||
ret i32 %1 | ||
} | ||
|
||
;--- 2.ll | ||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
@G = dso_local local_unnamed_addr global i32 42, align 4 |