[lld] r248733 - Implement --allow-multiple-definition.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 28 13:30:13 PDT 2015


Author: rafael
Date: Mon Sep 28 15:30:11 2015
New Revision: 248733

URL: http://llvm.org/viewvc/llvm-project?rev=248733&view=rev
Log:
Implement --allow-multiple-definition.

Patch by George Rimar!

Added:
    lld/trunk/test/elf2/Inputs/allow-multiple-definition.s
    lld/trunk/test/elf2/allow-multiple-definition.s
Modified:
    lld/trunk/ELF/Config.h
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/Options.td
    lld/trunk/ELF/SymbolTable.cpp

Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=248733&r1=248732&r2=248733&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Mon Sep 28 15:30:11 2015
@@ -29,6 +29,7 @@ struct Configuration {
   bool DiscardNone = false;
   bool ExportDynamic = false;
   bool NoInhibitExec = false;
+  bool AllowMultipleDefinition = false;
 };
 
 extern Configuration *Config;

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=248733&r1=248732&r2=248733&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Mon Sep 28 15:30:11 2015
@@ -139,6 +139,9 @@ void LinkerDriver::link(ArrayRef<const c
   if (Args.hasArg(OPT_noinhibit_exec))
     Config->NoInhibitExec = true;
 
+  if (Args.hasArg(OPT_allow_multiple_definition))
+    Config->AllowMultipleDefinition = true;
+
   // Create a list of input files.
   std::vector<MemoryBufferRef> Inputs;
 

Modified: lld/trunk/ELF/Options.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=248733&r1=248732&r2=248733&view=diff
==============================================================================
--- lld/trunk/ELF/Options.td (original)
+++ lld/trunk/ELF/Options.td Mon Sep 28 15:30:11 2015
@@ -38,6 +38,9 @@ def discard_none : Flag<["-"], "discard-
 def export_dynamic : Flag<["--"], "export-dynamic">,
      HelpText<"Put symbols in the dynamic symbol table">;
 
+def allow_multiple_definition: Flag<["--"], "allow-multiple-definition">,
+    HelpText<"Allow multiple definitions">;
+
 def L : Joined<["-"], "L">, MetaVarName<"<dir>">,
      HelpText<"Directory to search for libraries">;
 

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=248733&r1=248732&r2=248733&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Mon Sep 28 15:30:11 2015
@@ -150,8 +150,13 @@ void SymbolTable::dupError(const SymbolB
       NewFile = F.get();
   }
 
-  error(Twine("duplicate symbol: ") + Old.getName() + " in " +
-        OldFile->getName() + " and " + NewFile->getName());
+  std::string Msg = (Twine("duplicate symbol: ") + Old.getName() + " in " +
+                     OldFile->getName() + " and " + NewFile->getName())
+                        .str();
+  if (Config->AllowMultipleDefinition)
+    warning(Msg);
+  else
+    error(Msg);
 }
 
 // This function resolves conflicts if there's an existing symbol with

Added: lld/trunk/test/elf2/Inputs/allow-multiple-definition.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/Inputs/allow-multiple-definition.s?rev=248733&view=auto
==============================================================================
--- lld/trunk/test/elf2/Inputs/allow-multiple-definition.s (added)
+++ lld/trunk/test/elf2/Inputs/allow-multiple-definition.s Mon Sep 28 15:30:11 2015
@@ -0,0 +1,4 @@
+.globl _bar
+.type _bar, @function
+_bar:
+  mov $2, %eax

Added: lld/trunk/test/elf2/allow-multiple-definition.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/allow-multiple-definition.s?rev=248733&view=auto
==============================================================================
--- lld/trunk/test/elf2/allow-multiple-definition.s (added)
+++ lld/trunk/test/elf2/allow-multiple-definition.s Mon Sep 28 15:30:11 2015
@@ -0,0 +1,29 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/allow-multiple-definition.s -o %t2
+# RUN: not lld -flavor gnu2 %t1 %t2 -o %t3
+# RUN: lld -flavor gnu2 --allow-multiple-definition %t1 %t2 -o %t3
+# RUN: lld -flavor gnu2 --allow-multiple-definition %t2 %t1 -o %t4
+# RUN: llvm-objdump -d %t3 | FileCheck %s
+# RUN: llvm-objdump -d %t4 | FileCheck -check-prefix=REVERT %s
+
+# inputs contain different constants for instuction movl.
+# Tests below checks that order of files in command line
+# affects on what symbol will be used.
+# If flag allow-multiple-definition is enabled the first
+# meet symbol should be used.
+
+# CHECK: _bar:
+# CHECK-NEXT: 11000:   b8 01 00 00 00   movl   $1, %eax
+
+# REVERT: _bar:
+# REVERT-NEXT: 11000:   b8 02 00 00 00   movl   $2, %eax
+
+.globl _bar
+.type _bar, @function
+_bar:
+  mov $1, %eax
+
+.globl _start
+_start:




More information about the llvm-commits mailing list