From 6f03dce4ddd70db26f81ba8db6f97e559d74d0b3 Mon Sep 17 00:00:00 2001 From: Teresa Johnson Date: Wed, 18 Jan 2017 16:58:43 +0000 Subject: [PATCH] Don't create a comdat group for a dropped def with initializer 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 | 7 +++++-- test/CodeGen/X86/dropped_constructor.ll | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/X86/dropped_constructor.ll diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 9f6caa95a9e..821e336a823 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -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 index 00000000000..3478422a34f --- /dev/null +++ b/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 +} -- 2.50.1