]> granicus.if.org Git - llvm/commitdiff
Don't create a comdat group for a dropped def with initializer
authorTeresa Johnson <tejohnson@google.com>
Wed, 18 Jan 2017 16:58:43 +0000 (16:58 +0000)
committerTeresa Johnson <tejohnson@google.com>
Wed, 18 Jan 2017 16:58:43 +0000 (16:58 +0000)
Non-prevailing weak/linkonce odr symbols will be dropped by ThinLTO to
available_externally when possible. If they had an initializer in the
global_ctors list, a comdat group was being created. This code
already had logic to skip available_externally defs, but now the
EliminateAvailableExternally pass will drop these symbols to
declarations earlier. Change the check to skip all declarations for
linker (which includes available_externally along with declarations).

Reviewers: mehdi_amini

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D28737

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292408 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/AsmPrinter.cpp
test/CodeGen/X86/dropped_constructor.ll [new file with mode: 0644]

index 9f6caa95a9edbd28d00116362495f908a76368fb..821e336a823562f04bde5b98d586495a68bf43e8 100644 (file)
@@ -1644,8 +1644,11 @@ void AsmPrinter::EmitXXStructorList(const DataLayout &DL, const Constant *List,
     const TargetLoweringObjectFile &Obj = getObjFileLowering();
     const MCSymbol *KeySym = nullptr;
     if (GlobalValue *GV = S.ComdatKey) {
-      if (GV->hasAvailableExternallyLinkage())
-        // If the associated variable is available_externally, some other TU
+      if (GV->isDeclarationForLinker())
+        // If the associated variable is not defined in this module
+        // (it might be available_externally, or have been an
+        // available_externally definition that was dropped by the
+        // EliminateAvailableExternally pass), some other TU
         // will provide its dynamic initializer.
         continue;
 
diff --git a/test/CodeGen/X86/dropped_constructor.ll b/test/CodeGen/X86/dropped_constructor.ll
new file mode 100644 (file)
index 0000000..3478422
--- /dev/null
@@ -0,0 +1,19 @@
+; Test to ensure that a global value that was dropped to a declaration
+; (e.g. ThinLTO will drop non-prevailing weak to declarations) does not
+; provoke creation of a comdat when it had an initializer.
+; RUN: llc -mtriple x86_64-unknown-linux-gnu < %s | FileCheck %s
+; CHECK-NOT: comdat
+
+; ModuleID = 'dropped_constructor.o'
+source_filename = "dropped_constructor.c"
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+@fv = external global i8, align 8
+@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @__cxx_global_var_init.33, i8* @fv }]
+
+; Function Attrs: norecurse nounwind
+define internal void @__cxx_global_var_init.33() section ".text.startup" {
+  store i8 1, i8* @fv, align 8
+  ret void
+}