mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 08:26:29 +00:00
[ThinLTO] Remove dllimport attribute from locally defined symbols
Summary: The LTO/ThinLTO driver currently creates invalid bitcode by setting symbols marked dllimport as dso_local. The compiler often has access to the definition (often dllexport) and the declaration (often dllimport) of an object at link-time, leading to a conflicting declaration. This patch resolves the inconsistency by removing the dllimport attribute. Reviewers: tejohnson, pcc, rnk, echristo Reviewed By: rnk Subscribers: dmikulin, wristow, mehdi_amini, inglorion, eraman, steven_wu, dexonsmith, dang, llvm-commits Differential Revision: https://reviews.llvm.org/D55627 llvm-svn: 349667
This commit is contained in:
parent
5e7f539f83
commit
ef16314d07
@ -693,8 +693,12 @@ LTO::addRegularLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,
|
||||
}
|
||||
|
||||
// Set the 'local' flag based on the linker resolution for this symbol.
|
||||
if (Res.FinalDefinitionInLinkageUnit)
|
||||
if (Res.FinalDefinitionInLinkageUnit) {
|
||||
GV->setDSOLocal(true);
|
||||
if (GV->hasDLLImportStorageClass())
|
||||
GV->setDLLStorageClass(GlobalValue::DLLStorageClassTypes::
|
||||
DefaultStorageClass);
|
||||
}
|
||||
}
|
||||
// Common resolution: collect the maximum size/alignment over all commons.
|
||||
// We also record if we see an instance of a common as prevailing, so that
|
||||
|
32
test/LTO/Resolution/X86/local-def-dllimport.ll
Normal file
32
test/LTO/Resolution/X86/local-def-dllimport.ll
Normal file
@ -0,0 +1,32 @@
|
||||
; RUN: opt -thinlto-bc -o %t0.bc %s
|
||||
; RUN: llvm-lto2 run -r %t0.bc,__imp_f,l \
|
||||
; RUN: -r %t0.bc,g,p \
|
||||
; RUN: -r %t0.bc,g,l \
|
||||
; RUN: -r %t0.bc,e,l \
|
||||
; RUN: -r %t0.bc,main,x \
|
||||
; RUN: -save-temps -o %t1 %t0.bc
|
||||
; RUN: llvm-dis %t1.1.3.import.bc -o - | FileCheck %s
|
||||
source_filename = "test.cpp"
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
$g = comdat any
|
||||
@g = global i8 42, comdat, !type !0
|
||||
|
||||
; CHECK: define
|
||||
; CHECK-NOT: dllimport
|
||||
; CHECK-SAME: @f
|
||||
define available_externally dllimport i8* @f() {
|
||||
ret i8* @g
|
||||
}
|
||||
|
||||
define i8* @e() {
|
||||
ret i8* @g
|
||||
}
|
||||
|
||||
define i32 @main() {
|
||||
%1 = call i8* @f()
|
||||
%2 = ptrtoint i8* %1 to i32
|
||||
ret i32 %2
|
||||
}
|
||||
!0 = !{i32 0, !"typeid"}
|
Loading…
Reference in New Issue
Block a user