summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-09-28 20:30:11 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-09-28 20:30:11 +0000
commit4b2ca85c1af5f0b237c5e65ea0378c6d374d1aaf (patch)
tree4332a72a896f0d989e8aae1ea2d27e187ac2c354
parent5c692009bc346c732c1ff58a7242812ef7373b1f (diff)
downloadbcm5719-llvm-4b2ca85c1af5f0b237c5e65ea0378c6d374d1aaf.tar.gz
bcm5719-llvm-4b2ca85c1af5f0b237c5e65ea0378c6d374d1aaf.zip
Implement --allow-multiple-definition.
Patch by George Rimar! llvm-svn: 248733
-rw-r--r--lld/ELF/Config.h1
-rw-r--r--lld/ELF/Driver.cpp3
-rw-r--r--lld/ELF/Options.td3
-rw-r--r--lld/ELF/SymbolTable.cpp9
-rw-r--r--lld/test/elf2/Inputs/allow-multiple-definition.s4
-rw-r--r--lld/test/elf2/allow-multiple-definition.s29
6 files changed, 47 insertions, 2 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index d4000b54675..c28cb11f897 100644
--- a/lld/ELF/Config.h
+++ b/lld/ELF/Config.h
@@ -29,6 +29,7 @@ struct Configuration {
bool DiscardNone = false;
bool ExportDynamic = false;
bool NoInhibitExec = false;
+ bool AllowMultipleDefinition = false;
};
extern Configuration *Config;
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 948d4ecd8e7..c57739b27b6 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -139,6 +139,9 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
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;
diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td
index 1a237cb6b1c..ef69c6aefe9 100644
--- a/lld/ELF/Options.td
+++ b/lld/ELF/Options.td
@@ -38,6 +38,9 @@ def discard_none : Flag<["-"], "discard-none">,
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">;
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 39dde6a0d8c..3884b88cbe1 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -150,8 +150,13 @@ void SymbolTable::dupError(const SymbolBody &Old, const SymbolBody &New) {
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
diff --git a/lld/test/elf2/Inputs/allow-multiple-definition.s b/lld/test/elf2/Inputs/allow-multiple-definition.s
new file mode 100644
index 00000000000..c2655a437ae
--- /dev/null
+++ b/lld/test/elf2/Inputs/allow-multiple-definition.s
@@ -0,0 +1,4 @@
+.globl _bar
+.type _bar, @function
+_bar:
+ mov $2, %eax
diff --git a/lld/test/elf2/allow-multiple-definition.s b/lld/test/elf2/allow-multiple-definition.s
new file mode 100644
index 00000000000..ef275c342c2
--- /dev/null
+++ b/lld/test/elf2/allow-multiple-definition.s
@@ -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:
OpenPOWER on IntegriCloud