Skip to content

Commit

Permalink
Don't create a comdat group for a dropped def with initializer
Browse files Browse the repository at this point in the history
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

llvm-svn: 292408
  • Loading branch information
teresajohnson committed Jan 18, 2017
1 parent 6afbaf0 commit 2d384ac
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
7 changes: 5 additions & 2 deletions llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Expand Up @@ -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;

Expand Down
19 changes: 19 additions & 0 deletions llvm/test/CodeGen/X86/dropped_constructor.ll
@@ -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
}

0 comments on commit 2d384ac

Please sign in to comment.