[llvm] r349667 - [ThinLTO] Remove dllimport attribute from locally defined symbols

Matthew Voss via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 19 11:07:45 PST 2018


Author: ormris
Date: Wed Dec 19 11:07:45 2018
New Revision: 349667

URL: http://llvm.org/viewvc/llvm-project?rev=349667&view=rev
Log:
[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

Added:
    llvm/trunk/test/LTO/Resolution/X86/local-def-dllimport.ll
Modified:
    llvm/trunk/lib/LTO/LTO.cpp

Modified: llvm/trunk/lib/LTO/LTO.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTO.cpp?rev=349667&r1=349666&r2=349667&view=diff
==============================================================================
--- llvm/trunk/lib/LTO/LTO.cpp (original)
+++ llvm/trunk/lib/LTO/LTO.cpp Wed Dec 19 11:07:45 2018
@@ -693,8 +693,12 @@ LTO::addRegularLTO(BitcodeModule BM, Arr
       }
 
       // 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

Added: llvm/trunk/test/LTO/Resolution/X86/local-def-dllimport.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/LTO/Resolution/X86/local-def-dllimport.ll?rev=349667&view=auto
==============================================================================
--- llvm/trunk/test/LTO/Resolution/X86/local-def-dllimport.ll (added)
+++ llvm/trunk/test/LTO/Resolution/X86/local-def-dllimport.ll Wed Dec 19 11:07:45 2018
@@ -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
+ at 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"}




More information about the llvm-commits mailing list