[lld] r364273 - Fix an issue that common symbols are not internalized under some condition.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 24 23:58:07 PDT 2019


Author: ruiu
Date: Mon Jun 24 23:58:07 2019
New Revision: 364273

URL: http://llvm.org/viewvc/llvm-project?rev=364273&view=rev
Log:
Fix an issue that common symbols are not internalized under some condition.

r360841 introduced CommonSymbol class. An unintended behavioral change
introduced by that change was that common symbols are not internalized
by LTO under some condition. This patch fixes that issue.

The issue occurred under the following condition:

  1. There exists a common symbol
  2. At least one DSO is given to lld or -pie is used

If the above conditions are met, Symbol::includeInDynsym() returned a
wrong value for a common symbol.

Fixes https://bugs.llvm.org/show_bug.cgi?id=41978

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

Added:
    lld/trunk/test/ELF/lto/common4.ll
Modified:
    lld/trunk/ELF/Symbols.cpp

Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=364273&r1=364272&r2=364273&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Mon Jun 24 23:58:07 2019
@@ -275,13 +275,13 @@ bool Symbol::includeInDynsym() const {
     return false;
   if (computeBinding() == STB_LOCAL)
     return false;
+
   // If a PIE binary was not linked against any shared libraries, then we can
   // safely drop weak undef symbols from .dynsym.
   if (isUndefWeak() && Config->Pie && SharedFiles.empty())
     return false;
-  if (!isDefined())
-    return true;
-  return ExportDynamic;
+
+  return isUndefined() || isShared() || ExportDynamic;
 }
 
 // Print out a log message for --trace-symbol.

Added: lld/trunk/test/ELF/lto/common4.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/common4.ll?rev=364273&view=auto
==============================================================================
--- lld/trunk/test/ELF/lto/common4.ll (added)
+++ lld/trunk/test/ELF/lto/common4.ll Mon Jun 24 23:58:07 2019
@@ -0,0 +1,21 @@
+; REQUIRES: x86
+
+;; Make sure that common symbols are properly internalized.
+;; In this file, @a does not interpose any symbol in a DSO,
+;; so LTO should be able to internelize it.
+
+; RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux /dev/null -o %t.so.o
+; RUN: ld.lld -shared -o %t.so %t.so.o
+
+; RUN: llvm-as %s -o %t.o
+; RUN: ld.lld -o %t.exe -save-temps %t.o %t.so
+; RUN: llvm-dis < %t.exe.0.2.internalize.bc | FileCheck %s
+
+; RUN: ld.lld -pie -o %t.exe -save-temps %t.o
+; RUN: llvm-dis < %t.exe.0.2.internalize.bc | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+ at a = common dso_local local_unnamed_addr global i32 0, align 4
+; CHECK-DAG: @a = internal global i32 0, align 4




More information about the llvm-commits mailing list