[lld] r263413 - [ELF] implement --warn-common/--no-warn-common

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 14 02:19:30 PDT 2016


Author: grimar
Date: Mon Mar 14 04:19:30 2016
New Revision: 263413

URL: http://llvm.org/viewvc/llvm-project?rev=263413&view=rev
Log:
[ELF] implement --warn-common/--no-warn-common

-warn-common
Warn when a common symbol is combined with another common symbol
or with a symbol definition.  Unix linkers allow  this  somewhat
sloppy  practice, but linkers on some other operating systems do
not.  This option allows you to  find  potential  problems  from
combining global symbols.

Differential revision: http://reviews.llvm.org/D17998

Added:
    lld/trunk/test/ELF/Inputs/warn-common.s
    lld/trunk/test/ELF/Inputs/warn-common2.s
    lld/trunk/test/ELF/warn-common.s
Modified:
    lld/trunk/ELF/Config.h
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/Options.td
    lld/trunk/ELF/Symbols.cpp

Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=263413&r1=263412&r2=263413&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Mon Mar 14 04:19:30 2016
@@ -78,6 +78,7 @@ struct Configuration {
   bool SysvHash = true;
   bool Threads;
   bool Verbose;
+  bool WarnCommon;
   bool ZExecStack;
   bool ZNodelete;
   bool ZNow;

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=263413&r1=263412&r2=263413&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Mon Mar 14 04:19:30 2016
@@ -244,6 +244,7 @@ void LinkerDriver::readConfigs(opt::Inpu
   Config->StripAll = Args.hasArg(OPT_strip_all);
   Config->Threads = Args.hasArg(OPT_threads);
   Config->Verbose = Args.hasArg(OPT_verbose);
+  Config->WarnCommon = Args.hasArg(OPT_warn_common);
 
   Config->DynamicLinker = getString(Args, OPT_dynamic_linker);
   Config->Entry = getString(Args, OPT_entry);

Modified: lld/trunk/ELF/Options.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=263413&r1=263412&r2=263413&view=diff
==============================================================================
--- lld/trunk/ELF/Options.td (original)
+++ lld/trunk/ELF/Options.td Mon Mar 14 04:19:30 2016
@@ -131,6 +131,9 @@ def verbose : Flag<["--"], "verbose">;
 def version : Flag<["--", "-"], "version">,
   HelpText<"Display the version number">;
 
+def warn_common : Flag<["--", "-"], "warn-common">,
+  HelpText<"Warn about duplicate common symbols">;
+
 def whole_archive : Flag<["--", "-"], "whole-archive">,
   HelpText<"Force load of all members in a static library">;
 
@@ -178,9 +181,9 @@ def start_group_paren: Flag<["-"], "(">;
 def fatal_warnings : Flag<["--"], "fatal-warnings">;
 def no_add_needed : Flag<["--"], "no-add-needed">;
 def no_fatal_warnings : Flag<["--"], "no-fatal-warnings">;
+def no_warn_common : Flag<["--", "-"], "no-warn-common">;
 def no_warn_mismatch : Flag<["--"], "no-warn-mismatch">;
 def version_script : Separate<["--"], "version-script">;
-def warn_common : Flag<["--"], "warn-common">;
 def warn_shared_textrel : Flag<["--"], "warn-shared-textrel">;
 def G : Separate<["-"], "G">;
 

Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=263413&r1=263412&r2=263413&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Mon Mar 14 04:19:30 2016
@@ -159,6 +159,8 @@ static uint8_t getMinVisibility(uint8_t
 }
 
 static int compareCommons(DefinedCommon *A, DefinedCommon *B) {
+  if (Config->WarnCommon)
+    warning("multiple common of " + A->getName());
   A->Alignment = B->Alignment = std::max(A->Alignment, B->Alignment);
   if (A->Size < B->Size)
     return -1;
@@ -199,6 +201,8 @@ template <class ELFT> int SymbolBody::co
   if (isCommon() && Other->isCommon())
     return compareCommons(cast<DefinedCommon>(this),
                           cast<DefinedCommon>(Other));
+  if (Config->WarnCommon)
+    warning("common " + this->getName() + " is overridden");
   return isCommon() ? -1 : 1;
 }
 

Added: lld/trunk/test/ELF/Inputs/warn-common.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/Inputs/warn-common.s?rev=263413&view=auto
==============================================================================
--- lld/trunk/test/ELF/Inputs/warn-common.s (added)
+++ lld/trunk/test/ELF/Inputs/warn-common.s Mon Mar 14 04:19:30 2016
@@ -0,0 +1,2 @@
+.type arr, at object
+.comm arr,8,4

Added: lld/trunk/test/ELF/Inputs/warn-common2.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/Inputs/warn-common2.s?rev=263413&view=auto
==============================================================================
--- lld/trunk/test/ELF/Inputs/warn-common2.s (added)
+++ lld/trunk/test/ELF/Inputs/warn-common2.s Mon Mar 14 04:19:30 2016
@@ -0,0 +1,8 @@
+.type arr, at object
+.data
+.globl arr
+.p2align 2
+arr:
+ .long 1
+ .long 0
+ .size arr, 8

Added: lld/trunk/test/ELF/warn-common.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/warn-common.s?rev=263413&view=auto
==============================================================================
--- lld/trunk/test/ELF/warn-common.s (added)
+++ lld/trunk/test/ELF/warn-common.s Mon Mar 14 04:19:30 2016
@@ -0,0 +1,25 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/warn-common.s -o %t2.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/warn-common2.s -o %t3.o
+
+## Report multiple commons if warn-common is specified
+# RUN: ld.lld --warn-common %t1.o %t2.o -o %t.out 2>&1 | FileCheck %s --check-prefix=WARN
+# WARN: multiple common of arr
+
+## no-warn-common is ignored
+# RUN: ld.lld --no-warn-common %t1.o %t2.o -o %t.out
+# RUN: llvm-readobj %t.out > /dev/null
+
+## Report if common is overridden
+# RUN: ld.lld --warn-common %t1.o %t3.o -o %t.out 2>&1 | FileCheck %s --check-prefix=OVER
+# OVER: common arr is overridden
+
+## Report if common is overridden, but in different order
+# RUN: ld.lld --warn-common %t3.o %t1.o -o %t.out 2>&1 | FileCheck %s --check-prefix=OVER
+
+.globl _start
+_start:
+
+.type arr, at object
+.comm arr,4,4




More information about the llvm-commits mailing list